diff options
Diffstat (limited to 'src/corelib')
304 files changed, 23502 insertions, 13928 deletions
diff --git a/src/corelib/Qt5Config.cmake.in b/src/corelib/Qt5Config.cmake.in new file mode 100644 index 0000000000..408dd64496 --- /dev/null +++ b/src/corelib/Qt5Config.cmake.in @@ -0,0 +1,43 @@ + +if (CMAKE_VERSION VERSION_LESS 2.8.9) + message(FATAL_ERROR \"Qt5 requires at least CMake version 2.8.9\") +endif() + +if (NOT Qt5_FIND_COMPONENTS) + set(Qt5_NOT_FOUND_MESSAGE \"The Qt5 package requires at least one component\") + set(Qt5_FOUND False) + return() +endif() + +set(_Qt5_FIND_PARTS_REQUIRED) +if (Qt5_FIND_REQUIRED) + set(_Qt5_FIND_PARTS_REQUIRED REQUIRED) +endif() +set(_Qt5_FIND_PARTS_QUIET) +if (Qt5_FIND_QUIETLY) + set(_Qt5_FIND_PARTS_QUIET QUIET) +endif() + +get_filename_component(_qt5_install_prefix \"${CMAKE_CURRENT_LIST_DIR}/$${CMAKE_RELATIVE_INSTALL_DIR}\" ABSOLUTE) + +set(_Qt5_NOTFOUND_MESSAGE) + +foreach(module ${Qt5_FIND_COMPONENTS}) + find_package(Qt5${module} + ${_Qt5_FIND_PARTS_QUIET} + ${_Qt5_FIND_PARTS_REQUIRED} + PATHS \"${_qt5_install_prefix}\" NO_DEFAULT_PATH + ) + if (NOT Qt5${module}_FOUND) + if (Qt5_FIND_REQUIRED_${module}) + set(_Qt5_NOTFOUND_MESSAGE \"${_Qt5_NOTFOUND_MESSAGE}Failed to find Qt5 component \\\"${module}\\\" config file at \\\"${_qt5_install_prefix}/lib/cmake/Qt5${module}/Qt5${module}Config.cmake\\\"\\n\") + elseif(NOT Qt5_FIND_QUIETLY) + message(WARNING \"Failed to find Qt5 component \\\"${module}\\\" config file at \\\"${_qt5_install_prefix}/lib/cmake/Qt5${module}/Qt5${module}Config.cmake\\\"\") + endif() + endif() +endforeach() + +if (_Qt5_NOTFOUND_MESSAGE) + set(Qt5_NOT_FOUND_MESSAGE \"${_Qt5_NOTFOUND_MESSAGE}\") + set(Qt5_FOUND False) +endif() diff --git a/src/corelib/animation/qabstractanimation.h b/src/corelib/animation/qabstractanimation.h index e1884aa533..f1aa6c0d78 100644 --- a/src/corelib/animation/qabstractanimation.h +++ b/src/corelib/animation/qabstractanimation.h @@ -44,8 +44,6 @@ #include <QtCore/qobject.h> -QT_BEGIN_HEADER - QT_BEGIN_NAMESPACE @@ -177,6 +175,4 @@ private: QT_END_NAMESPACE -QT_END_HEADER - #endif // QABSTRACTANIMATION_H diff --git a/src/corelib/animation/qanimationgroup.h b/src/corelib/animation/qanimationgroup.h index 987efa0f94..cf32f844d3 100644 --- a/src/corelib/animation/qanimationgroup.h +++ b/src/corelib/animation/qanimationgroup.h @@ -44,8 +44,6 @@ #include <QtCore/qabstractanimation.h> -QT_BEGIN_HEADER - QT_BEGIN_NAMESPACE @@ -82,6 +80,4 @@ private: QT_END_NAMESPACE -QT_END_HEADER - #endif //QANIMATIONGROUP_H diff --git a/src/corelib/animation/qparallelanimationgroup.h b/src/corelib/animation/qparallelanimationgroup.h index ad9c0ccae7..31810cfca2 100644 --- a/src/corelib/animation/qparallelanimationgroup.h +++ b/src/corelib/animation/qparallelanimationgroup.h @@ -44,8 +44,6 @@ #include <QtCore/qanimationgroup.h> -QT_BEGIN_HEADER - QT_BEGIN_NAMESPACE @@ -80,6 +78,4 @@ private: QT_END_NAMESPACE -QT_END_HEADER - #endif // QPARALLELANIMATIONGROUP diff --git a/src/corelib/animation/qpauseanimation.h b/src/corelib/animation/qpauseanimation.h index 49abad4e5f..5c770015ef 100644 --- a/src/corelib/animation/qpauseanimation.h +++ b/src/corelib/animation/qpauseanimation.h @@ -44,8 +44,6 @@ #include <QtCore/qanimationgroup.h> -QT_BEGIN_HEADER - QT_BEGIN_NAMESPACE @@ -78,6 +76,4 @@ private: QT_END_NAMESPACE -QT_END_HEADER - #endif // QPAUSEANIMATION_H diff --git a/src/corelib/animation/qpropertyanimation.h b/src/corelib/animation/qpropertyanimation.h index 7b53eb3d96..f6b92cb515 100644 --- a/src/corelib/animation/qpropertyanimation.h +++ b/src/corelib/animation/qpropertyanimation.h @@ -44,8 +44,6 @@ #include <QtCore/qvariantanimation.h> -QT_BEGIN_HEADER - QT_BEGIN_NAMESPACE @@ -83,6 +81,4 @@ private: QT_END_NAMESPACE -QT_END_HEADER - #endif // QPROPERTYANIMATION_H diff --git a/src/corelib/animation/qsequentialanimationgroup.h b/src/corelib/animation/qsequentialanimationgroup.h index 9070720669..51b4227599 100644 --- a/src/corelib/animation/qsequentialanimationgroup.h +++ b/src/corelib/animation/qsequentialanimationgroup.h @@ -44,8 +44,6 @@ #include <QtCore/qanimationgroup.h> -QT_BEGIN_HEADER - QT_BEGIN_NAMESPACE @@ -90,6 +88,4 @@ private: QT_END_NAMESPACE -QT_END_HEADER - #endif //QSEQUENTIALANIMATIONGROUP_H diff --git a/src/corelib/animation/qvariantanimation.h b/src/corelib/animation/qvariantanimation.h index b5ebbd235a..83018c30ae 100644 --- a/src/corelib/animation/qvariantanimation.h +++ b/src/corelib/animation/qvariantanimation.h @@ -48,8 +48,6 @@ #include <QtCore/qvariant.h> #include <QtCore/qpair.h> -QT_BEGIN_HEADER - QT_BEGIN_NAMESPACE @@ -124,6 +122,4 @@ void qRegisterAnimationInterpolator(QVariant (*func)(const T &from, const T &to, QT_END_NAMESPACE -QT_END_HEADER - #endif //QVARIANTANIMATION_H diff --git a/src/corelib/arch/qatomic_alpha.h b/src/corelib/arch/qatomic_alpha.h index b842859336..71cb112d47 100644 --- a/src/corelib/arch/qatomic_alpha.h +++ b/src/corelib/arch/qatomic_alpha.h @@ -44,10 +44,17 @@ #include <QtCore/qoldbasicatomic.h> -QT_BEGIN_HEADER - QT_BEGIN_NAMESPACE +#if 0 +// silence syncqt warnings +QT_END_NAMESPACE +QT_END_HEADER + +#pragma qt_sync_skip_header_check +#pragma qt_sync_stop_processing +#endif + #define Q_ATOMIC_INT_REFERENCE_COUNTING_IS_ALWAYS_NATIVE inline bool QBasicAtomicInt::isReferenceCountingNative() @@ -517,6 +524,4 @@ Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndAddOrdered(qptrdiff valueTo QT_END_NAMESPACE -QT_END_HEADER - #endif // QATOMIC_ALPHA_H diff --git a/src/corelib/arch/qatomic_armv5.h b/src/corelib/arch/qatomic_armv5.h index cdb9c8f979..e0a50b3c24 100644 --- a/src/corelib/arch/qatomic_armv5.h +++ b/src/corelib/arch/qatomic_armv5.h @@ -45,15 +45,12 @@ #include <QtCore/qgenericatomic.h> -QT_BEGIN_HEADER - QT_BEGIN_NAMESPACE #if 0 // silence syncqt warnings QT_END_NAMESPACE -QT_END_HEADER - +#pragma qt_sync_skip_header_check #pragma qt_sync_stop_processing #endif @@ -167,12 +164,20 @@ __asm T QBasicAtomicOps<4>::fetchAndStoreRelaxed(T &_q_value, T newValue) Q_DECL template<> template <typename T> inline T QBasicAtomicOps<4>::fetchAndStoreRelaxed(T &_q_value, T newValue) Q_DECL_NOTHROW { +#if defined(__thumb__) + register T originalValue; + do { + originalValue = _q_value; + } while (_q_cmpxchg(originalValue, newValue, &_q_value) != 0); + return originalValue; +#else T originalValue; asm volatile("swp %0,%2,[%3]" : "=&r"(originalValue), "=m" (_q_value) : "r"(newValue), "r"(&_q_value) : "cc", "memory"); return originalValue; +#endif } #endif // Q_CC_RVCT @@ -190,6 +195,4 @@ T QBasicAtomicOps<4>::fetchAndAddRelaxed(T &_q_value, typename QAtomicAdditiveTy QT_END_NAMESPACE -QT_END_HEADER - #endif // QATOMIC_ARMV5_H diff --git a/src/corelib/arch/qatomic_armv6.h b/src/corelib/arch/qatomic_armv6.h index 38ab1983d6..7f5939e391 100644 --- a/src/corelib/arch/qatomic_armv6.h +++ b/src/corelib/arch/qatomic_armv6.h @@ -45,15 +45,12 @@ #include <QtCore/qgenericatomic.h> -QT_BEGIN_HEADER - QT_BEGIN_NAMESPACE #if 0 // silence syncqt warnings QT_END_NAMESPACE -QT_END_HEADER - +#pragma qt_sync_skip_header_check #pragma qt_sync_stop_processing #endif @@ -729,6 +726,4 @@ void QBasicAtomicOps<size>::orderedMemoryFence(const T &) Q_DECL_NOTHROW QT_END_NAMESPACE -QT_END_HEADER - #endif // QATOMIC_ARMV6_H diff --git a/src/corelib/arch/qatomic_armv7.h b/src/corelib/arch/qatomic_armv7.h index fc5dbc9175..1929ae0ab3 100644 --- a/src/corelib/arch/qatomic_armv7.h +++ b/src/corelib/arch/qatomic_armv7.h @@ -54,11 +54,12 @@ #if 0 // silence syncqt warnings -QT_BEGIN_HEADER QT_BEGIN_NAMESPACE QT_END_NAMESPACE -QT_END_HEADER + +#pragma qt_sync_skip_header_check +#pragma qt_sync_stop_processing #endif #endif // QATOMIC_ARMV7_H diff --git a/src/corelib/arch/qatomic_bfin.h b/src/corelib/arch/qatomic_bfin.h index 24c9ea77e1..79519308a4 100644 --- a/src/corelib/arch/qatomic_bfin.h +++ b/src/corelib/arch/qatomic_bfin.h @@ -44,10 +44,17 @@ #include <QtCore/qoldbasicatomic.h> -QT_BEGIN_HEADER - QT_BEGIN_NAMESPACE +#if 0 +// silence syncqt warnings +QT_END_NAMESPACE +QT_END_HEADER + +#pragma qt_sync_skip_header_check +#pragma qt_sync_stop_processing +#endif + #define Q_ATOMIC_INT_REFERENCE_COUNTING_IS_NOT_NATIVE inline bool QBasicAtomicInt::isReferenceCountingNative() @@ -340,6 +347,4 @@ Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndAddRelease(qptrdiff valueTo QT_END_NAMESPACE -QT_END_HEADER - #endif // QATOMIC_BFIN_H diff --git a/src/corelib/arch/qatomic_bootstrap.h b/src/corelib/arch/qatomic_bootstrap.h index 5b2a2f86fd..160e0abdf3 100644 --- a/src/corelib/arch/qatomic_bootstrap.h +++ b/src/corelib/arch/qatomic_bootstrap.h @@ -45,15 +45,12 @@ #include <QtCore/qgenericatomic.h> -QT_BEGIN_HEADER - QT_BEGIN_NAMESPACE #if 0 // silence syncqt warnings QT_END_NAMESPACE -QT_END_HEADER - +#pragma qt_sync_skip_header_check #pragma qt_sync_stop_processing #endif @@ -98,6 +95,4 @@ template <typename T> struct QAtomicOps: QGenericAtomicOps<QAtomicOps<T> > QT_END_NAMESPACE -QT_END_HEADER - #endif // QATOMIC_BOOTSTRAP_H diff --git a/src/corelib/arch/qatomic_cxx11.h b/src/corelib/arch/qatomic_cxx11.h index f7a7ba4295..3119edaf45 100644 --- a/src/corelib/arch/qatomic_cxx11.h +++ b/src/corelib/arch/qatomic_cxx11.h @@ -45,14 +45,12 @@ #include <QtCore/qgenericatomic.h> #include <atomic> -QT_BEGIN_HEADER QT_BEGIN_NAMESPACE #if 0 // silence syncqt warnings QT_END_NAMESPACE -QT_END_HEADER - +#pragma qt_sync_skip_header_check #pragma qt_sync_stop_processing #endif @@ -247,6 +245,5 @@ template <typename T> struct QAtomicOps #endif QT_END_NAMESPACE -QT_END_HEADER #endif // QATOMIC_CXX0X_H diff --git a/src/corelib/arch/qatomic_gcc.h b/src/corelib/arch/qatomic_gcc.h index 0940ed082f..bd296053e5 100644 --- a/src/corelib/arch/qatomic_gcc.h +++ b/src/corelib/arch/qatomic_gcc.h @@ -44,14 +44,12 @@ #include <QtCore/qgenericatomic.h> -QT_BEGIN_HEADER QT_BEGIN_NAMESPACE #if 0 // silence syncqt warnings QT_END_NAMESPACE -QT_END_HEADER - +#pragma qt_sync_skip_header_check #pragma qt_sync_stop_processing #endif @@ -132,6 +130,4 @@ template <typename T> struct QAtomicOps: QGenericAtomicOps<QAtomicOps<T> > }; QT_END_NAMESPACE -QT_END_HEADER - #endif // QATOMIC_GCC_H diff --git a/src/corelib/arch/qatomic_ia64.h b/src/corelib/arch/qatomic_ia64.h index 1a5259aa09..d4b187ffea 100644 --- a/src/corelib/arch/qatomic_ia64.h +++ b/src/corelib/arch/qatomic_ia64.h @@ -45,15 +45,12 @@ #include <QtCore/qgenericatomic.h> -QT_BEGIN_HEADER - QT_BEGIN_NAMESPACE #if 0 // silence syncqt warnings QT_END_NAMESPACE -QT_END_HEADER - +#pragma qt_sync_skip_header_check #pragma qt_sync_stop_processing #endif @@ -1089,6 +1086,4 @@ T QBasicAtomicOps<size>::fetchAndAddOrdered(T &_q_value, typename QAtomicAdditiv QT_END_NAMESPACE -QT_END_HEADER - #endif // QATOMIC_IA64_H diff --git a/src/corelib/arch/qatomic_integrity.h b/src/corelib/arch/qatomic_integrity.h index 50654e6713..f8cfc8ce5b 100644 --- a/src/corelib/arch/qatomic_integrity.h +++ b/src/corelib/arch/qatomic_integrity.h @@ -45,10 +45,17 @@ #include <QtCore/qoldbasicatomic.h> #include <INTEGRITY.h> -QT_BEGIN_HEADER - QT_BEGIN_NAMESPACE +#if 0 +// silence syncqt warnings +QT_END_NAMESPACE +QT_END_HEADER + +#pragma qt_sync_skip_header_check +#pragma qt_sync_stop_processing +#endif + #define qt_i2addr(a) reinterpret_cast<Address *>(const_cast<int *>(a)) #define qt_p2addr(a) reinterpret_cast<Address *>(const_cast<void *>(a)) #define qt_addr(a) reinterpret_cast<Address>(a) @@ -284,7 +291,5 @@ Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndAddRelease(qptrdiff valueTo QT_END_NAMESPACE -QT_END_HEADER - #endif // QATOMIC_INTEGRITY_H diff --git a/src/corelib/arch/qatomic_mips.h b/src/corelib/arch/qatomic_mips.h index 98ac928184..7716750332 100644 --- a/src/corelib/arch/qatomic_mips.h +++ b/src/corelib/arch/qatomic_mips.h @@ -45,15 +45,12 @@ #include <QtCore/qgenericatomic.h> -QT_BEGIN_HEADER - QT_BEGIN_NAMESPACE #if 0 // silence syncqt warnings QT_END_NAMESPACE -QT_END_HEADER - +#pragma qt_sync_skip_header_check #pragma qt_sync_stop_processing #endif @@ -362,6 +359,4 @@ T QBasicAtomicOps<8>::fetchAndAddRelaxed(T &_q_value, typename QAtomicAdditiveTy QT_END_NAMESPACE -QT_END_HEADER - #endif // QATOMIC_MIPS_H diff --git a/src/corelib/arch/qatomic_msvc.h b/src/corelib/arch/qatomic_msvc.h index 58b2f30bb7..4f91e3d9da 100644 --- a/src/corelib/arch/qatomic_msvc.h +++ b/src/corelib/arch/qatomic_msvc.h @@ -214,14 +214,12 @@ extern "C" { //////////////////////////////////////////////////////////////////////////////////////////////////// -QT_BEGIN_HEADER QT_BEGIN_NAMESPACE #if 0 // silence syncqt warnings QT_END_NAMESPACE -QT_END_HEADER - +#pragma qt_sync_skip_header_check #pragma qt_sync_stop_processing #endif @@ -383,6 +381,4 @@ inline T *QAtomicOps<T *>::fetchAndAddRelaxed(T *&_q_value, qptrdiff valueToAdd) #undef QT_INTERLOCKED_EXCHANGE_ADD_POINTER QT_END_NAMESPACE -QT_END_HEADER - #endif // QATOMIC_MSVC_H diff --git a/src/corelib/arch/qatomic_power.h b/src/corelib/arch/qatomic_power.h index 5e4de3f9fd..ad1c619d56 100644 --- a/src/corelib/arch/qatomic_power.h +++ b/src/corelib/arch/qatomic_power.h @@ -44,10 +44,17 @@ #include <QtCore/qoldbasicatomic.h> -QT_BEGIN_HEADER - QT_BEGIN_NAMESPACE +#if 0 +// silence syncqt warnings +QT_END_NAMESPACE +QT_END_HEADER + +#pragma qt_sync_skip_header_check +#pragma qt_sync_stop_processing +#endif + #define Q_ATOMIC_INT_REFERENCE_COUNTING_IS_ALWAYS_NATIVE inline bool QBasicAtomicInt::isReferenceCountingNative() @@ -511,6 +518,4 @@ Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndAddOrdered(qptrdiff valueTo QT_END_NAMESPACE -QT_END_HEADER - #endif // QATOMIC_POWER_H diff --git a/src/corelib/arch/qatomic_s390.h b/src/corelib/arch/qatomic_s390.h index c24c243c03..0469f44e5f 100644 --- a/src/corelib/arch/qatomic_s390.h +++ b/src/corelib/arch/qatomic_s390.h @@ -44,10 +44,17 @@ #include <QtCore/qoldbasicatomic.h> -QT_BEGIN_HEADER - QT_BEGIN_NAMESPACE +#if 0 +// silence syncqt warnings +QT_END_NAMESPACE +QT_END_HEADER + +#pragma qt_sync_skip_header_check +#pragma qt_sync_stop_processing +#endif + #define Q_ATOMIC_INT_REFERENCE_COUNTING_IS_ALWAYS_NATIVE inline bool QBasicAtomicInt::isReferenceCountingNative() @@ -423,6 +430,4 @@ Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndAddRelease(qptrdiff valueTo QT_END_NAMESPACE -QT_END_HEADER - #endif // QATOMIC_S390_H diff --git a/src/corelib/arch/qatomic_sh4a.h b/src/corelib/arch/qatomic_sh4a.h index 0fd96d1f0f..08f75e44f2 100644 --- a/src/corelib/arch/qatomic_sh4a.h +++ b/src/corelib/arch/qatomic_sh4a.h @@ -44,14 +44,15 @@ #include <QtCore/qoldbasicatomic.h> -QT_BEGIN_HEADER - QT_BEGIN_NAMESPACE QT_END_NAMESPACE -QT_END_HEADER +#if 0 +#pragma qt_sync_skip_header_check +#pragma qt_sync_stop_processing +#endif #define Q_ATOMIC_INT_REFERENCE_COUNTING_IS_ALWAYS_NATIVE diff --git a/src/corelib/arch/qatomic_sparc.h b/src/corelib/arch/qatomic_sparc.h index 1bf625fbb1..8aea33ce85 100644 --- a/src/corelib/arch/qatomic_sparc.h +++ b/src/corelib/arch/qatomic_sparc.h @@ -44,10 +44,17 @@ #include <QtCore/qoldbasicatomic.h> -QT_BEGIN_HEADER - QT_BEGIN_NAMESPACE +#if 0 +// silence syncqt warnings +QT_END_NAMESPACE +QT_END_HEADER + +#pragma qt_sync_skip_header_check +#pragma qt_sync_stop_processing +#endif + #if defined(_LP64) #define Q_ATOMIC_INT_REFERENCE_COUNTING_IS_ALWAYS_NATIVE @@ -522,6 +529,4 @@ Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndAddRelease(qptrdiff valueTo QT_END_NAMESPACE -QT_END_HEADER - #endif // QATOMIC_SPARC_H diff --git a/src/corelib/arch/qatomic_unix.h b/src/corelib/arch/qatomic_unix.h index 0e9c105d57..03c7d2eee8 100644 --- a/src/corelib/arch/qatomic_unix.h +++ b/src/corelib/arch/qatomic_unix.h @@ -44,14 +44,12 @@ #include <QtCore/qgenericatomic.h> -QT_BEGIN_HEADER QT_BEGIN_NAMESPACE #if 0 // silence syncqt warnings QT_END_NAMESPACE -QT_END_HEADER - +#pragma qt_sync_skip_header_check #pragma qt_sync_stop_processing #endif @@ -112,6 +110,4 @@ struct QAtomicOps<T *> : QGenericAtomicOps<QAtomicOps<T *> > }; QT_END_NAMESPACE -QT_END_HEADER - #endif // QATOMIC_UNIX_H diff --git a/src/corelib/arch/qatomic_vxworks.h b/src/corelib/arch/qatomic_vxworks.h index a8664cf752..57e3b6a32b 100644 --- a/src/corelib/arch/qatomic_vxworks.h +++ b/src/corelib/arch/qatomic_vxworks.h @@ -42,8 +42,6 @@ #ifndef QATOMIC_VXWORKS_H #define QATOMIC_VXWORKS_H -QT_BEGIN_HEADER - #if defined(__ppc) # include <QtCore/qatomic_power.h> #else // generic implementation with taskLock() @@ -56,14 +54,28 @@ QT_BEGIN_HEADER # include <vxWorksCommon.h> # include <taskLib.h> #else +#if defined(_WRS_KERNEL) extern "C" int taskLock(); extern "C" int taskUnlock(); +#else +inline int taskLock() { return 0; } +inline int taskUnlock() { return 0; } +#endif #endif QT_BEGIN_NAMESPACE +#if 0 +// silence syncqt warnings +QT_END_NAMESPACE +QT_END_HEADER + +#pragma qt_sync_skip_header_check +#pragma qt_sync_stop_processing +#endif + #define Q_ATOMIC_INT_REFERENCE_COUNTING_IS_NOT_NATIVE inline bool QBasicAtomicInt::isReferenceCountingNative() @@ -315,6 +327,4 @@ QT_END_NAMESPACE #endif // generic implementation with taskLock() -QT_END_HEADER - #endif // QATOMIC_VXWORKS_H diff --git a/src/corelib/arch/qatomic_x86.h b/src/corelib/arch/qatomic_x86.h index 077cfd1336..f8180ad9d6 100644 --- a/src/corelib/arch/qatomic_x86.h +++ b/src/corelib/arch/qatomic_x86.h @@ -45,15 +45,12 @@ #include <QtCore/qgenericatomic.h> -QT_BEGIN_HEADER - QT_BEGIN_NAMESPACE #if 0 // silence syncqt warnings QT_END_NAMESPACE -QT_END_HEADER - +#pragma qt_sync_skip_header_check #pragma qt_sync_stop_processing #endif @@ -423,6 +420,4 @@ template <> struct QBasicAtomicOps<8>: QGenericAtomicOps<QBasicAtomicOps<8> > QT_END_NAMESPACE -QT_END_HEADER - #endif // QATOMIC_X86_H diff --git a/src/corelib/codecs/qicucodec.cpp b/src/corelib/codecs/qicucodec.cpp index 000f6872b5..9afae8c0ee 100644 --- a/src/corelib/codecs/qicucodec.cpp +++ b/src/corelib/codecs/qicucodec.cpp @@ -457,7 +457,8 @@ QTextCodec *QIcuCodec::codecForNameUnlocked(const char *name) if (!qstrcmp(name, "windows-874-2000") || !qstrcmp(name, "windows-874") || !qstrcmp(name, "MS874") - || !qstrcmp(name, "x-windows-874")) + || !qstrcmp(name, "x-windows-874") + || !qstrcmp(name, "ISO 8859-11")) name = "TIS-620"; UErrorCode error = U_ZERO_ERROR; diff --git a/src/corelib/codecs/qtextcodec.cpp b/src/corelib/codecs/qtextcodec.cpp index 0e671518ef..1a5c9f6766 100644 --- a/src/corelib/codecs/qtextcodec.cpp +++ b/src/corelib/codecs/qtextcodec.cpp @@ -89,7 +89,7 @@ #include <stdlib.h> #include <ctype.h> #include <locale.h> -#if defined (_XOPEN_UNIX) && !defined(Q_OS_QNX) && !defined(Q_OS_OSF) && !defined(Q_OS_LINUX_ANDROID) +#if defined (_XOPEN_UNIX) && !defined(Q_OS_QNX) && !defined(Q_OS_OSF) && !defined(Q_OS_ANDROID) # include <langinfo.h> #endif @@ -1043,28 +1043,30 @@ QString QTextDecoder::toUnicode(const QByteArray &ba) QTextCodec *QTextCodec::codecForHtml(const QByteArray &ba, QTextCodec *defaultCodec) { // determine charset - int pos; - QTextCodec *c = 0; - - c = QTextCodec::codecForUtfText(ba, c); + QTextCodec *c = QTextCodec::codecForUtfText(ba, 0); if (!c) { QByteArray header = ba.left(512).toLower(); - if ((pos = header.indexOf("http-equiv=")) != -1) { - if ((pos = header.lastIndexOf("meta ", pos)) != -1) { - pos = header.indexOf("charset=", pos) + int(strlen("charset=")); - if (pos != -1) { - int pos2 = header.indexOf('\"', pos+1); - QByteArray cs = header.mid(pos, pos2-pos); - // qDebug("found charset: %s", cs.data()); - c = QTextCodec::codecForName(cs); + int pos = header.indexOf("meta "); + if (pos != -1) { + pos = header.indexOf("charset=", pos); + if (pos != -1) { + pos += qstrlen("charset="); + + int pos2 = pos; + // The attribute can be closed with either """, "'", ">" or "/", + // none of which are valid charset characters. + while (++pos2 < header.size()) { + char ch = header.at(pos2); + if (ch == '\"' || ch == '\'' || ch == '>') { + c = QTextCodec::codecForName(header.mid(pos, pos2 - pos)); + return c ? c : defaultCodec; + } } } } } - if (!c) - c = defaultCodec; - return c; + return defaultCodec; } /*! diff --git a/src/corelib/codecs/qtextcodec.h b/src/corelib/codecs/qtextcodec.h index ac0bc77ea5..35ff83a27a 100644 --- a/src/corelib/codecs/qtextcodec.h +++ b/src/corelib/codecs/qtextcodec.h @@ -45,8 +45,6 @@ #include <QtCore/qstring.h> #include <QtCore/qlist.h> -QT_BEGIN_HEADER - QT_BEGIN_NAMESPACE @@ -166,6 +164,4 @@ private: QT_END_NAMESPACE -QT_END_HEADER - #endif // QTEXTCODEC_H diff --git a/src/corelib/codecs/qtextcodec_p.h b/src/corelib/codecs/qtextcodec_p.h index 18629f4bf3..0fec1e80c7 100644 --- a/src/corelib/codecs/qtextcodec_p.h +++ b/src/corelib/codecs/qtextcodec_p.h @@ -60,7 +60,7 @@ QT_BEGIN_NAMESPACE #ifndef QT_NO_TEXTCODEC -#if defined(Q_OS_MAC) || defined(Q_OS_IOS) || defined(Q_OS_LINUX_ANDROID) || defined(Q_OS_QNX) +#if defined(Q_OS_MAC) || defined(Q_OS_IOS) || defined(Q_OS_ANDROID) || defined(Q_OS_QNX) #define QT_LOCALE_IS_UTF8 #endif diff --git a/src/corelib/corelib.pro b/src/corelib/corelib.pro index 4462203a11..b1f1a60b6c 100644 --- a/src/corelib/corelib.pro +++ b/src/corelib/corelib.pro @@ -16,6 +16,12 @@ win32-g++*:QMAKE_CXXFLAGS_CXX11 = -std=gnu++0x QMAKE_DOCS = $$PWD/doc/qtcore.qdocconf +ANDROID_JAR_DEPENDENCIES = \ + jar/QtAndroid.jar +ANDROID_LIB_DEPENDENCIES = \ + plugins/platforms/android/libqtforandroid.so \ + libs/libgnustl_shared.so + load(qt_module) include(animation/animation.pri) @@ -63,10 +69,16 @@ ctest_macros_file.input = $$PWD/Qt5CTestMacros.cmake ctest_macros_file.output = $$DESTDIR/cmake/Qt5Core/Qt5CTestMacros.cmake ctest_macros_file.CONFIG = verbatim -QMAKE_SUBSTITUTES += ctest_macros_file +cmake_umbrella_config_file.input = $$PWD/Qt5Config.cmake.in +cmake_umbrella_config_file.output = $$DESTDIR/cmake/Qt5/Qt5Config.cmake + +cmake_qt5_umbrella_module_files.files = $$cmake_umbrella_config_file.output +cmake_qt5_umbrella_module_files.path = $$[QT_INSTALL_LIBS]/cmake/Qt5 + +QMAKE_SUBSTITUTES += ctest_macros_file cmake_umbrella_config_file ctest_qt5_module_files.files += $$ctest_macros_file.output ctest_qt5_module_files.path = $$[QT_INSTALL_LIBS]/cmake/Qt5Core -INSTALLS += ctest_qt5_module_files +INSTALLS += ctest_qt5_module_files cmake_qt5_umbrella_module_files diff --git a/src/corelib/doc/snippets/code/doc_src_properties.cpp b/src/corelib/doc/snippets/code/doc_src_properties.cpp index 9a25918d47..7a70200cce 100644 --- a/src/corelib/doc/snippets/code/doc_src_properties.cpp +++ b/src/corelib/doc/snippets/code/doc_src_properties.cpp @@ -40,8 +40,8 @@ //! [0] Q_PROPERTY(type name - READ getFunction - [WRITE setFunction] + (READ getFunction [WRITE setFunction] | + MEMBER memberName [(READ getFunction | WRITE setFunction)]) [RESET resetFunction] [NOTIFY notifySignal] [REVISION int] @@ -130,3 +130,20 @@ object->setProperty("priority", "VeryHigh"); //! [7] Q_CLASSINFO("Version", "3.0.0") //! [7] + +//! [8] + Q_PROPERTY(QColor color MEMBER m_color NOTIFY colorChanged) + Q_PROPERTY(qreal spacing MEMBER m_spacing NOTIFY spacingChanged) + Q_PROPERTY(QString text MEMBER m_text NOTIFY textChanged) + ... +signals: + void colorChanged(); + void spacingChanged(); + void textChanged(const QString &newText); + +private: + QColor m_color; + qreal m_spacing; + QString m_text; +//! [8] + diff --git a/src/corelib/doc/snippets/code/src_corelib_kernel_qabstractitemmodel.cpp b/src/corelib/doc/snippets/code/src_corelib_kernel_qabstractitemmodel.cpp index 2f81b15752..c448c75206 100644 --- a/src/corelib/doc/snippets/code/src_corelib_kernel_qabstractitemmodel.cpp +++ b/src/corelib/doc/snippets/code/src_corelib_kernel_qabstractitemmodel.cpp @@ -97,3 +97,37 @@ beginResetModel(); myData.clear(); endResetModel(); //! [11] + +//! [12] +class CustomDataProxy : public QSortFilterProxyModel +{ + Q_OBJECT +public: + CustomDataProxy(QObject *parent) + : QSortFilterProxyModel(parent) + { + } + + ... + + QVariant data(const QModelIndex &index, int role) + { + if (role != Qt::BackgroundRole) + return QSortFilterProxyModel::data(index, role); + + if (m_customData.contains(index.row())) + return m_customData.value(index.row()); + return QSortFilterProxyModel::data(index, role); + } + +private slots: + void resetInternalData() + { + m_customData.clear(); + } + +private: + QHash<int, QVariant> m_customData; +}; +//! [12] + diff --git a/src/corelib/doc/snippets/code/src_corelib_kernel_qcoreapplication.cpp b/src/corelib/doc/snippets/code/src_corelib_kernel_qcoreapplication.cpp index cbb5a9db5d..c349a6dbba 100644 --- a/src/corelib/doc/snippets/code/src_corelib_kernel_qcoreapplication.cpp +++ b/src/corelib/doc/snippets/code/src_corelib_kernel_qcoreapplication.cpp @@ -57,7 +57,14 @@ foreach (const QString &path, app.libraryPaths()) //! [3] +// Called once QCoreApplication exists +static void preRoutineMyDebugTool() +{ + MyDebugTool* tool = new MyDebugTool(QCoreApplication::instance()); + QCoreApplication::instance()->installEventFilter(tool); +} +Q_COREAPP_STARTUP_FUNCTION(preRoutineMyDebugTool) //! [3] diff --git a/src/corelib/doc/snippets/code/src_corelib_kernel_qmath.cpp b/src/corelib/doc/snippets/code/src_corelib_kernel_qmath.cpp new file mode 100644 index 0000000000..71a2a09a7d --- /dev/null +++ b/src/corelib/doc/snippets/code/src_corelib_kernel_qmath.cpp @@ -0,0 +1,63 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Laszlo Papp <lpapp@kde.org> +** Contact: http://www.qt-project.org/legal +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +//! [0] +float degrees = 180.0f +float radians = qDegreesToRadians(degrees) +//! [0] + + +//! [1] +double degrees = 180.0 +double radians = qDegreesToRadians(degrees) +//! [1] + + +//! [2] +float radians = float(M_PI) +float degrees = qRadiansToDegrees(radians) +//! [2] + + +//! [3] +double radians = M_PI +double degrees = qRadiansToDegrees(radians) +//! [3] + diff --git a/src/corelib/doc/snippets/code/src_corelib_tools_qpoint.cpp b/src/corelib/doc/snippets/code/src_corelib_tools_qpoint.cpp index a83fd9a71f..8c6751cbaa 100644 --- a/src/corelib/doc/snippets/code/src_corelib_tools_qpoint.cpp +++ b/src/corelib/doc/snippets/code/src_corelib_tools_qpoint.cpp @@ -79,6 +79,13 @@ p *= 2.5; // p becomes (-3, 10) //! [5] +//! [16] +QPoint p( 3, 7); +QPoint q(-1, 4); +int lengthSquared = QPoint::dotProduct(p, q); // lengthSquared becomes 25 +//! [16] + + //! [6] QPoint p(-3, 10); p /= 2.5; // p becomes (-1, 4) @@ -147,3 +154,10 @@ p *= 2.5; // p becomes (-2.75, 10.25) QPointF p(-2.75, 10.25); p /= 2.5; // p becomes (-1.1, 4.1) //! [15] + + +//! [17] +QPointF p( 3.1, 7.1); +QPointF q(-1.0, 4.1); +int lengthSquared = QPointF::dotProduct(p, q); // lengthSquared becomes 26.01 +//! [17] diff --git a/src/corelib/doc/snippets/qmessageauthenticationcode/main.cpp b/src/corelib/doc/snippets/qmessageauthenticationcode/main.cpp new file mode 100644 index 0000000000..4441fbd9a1 --- /dev/null +++ b/src/corelib/doc/snippets/qmessageauthenticationcode/main.cpp @@ -0,0 +1,62 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Ruslan Nigmatullin <euroelessar@yandex.ru> +** Contact: http://www.qt-project.org/legal +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtCore> + +int main(int argc, char *argv[]) +{ + QCoreApplication app(argc, argv); + +//! [0] + QByteArray key = "key"; + QByteArray message = "The quick brown fox jumps over the lazy dog"; +//! [0] + +//! [1] + QMessageAuthenticationCode code(QCryptographicHash::Sha1); + code.setKey(key); + code.addData(message); + code.result().toHex(); // returns "de7c9b85b8b78aa6bc8a7a36f70a90701c9db4d9" +//! [1] + +//! [2] + QMessageAuthenticationCode::hash(message, key, QCryptographicHash::Sha1).toHex(); +//! [2] +} diff --git a/src/corelib/doc/src/objectmodel/properties.qdoc b/src/corelib/doc/src/objectmodel/properties.qdoc index 66325ca6c0..37f54621a1 100644 --- a/src/corelib/doc/src/objectmodel/properties.qdoc +++ b/src/corelib/doc/src/objectmodel/properties.qdoc @@ -53,16 +53,22 @@ \snippet code/doc_src_properties.cpp 1 + Here is an example showing how to export member variables as Qt + properties using the \c MEMBER keyword. + Note that a \c NOTIFY signal must be specified to allow QML property bindings. + + \snippet code/doc_src_properties.cpp 8 + A property behaves like a class data member, but it has additional features accessible through the \l {Meta-Object System}. \list - \li A \c READ accessor function is required. It is for reading the - property value. Ideally, a const function is used for this purpose, - and it must return either the property's type or a pointer or - reference to that type. e.g., QWidget::focus is a read-only property - with \c READ function, QWidget::hasFocus(). + \li A \c READ accessor function is required if no \c MEMBER variable was + specified. It is for reading the property value. Ideally, a const function + is used for this purpose, and it must return either the property's type or a + pointer or reference to that type. e.g., QWidget::focus is a read-only + property with \c READ function, QWidget::hasFocus(). \li A \c WRITE accessor function is optional. It is for setting the property value. It must return void and must take exactly one @@ -71,6 +77,13 @@ QWidget::setEnabled(). Read-only properties do not need \c WRITE functions. e.g., QWidget::focus has no \c WRITE function. + \li A \c MEMBER variable association is required if no \c READ accessor + function is specified. This makes the given member variable + readable and writable without the need of creating \c READ and \c WRITE accessor + functions. It's still possible to use \c READ or \c WRITE accessor functions in + addition to \c MEMBER variable association (but not both), if you need to + control the variable access. + \li A \c RESET function is optional. It is for setting the property back to its context specific default value. e.g., QWidget::cursor has the typical \c READ and \c WRITE functions, QWidget::cursor() @@ -82,6 +95,9 @@ \li A \c NOTIFY signal is optional. If defined, it should specify one existing signal in that class that is emitted whenever the value of the property changes. + \c NOTIFY signals for \c MEMBER variables must take zero or one parameter, + which must be of the same type as the property. The parameter will take the + new value of the property. \li A \c REVISION number is optional. If included, it defines the property and its notifier signal to be used in a particular diff --git a/src/corelib/global/global.pri b/src/corelib/global/global.pri index 01756c8419..6ac32cd35d 100644 --- a/src/corelib/global/global.pri +++ b/src/corelib/global/global.pri @@ -9,6 +9,7 @@ HEADERS += \ global/qendian.h \ global/qnumeric_p.h \ global/qnumeric.h \ + global/qglobalstatic.h \ global/qlibraryinfo.h \ global/qlogging.h \ global/qtypeinfo.h \ @@ -19,6 +20,7 @@ HEADERS += \ SOURCES += \ global/qglobal.cpp \ + global/qglobalstatic.cpp \ global/qlibraryinfo.cpp \ global/qmalloc.cpp \ global/qnumeric.cpp \ diff --git a/src/corelib/global/qcompilerdetection.h b/src/corelib/global/qcompilerdetection.h index 15229e03a0..e547d58c2e 100644 --- a/src/corelib/global/qcompilerdetection.h +++ b/src/corelib/global/qcompilerdetection.h @@ -157,6 +157,10 @@ # define Q_CC_CLANG # define Q_ASSUME_IMPL(expr) if (expr){} else __builtin_unreachable() # define Q_UNREACHABLE_IMPL() __builtin_unreachable() +# if !defined(__has_extension) +# /* Compatibility with older Clang versions */ +# define __has_extension __has_feature +# endif # else /* Plain GCC */ # if (__GNUC__ * 100 + __GNUC_MINOR__) >= 405 @@ -179,6 +183,7 @@ # define Q_TYPEOF(expr) __typeof__(expr) # define Q_DECL_DEPRECATED __attribute__ ((__deprecated__)) # define Q_DECL_ALIGN(n) __attribute__((__aligned__(n))) +# define Q_DECL_UNUSED __attribute__((__unused__)) # define Q_LIKELY(expr) __builtin_expect(!!(expr), true) # define Q_UNLIKELY(expr) __builtin_expect(!!(expr), false) # define Q_NORETURN __attribute__((__noreturn__)) @@ -816,6 +821,9 @@ #ifndef Q_DECL_HIDDEN # define Q_DECL_HIDDEN #endif +#ifndef Q_DECL_UNUSED +# define Q_DECL_UNUSED +#endif #ifndef Q_FUNC_INFO # if defined(Q_OS_SOLARIS) || defined(Q_CC_XLC) # define Q_FUNC_INFO __FILE__ "(line number unavailable)" diff --git a/src/corelib/global/qendian.h b/src/corelib/global/qendian.h index cdffb10d5a..c9c4d23aab 100644 --- a/src/corelib/global/qendian.h +++ b/src/corelib/global/qendian.h @@ -52,8 +52,6 @@ #include <byteswap.h> #endif -QT_BEGIN_HEADER - QT_BEGIN_NAMESPACE @@ -386,6 +384,4 @@ template <> inline qint8 qbswap<qint8>(qint8 source) QT_END_NAMESPACE -QT_END_HEADER - #endif // QENDIAN_H diff --git a/src/corelib/global/qfeatures.h b/src/corelib/global/qfeatures.h index 7ae4863da3..a751f9af56 100644 --- a/src/corelib/global/qfeatures.h +++ b/src/corelib/global/qfeatures.h @@ -154,6 +154,9 @@ // Properties //#define QT_NO_PROPERTIES +// QRegularExpression +//#define QT_NO_REGULAREXPRESSION + // Resize Handler //#define QT_NO_RESIZEHANDLER diff --git a/src/corelib/global/qfeatures.txt b/src/corelib/global/qfeatures.txt index a97309b876..c27463897f 100644 --- a/src/corelib/global/qfeatures.txt +++ b/src/corelib/global/qfeatures.txt @@ -28,6 +28,13 @@ Requires: Name: CssParser SeeAlso: ??? +Feature: REGULAREXPRESSION +Description: Perl-compatible regular expression APIs +Section: Kernel +Requires: +Name: QRegularExpression +SeeAlso: ??? + Feature: CONCURRENT Description: Provides a high-level multi-threaded APIs Section: Kernel diff --git a/src/corelib/global/qflags.h b/src/corelib/global/qflags.h index 4b75383213..4722fe2282 100644 --- a/src/corelib/global/qflags.h +++ b/src/corelib/global/qflags.h @@ -47,8 +47,6 @@ #include <QtCore/qtypeinfo.h> #include <QtCore/qtypetraits.h> -QT_BEGIN_HEADER - QT_BEGIN_NAMESPACE class QFlag @@ -152,6 +150,4 @@ typedef uint Flags; QT_END_NAMESPACE -QT_END_HEADER - #endif // QFLAGS_H diff --git a/src/corelib/global/qglobal.cpp b/src/corelib/global/qglobal.cpp index f0fb9c1a02..c591cc5b49 100644 --- a/src/corelib/global/qglobal.cpp +++ b/src/corelib/global/qglobal.cpp @@ -68,7 +68,7 @@ # endif #endif -#if defined(Q_OS_VXWORKS) +#if defined(Q_OS_VXWORKS) && defined(_WRS_KERNEL) # include <envLib.h> #endif @@ -2193,6 +2193,10 @@ bool qEnvironmentVariableIsSet(const char *varName) Q_DECL_NOEXCEPT \a varName. It will create the variable if it does not exist. It returns 0 if the variable could not be set. + Calling qputenv with an empty value removes the environment variable on + Windows, and makes it set (but empty) on Unix. Prefer using qunsetenv() + for fully portable behavior. + \note qputenv() was introduced because putenv() from the standard C library was deprecated in VC2005 (and later versions). qputenv() uses the replacement function in VC, and calls the standard C @@ -2219,6 +2223,39 @@ bool qputenv(const char *varName, const QByteArray& value) #endif } +/*! + \relates <QtGlobal> + + This function deletes the variable \a varName from the environment. + + Returns true on success. + + \since 5.1 + + \sa qputenv(), qgetenv() +*/ +bool qunsetenv(const char *varName) +{ +#if defined(_MSC_VER) && _MSC_VER >= 1400 + return _putenv_s(varName, "") == 0; +#elif (defined(_POSIX_VERSION) && (_POSIX_VERSION-0) >= 200112L) || defined(Q_OS_BSD4) + // POSIX.1-2001 and BSD have unsetenv + return unsetenv(varName) == 0; +#elif defined(Q_CC_MINGW) + // On mingw, putenv("var=") removes "var" from the environment + QByteArray buffer(varName); + buffer += '='; + return putenv(buffer.constData()) == 0; +#else + // Fallback to putenv("var=") which will insert an empty var into the + // environment and leak it + QByteArray buffer(varName); + buffer += '='; + char *envVar = qstrdup(buffer.constData()); + return putenv(envVar) == 0; +#endif +} + #if defined(Q_OS_UNIX) && !defined(QT_NO_THREAD) # if defined(Q_OS_INTEGRITY) && defined(__GHS_VERSION_NUMBER) && (__GHS_VERSION_NUMBER < 500) @@ -2814,8 +2851,7 @@ bool QInternal::activateCallbacks(Callback cb, void **parameters) As a rule of thumb, \c QT_BEGIN_NAMESPACE should appear in all Qt header and Qt source files after the last \c{#include} line and before the first - declaration. In Qt headers using \c QT_BEGIN_HEADER, \c QT_BEGIN_NAMESPACE - follows \c QT_BEGIN_HEADER immediately. + declaration. If that rule can't be followed because, e.g., \c{#include} lines and declarations are wildly mixed, place \c QT_BEGIN_NAMESPACE before diff --git a/src/corelib/global/qglobal.h b/src/corelib/global/qglobal.h index 13bdc7553f..233743f3ce 100644 --- a/src/corelib/global/qglobal.h +++ b/src/corelib/global/qglobal.h @@ -45,11 +45,11 @@ #include <stddef.h> -#define QT_VERSION_STR "5.0.2" +#define QT_VERSION_STR "5.1.0" /* QT_VERSION is (major << 16) + (minor << 8) + patch. */ -#define QT_VERSION 0x050002 +#define QT_VERSION 0x050100 /* can be used like #if (QT_VERSION >= QT_VERSION_CHECK(4, 4, 0)) */ @@ -151,6 +151,7 @@ namespace QT_NAMESPACE {} #endif /* __cplusplus */ +// ### Qt6: remove me. #define QT_BEGIN_HEADER #define QT_END_HEADER @@ -158,7 +159,6 @@ namespace QT_NAMESPACE {} # define QT_LARGEFILE_SUPPORT 64 #endif -QT_BEGIN_HEADER QT_BEGIN_NAMESPACE /* @@ -512,6 +512,16 @@ template <typename T> Q_DECL_CONSTEXPR inline const T &qBound(const T &min, const T &val, const T &max) { return qMax(min, qMin(max, val)); } +#ifdef Q_OS_DARWIN +# define QT_MAC_PLATFORM_SDK_EQUAL_OR_ABOVE(osx, ios) \ + (defined(__MAC_OS_X_VERSION_MAX_ALLOWED) && __MAC_OS_X_VERSION_MAX_ALLOWED >= osx) || \ + (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= ios) + +# define QT_MAC_DEPLOYMENT_TARGET_BELOW(osx, ios) \ + (defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && osx != __MAC_NA && __MAC_OS_X_VERSION_MIN_REQUIRED < osx) || \ + (defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && ios != __IPHONE_NA && __IPHONE_OS_VERSION_MIN_REQUIRED < ios) +#endif + /* Data stream functions are provided by many classes (defined in qdatastream.h) */ @@ -664,125 +674,6 @@ typedef void (*QFunctionPointer)(); # define Q_UNIMPLEMENTED() qWarning("%s:%d: %s: Unimplemented code.", __FILE__, __LINE__, Q_FUNC_INFO) #endif -#if defined(QT_NO_THREAD) - -template <typename T> -class QGlobalStatic -{ -public: - T *pointer; - inline QGlobalStatic(T *p) : pointer(p) { } - inline ~QGlobalStatic() { pointer = 0; } -}; - -#define Q_GLOBAL_STATIC(TYPE, NAME) \ - static TYPE *NAME() \ - { \ - static TYPE thisVariable; \ - static QGlobalStatic<TYPE > thisGlobalStatic(&thisVariable); \ - return thisGlobalStatic.pointer; \ - } - -#define Q_GLOBAL_STATIC_WITH_ARGS(TYPE, NAME, ARGS) \ - static TYPE *NAME() \ - { \ - static TYPE thisVariable ARGS; \ - static QGlobalStatic<TYPE > thisGlobalStatic(&thisVariable); \ - return thisGlobalStatic.pointer; \ - } - -#define Q_GLOBAL_STATIC_WITH_INITIALIZER(TYPE, NAME, INITIALIZER) \ - static TYPE *NAME() \ - { \ - static TYPE thisVariable; \ - static QGlobalStatic<TYPE > thisGlobalStatic(0); \ - if (!thisGlobalStatic.pointer) { \ - TYPE *x = thisGlobalStatic.pointer = &thisVariable; \ - INITIALIZER; \ - } \ - return thisGlobalStatic.pointer; \ - } - -#else - -// forward declaration, since qatomic.h needs qglobal.h -template <typename T> class QBasicAtomicPointer; - -// POD for Q_GLOBAL_STATIC -template <typename T> -class QGlobalStatic -{ -public: - QBasicAtomicPointer<T> pointer; - bool destroyed; -}; - -// Created as a function-local static to delete a QGlobalStatic<T> -template <typename T> -class QGlobalStaticDeleter -{ -public: - QGlobalStatic<T> &globalStatic; - QGlobalStaticDeleter(QGlobalStatic<T> &_globalStatic) - : globalStatic(_globalStatic) - { } - - inline ~QGlobalStaticDeleter() - { - delete globalStatic.pointer.load(); - globalStatic.pointer.store(0); - globalStatic.destroyed = true; - } -}; - -#define Q_GLOBAL_STATIC(TYPE, NAME) \ - static TYPE *NAME() \ - { \ - static QGlobalStatic<TYPE > thisGlobalStatic \ - = { Q_BASIC_ATOMIC_INITIALIZER(0), false }; \ - if (!thisGlobalStatic.pointer.load() && !thisGlobalStatic.destroyed) { \ - TYPE *x = new TYPE; \ - if (!thisGlobalStatic.pointer.testAndSetOrdered(0, x)) \ - delete x; \ - else \ - static QGlobalStaticDeleter<TYPE > cleanup(thisGlobalStatic); \ - } \ - return thisGlobalStatic.pointer.load(); \ - } - -#define Q_GLOBAL_STATIC_WITH_ARGS(TYPE, NAME, ARGS) \ - static TYPE *NAME() \ - { \ - static QGlobalStatic<TYPE > thisGlobalStatic \ - = { Q_BASIC_ATOMIC_INITIALIZER(0), false }; \ - if (!thisGlobalStatic.pointer.load() && !thisGlobalStatic.destroyed) { \ - TYPE *x = new TYPE ARGS; \ - if (!thisGlobalStatic.pointer.testAndSetOrdered(0, x)) \ - delete x; \ - else \ - static QGlobalStaticDeleter<TYPE > cleanup(thisGlobalStatic); \ - } \ - return thisGlobalStatic.pointer.load(); \ - } - -#define Q_GLOBAL_STATIC_WITH_INITIALIZER(TYPE, NAME, INITIALIZER) \ - static TYPE *NAME() \ - { \ - static QGlobalStatic<TYPE > thisGlobalStatic \ - = { Q_BASIC_ATOMIC_INITIALIZER(0), false }; \ - if (!thisGlobalStatic.pointer.load() && !thisGlobalStatic.destroyed) { \ - QScopedPointer<TYPE > x(new TYPE); \ - INITIALIZER; \ - if (thisGlobalStatic.pointer.testAndSetOrdered(0, x.data())) { \ - static QGlobalStaticDeleter<TYPE > cleanup(thisGlobalStatic); \ - x.take(); \ - } \ - } \ - return thisGlobalStatic.pointer.load(); \ - } - -#endif - Q_DECL_CONSTEXPR static inline bool qFuzzyCompare(double p1, double p2) { return (qAbs(p1 - p2) <= 0.000000000001 * qMin(qAbs(p1), qAbs(p2))); @@ -1053,6 +944,7 @@ Q_CORE_EXPORT QString qtTrId(const char *id, int n = -1); class QByteArray; Q_CORE_EXPORT QByteArray qgetenv(const char *varName); Q_CORE_EXPORT bool qputenv(const char *varName, const QByteArray& value); +Q_CORE_EXPORT bool qunsetenv(const char *varName); Q_CORE_EXPORT bool qEnvironmentVariableIsEmpty(const char *varName) Q_DECL_NOEXCEPT; Q_CORE_EXPORT bool qEnvironmentVariableIsSet(const char *varName) Q_DECL_NOEXCEPT; @@ -1087,7 +979,8 @@ template <typename T> struct QEnableIf<true, T> { typedef T Type; }; } QT_END_NAMESPACE -QT_END_HEADER +// Q_GLOBAL_STATIC +#include <QtCore/qglobalstatic.h> // qDebug and friends #include <QtCore/qlogging.h> diff --git a/src/corelib/global/qglobalstatic.cpp b/src/corelib/global/qglobalstatic.cpp new file mode 100644 index 0000000000..8474d132b4 --- /dev/null +++ b/src/corelib/global/qglobalstatic.cpp @@ -0,0 +1,524 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Intel Corporation. +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qglobalstatic.h" + +/*! + \macro Q_GLOBAL_STATIC(Type, VariableName) + \since 5.1 + \relates QGlobalStatic + + Creates a global and static object of type \l QGlobalStatic, of name \a + VariableName and that behaves as a pointer to \a Type. The object created + by Q_GLOBAL_STATIC initializes itself on the first use, which means that it + will not increase the application or the library's load time. Additionally, + the object is initialized in a thread-safe manner on all platforms. + + The typical use of this macro is as follows, in a global context (that is, + outside of any function bodies): + + \code + Q_GLOBAL_STATIC(MyType, staticType) + \endcode + + This macro is intended to replace global static objects that are not POD + (Plain Old Data, or in C++11 terms, not made of a trivial type), hence the + name. For example, the following C++ code creates a global static: + + \code + static MyType staticType; + \endcode + + Compared to Q_GLOBAL_STATIC, and assuming that \c MyType is a class or + struct that has a constructor, a destructor, or is otherwise non-POD, the + above has the following drawbacks: + + \list + \li it requires load-time initialization of \c MyType (that is, the + default constructor for \c MyType is called when the library or + application is loaded); + + \li the type will be initialized even if it is never used; + + \li the order of initialization and destruction among different + translation units is not determined, leading to possible uses before + initialization or after destruction; + + \li if it is found inside a function (that is, not global), it will be + initialized on first use, but many current compilers (as of 2013) do + not guarantee that the initialization will be thread-safe; + \endlist + + The Q_GLOBAL_STATIC macro solves all of the above problems by guaranteeing + thread-safe initialization on first use and allowing the user to query for + whether the type has already been destroyed, to avoid the + use-after-destruction problem (see QGlobalStatic::isDestroyed()). + + \section1 Constructor and destructor + + For Q_GLOBAL_STATIC, the type \c Type must be publicly + default-constructible and publicly destructible. For + Q_GLOBAL_STATIC_WITH_ARGS(), there must be a public constructor that + matches the arguments passed. + + It is not possible to use Q_GLOBAL_STATIC with types that have protected or + private default constructors or destructors (for Q_GLOBAL_STATIC_WITH_ARGS(), + a protected or private constructor matching the arguments). If the type in + question has those members as protected, it is possible to overcome the + issue by deriving from the type and creating public a constructor and + destructor. If the type has them as private, a friend declaration is + necessary before deriving. + + For example, the following is enough to create \c MyType based on a + previously-defined \c MyOtherType which has a protected default constructor + and/or a protected destructor (or has them as private, but that defines \c + MyType as a friend). + + \code + class MyType : public MyOtherType { }; + Q_GLOBAL_STATIC(MyType, staticType) + \endcode + + No body for \c MyType is required since the destructor is an implicit + member and so is the default constructor if no other constructors are + defined. For use with Q_GLOBAL_STATIC_WITH_ARGS(), however, a suitable + constructor body is necessary: + + \code + class MyType : public MyOtherType + { + public: + MyType(int i) : MyOtherType(i) {} + }; + Q_GLOBAL_STATIC_WITH_ARGS(MyType, staticType, (42)) + \endcode + + Alternatively, if the compiler supports C++11 inheriting constructors, one could write: + + \code + class MyType : public MyOtherType + { + public: + using MyOtherType::MyOtherType; + }; + Q_GLOBAL_STATIC_WITH_ARGS(MyType, staticType, (42)) + \endcode + + \section1 Placement + + The Q_GLOBAL_STATIC macro creates a type that is necessarily static, at the + global scope. It is not possible to place the Q_GLOBAL_STATIC macro inside + a function (doing so will result in compilation errors). + + More importantly, this macro should be placed in source files, never in + headers. Since the resulting object is has static linkage, if the macro is + placed in a header and included by multiple source files, the object will + be defined multiple times and will not cause linking errors. Instead, each + translation unit will refer to a different object, which could lead to + subtle and hard-to-track errors. + + \section1 Non-recommended uses + + Note that the macro is not recommended for use with types that are POD or + that have C++11 constexpr constructors (trivially constructible and + destructible). For those types, it is still recommended to use regular + static, whether global or function-local. + + This macro will work, but it will add unnecessary overhead. + + \section1 Reentrancy, thread-safety, deadlocks, and exception-safety on construction + + The Q_GLOBAL_STATIC macro creates an object that initializes itself on + first use in a thread-safe manner: if multiple threads attempt to + initialize the object at the same time, only one thread will proceed to + initialize, while all other threads wait for completion. + + If the initialization process throws an exception, the initialization is + deemed not complete and will be attempted again when control reaches any + use of the object. If there are any threads waiting for initialization, one + of them will be woken up to attempt to initialize. + + The macro makes no guarantee about reentrancy from the same thread. If the + global static object is accessed directly or indirectly from inside the + constructor, a deadlock will surely happen. + + In addition, if two Q_GLOBAL_STATIC objects are being initialized on two + different threads and each one's initialization sequence accesses the + other, a deadlock might happen. For that reason, it is recommended to keep + global static constructors simple or, failing that, to ensure that there's + no cross-dependency of uses of global static during construction. + + \section1 Destruction + + If the object is never used during the lifetime of the program, aside from + the QGlobalStatic::exists() and QGlobalStatic::isDestroyed() functions, the + contents of type \a Type will not be created and there will not be any + exit-time operation. + + If the object is created, it will be destroyed at exit-time, similar to the + C \c atexit function. On most systems, in fact, the destructor will also be + called if the library or plugin is unloaded from memory before exit. + + Since the destruction is meant to happen at program exit, no thread-safety + is provided. This includes the case of plugin or library unload. In + addition, since destructors are not supposed to throw exceptions, no + exception safety is provided either. + + However, reentrancy is permitted: during destruction, it is possible to + access the global static object and the pointer returned will be the same + as it was before destruction began. After the destruction has completed, + accessing the global static object is not permitted, except as noted in the + \l QGlobalStatic API. + + \omit + \section1 Compatibility with Qt 4 and Qt 5.0 + + This macro, in its current form and behavior, was introduced in Qt 5.1. + Prior to that version, Qt had another macro with the same name that was + private API. This section is not meant to document how to use + Q_GLOBAL_STATIC in those versions, but instead to serve as a porting guide + for Qt code that used those macros. + + The Qt 4 Q_GLOBAL_STATIC macro differed in behavior in the following ways: + + \list + \li the object created was not of type \l QGlobalStatic, but instead + it was a function that returned a pointer to \a Type; that means the + \l QGlobalStatic API was not present; + + \li the initialization was thread-safe, but not guaranteed to be + unique: instead, if N threads tried to initialize the object at the + same time, N objects would be created on the heap and N-1 would be + destroyed; + + \li the object was always created on the heap. + \endlist + + \section1 Implementation details + + Q_GLOBAL_STATIC is implemented by creating a QBasicAtomicInt called the \c + guard and a free, inline function called \c innerFunction. The guard + variable is initialized to value 0 (chosen so that the guard can be placed + in the .bss section of the binary file), which denotes that construction + has not yet taken place (uninitialized). The inner function is implemented + by the helper macro Q_GLOBAL_STATIC_INTERNAL. + + Both the guard variable and the inner function are passed as template + parameters to QGlobalStatic, along with the type \a Type. Both should also + have static linkage or be placed inside an anonymous namespace, so that the + visibility of Q_GLOBAL_STATIC is that of a global static. To permit + multiple Q_GLOBAL_STATIC per translation unit, the guard variable and the + inner function must have unique names, which can be accomplished by + concatenating with \a VariableName or by placing them in a namespace that + has \a VariableName as part of the name. To simplify and improve + readability on Q_GLOBAL_STATIC_INTERNAL, we chose the namespace solution. + It's also required for C++98 builds, since static symbols cannot be used as + template parameters. + + The guard variable can assume the following values: + + \list + \li -2: object was once initialized but has been destroyed already; + \li -1: object was initialized and is still valid; + \li 0: object was not initialized yet; + \li +1: object is being initialized and any threads encountering this + value must wait for completion (not used in the current implementation). + \endlist + + Collectively, all positive values indicate that the initialization is + progressing and must be waited on, whereas all negative values indicate + that the initialization has terminated and must not be attempted again. + Positive values are not used in the current implementation, but were in + earlier versions. They could be used again in the future. + + The QGlobalStatic::exists() and QGlobalStatic::isDestroyed() functions + operate solely on the guard variable: the former returns true if the guard + is negative, whereas the latter returns true only if it is -2. + + The Q_GLOBAL_STATIC_INTERNAL macro implements the actual construction and + destruction. There are two implementations of it: one for compilers that + support thread-safe initialization of function-local statics and one for + compilers that don't. Thread-safe initialization is required by C++11 in + [stmt.decl], but as of the time of this writing, only compilers based on + the IA-64 C++ ABI implemented it properly. The implementation requiring + thread-safe initialization is also used on the Qt bootstrapped tools, which + define QT_NO_THREAD. + + The implementation requiring thread-safe initialization from the compiler + is the simplest: it creates the \a Type object as a function-local static + and returns its address. The actual object is actually inside a holder + structure so holder's destructor can set the guard variable to the value -2 + (destroyed) when the type has finished destruction. Since we need to set + the guard \b after the destruction has finished, this code needs to be in a + base struct's destructor. And it only sets to -2 (destroyed) if it finds + the guard at -1 (initialized): this is done to ensure that the guard isn't + set to -2 in the event the type's constructor threw an exception. A holder + structure is used to avoid creating two statics, which the ABI might + require duplicating the thread-safe control structures for. + + The other implementation is similar to Qt 4's Q_GLOBAL_STATIC, but unlike + that one, it uses a \l QBasicMutex to provide locking. It is also more + efficient memory-wise. It use a simple double-checked locking of the mutex + and then creates the contents on the heap. After that, it creates a + function-local structure called "Cleanup", whose destructor will be run at + program exit and will actually destroy the contents. + + \endomit + + \sa Q_GLOBAL_STATIC_WITH_ARGS(), QGlobalStatic +*/ + +/*! + \macro Q_GLOBAL_STATIC_WITH_ARGS(Type, VariableName, Arguments) + \since 5.1 + \relates QGlobalStatic + + Creates a global and static object of type \l QGlobalStatic, of name \a + VariableName, initialized by the arguments \a Arguments and that behaves as + a pointer to \a Type. The object created by Q_GLOBAL_STATIC_WITH_ARGS + initializes itself on the first use, which means that it will not increase + the application or the library's load time. Additionally, the object is + initialized in a thread-safe manner on all platforms. + + The typical use of this macro is as follows, in a global context (that is, + outside of any function bodies): + + \code + Q_GLOBAL_STATIC_WITH_ARGS(MyType, staticType, (42, "Hello", "World")) + \endcode + + The \a Arguments macro parameter must always include the parentheses or, if + C++11 uniform initialization is allowed, the braces. + + Aside from the actual initialization of the contents with the supplied + arguments, this macro behaves identically to Q_GLOBAL_STATIC(). Please + see that macro's documentation for more information. + + \sa Q_GLOBAL_STATIC(), QGlobalStatic +*/ + +/*! + \class QGlobalStatic + \threadsafe + \inmodule QtCore + \since 5.1 + \brief The QGlobalStatic class is used to implement a global static object + + The QGlobalStatic class is the front-end API exported when + Q_GLOBAL_STATIC() is used. See the documentation for the macro for a + discussion on when to use it and its requirements. + + Normally, you will never use this class directly, but instead you will use + the Q_GLOBAL_STATIC() or Q_GLOBAL_STATIC_WITH_ARGS() macros, as + follows: + + \code + Q_GLOBAL_STATIC(MyType, staticType) + \endcode + + The above example creates an object of type QGlobalStatic called \c + staticType. After the above declaration, the \c staticType object may be + used as if it were a pointer, guaranteed to be initialized exactly once. In + addition to the use as a pointer, the object offers two methods to + determine the current status of the global: exists() and isDestroyed(). + + \sa Q_GLOBAL_STATIC(), Q_GLOBAL_STATIC_WITH_ARGS() +*/ + +/*! + \typedef QGlobalStatic::Type + + This type is equivalent to the \c Type parameter passed to the + Q_GLOBAL_STATIC() or Q_GLOBAL_STATIC_WITH_ARGS() macros. It is used in the + return types of some functions. +*/ + +/*! + \fn bool QGlobalStatic::isDestroyed() const + + This function returns true if the global static object has already + completed destruction (that is, if the destructor for the type has already + returned). In specific, note that this function returns false if + the destruction is still in progress. + + Once this function has returned true once, it will never return + false again until either the program is restarted or the plugin or library + containing the global static is unloaded and reloaded. + + This function is safe to call at any point in the program execution: it + cannot fail and cannot cause a deadlock. Additionally, it will not cause + the contents to be created if they have not yet been created. + + This function is useful in code that may be executed at program shutdown, + to determine whether the contents may still be accessed or not. + + \omit + Due to the non-atomic nature of destruction, it's possible that + QGlobalStatic::isDestroyed might return false for a short time after the + destructor has finished. However, since the destructor is only run in an + environment where concurrent multithreaded access is impossible, no one can + see that state. (omitted because it's useless information) + \endomit + + \sa exists() +*/ + +/*! + \fn bool QGlobalStatic::exists() const + + This function returns true if the global static object has already + completed initialization (that is, if the constructor for the type has + already returned). In specific, note that this function returns false if + the initialization is still in progress. + + Once this function has returned true once, it will never return false again + until either the program is restarted or the plugin or library containing + the global static is unloaded and reloaded. + + This function is safe to call at any point in the program execution: it + cannot fail and cannot cause a deadlock. Additionally, it will not cause + the contents to be created if they have not yet been created. + + This function is useful if one can determine the initial conditions of the + global static object and would prefer to avoid a possibly expensive + construction operation. + + For example, in the following code sample, this function is used to + short-circuit the creation of the global static called \c globalState and + returns a default value: + + \code + Q_GLOBAL_STATIC(MyType, globalState) + QString someState() + { + if (globalState.exists()) + return globalState->someState; + return QString(); + } + \endcode + + \b{Thread-safety notice:} this function is thread-safe in the sense that it + may be called from any thread at any time and will always return a valid + reply. But due to the non-atomic nature of construction, this function may + return false for a short time after the construction has completed. + + \b{Memory ordering notice:} this function does not impose any memory + ordering guarantees. That is instead provided by the accessor functions + that return the pointer or reference to the contents. If you bypass the + accessor functions and attempt to access some global state set by the + constructor, be sure to use the correct memory ordering semantics provided + by \l QAtomicInt or \l QAtomicPointer. + + \sa isDestroyed() +*/ + +/*! + \fn QGlobalStatic::operator Type*() + + This function returns the address of the contents of this global static. If + the contents have not yet been created, they will be created thread-safely + by this function. If the contents have already been destroyed, this + function will return a null pointer. + + This function can be used, for example, to store the pointer to the + contents of the global static in a local variable, thus avoiding multiple + calls to the function. The implementation of Q_GLOBAL_STATIC() is quite + efficient already, but in performance-critical sections it might be useful + to help the compiler a little. For example: + + \code + Q_GLOBAL_STATIC(MyType, globalState) + QString someState() + { + MyType *state = globalState; + if (!state) { + // we're in a post-destruction state + return QString(); + } + if (state->condition) + return state->value1; + else + return state->value2; + } + \endcode + + \sa operator->(), operator*() +*/ + +/*! + \fn Type *QGlobalStatic::operator()() + \deprecated + + This function returns the address of the contents of this global static. If + the contents have not yet been created, they will be created thread-safely + by this function. If the contents have already been destroyed, this + function will return a null pointer. + + This function is equivalent to \l {operator Type *()}. It is provided for + compatibility with the private Q_GLOBAL_STATIC implementation that existed + in Qt 4.x and 5.0. New code should avoid using it and should instead treat + the object as a smart pointer. +*/ + +/*! + \fn Type *QGlobalStatic::operator->() + + This function returns the address of the contents of this global static. If + the contents have not yet been created, they will be created thread-safely + by this function. + + This function does not check if the contents have already been destroyed and + will never return null. If this function is called after the object has + been destroyed, it will return a dangling pointer that should not be + dereferenced. +*/ + +/*! + \fn Type &QGlobalStatic::operator*() + + This function returns a reference to the contents of this global static. If + the contents have not yet been created, they will be created thread-safely + by this function. + + This function does not check if the contents have already been destroyed. + If this function is called after the object has been destroyed, it will + return an invalid reference that must not be used. +*/ diff --git a/src/corelib/global/qglobalstatic.h b/src/corelib/global/qglobalstatic.h new file mode 100644 index 0000000000..a6268e057e --- /dev/null +++ b/src/corelib/global/qglobalstatic.h @@ -0,0 +1,142 @@ +/**************************************************************************** +** +** Copyright (C) 2012 Intel Corporation +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtCore/qglobal.h> + +#ifndef QGLOBALSTATIC_H +#define QGLOBALSTATIC_H + +#include <QtCore/qatomic.h> + +QT_BEGIN_NAMESPACE + +namespace QtGlobalStatic { +enum GuardValues { + Destroyed = -2, + Initialized = -1, + Uninitialized = 0, + Initializing = 1 +}; +} + +#if defined(QT_NO_THREAD) || defined(Q_CC_GNU) +// some compilers support thread-safe statics +// The IA-64 C++ ABI requires this, so we know that all GCC versions since 3.4 +// support it. C++11 also requires this behavior. +// Clang and Intel CC masquerade as GCC when compiling on Linux and Mac OS X. + +#define Q_GLOBAL_STATIC_INTERNAL(ARGS) \ + Q_DECL_HIDDEN inline Type *innerFunction() \ + { \ + struct HolderBase { \ + ~HolderBase() Q_DECL_NOTHROW \ + { if (guard.load() == QtGlobalStatic::Initialized) \ + guard.store(QtGlobalStatic::Destroyed); } \ + }; \ + static struct Holder : public HolderBase { \ + Type value; \ + Holder() \ + Q_DECL_NOEXCEPT_EXPR(noexcept(Type ARGS)) \ + : value ARGS \ + { guard.store(QtGlobalStatic::Initialized); } \ + } holder; \ + return &holder.value; \ + } +#else +// We don't know if this compiler supports thread-safe global statics +// so use our own locked implementation + +QT_END_NAMESPACE +#include <QtCore/qmutex.h> +QT_BEGIN_NAMESPACE + +#define Q_GLOBAL_STATIC_INTERNAL(ARGS) \ + Q_DECL_HIDDEN inline Type *innerFunction() \ + { \ + static Type *d; \ + static QBasicMutex mutex; \ + int x = guard.loadAcquire(); \ + if (Q_UNLIKELY(x >= QtGlobalStatic::Uninitialized)) { \ + QMutexLocker locker(&mutex); \ + if (guard.load() == QtGlobalStatic::Uninitialized) { \ + d = new Type ARGS; \ + static struct Cleanup { \ + ~Cleanup() { \ + delete d; \ + guard.store(QtGlobalStatic::Destroyed); \ + } \ + } cleanup; \ + guard.store(QtGlobalStatic::Initialized); \ + } \ + } \ + return d; \ + } +#endif + +// this class must be POD, unless the compiler supports thread-safe statics +template <typename T, T *(&innerFunction)(), QBasicAtomicInt &guard> +struct QGlobalStatic +{ + typedef T Type; + + bool isDestroyed() const { return guard.load() <= QtGlobalStatic::Destroyed; } + bool exists() const { return guard.load() == QtGlobalStatic::Initialized; } + operator Type *() { if (isDestroyed()) return 0; return innerFunction(); } + Type *operator()() { if (isDestroyed()) return 0; return innerFunction(); } + Type *operator->() { return innerFunction(); } + Type &operator*() { return *innerFunction(); } +}; + +#define Q_GLOBAL_STATIC_WITH_ARGS(TYPE, NAME, ARGS) \ + namespace { namespace Q_QGS_ ## NAME { \ + typedef TYPE Type; \ + QBasicAtomicInt guard = Q_BASIC_ATOMIC_INITIALIZER(QtGlobalStatic::Uninitialized); \ + Q_GLOBAL_STATIC_INTERNAL(ARGS) \ + } } \ + static QGlobalStatic<TYPE, \ + Q_QGS_ ## NAME::innerFunction, \ + Q_QGS_ ## NAME::guard> NAME; + +#define Q_GLOBAL_STATIC(TYPE, NAME) \ + Q_GLOBAL_STATIC_WITH_ARGS(TYPE, NAME, ()) + +QT_END_NAMESPACE +#endif // QGLOBALSTATIC_H diff --git a/src/corelib/global/qisenum.h b/src/corelib/global/qisenum.h index 073d5a591f..577007b455 100644 --- a/src/corelib/global/qisenum.h +++ b/src/corelib/global/qisenum.h @@ -62,9 +62,6 @@ #endif // shut up syncqt -QT_BEGIN_HEADER QT_BEGIN_NAMESPACE QT_END_NAMESPACE -QT_END_HEADER - #endif // QISENUM_H diff --git a/src/corelib/global/qlibraryinfo.h b/src/corelib/global/qlibraryinfo.h index 054231b084..1a00a14caf 100644 --- a/src/corelib/global/qlibraryinfo.h +++ b/src/corelib/global/qlibraryinfo.h @@ -45,8 +45,6 @@ #include <QtCore/qstring.h> #include <QtCore/qdatetime.h> -QT_BEGIN_HEADER - QT_BEGIN_NAMESPACE class Q_CORE_EXPORT QLibraryInfo @@ -103,6 +101,4 @@ private: QT_END_NAMESPACE -QT_END_HEADER - #endif // QLIBRARYINFO_H diff --git a/src/corelib/global/qlogging.cpp b/src/corelib/global/qlogging.cpp index 60ba19e625..6a127e1786 100644 --- a/src/corelib/global/qlogging.cpp +++ b/src/corelib/global/qlogging.cpp @@ -57,6 +57,10 @@ #include <slog2.h> #endif +#ifdef Q_OS_ANDROID +#include <android/log.h> +#endif + #include <stdio.h> QT_BEGIN_NAMESPACE @@ -73,7 +77,7 @@ static bool isFatal(QtMsgType msgType) return true; if (msgType == QtWarningMsg) { - static bool fatalWarnings = qEnvironmentVariableIsSet("QT_FATAL_WARNINGS"); + static bool fatalWarnings = !qEnvironmentVariableIsEmpty("QT_FATAL_WARNINGS"); return fatalWarnings; } @@ -115,6 +119,7 @@ static bool isFatal(QtMsgType msgType) extern bool usingWinMain; #endif +#ifdef Q_OS_WIN static inline void convert_to_wchar_t_elided(wchar_t *d, size_t space, const char *s) Q_DECL_NOEXCEPT { size_t len = qstrlen(s); @@ -128,6 +133,7 @@ static inline void convert_to_wchar_t_elided(wchar_t *d, size_t space, const cha *d++ = *s++; *d++ = 0; } +#endif #if !defined(QT_NO_EXCEPTIONS) /*! @@ -521,6 +527,11 @@ static const char functionTokenC[] = "%{function}"; static const char pidTokenC[] = "%{pid}"; static const char appnameTokenC[] = "%{appname}"; static const char threadidTokenC[] = "%{threadid}"; +static const char ifDebugTokenC[] = "%{if-debug}"; +static const char ifWarningTokenC[] = "%{if-warning}"; +static const char ifCriticalTokenC[] = "%{if-critical}"; +static const char ifFatalTokenC[] = "%{if-fatal}"; +static const char endifTokenC[] = "%{endif}"; static const char emptyTokenC[] = ""; static const char defaultPattern[] = "%{message}"; @@ -607,6 +618,10 @@ void QMessagePattern::setPattern(const QString &pattern) tokens = new const char*[lexemes.size() + 1]; tokens[lexemes.size()] = 0; + bool nestedIfError = false; + bool inIf = false; + QString error; + for (int i = 0; i < lexemes.size(); ++i) { const QString lexeme = lexemes.at(i); if (lexeme.startsWith(QLatin1String("%{")) @@ -630,23 +645,28 @@ void QMessagePattern::setPattern(const QString &pattern) tokens[i] = appnameTokenC; else if (lexeme == QLatin1String(threadidTokenC)) tokens[i] = threadidTokenC; - else { - tokens[i] = emptyTokenC; - QString error = QStringLiteral("QT_MESSAGE_PATTERN: Unknown placeholder %1\n") +#define IF_TOKEN(LEVEL) \ + else if (lexeme == QLatin1String(LEVEL)) { \ + if (inIf) \ + nestedIfError = true; \ + tokens[i] = LEVEL; \ + inIf = true; \ + } + IF_TOKEN(ifDebugTokenC) + IF_TOKEN(ifWarningTokenC) + IF_TOKEN(ifCriticalTokenC) + IF_TOKEN(ifFatalTokenC) +#undef IF_TOKEN + else if (lexeme == QLatin1String(endifTokenC)) { + tokens[i] = endifTokenC; + if (!inIf && !nestedIfError) + error += QStringLiteral("QT_MESSAGE_PATTERN: %{endif} without an %{if-*}\n"); + inIf = false; + } else { + tokens[i] = emptyTokenC; + error += QStringLiteral("QT_MESSAGE_PATTERN: Unknown placeholder %1\n") .arg(lexeme); - -#if defined(Q_OS_WINCE) - OutputDebugString(reinterpret_cast<const wchar_t*>(error.utf16())); - continue; -#elif defined(Q_OS_WIN) && defined(QT_BUILD_CORE_LIB) - if (usingWinMain) { - OutputDebugString(reinterpret_cast<const wchar_t*>(error.utf16())); - continue; - } -#endif - fprintf(stderr, "%s", error.toLocal8Bit().constData()); - fflush(stderr); } } else { char *literal = new char[lexeme.size() + 1]; @@ -656,6 +676,24 @@ void QMessagePattern::setPattern(const QString &pattern) tokens[i] = literal; } } + if (nestedIfError) + error += QStringLiteral("QT_MESSAGE_PATTERN: %{if-*} cannot be nested\n"); + else if (inIf) + error += QStringLiteral("QT_MESSAGE_PATTERN: missing %{endif}\n"); + if (!error.isEmpty()) { +#if defined(Q_OS_WINCE) + OutputDebugString(reinterpret_cast<const wchar_t*>(error.utf16())); + if (0) +#elif defined(Q_OS_WIN) && defined(QT_BUILD_CORE_LIB) + if (usingWinMain) { + OutputDebugString(reinterpret_cast<const wchar_t*>(error.utf16())); + } else +#endif + { + fprintf(stderr, "%s", error.toLocal8Bit().constData()); + fflush(stderr); + } + } literals = new const char*[literalsVar.size() + 1]; literals[literalsVar.size()] = 0; memcpy(literals, literalsVar.constData(), literalsVar.size() * sizeof(const char*)); @@ -735,10 +773,16 @@ Q_CORE_EXPORT QString qMessageFormatString(QtMsgType type, const QMessageLogCont if (pattern->tokens[0] == 0) return message; + bool skip = false; + // we do not convert file, function, line literals to local encoding due to overhead for (int i = 0; pattern->tokens[i] != 0; ++i) { const char *token = pattern->tokens[i]; - if (token == messageTokenC) { + if (token == endifTokenC) { + skip = false; + } else if (skip) { + // do nothing + } else if (token == messageTokenC) { message.append(str); } else if (token == categoryTokenC) { message.append(QLatin1String(context.category)); @@ -770,6 +814,14 @@ Q_CORE_EXPORT QString qMessageFormatString(QtMsgType type, const QMessageLogCont message.append(QLatin1String("0x")); message.append(QString::number(qlonglong(QThread::currentThread()->currentThread()), 16)); #endif +#define HANDLE_IF_TOKEN(LEVEL) \ + } else if (token == if##LEVEL##TokenC) { \ + skip = type != Qt##LEVEL##Msg; + HANDLE_IF_TOKEN(Debug) + HANDLE_IF_TOKEN(Warning) + HANDLE_IF_TOKEN(Critical) + HANDLE_IF_TOKEN(Fatal) +#undef HANDLE_IF_TOKEN } else { message.append(QLatin1String(token)); } @@ -787,6 +839,24 @@ Q_CORE_EXPORT QtMsgHandler qInstallMsgHandler(QtMsgHandler); static QtMsgHandler msgHandler = 0; // pointer to debug handler (without context) static QtMessageHandler messageHandler = 0; // pointer to debug handler (with context) +#ifdef Q_OS_ANDROID +static void android_default_message_handler(QtMsgType type, + const QMessageLogContext &context, + const QString &message) +{ + android_LogPriority priority; + switch (type) { + case QtDebugMsg: priority = ANDROID_LOG_DEBUG; break; + case QtWarningMsg: priority = ANDROID_LOG_WARN; break; + case QtCriticalMsg: priority = ANDROID_LOG_ERROR; break; + case QtFatalMsg: priority = ANDROID_LOG_FATAL; break; + }; + + __android_log_print(priority, "Qt", "%s:%d (%s): %s", qPrintable(context.file), context.line, + qPrintable(context.function), qPrintable(message)); +} +#endif //Q_OS_ANDROID + /*! \internal */ @@ -807,6 +877,8 @@ static void qDefaultMessageHandler(QtMsgType type, const QMessageLogContext &con #if defined(QT_USE_SLOG2) slog2_default_handler(type, logMessage.toLocal8Bit().constData()); +#elif defined(Q_OS_ANDROID) + android_default_message_handler(type, context, logMessage); #else fprintf(stderr, "%s", logMessage.toLocal8Bit().constData()); fflush(stderr); @@ -1009,6 +1081,15 @@ void qErrnoWarning(int code, const char *msg, ...) \row \li \c %{type} \li "debug", "warning", "critical" or "fatal" \endtable + You can also use conditionals on the type of the message using \c %{if-debug}, + \c %{if-warning}, \c %{if-critical} or \c %{if-fatal} followed by an \c %{endif}. + What is inside the \c %{if-*} and \c %{endif} will only be printed if the type matches. + + Example: + \code + QT_MESSAGE_PATTERN="[%{if-debug}D%{endif}%{if-warning}W%{endif}%{if-critical}C%{endif}%{if-fatal}F%{endif}] %{file}:%{line} - %{message}" + \endcode + The default \a pattern is "%{message}". The \a pattern can also be changed at runtime by setting the QT_MESSAGE_PATTERN diff --git a/src/corelib/global/qlogging.h b/src/corelib/global/qlogging.h index 7d8f7313c8..a6f244698d 100644 --- a/src/corelib/global/qlogging.h +++ b/src/corelib/global/qlogging.h @@ -49,7 +49,6 @@ #pragma qt_no_master_include #endif -QT_BEGIN_HEADER QT_BEGIN_NAMESPACE /* @@ -172,6 +171,4 @@ Q_CORE_EXPORT QtMessageHandler qInstallMessageHandler(QtMessageHandler); Q_CORE_EXPORT void qSetMessagePattern(const QString &messagePattern); QT_END_NAMESPACE -QT_END_HEADER - #endif // QLOGGING_H diff --git a/src/corelib/global/qnamespace.h b/src/corelib/global/qnamespace.h index e6cd166832..41bca2a443 100644 --- a/src/corelib/global/qnamespace.h +++ b/src/corelib/global/qnamespace.h @@ -44,8 +44,6 @@ #include <QtCore/qglobal.h> -QT_BEGIN_HEADER - QT_BEGIN_NAMESPACE @@ -327,6 +325,15 @@ public: Q_DECLARE_FLAGS(WindowStates, WindowState) + enum ApplicationState { + ApplicationSuspended = 0x00000000, + ApplicationHidden = 0x00000001, + ApplicationInactive = 0x00000002, + ApplicationActive = 0x00000004 + }; + + Q_DECLARE_FLAGS(ApplicationStates, ApplicationState) + enum ScreenOrientation { PrimaryOrientation = 0x00000000, PortraitOrientation = 0x00000001, @@ -1300,6 +1307,8 @@ public: ImhPreferLatin = 0x200, + ImhMultiLine = 0x400, + ImhDigitsOnly = 0x10000, ImhFormattedNumbersOnly = 0x20000, ImhUppercaseOnly = 0x40000, @@ -1397,7 +1406,8 @@ public: ItemIsDropEnabled = 8, ItemIsUserCheckable = 16, ItemIsEnabled = 32, - ItemIsTristate = 64 + ItemIsTristate = 64, + ItemNeverHasChildren = 128 }; Q_DECLARE_FLAGS(ItemFlags, ItemFlag) @@ -1603,6 +1613,4 @@ public: QT_END_NAMESPACE -QT_END_HEADER - #endif // QNAMESPACE_H diff --git a/src/corelib/global/qnamespace.qdoc b/src/corelib/global/qnamespace.qdoc index cb18dde724..8ec206a572 100644 --- a/src/corelib/global/qnamespace.qdoc +++ b/src/corelib/global/qnamespace.qdoc @@ -1783,6 +1783,36 @@ */ /*! + \enum Qt::ApplicationState + + \keyword application state + + This enum type is used to specify the current state of the application. + + The states are + + \value ApplicationSuspended The application is about to suspend. When entering this state, the + application should save its state, cease all activities, and be + prepared for code execution to stop. While suspended, the + application can be killed at any time without further warnings + (e.g. when low memory forces the OS to purge suspended applications). + \value ApplicationHidden The application is hidden and runs in the background. This + is the normal state for applications that need to do background + processing, like playing music, while the user interacts with + other applications. The application should free up all graphical + resources when entering this state. + \value ApplicationInactive The application is visible, but not selected to be in front. + On desktop platforms, this typically means that the user + activated another application. On mobile platforms, it is + more common to enter this state when the OS is interrupting + the user with e.g. incoming calls or SMS-messages. + While in this state, consider reducing CPU-intensive tasks. + \value ApplicationActive The application is visible and selected to be in front. + + \since 5.1 +*/ + +/*! \enum Qt::ScreenOrientation This enum type specifies the various orientations a screen might have. @@ -2315,6 +2345,8 @@ \value ImhTime The text editor functions as a time field. \value ImhPreferLatin Latin characters are preferred (but not required). + \value ImhMultiLine Multiple lines can be entered into the text field. + Flags that restrict input (exclusive flags): \value ImhDigitsOnly Only digits are allowed. @@ -2441,6 +2473,7 @@ \value ItemIsUserCheckable It can be checked or unchecked by the user. \value ItemIsEnabled The user can interact with the item. \value ItemIsTristate The item is checkable with three separate states. + \value ItemNeverHasChildren The item never has child items. Note that checkable items need to be given both a suitable set of flags and an initial state, indicating whether the item is checked or not. diff --git a/src/corelib/global/qnumeric.h b/src/corelib/global/qnumeric.h index f8e84825c0..25db5443eb 100644 --- a/src/corelib/global/qnumeric.h +++ b/src/corelib/global/qnumeric.h @@ -44,8 +44,6 @@ #include <QtCore/qglobal.h> -QT_BEGIN_HEADER - QT_BEGIN_NAMESPACE @@ -65,6 +63,4 @@ Q_CORE_EXPORT double qInf(); QT_END_NAMESPACE -QT_END_HEADER - #endif // QNUMERIC_H diff --git a/src/corelib/global/qprocessordetection.h b/src/corelib/global/qprocessordetection.h index c005c5446e..86023d1703 100644 --- a/src/corelib/global/qprocessordetection.h +++ b/src/corelib/global/qprocessordetection.h @@ -118,6 +118,7 @@ # define Q_PROCESSOR_ARM_V6 # define Q_PROCESSOR_ARM_V5 # elif defined(__ARM_ARCH_5TEJ__) \ + || defined(__ARM_ARCH_5TE__) \ || (defined(__TARGET_ARCH_ARM) && __TARGET_ARCH_ARM-0 >= 5) \ || (defined(_M_ARM) && _M_ARM-0 >= 5) # define Q_PROCESSOR_ARM_V5 diff --git a/src/corelib/global/qsysinfo.h b/src/corelib/global/qsysinfo.h index c95c1674eb..edeef3c461 100644 --- a/src/corelib/global/qsysinfo.h +++ b/src/corelib/global/qsysinfo.h @@ -44,7 +44,6 @@ #ifndef QSYSINFO_H #define QSYSINFO_H -QT_BEGIN_HEADER QT_BEGIN_NAMESPACE /* @@ -151,6 +150,4 @@ public: }; QT_END_NAMESPACE -QT_END_HEADER - #endif // QSYSINFO_H diff --git a/src/corelib/global/qsystemdetection.h b/src/corelib/global/qsystemdetection.h index 5f9671932f..0caac3d797 100644 --- a/src/corelib/global/qsystemdetection.h +++ b/src/corelib/global/qsystemdetection.h @@ -50,6 +50,8 @@ The operating system, must be one of: (Q_OS_x) DARWIN - Darwin OS (synonym for Q_OS_MAC) + MAC - Mac OS X or iOS (iPhoneOS) + IOS - iOS (treated as a variant of Mac OS) MSDOS - MS-DOS and Windows OS2 - OS/2 OS2EMX - XFree86 on OS/2 (not PM) @@ -78,6 +80,7 @@ LYNX - LynxOS BSD4 - Any BSD 4.4 system UNIX - Any UNIX BSD/SYSV system + ANDROID - Android platform */ #if defined(__APPLE__) && (defined(__GNUC__) || defined(__xlC__) || defined(__xlc__)) @@ -88,6 +91,9 @@ # else # define Q_OS_DARWIN32 # endif +#elif defined(ANDROID) +# define Q_OS_ANDROID +# define Q_OS_LINUX #elif defined(__CYGWIN__) # define Q_OS_CYGWIN #elif !defined(SAG_COM) && (defined(WIN64) || defined(_WIN64) || defined(__WIN64__)) @@ -166,6 +172,10 @@ # elif defined(Q_OS_DARWIN32) # define Q_OS_MAC32 # endif +# include <TargetConditionals.h> +# if defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE +# define Q_OS_IOS +# endif #endif #if defined(Q_OS_WIN) @@ -175,30 +185,50 @@ #endif #ifdef Q_OS_DARWIN -# ifdef MAC_OS_X_VERSION_MIN_REQUIRED -# undef MAC_OS_X_VERSION_MIN_REQUIRED +# include <Availability.h> +# if !defined(__MAC_OS_X_VERSION_MIN_REQUIRED) || __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_6 +# undef __MAC_OS_X_VERSION_MIN_REQUIRED +# define __MAC_OS_X_VERSION_MIN_REQUIRED __MAC_10_6 # endif -# define MAC_OS_X_VERSION_MIN_REQUIRED MAC_OS_X_VERSION_10_4 # include <AvailabilityMacros.h> -# if !defined(MAC_OS_X_VERSION_10_3) -# define MAC_OS_X_VERSION_10_3 MAC_OS_X_VERSION_10_2 + 1 +# if !defined(MAC_OS_X_VERSION_MIN_REQUIRED) || MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_6 +# undef MAC_OS_X_VERSION_MIN_REQUIRED +# define MAC_OS_X_VERSION_MIN_REQUIRED MAC_OS_X_VERSION_10_6 # endif -# if !defined(MAC_OS_X_VERSION_10_4) -# define MAC_OS_X_VERSION_10_4 MAC_OS_X_VERSION_10_3 + 1 +# +# // Numerical checks are preferred to named checks, but to be safe +# // we define the missing version names in case Qt uses them. +# +# if !defined(__MAC_10_7) +# define __MAC_10_7 1070 # endif -# if !defined(MAC_OS_X_VERSION_10_5) -# define MAC_OS_X_VERSION_10_5 MAC_OS_X_VERSION_10_4 + 1 -# endif -# if !defined(MAC_OS_X_VERSION_10_6) -# define MAC_OS_X_VERSION_10_6 MAC_OS_X_VERSION_10_5 + 1 +# if !defined(__MAC_10_8) +# define __MAC_10_8 1080 # endif # if !defined(MAC_OS_X_VERSION_10_7) -# define MAC_OS_X_VERSION_10_7 MAC_OS_X_VERSION_10_6 + 1 +# define MAC_OS_X_VERSION_10_7 1070 # endif # if !defined(MAC_OS_X_VERSION_10_8) -# define MAC_OS_X_VERSION_10_8 MAC_OS_X_VERSION_10_7 + 1 +# define MAC_OS_X_VERSION_10_8 1080 +# endif +# +# if !defined(__IPHONE_4_3) +# define __IPHONE_4_3 40300 +# endif +# if !defined(__IPHONE_5_0) +# define __IPHONE_5_0 50000 +# endif +# if !defined(__IPHONE_5_1) +# define __IPHONE_5_1 50100 +# endif +# if !defined(__IPHONE_6_0) +# define __IPHONE_6_0 60000 +# endif +# if !defined(__IPHONE_6_1) +# define __IPHONE_6_1 60100 # endif -# if (MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_8) +# +# if (__MAC_OS_X_VERSION_MAX_ALLOWED > __MAC_10_8) # warning "This version of Mac OS X is unsupported" # endif #endif diff --git a/src/corelib/global/qt_windows.h b/src/corelib/global/qt_windows.h index 26b55336ed..c3266c5487 100644 --- a/src/corelib/global/qt_windows.h +++ b/src/corelib/global/qt_windows.h @@ -42,6 +42,11 @@ #ifndef QT_WINDOWS_H #define QT_WINDOWS_H +#if 0 +#pragma qt_sync_skip_header_check +#pragma qt_sync_stop_processing +#endif + #if defined(Q_CC_BOR) // Borland's windows.h does not set these correctly, resulting in // unusable WinSDK standard dialogs diff --git a/src/corelib/global/qtypeinfo.h b/src/corelib/global/qtypeinfo.h index 754aa6712b..8e34c9792d 100644 --- a/src/corelib/global/qtypeinfo.h +++ b/src/corelib/global/qtypeinfo.h @@ -44,7 +44,6 @@ #ifndef QTYPEINFO_H #define QTYPEINFO_H -QT_BEGIN_HEADER QT_BEGIN_NAMESPACE /* @@ -241,6 +240,4 @@ Q_DECLARE_TYPEINFO(long double, Q_PRIMITIVE_TYPE); #endif QT_END_NAMESPACE -QT_END_HEADER - #endif // QTYPEINFO_H diff --git a/src/corelib/global/qtypetraits.h b/src/corelib/global/qtypetraits.h index 54b48667b4..7ccad067d0 100644 --- a/src/corelib/global/qtypetraits.h +++ b/src/corelib/global/qtypetraits.h @@ -109,7 +109,6 @@ #include <utility> // For pair -QT_BEGIN_HEADER QT_BEGIN_NAMESPACE namespace QtPrivate { @@ -505,6 +504,4 @@ Q_STATIC_ASSERT(( is_signed<qint64>::value)); } // namespace QtPrivate QT_END_NAMESPACE -QT_END_HEADER - #endif // QTYPETRAITS_H diff --git a/src/corelib/io/io.pri b/src/corelib/io/io.pri index f57dcebe33..3f100593bb 100644 --- a/src/corelib/io/io.pri +++ b/src/corelib/io/io.pri @@ -18,14 +18,19 @@ HEADERS += \ io/qipaddress_p.h \ io/qiodevice.h \ io/qiodevice_p.h \ + io/qlockfile.h \ + io/qlockfile_p.h \ io/qnoncontiguousbytedevice_p.h \ io/qprocess.h \ io/qprocess_p.h \ io/qtextstream.h \ + io/qtextstream_p.h \ io/qtemporarydir.h \ io/qtemporaryfile.h \ + io/qtemporaryfile_p.h \ io/qresource_p.h \ io/qresource_iterator_p.h \ + io/qsavefile.h \ io/qstandardpaths.h \ io/qurl.h \ io/qurl_p.h \ @@ -58,6 +63,7 @@ SOURCES += \ io/qfileinfo.cpp \ io/qipaddress.cpp \ io/qiodevice.cpp \ + io/qlockfile.cpp \ io/qnoncontiguousbytedevice.cpp \ io/qprocess.cpp \ io/qtextstream.cpp \ @@ -65,6 +71,7 @@ SOURCES += \ io/qtemporaryfile.cpp \ io/qresource.cpp \ io/qresource_iterator.cpp \ + io/qsavefile.cpp \ io/qstandardpaths.cpp \ io/qurl.cpp \ io/qurlidna.cpp \ @@ -81,6 +88,7 @@ SOURCES += \ win32 { SOURCES += io/qsettings_win.cpp SOURCES += io/qfsfileengine_win.cpp + SOURCES += io/qlockfile_win.cpp SOURCES += io/qfilesystemwatcher_win.cpp HEADERS += io/qfilesystemwatcher_win_p.h @@ -105,15 +113,16 @@ win32 { SOURCES += \ io/qfsfileengine_unix.cpp \ io/qfilesystemengine_unix.cpp \ + io/qlockfile_unix.cpp \ io/qprocess_unix.cpp \ io/qfilesystemiterator_unix.cpp \ - !nacl:macx-*: { + !nacl:mac: { SOURCES += io/qfilesystemengine_mac.cpp SOURCES += io/qsettings_mac.cpp } - macx-*: { - !ios { + mac { + macx { SOURCES += io/qstandardpaths_mac.cpp } else { SOURCES += io/qstandardpaths_unix.cpp @@ -124,13 +133,13 @@ win32 { SOURCES += io/qstandardpaths_unix.cpp } - linux-*|if(qnx:contains(QT_CONFIG, inotify)) { + linux|if(qnx:contains(QT_CONFIG, inotify)) { SOURCES += io/qfilesystemwatcher_inotify.cpp HEADERS += io/qfilesystemwatcher_inotify_p.h } !nacl { - freebsd-*|macx-*|darwin-*|openbsd-*:{ + freebsd-*|mac|darwin-*|openbsd-*:{ SOURCES += io/qfilesystemwatcher_kqueue.cpp HEADERS += io/qfilesystemwatcher_kqueue_p.h } diff --git a/src/corelib/io/qabstractfileengine.cpp b/src/corelib/io/qabstractfileengine.cpp index 2d9cb85d9f..9cdbbbbb25 100644 --- a/src/corelib/io/qabstractfileengine.cpp +++ b/src/corelib/io/qabstractfileengine.cpp @@ -400,6 +400,19 @@ bool QAbstractFileEngine::close() } /*! + \since 5.1 + + Flushes and syncs the file to disk. + + Returns true if successful; otherwise returns false. + The default implementation always returns false. +*/ +bool QAbstractFileEngine::syncToDisk() +{ + return false; +} + +/*! Flushes the open file, returning true if successful; otherwise returns false. @@ -496,6 +509,24 @@ bool QAbstractFileEngine::rename(const QString &newName) } /*! + \since 5.1 + + Requests that the file be renamed to \a newName in the file + system. If the new name already exists, it must be overwritten. + If the operation succeeds, returns true; otherwise returns + false. + + This virtual function must be reimplemented by all subclasses. + + \sa setFileName() + */ +bool QAbstractFileEngine::renameOverwrite(const QString &newName) +{ + Q_UNUSED(newName); + return false; +} + +/*! Creates a link from the file currently specified by fileName() to \a newName. What a link is depends on the underlying filesystem (be it a shortcut on Windows or a symbolic link on Unix). Returns diff --git a/src/corelib/io/qabstractfileengine_p.h b/src/corelib/io/qabstractfileengine_p.h index 868b086b57..dd64e3d71f 100644 --- a/src/corelib/io/qabstractfileengine_p.h +++ b/src/corelib/io/qabstractfileengine_p.h @@ -66,7 +66,7 @@ class QVariant; class QAbstractFileEngineIterator; class QAbstractFileEnginePrivate; -class Q_AUTOTEST_EXPORT QAbstractFileEngine +class Q_CORE_EXPORT QAbstractFileEngine { public: enum FileFlag { @@ -124,6 +124,7 @@ public: virtual bool open(QIODevice::OpenMode openMode); virtual bool close(); virtual bool flush(); + virtual bool syncToDisk(); virtual qint64 size() const; virtual qint64 pos() const; virtual bool seek(qint64 pos); @@ -131,6 +132,7 @@ public: virtual bool remove(); virtual bool copy(const QString &newName); virtual bool rename(const QString &newName); + virtual bool renameOverwrite(const QString &newName); virtual bool link(const QString &newName); virtual bool mkdir(const QString &dirName, bool createParentDirectories) const; virtual bool rmdir(const QString &dirName, bool recurseParentDirectories) const; @@ -208,7 +210,7 @@ private: Q_DECLARE_OPERATORS_FOR_FLAGS(QAbstractFileEngine::FileFlags) -class Q_AUTOTEST_EXPORT QAbstractFileEngineHandler +class Q_CORE_EXPORT QAbstractFileEngineHandler { public: QAbstractFileEngineHandler(); @@ -217,7 +219,7 @@ public: }; class QAbstractFileEngineIteratorPrivate; -class Q_AUTOTEST_EXPORT QAbstractFileEngineIterator +class Q_CORE_EXPORT QAbstractFileEngineIterator { public: QAbstractFileEngineIterator(QDir::Filters filters, const QStringList &nameFilters); diff --git a/src/corelib/io/qbuffer.h b/src/corelib/io/qbuffer.h index f246f1375f..de0fe9f36a 100644 --- a/src/corelib/io/qbuffer.h +++ b/src/corelib/io/qbuffer.h @@ -45,8 +45,6 @@ #include <QtCore/qiodevice.h> #include <QtCore/qbytearray.h> -QT_BEGIN_HEADER - QT_BEGIN_NAMESPACE @@ -106,6 +104,4 @@ inline void QBuffer::setData(const char *adata, int alen) QT_END_NAMESPACE -QT_END_HEADER - #endif // QBUFFER_H diff --git a/src/corelib/io/qdatastream.cpp b/src/corelib/io/qdatastream.cpp index 544e9e8592..8f788ac355 100644 --- a/src/corelib/io/qdatastream.cpp +++ b/src/corelib/io/qdatastream.cpp @@ -251,7 +251,7 @@ QT_BEGIN_NAMESPACE return retVal; enum { - DefaultStreamVersion = QDataStream::Qt_5_0 + DefaultStreamVersion = QDataStream::Qt_5_1 }; /*! @@ -539,6 +539,7 @@ void QDataStream::setByteOrder(ByteOrder bo) \value Qt_4_8 Same as Qt_4_6. \value Qt_4_9 Same as Qt_4_6. \value Qt_5_0 Version 13 (Qt 5.0) + \value Qt_5_1 Same as Qt_5_0. \sa setVersion(), version() */ diff --git a/src/corelib/io/qdatastream.h b/src/corelib/io/qdatastream.h index 092f3a15b3..6017ba5e7d 100644 --- a/src/corelib/io/qdatastream.h +++ b/src/corelib/io/qdatastream.h @@ -50,8 +50,6 @@ #error qdatastream.h must be included before any header file that defines Status #endif -QT_BEGIN_HEADER - QT_BEGIN_NAMESPACE @@ -87,8 +85,9 @@ public: Qt_4_7 = Qt_4_6, Qt_4_8 = Qt_4_7, Qt_4_9 = Qt_4_8, - Qt_5_0 = 13 -#if QT_VERSION >= 0x050100 + Qt_5_0 = 13, + Qt_5_1 = Qt_5_0 +#if QT_VERSION >= 0x050200 #error Add the datastream version for this Qt version #endif }; @@ -434,6 +433,4 @@ inline QDataStream& operator<<(QDataStream& s, const QPair<T1, T2>& p) QT_END_NAMESPACE -QT_END_HEADER - #endif // QDATASTREAM_H diff --git a/src/corelib/io/qdebug.cpp b/src/corelib/io/qdebug.cpp index bd43963139..9cb5609dac 100644 --- a/src/corelib/io/qdebug.cpp +++ b/src/corelib/io/qdebug.cpp @@ -47,6 +47,9 @@ #endif #include "qdebug.h" +#include <private/qtextstream_p.h> + +QT_BEGIN_NAMESPACE // This file is needed to force compilation of QDebug into the kernel library. @@ -170,6 +173,8 @@ between writes. \since 5.0 + + \sa QDebugStateSaver */ /*! @@ -179,6 +184,8 @@ automatic insertion of spaces is disabled. \since 5.0 + + \sa QDebugStateSaver */ /*! @@ -321,3 +328,69 @@ \fn QDebug &QDebug::operator<<(QTextStreamManipulator m) \internal */ + +/*! + \class QDebugStateSaver + + \brief Convenience class for custom QDebug operators + + Saves the settings used by QDebug, and restores them upon destruction. + + The automatic insertion of spaces between writes is one of the settings + that QDebugStateSaver stores for the duration of the current block. + + The settings of the internal QTextStream are also saved and restored, + so that using << hex in a QDebug operator doesn't affect other QDebug + operators. + + \since 5.1 +*/ + +class QDebugStateSaverPrivate +{ +public: + QDebugStateSaverPrivate(QDebug &dbg) + : m_dbg(dbg), + m_spaces(dbg.autoInsertSpaces()), + m_streamParams(dbg.stream->ts.d_ptr->params) + { + } + void restoreState() + { + m_dbg.setAutoInsertSpaces(m_spaces); + m_dbg.stream->ts.d_ptr->params = m_streamParams; + } + + QDebug &m_dbg; + + // QDebug state + const bool m_spaces; + + // QTextStream state + const QTextStreamPrivate::Params m_streamParams; +}; + + +/*! + Creates a QDebugStateSaver instance, which saves the settings + currently used by \a dbg. + + \sa QDebug::setAutoInsertSpaces(), QDebug::autoInsertSpaces() +*/ +QDebugStateSaver::QDebugStateSaver(QDebug &dbg) + : d(new QDebugStateSaverPrivate(dbg)) +{ +} + +/*! + Destroyes a QDebugStateSaver instance, which restores the settings + used by \a dbg when the QDebugStateSaver instance was created. + + \sa QDebug::setAutoInsertSpaces(), QDebug::autoInsertSpaces() +*/ +QDebugStateSaver::~QDebugStateSaver() +{ + d->restoreState(); +} + +QT_END_NAMESPACE diff --git a/src/corelib/io/qdebug.h b/src/corelib/io/qdebug.h index be8252fbb2..ce72fcd26d 100644 --- a/src/corelib/io/qdebug.h +++ b/src/corelib/io/qdebug.h @@ -53,14 +53,13 @@ #include <QtCore/qset.h> #include <QtCore/qcontiguouscache.h> -QT_BEGIN_HEADER - QT_BEGIN_NAMESPACE class Q_CORE_EXPORT QDebug { friend class QMessageLogger; + friend class QDebugStateSaverPrivate; struct Stream { Stream(QIODevice *device) : ts(device), ref(1), type(QtDebugMsg), space(true), message_output(false) {} Stream(QString *string) : ts(string, QIODevice::WriteOnly), ref(1), type(QtDebugMsg), space(true), message_output(false) {} @@ -132,6 +131,17 @@ public: Q_DECLARE_SHARED(QDebug) +class QDebugStateSaverPrivate; +class Q_CORE_EXPORT QDebugStateSaver +{ +public: + QDebugStateSaver(QDebug &dbg); + ~QDebugStateSaver(); +private: + Q_DISABLE_COPY(QDebugStateSaver) + QScopedPointer<QDebugStateSaverPrivate> d; +}; + class QNoDebug { public: @@ -279,6 +289,4 @@ inline QDebug operator<<(QDebug debug, const QFlags<T> &flags) QT_END_NAMESPACE -QT_END_HEADER - #endif // QDEBUG_H diff --git a/src/corelib/io/qdir.h b/src/corelib/io/qdir.h index 00091bb0d1..dbb6d93d2e 100644 --- a/src/corelib/io/qdir.h +++ b/src/corelib/io/qdir.h @@ -47,8 +47,6 @@ #include <QtCore/qstringlist.h> #include <QtCore/qshareddata.h> -QT_BEGIN_HEADER - QT_BEGIN_NAMESPACE @@ -236,6 +234,4 @@ Q_CORE_EXPORT QDebug operator<<(QDebug debug, const QDir &dir); QT_END_NAMESPACE -QT_END_HEADER - #endif // QDIR_H diff --git a/src/corelib/io/qdiriterator.h b/src/corelib/io/qdiriterator.h index f0601e602e..4a96005570 100644 --- a/src/corelib/io/qdiriterator.h +++ b/src/corelib/io/qdiriterator.h @@ -44,8 +44,6 @@ #include <QtCore/qdir.h> -QT_BEGIN_HEADER - QT_BEGIN_NAMESPACE @@ -91,6 +89,4 @@ Q_DECLARE_OPERATORS_FOR_FLAGS(QDirIterator::IteratorFlags) QT_END_NAMESPACE -QT_END_HEADER - #endif diff --git a/src/corelib/io/qfile.h b/src/corelib/io/qfile.h index 2e86af3703..2e75e29995 100644 --- a/src/corelib/io/qfile.h +++ b/src/corelib/io/qfile.h @@ -50,8 +50,6 @@ #error qfile.h must be included before any header file that defines open #endif -QT_BEGIN_HEADER - QT_BEGIN_NAMESPACE class QTemporaryFile; @@ -154,6 +152,4 @@ private: QT_END_NAMESPACE -QT_END_HEADER - #endif // QFILE_H diff --git a/src/corelib/io/qfiledevice.h b/src/corelib/io/qfiledevice.h index fc07097b1c..fc2779086a 100644 --- a/src/corelib/io/qfiledevice.h +++ b/src/corelib/io/qfiledevice.h @@ -45,8 +45,6 @@ #include <QtCore/qiodevice.h> #include <QtCore/qstring.h> -QT_BEGIN_HEADER - QT_BEGIN_NAMESPACE class QFileDevicePrivate; @@ -142,6 +140,4 @@ Q_DECLARE_OPERATORS_FOR_FLAGS(QFileDevice::Permissions) QT_END_NAMESPACE -QT_END_HEADER - #endif // QFILEDEVICE_H diff --git a/src/corelib/io/qfileinfo.h b/src/corelib/io/qfileinfo.h index 938114f9d1..211c18d0a0 100644 --- a/src/corelib/io/qfileinfo.h +++ b/src/corelib/io/qfileinfo.h @@ -47,8 +47,6 @@ #include <QtCore/qshareddata.h> #include <QtCore/qmetatype.h> -QT_BEGIN_HEADER - QT_BEGIN_NAMESPACE @@ -159,6 +157,4 @@ QT_END_NAMESPACE Q_DECLARE_METATYPE(QFileInfo) -QT_END_HEADER - #endif // QFILEINFO_H diff --git a/src/corelib/io/qfilesystemengine.cpp b/src/corelib/io/qfilesystemengine.cpp index 0fd77fbeb5..71ecc4a0a0 100644 --- a/src/corelib/io/qfilesystemengine.cpp +++ b/src/corelib/io/qfilesystemengine.cpp @@ -272,8 +272,7 @@ void QFileSystemMetaData::fillFromStatBuf(const QT_STATBUF &statBuffer) // Attributes entryFlags |= QFileSystemMetaData::ExistsAttribute; size_ = statBuffer.st_size; -#if defined (Q_OS_MAC) && !defined(Q_OS_IOS) \ - && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 +#if defined (Q_OS_MAC) && !defined(Q_OS_IOS) if (statBuffer.st_flags & UF_HIDDEN) { entryFlags |= QFileSystemMetaData::HiddenAttribute; knownFlagsMask |= QFileSystemMetaData::HiddenAttribute; diff --git a/src/corelib/io/qfilesystemengine_unix.cpp b/src/corelib/io/qfilesystemengine_unix.cpp index 4af01f6730..4bfb03a41e 100644 --- a/src/corelib/io/qfilesystemengine_unix.cpp +++ b/src/corelib/io/qfilesystemengine_unix.cpp @@ -169,7 +169,7 @@ QFileSystemEntry QFileSystemEngine::canonicalName(const QFileSystemEntry &entry, if (entry.isEmpty() || entry.isRoot()) return entry; -#if !defined(Q_OS_MAC) && !defined(Q_OS_QNX) && _POSIX_VERSION < 200809L +#if !defined(Q_OS_MAC) && !defined(Q_OS_QNX) && !defined(Q_OS_ANDROID) && _POSIX_VERSION < 200809L // realpath(X,0) is not supported Q_UNUSED(data); return QFileSystemEntry(slowCanonicalized(absoluteName(entry).filePath())); @@ -286,7 +286,7 @@ QString QFileSystemEngine::resolveUserName(uint userId) struct passwd *pw = 0; #if !defined(Q_OS_INTEGRITY) -#if !defined(QT_NO_THREAD) && defined(_POSIX_THREAD_SAFE_FUNCTIONS) && !defined(Q_OS_OPENBSD) +#if !defined(QT_NO_THREAD) && defined(_POSIX_THREAD_SAFE_FUNCTIONS) && !defined(Q_OS_OPENBSD) && !defined(Q_OS_VXWORKS) struct passwd entry; getpwuid_r(userId, &entry, buf.data(), buf.size(), &pw); #else @@ -310,7 +310,7 @@ QString QFileSystemEngine::resolveGroupName(uint groupId) struct group *gr = 0; #if !defined(Q_OS_INTEGRITY) -#if !defined(QT_NO_THREAD) && defined(_POSIX_THREAD_SAFE_FUNCTIONS) && !defined(Q_OS_OPENBSD) +#if !defined(QT_NO_THREAD) && defined(_POSIX_THREAD_SAFE_FUNCTIONS) && !defined(Q_OS_OPENBSD) && !defined(Q_OS_VXWORKS) size_max = sysconf(_SC_GETGR_R_SIZE_MAX); if (size_max == -1) size_max = 1024; @@ -360,12 +360,10 @@ bool QFileSystemEngine::fillMetaData(const QFileSystemEntry &entry, QFileSystemM if (!data.hasFlags(QFileSystemMetaData::DirectoryType)) what |= QFileSystemMetaData::DirectoryType; } -# if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 if (what & QFileSystemMetaData::HiddenAttribute) { // Mac OS >= 10.5: st_flags & UF_HIDDEN what |= QFileSystemMetaData::PosixStatFlags; } -# endif // MAC_OS_X_VERSION_MAX_ALLOWED... #endif // defined(Q_OS_MAC) && !defined(Q_OS_IOS) if (what & QFileSystemMetaData::PosixStatFlags) @@ -685,8 +683,16 @@ QFileSystemEntry QFileSystemEngine::currentPath() } #else char currentName[PATH_MAX+1]; - if (::getcwd(currentName, PATH_MAX)) + if (::getcwd(currentName, PATH_MAX)) { +#if defined(Q_OS_VXWORKS) && defined(VXWORKS_VXSIM) + QByteArray dir(currentName); + if (dir.indexOf(':') < dir.indexOf('/')) + dir.remove(0, dir.indexOf(':')+1); + + qstrncpy(currentName, dir.constData(), PATH_MAX); +#endif result = QFileSystemEntry(QByteArray(currentName), QFileSystemEntry::FromNativePath()); + } # if defined(QT_DEBUG) if (result.isEmpty()) qWarning("QFileSystemEngine::currentPath: getcwd() failed"); diff --git a/src/corelib/io/qfilesystemwatcher.h b/src/corelib/io/qfilesystemwatcher.h index e2f48ce0bf..5a326075ba 100644 --- a/src/corelib/io/qfilesystemwatcher.h +++ b/src/corelib/io/qfilesystemwatcher.h @@ -46,8 +46,6 @@ #ifndef QT_NO_FILESYSTEMWATCHER -QT_BEGIN_HEADER - QT_BEGIN_NAMESPACE @@ -90,7 +88,5 @@ private: QT_END_NAMESPACE -QT_END_HEADER - #endif // QT_NO_FILESYSTEMWATCHER #endif // QFILESYSTEMWATCHER_H diff --git a/src/corelib/io/qfsfileengine.cpp b/src/corelib/io/qfsfileengine.cpp index 3963416084..f0f3c935e6 100644 --- a/src/corelib/io/qfsfileengine.cpp +++ b/src/corelib/io/qfsfileengine.cpp @@ -419,6 +419,17 @@ bool QFSFileEngine::flush() } /*! + \reimp +*/ +bool QFSFileEngine::syncToDisk() +{ + Q_D(QFSFileEngine); + if ((d->openMode & QIODevice::WriteOnly) == 0) + return true; + return d->nativeSyncToDisk(); +} + +/*! \internal */ bool QFSFileEnginePrivate::flushFh() @@ -908,6 +919,11 @@ bool QFSFileEngine::supportsExtension(Extension extension) const \reimp */ + +/*! \fn bool QFSFileEngine::renameOverwrite(const QString &newName) + \reimp +*/ + /*! \fn bool QFSFileEngine::rmdir(const QString &name, bool recurseParentDirectories) const \reimp */ diff --git a/src/corelib/io/qfsfileengine_p.h b/src/corelib/io/qfsfileengine_p.h index d19310b6b6..21f38fea1d 100644 --- a/src/corelib/io/qfsfileengine_p.h +++ b/src/corelib/io/qfsfileengine_p.h @@ -81,6 +81,7 @@ public: bool open(QIODevice::OpenMode flags, FILE *fh); bool close(); bool flush(); + bool syncToDisk(); qint64 size() const; qint64 pos() const; bool seek(qint64); @@ -88,6 +89,7 @@ public: bool remove(); bool copy(const QString &newName); bool rename(const QString &newName); + bool renameOverwrite(const QString &newName); bool link(const QString &newName); bool mkdir(const QString &dirName, bool createParentDirectories) const; bool rmdir(const QString &dirName, bool recurseParentDirectories) const; @@ -149,6 +151,7 @@ public: bool nativeClose(); bool closeFdFh(); bool nativeFlush(); + bool nativeSyncToDisk(); bool flushFh(); qint64 nativeSize() const; #ifndef Q_OS_WIN diff --git a/src/corelib/io/qfsfileengine_unix.cpp b/src/corelib/io/qfsfileengine_unix.cpp index 482f65e7f6..a5f077bd0b 100644 --- a/src/corelib/io/qfsfileengine_unix.cpp +++ b/src/corelib/io/qfsfileengine_unix.cpp @@ -258,6 +258,23 @@ bool QFSFileEnginePrivate::nativeFlush() /*! \internal + \since 5.1 +*/ +bool QFSFileEnginePrivate::nativeSyncToDisk() +{ + Q_Q(QFSFileEngine); +#if defined(_POSIX_SYNCHRONIZED_IO) && _POSIX_SYNCHRONIZED_IO > 0 + const int ret = fdatasync(nativeHandle()); +#else + const int ret = fsync(nativeHandle()); +#endif + if (ret != 0) + q->setError(QFile::WriteError, qt_error_string(errno)); + return ret == 0; +} + +/*! + \internal */ qint64 QFSFileEnginePrivate::nativeRead(char *data, qint64 len) { @@ -388,6 +405,12 @@ bool QFSFileEngine::copy(const QString &newName) return ret; } +bool QFSFileEngine::renameOverwrite(const QString &newName) +{ + // On Unix, rename() overwrites. + return rename(newName); +} + bool QFSFileEngine::rename(const QString &newName) { Q_D(QFSFileEngine); diff --git a/src/corelib/io/qfsfileengine_win.cpp b/src/corelib/io/qfsfileengine_win.cpp index 24631f11c7..23ab507dad 100644 --- a/src/corelib/io/qfsfileengine_win.cpp +++ b/src/corelib/io/qfsfileengine_win.cpp @@ -198,15 +198,25 @@ bool QFSFileEnginePrivate::nativeFlush() return true; } - // Windows native mode; flushing is - // unnecessary. FlushFileBuffers(), the equivalent of sync() or - // fsync() on Unix, does a low-level flush to the disk, and we - // don't expose an API for this. + // Windows native mode; flushing is unnecessary. return true; } /* \internal + \since 5.1 +*/ +bool QFSFileEnginePrivate::nativeSyncToDisk() +{ + if (fh || fd != -1) { + // stdlib / stdio mode. No API available. + return false; + } + return FlushFileBuffers(fileHandle); +} + +/* + \internal */ qint64 QFSFileEnginePrivate::nativeSize() const { @@ -507,6 +517,17 @@ bool QFSFileEngine::rename(const QString &newName) return ret; } +bool QFSFileEngine::renameOverwrite(const QString &newName) +{ + Q_D(QFSFileEngine); + bool ret = ::MoveFileEx((wchar_t*)d->fileEntry.nativeFilePath().utf16(), + (wchar_t*)QFileSystemEntry(newName).nativeFilePath().utf16(), + MOVEFILE_REPLACE_EXISTING | MOVEFILE_COPY_ALLOWED) != 0; + if (!ret) + setError(QFile::RenameError, QSystemError(::GetLastError(), QSystemError::NativeError).toString()); + return ret; +} + bool QFSFileEngine::mkdir(const QString &name, bool createParentDirectories) const { return QFileSystemEngine::createDirectory(QFileSystemEntry(name), createParentDirectories); diff --git a/src/corelib/io/qiodevice.h b/src/corelib/io/qiodevice.h index 96a8971639..39c2d70492 100644 --- a/src/corelib/io/qiodevice.h +++ b/src/corelib/io/qiodevice.h @@ -54,8 +54,6 @@ #error qiodevice.h must be included before any header file that defines open #endif -QT_BEGIN_HEADER - QT_BEGIN_NAMESPACE @@ -177,6 +175,4 @@ Q_CORE_EXPORT QDebug operator<<(QDebug debug, QIODevice::OpenMode modes); QT_END_NAMESPACE -QT_END_HEADER - #endif // QIODEVICE_H diff --git a/src/corelib/io/qlockfile.cpp b/src/corelib/io/qlockfile.cpp new file mode 100644 index 0000000000..5d56a67f48 --- /dev/null +++ b/src/corelib/io/qlockfile.cpp @@ -0,0 +1,346 @@ +/**************************************************************************** +** +** Copyright (C) 2013 David Faure <faure+bluesystems@kde.org> +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qlockfile.h" +#include "qlockfile_p.h" + +#include <QtCore/qthread.h> +#include <QtCore/qelapsedtimer.h> +#include <QtCore/qdatetime.h> + +QT_BEGIN_NAMESPACE + +/*! + \class QLockFile + \inmodule QtCore + \brief The QLockFile class provides locking between processes using a file. + \since 5.1 + + A lock file can be used to prevent multiple processes from accessing concurrently + the same resource. For instance, a configuration file on disk, or a socket, a port, + a region of shared memory... + + Serialization is only guaranteed if all processes that access the shared resource + use QLockFile, with the same file path. + + QLockFile supports two use cases: + to protect a resource for a short-term operation (e.g. verifying if a configuration + file has changed before saving new settings), and for long-lived protection of a + resource (e.g. a document opened by a user in an editor) for an indefinite amount of time. + + When protecting for a short-term operation, it is acceptable to call lock() and wait + until any running operation finishes. + When protecting a resource over a long time, however, the application should always + call setStaleLockTime(0) and then tryLock() with a short timeout, in order to + warn the user that the resource is locked. + + If the process holding the lock crashes, the lock file stays on disk and can prevent + any other process from accessing the shared resource, ever. For this reason, QLockFile + tries to detect such a "stale" lock file, based on the process ID written into the file, + and (in case that process ID got reused meanwhile), on the last modification time of + the lock file (30s by default, for the use case of a short-lived operation). + If the lock file is found to be stale, it will be deleted. + + For the use case of protecting a resource over a long time, you should therefore call + setStaleLockTime(0), and when tryLock() returns LockFailedError, inform the user + that the document is locked, possibly using getLockInfo() for more details. +*/ + +/*! + \enum QLockFile::LockError + + This enum describes the result of the last call to lock() or tryLock(). + + \value NoError The lock was acquired successfully. + \value LockFailedError The lock could not be acquired because another process holds it. + \value PermissionError The lock file could not be created, for lack of permissions + in the parent directory. + \value UnknownError Another error happened, for instance a full partition + prevented writing out the lock file. +*/ + +/*! + Constructs a new lock file object. + The object is created in an unlocked state. + When calling lock() or tryLock(), a lock file named \a fileName will be created, + if it doesn't already exist. + + \sa lock(), unlock() +*/ +QLockFile::QLockFile(const QString &fileName) + : d_ptr(new QLockFilePrivate(fileName)) +{ +} + +/*! + Destroys the lock file object. + If the lock was acquired, this will release the lock, by deleting the lock file. +*/ +QLockFile::~QLockFile() +{ + unlock(); +} + +/*! + Sets \a staleLockTime to be the time in milliseconds after which + a lock file is considered stale. + The default value is 30000, i.e. 30 seconds. + If your application typically keeps the file locked for more than 30 seconds + (for instance while saving megabytes of data for 2 minutes), you should set + a bigger value using setStaleLockTime(). + + The value of \a staleLockTime is used by lock() and tryLock() in order + to determine when an existing lock file is considered stale, i.e. left over + by a crashed process. This is useful for the case where the PID got reused + meanwhile, so the only way to detect a stale lock file is by the fact that + it has been around for a long time. + + \sa staleLockTime() +*/ +void QLockFile::setStaleLockTime(int staleLockTime) +{ + Q_D(QLockFile); + d->staleLockTime = staleLockTime; +} + +/*! + Returns the time in milliseconds after which + a lock file is considered stale. + + \sa setStaleLockTime() +*/ +int QLockFile::staleLockTime() const +{ + Q_D(const QLockFile); + return d->staleLockTime; +} + +/*! + Returns true if the lock was acquired by this QLockFile instance, + otherwise returns false. + + \sa lock(), unlock(), tryLock() +*/ +bool QLockFile::isLocked() const +{ + Q_D(const QLockFile); + return d->isLocked; +} + +/*! + Creates the lock file. + + If another process (or another thread) has created the lock file already, + this function will block until that process (or thread) releases it. + + Calling this function multiple times on the same lock from the same + thread without unlocking first is not allowed. This function will + \e dead-lock when the file is locked recursively. + + Returns true if the lock was acquired, false if it could not be acquired + due to an unrecoverable error, such as no permissions in the parent directory. + + \sa unlock(), tryLock() +*/ +bool QLockFile::lock() +{ + return tryLock(-1); +} + +/*! + Attempts to create the lock file. This function returns true if the + lock was obtained; otherwise it returns false. If another process (or + another thread) has created the lock file already, this function will + wait for at most \a timeout milliseconds for the lock file to become + available. + + Note: Passing a negative number as the \a timeout is equivalent to + calling lock(), i.e. this function will wait forever until the lock + file can be locked if \a timeout is negative. + + If the lock was obtained, it must be released with unlock() + before another process (or thread) can successfully lock it. + + Calling this function multiple times on the same lock from the same + thread without unlocking first is not allowed, this function will + \e always return false when attempting to lock the file recursively. + + \sa lock(), unlock() +*/ +bool QLockFile::tryLock(int timeout) +{ + Q_D(QLockFile); + QElapsedTimer timer; + if (timeout > 0) + timer.start(); + int sleepTime = 100; + forever { + d->lockError = d->tryLock_sys(); + switch (d->lockError) { + case NoError: + d->isLocked = true; + return true; + case PermissionError: + case UnknownError: + return false; + case LockFailedError: + if (!d->isLocked && d->isApparentlyStale()) { + // Stale lock from another thread/process + // Ensure two processes don't remove it at the same time + QLockFile rmlock(d->fileName + QStringLiteral(".rmlock")); + if (rmlock.tryLock()) { + if (d->isApparentlyStale() && d->removeStaleLock()) + continue; + } + } + break; + } + if (timeout == 0 || (timeout > 0 && timer.hasExpired(timeout))) + return false; + QThread::msleep(sleepTime); + if (sleepTime < 5 * 1000) + sleepTime *= 2; + } + // not reached + return false; +} + +/*! + \fn void QLockFile::unlock() + Releases the lock, by deleting the lock file. + + Calling unlock() without locking the file first, does nothing. + + \sa lock(), tryLock() +*/ + +/*! + Retrieves information about the current owner of the lock file. + + If tryLock() returns false, and error() returns LockFailedError, + this function can be called to find out more information about the existing + lock file: + \list + \li the PID of the application (returned in \a pid) + \li the \a hostname it's running on (useful in case of networked filesystems), + \li the name of the application which created it (returned in \a appname), + \endlist + + Note that tryLock() automatically deleted the file if there is no + running application with this PID, so LockFailedError can only happen if there is + an application with this PID (it could be unrelated though). + + This can be used to inform users about the existing lock file and give them + the choice to delete it. After removing the file using removeStaleLockFile(), + the application can call tryLock() again. + + This function returns true if the information could be successfully retrieved, false + if the lock file doesn't exist or doesn't contain the expected data. + This can happen if the lock file was deleted between the time where tryLock() failed + and the call to this function. Simply call tryLock() again if this happens. +*/ +bool QLockFile::getLockInfo(qint64 *pid, QString *hostname, QString *appname) const +{ + Q_D(const QLockFile); + return d->getLockInfo(pid, hostname, appname); +} + +bool QLockFilePrivate::getLockInfo(qint64 *pid, QString *hostname, QString *appname) const +{ + QFile reader(fileName); + if (!reader.open(QIODevice::ReadOnly)) + return false; + + QByteArray pidLine = reader.readLine(); + pidLine.chop(1); + QByteArray appNameLine = reader.readLine(); + appNameLine.chop(1); + QByteArray hostNameLine = reader.readLine(); + hostNameLine.chop(1); + if (pidLine.isEmpty() || appNameLine.isEmpty()) + return false; + + qint64 thePid = pidLine.toLongLong(); + if (pid) + *pid = thePid; + if (appname) + *appname = QString::fromUtf8(appNameLine); + if (hostname) + *hostname = QString::fromUtf8(hostNameLine); + return thePid > 0; +} + +/*! + Attempts to forcefully remove an existing lock file. + + Calling this is not recommended when protecting a short-lived operation: QLockFile + already takes care of removing lock files after they are older than staleLockTime(). + + This method should only be called when protecting a resource for a long time, i.e. + with staleLockTime(0), and after tryLock() returned LockFailedError, and the user + agreed on removing the lock file. + + Returns true on success, false if the lock file couldn't be removed. This happens + on Windows, when the application owning the lock is still running. +*/ +bool QLockFile::removeStaleLockFile() +{ + Q_D(QLockFile); + if (d->isLocked) { + qWarning("removeStaleLockFile can only be called when not holding the lock"); + return false; + } + return d->removeStaleLock(); +} + +/*! + Returns the lock file error status. + + If tryLock() returns false, this function can be called to find out + the reason why the locking failed. +*/ +QLockFile::LockError QLockFile::error() const +{ + Q_D(const QLockFile); + return d->lockError; +} + +QT_END_NAMESPACE diff --git a/src/corelib/io/qlockfile.h b/src/corelib/io/qlockfile.h new file mode 100644 index 0000000000..4c8b6bf31a --- /dev/null +++ b/src/corelib/io/qlockfile.h @@ -0,0 +1,91 @@ +/**************************************************************************** +** +** Copyright (C) 2013 David Faure <faure+bluesystems@kde.org> +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QLOCKFILE_H +#define QLOCKFILE_H + +#include <QtCore/qstring.h> +#include <QtCore/qscopedpointer.h> + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +class QLockFilePrivate; + +class Q_CORE_EXPORT QLockFile +{ +public: + QLockFile(const QString &fileName); + ~QLockFile(); + + bool lock(); + bool tryLock(int timeout = 0); + void unlock(); + + void setStaleLockTime(int); + int staleLockTime() const; + + bool isLocked() const; + bool getLockInfo(qint64 *pid, QString *hostname, QString *appname) const; + bool removeStaleLockFile(); + + enum LockError { + NoError = 0, + LockFailedError = 1, + PermissionError = 2, + UnknownError = 3 + }; + LockError error() const; + +protected: + QScopedPointer<QLockFilePrivate> d_ptr; + +private: + Q_DECLARE_PRIVATE(QLockFile) + Q_DISABLE_COPY(QLockFile) +}; + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif // QLOCKFILE_H diff --git a/src/corelib/io/qlockfile_p.h b/src/corelib/io/qlockfile_p.h new file mode 100644 index 0000000000..e046e87cf4 --- /dev/null +++ b/src/corelib/io/qlockfile_p.h @@ -0,0 +1,104 @@ +/**************************************************************************** +** +** Copyright (C) 2013 David Faure <faure+bluesystems@kde.org> +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QLOCKFILE_P_H +#define QLOCKFILE_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include <QtCore/qlockfile.h> +#include <QtCore/qfile.h> + +#ifdef Q_OS_WIN +#include <qt_windows.h> +#endif + +QT_BEGIN_NAMESPACE + +class QLockFilePrivate +{ +public: + QLockFilePrivate(const QString &fn) + : fileName(fn), +#ifdef Q_OS_WIN + fileHandle(INVALID_HANDLE_VALUE), +#else + fileHandle(-1), +#endif + staleLockTime(30 * 1000), // 30 seconds + lockError(QLockFile::NoError), + isLocked(false) + { + } + QLockFile::LockError tryLock_sys(); + bool removeStaleLock(); + bool getLockInfo(qint64 *pid, QString *hostname, QString *appname) const; + // Returns true if the lock belongs to dead PID, or is old. + // The attempt to delete it will tell us if it was really stale or not, though. + bool isApparentlyStale() const; + +#ifdef Q_OS_UNIX + static int checkFcntlWorksAfterFlock(); +#endif + + QString fileName; +#ifdef Q_OS_WIN + Qt::HANDLE fileHandle; +#else + int fileHandle; +#endif + int staleLockTime; // "int milliseconds" is big enough for 24 days + QLockFile::LockError lockError; + bool isLocked; +}; + +QT_END_NAMESPACE + +#endif /* QLOCKFILE_P_H */ diff --git a/src/corelib/io/qlockfile_unix.cpp b/src/corelib/io/qlockfile_unix.cpp new file mode 100644 index 0000000000..ed3b399fbf --- /dev/null +++ b/src/corelib/io/qlockfile_unix.cpp @@ -0,0 +1,207 @@ +/**************************************************************************** +** +** Copyright (C) 2013 David Faure <faure+bluesystems@kde.org> +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "private/qlockfile_p.h" + +#include "QtCore/qtemporaryfile.h" +#include "QtCore/qcoreapplication.h" +#include "QtCore/qfileinfo.h" +#include "QtCore/qdebug.h" + +#include "private/qcore_unix_p.h" // qt_safe_open +#include "private/qabstractfileengine_p.h" +#include "private/qtemporaryfile_p.h" + +#include <sys/file.h> // flock +#include <sys/types.h> // kill +#include <signal.h> // kill + +QT_BEGIN_NAMESPACE + +static QString localHostName() // from QHostInfo::localHostName() +{ + char hostName[512]; + if (gethostname(hostName, sizeof(hostName)) == -1) + return QString(); + hostName[sizeof(hostName) - 1] = '\0'; + return QString::fromLocal8Bit(hostName); +} + +// ### merge into qt_safe_write? +static qint64 qt_write_loop(int fd, const char *data, qint64 len) +{ + qint64 pos = 0; + while (pos < len) { + const qint64 ret = qt_safe_write(fd, data + pos, len - pos); + if (ret == -1) // e.g. partition full + return pos; + pos += ret; + } + return pos; +} + +int QLockFilePrivate::checkFcntlWorksAfterFlock() +{ + QTemporaryFile file; + if (!file.open()) + return -2; + const int fd = file.d_func()->engine()->handle(); + if (flock(fd, LOCK_EX | LOCK_NB) == -1) // other threads, and other processes on a local fs + return -3; + struct flock flockData; + flockData.l_type = F_WRLCK; + flockData.l_whence = SEEK_SET; + flockData.l_start = 0; + flockData.l_len = 0; // 0 = entire file + flockData.l_pid = getpid(); + if (fcntl(fd, F_SETLK, &flockData) == -1) // for networked filesystems + return 0; + return 1; +} + +static QBasicAtomicInt fcntlOK = Q_BASIC_ATOMIC_INITIALIZER(-1); + +/*! + \internal + Checks that the OS isn't using POSIX locks to emulate flock(). + Mac OS X is one of those. +*/ +static bool fcntlWorksAfterFlock() +{ + int value = fcntlOK.load(); + if (Q_UNLIKELY(value == -1)) { + value = QLockFilePrivate::checkFcntlWorksAfterFlock(); + fcntlOK.store(value); + } + return value == 1; +} + +static bool setNativeLocks(int fd) +{ + if (flock(fd, LOCK_EX | LOCK_NB) == -1) // other threads, and other processes on a local fs + return false; + struct flock flockData; + flockData.l_type = F_WRLCK; + flockData.l_whence = SEEK_SET; + flockData.l_start = 0; + flockData.l_len = 0; // 0 = entire file + flockData.l_pid = getpid(); + if (fcntlWorksAfterFlock() && fcntl(fd, F_SETLK, &flockData) == -1) // for networked filesystems + return false; + return true; +} + +QLockFile::LockError QLockFilePrivate::tryLock_sys() +{ + const QByteArray lockFileName = QFile::encodeName(fileName); + const int fd = qt_safe_open(lockFileName.constData(), O_WRONLY | O_CREAT | O_EXCL, 0644); + if (fd < 0) { + switch (errno) { + case EEXIST: + return QLockFile::LockFailedError; + case EACCES: + case EROFS: + return QLockFile::PermissionError; + default: + return QLockFile::UnknownError; + } + } + // Ensure nobody else can delete the file while we have it + if (!setNativeLocks(fd)) + qWarning() << "setNativeLocks failed:" << strerror(errno); + + // We hold the lock, continue. + fileHandle = fd; + + // Assemble data, to write in a single call to write + // (otherwise we'd have to check every write call) + QByteArray fileData; + fileData += QByteArray::number(QCoreApplication::applicationPid()); + fileData += '\n'; + fileData += qAppName().toUtf8(); + fileData += '\n'; + fileData += localHostName().toUtf8(); + fileData += '\n'; + + QLockFile::LockError error = QLockFile::NoError; + if (qt_write_loop(fd, fileData.constData(), fileData.size()) < fileData.size()) + error = QLockFile::UnknownError; // partition full + return error; +} + +bool QLockFilePrivate::removeStaleLock() +{ + const QByteArray lockFileName = QFile::encodeName(fileName); + const int fd = qt_safe_open(lockFileName.constData(), O_WRONLY, 0644); + if (fd < 0) // gone already? + return false; + bool success = setNativeLocks(fd) && (::unlink(lockFileName) == 0); + close(fd); + return success; +} + +bool QLockFilePrivate::isApparentlyStale() const +{ + qint64 pid; + QString hostname, appname; + if (!getLockInfo(&pid, &hostname, &appname)) + return false; + if (hostname == localHostName()) { + if (::kill(pid, 0) == -1 && errno == ESRCH) + return true; // PID doesn't exist anymore + } + const qint64 age = QFileInfo(fileName).lastModified().msecsTo(QDateTime::currentDateTime()); + return staleLockTime > 0 && age > staleLockTime; +} + +void QLockFile::unlock() +{ + Q_D(QLockFile); + if (!d->isLocked) + return; + close(d->fileHandle); + d->fileHandle = -1; + QFile::remove(d->fileName); + d->lockError = QLockFile::NoError; + d->isLocked = false; +} + +QT_END_NAMESPACE diff --git a/src/corelib/io/qlockfile_win.cpp b/src/corelib/io/qlockfile_win.cpp new file mode 100644 index 0000000000..b5f6d9f3da --- /dev/null +++ b/src/corelib/io/qlockfile_win.cpp @@ -0,0 +1,138 @@ +/**************************************************************************** +** +** Copyright (C) 2013 David Faure <faure+bluesystems@kde.org> +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "private/qlockfile_p.h" +#include "private/qfilesystementry_p.h" +#include <qt_windows.h> + +#include "QtCore/qcoreapplication.h" +#include "QtCore/qfileinfo.h" +#include "QtCore/qdatetime.h" +#include "QtCore/qdebug.h" + +QT_BEGIN_NAMESPACE + +QLockFile::LockError QLockFilePrivate::tryLock_sys() +{ + SECURITY_ATTRIBUTES securityAtts = { sizeof(SECURITY_ATTRIBUTES), NULL, FALSE }; + const QFileSystemEntry fileEntry(fileName); + // When writing, allow others to read. + // When reading, QFile will allow others to read and write, all good. + // Adding FILE_SHARE_DELETE would allow forceful deletion of stale files, + // but Windows doesn't allow recreating it while this handle is open anyway, + // so this would only create confusion (can't lock, but no lock file to read from). + const DWORD dwShareMode = FILE_SHARE_READ; + HANDLE fh = CreateFile((const wchar_t*)fileEntry.nativeFilePath().utf16(), + GENERIC_WRITE, + dwShareMode, + &securityAtts, + CREATE_NEW, // error if already exists + FILE_ATTRIBUTE_NORMAL, + NULL); + if (fh == INVALID_HANDLE_VALUE) { + const DWORD lastError = GetLastError(); + switch (lastError) { + case ERROR_SHARING_VIOLATION: + case ERROR_ALREADY_EXISTS: + case ERROR_FILE_EXISTS: + case ERROR_ACCESS_DENIED: // readonly file, or file still in use by another process. Assume the latter, since we don't create it readonly. + return QLockFile::LockFailedError; + default: + qWarning() << "Got unexpected locking error" << lastError; + return QLockFile::UnknownError; + } + } + + // We hold the lock, continue. + fileHandle = fh; + // Assemble data, to write in a single call to write + // (otherwise we'd have to check every write call) + QByteArray fileData; + fileData += QByteArray::number(QCoreApplication::applicationPid()); + fileData += '\n'; + fileData += qAppName().toUtf8(); + fileData += '\n'; + //fileData += localHostname(); // gethostname requires winsock init, see QHostInfo... + fileData += '\n'; + DWORD bytesWritten = 0; + QLockFile::LockError error = QLockFile::NoError; + if (!WriteFile(fh, fileData.constData(), fileData.size(), &bytesWritten, NULL) || !FlushFileBuffers(fh)) + error = QLockFile::UnknownError; // partition full + return error; +} + +bool QLockFilePrivate::removeStaleLock() +{ + // QFile::remove fails on Windows if the other process is still using the file, so it's not stale. + return QFile::remove(fileName); +} + +bool QLockFilePrivate::isApparentlyStale() const +{ + qint64 pid; + QString hostname, appname; + if (!getLockInfo(&pid, &hostname, &appname)) + return false; + + HANDLE procHandle = ::OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pid); + if (!procHandle) + return true; + // We got a handle but check if process is still alive + DWORD dwR = ::WaitForSingleObject(procHandle, 0); + ::CloseHandle(procHandle); + if (dwR == WAIT_TIMEOUT) + return true; + const qint64 age = QFileInfo(fileName).lastModified().msecsTo(QDateTime::currentDateTime()); + return staleLockTime > 0 && age > staleLockTime; +} + +void QLockFile::unlock() +{ + Q_D(QLockFile); + if (!d->isLocked) + return; + CloseHandle(d->fileHandle); + QFile::remove(d->fileName); + d->lockError = QLockFile::NoError; + d->isLocked = false; +} + +QT_END_NAMESPACE diff --git a/src/corelib/io/qprocess.cpp b/src/corelib/io/qprocess.cpp index 8409e7e479..3993cf5002 100644 --- a/src/corelib/io/qprocess.cpp +++ b/src/corelib/io/qprocess.cpp @@ -458,6 +458,9 @@ void QProcessPrivate::Channel::clear() the program you want to run as arguments to start(). Arguments are supplied as individual strings in a QStringList. + Alternatively, you can set the program to run with setProgram() + and setArguments(), and then call start() or open(). + For example, the following code snippet runs the analog clock example in the Fusion style on X11 platforms by passing strings containing "-style" and "fusion" as two items in the list of @@ -1946,6 +1949,58 @@ void QProcess::start(const QString &program, const QStringList &arguments, OpenM return; } + d->program = program; + d->arguments = arguments; + + open(mode); +} + +/*! + \since 5.1 + \overload + + Starts the program set by setProgram() with arguments set by setArguments(). + The OpenMode is set to \a mode. + + This method is a convenient alias to open(). + + \sa open(), setProgram(), setArguments() + */ +void QProcess::start(OpenMode mode) +{ + open(mode); +} + +/*! + Starts the program set by setProgram() in a new process, if none is already + running, passing the command line arguments set by setArguments(). The OpenMode + is set to \a mode. + + The QProcess object will immediately enter the Starting state. If the + process starts successfully, QProcess will emit started(); otherwise, + error() will be emitted. If the QProcess object is already running a + process, a warning may be printed at the console, the function will return false, + and the existing process will continue running. + + \note Processes are started asynchronously, which means the started() + and error() signals may be delayed. Call waitForStarted() to make + sure the process has started (or has failed to start) and those signals + have been emitted. In this regard, a true return value merly means the process + was correcty initialized, not that the program was actually started. + +*/ +bool QProcess::open(OpenMode mode) +{ + Q_D(QProcess); + if (d->processState != NotRunning) { + qWarning("QProcess::start: Process is already running"); + return false; + } + if (d->program.isEmpty()) { + qWarning("QProcess::start: program not set"); + return false; + } + #if defined QPROCESS_DEBUG qDebug() << "QProcess::start(" << program << ',' << arguments << ',' << mode << ')'; #endif @@ -1967,14 +2022,13 @@ void QProcess::start(const QString &program, const QStringList &arguments, OpenM d->stdoutChannel.closed = false; d->stderrChannel.closed = false; - d->program = program; - d->arguments = arguments; - d->exitCode = 0; d->exitStatus = NormalExit; d->processError = QProcess::UnknownError; d->errorString.clear(); d->startProcess(); + + return true; } @@ -2074,6 +2128,24 @@ QString QProcess::program() const } /*! + \since 5.1 + + Set the \a program to use when starting the process. + That function must be call before open() + + \sa start(), setArguments(), program() +*/ +void QProcess::setProgram(const QString &program) +{ + Q_D(QProcess); + if (d->processState != NotRunning) { + qWarning("QProcess::setProgram: Process is already running"); + return; + } + d->program = program; +} + +/*! Returns the command line arguments the process was last started with. \sa start() @@ -2085,6 +2157,24 @@ QStringList QProcess::arguments() const } /*! + \since 5.1 + + Set the \a arguments to pass to the called program when starting the process. + That function must be call before open() + + \sa start(), setProgram(), arguments() +*/ +void QProcess::setArguments(const QStringList &arguments) +{ + Q_D(QProcess); + if (d->processState != NotRunning) { + qWarning("QProcess::setProgram: Process is already running"); + return; + } + d->arguments = arguments; +} + +/*! Attempts to terminate the process. The process may not exit as a result of calling this function (it is given diff --git a/src/corelib/io/qprocess.h b/src/corelib/io/qprocess.h index 2c6746b0ab..29adf37f74 100644 --- a/src/corelib/io/qprocess.h +++ b/src/corelib/io/qprocess.h @@ -46,8 +46,6 @@ #include <QtCore/qstringlist.h> #include <QtCore/qshareddata.h> -QT_BEGIN_HEADER - QT_BEGIN_NAMESPACE @@ -138,8 +136,14 @@ public: void start(const QString &program, const QStringList &arguments, OpenMode mode = ReadWrite); void start(const QString &command, OpenMode mode = ReadWrite); + void start(OpenMode mode = ReadWrite); + bool open(OpenMode mode = ReadWrite) Q_DECL_OVERRIDE; + QString program() const; + void setProgram(const QString &program); + QStringList arguments() const; + void setArguments(const QStringList & arguments); ProcessChannelMode readChannelMode() const; void setReadChannelMode(ProcessChannelMode mode); @@ -261,6 +265,4 @@ private: QT_END_NAMESPACE -QT_END_HEADER - #endif // QPROCESS_H diff --git a/src/corelib/io/qprocess_unix.cpp b/src/corelib/io/qprocess_unix.cpp index e159bf8f30..997848851d 100644 --- a/src/corelib/io/qprocess_unix.cpp +++ b/src/corelib/io/qprocess_unix.cpp @@ -328,16 +328,18 @@ void QProcessManager::unlock() mutex.unlock(); } -static void qt_create_pipe(int *pipe) +static int qt_create_pipe(int *pipe) { if (pipe[0] != -1) qt_safe_close(pipe[0]); if (pipe[1] != -1) qt_safe_close(pipe[1]); - if (qt_safe_pipe(pipe) != 0) { + int pipe_ret = qt_safe_pipe(pipe); + if (pipe_ret != 0) { qWarning("QProcessPrivate::createPipe: Cannot create pipe %p: %s", pipe, qPrintable(qt_error_string(errno))); } + return pipe_ret; } void QProcessPrivate::destroyPipe(int *pipe) @@ -374,7 +376,8 @@ bool QProcessPrivate::createChannel(Channel &channel) if (channel.type == Channel::Normal) { // we're piping this channel to our own process - qt_create_pipe(channel.pipe); + if (qt_create_pipe(channel.pipe) != 0) + return false; // create the socket notifiers if (threadData->eventDispatcher) { @@ -458,7 +461,8 @@ bool QProcessPrivate::createChannel(Channel &channel) Q_ASSERT(sink->pipe[0] == INVALID_Q_PIPE && sink->pipe[1] == INVALID_Q_PIPE); Q_PIPE pipe[2] = { -1, -1 }; - qt_create_pipe(pipe); + if (qt_create_pipe(pipe) != 0) + return false; sink->pipe[0] = pipe[0]; source->pipe[1] = pipe[1]; @@ -548,10 +552,15 @@ void QProcessPrivate::startProcess() // Initialize pipes if (!createChannel(stdinChannel) || !createChannel(stdoutChannel) || - !createChannel(stderrChannel)) + !createChannel(stderrChannel) || + qt_create_pipe(childStartedPipe) != 0 || + qt_create_pipe(deathPipe) != 0) { + processError = QProcess::FailedToStart; + q->setErrorString(qt_error_string(errno)); + emit q->error(processError); + cleanup(); return; - qt_create_pipe(childStartedPipe); - qt_create_pipe(deathPipe); + } if (threadData->eventDispatcher) { startupSocketNotifier = new QSocketNotifier(childStartedPipe[0], @@ -1001,9 +1010,9 @@ static int select_msecs(int nfds, fd_set *fdread, fd_set *fdwrite, int timeout) if (timeout < 0) return qt_safe_select(nfds, fdread, fdwrite, 0, 0); - struct timeval tv; + struct timespec tv; tv.tv_sec = timeout / 1000; - tv.tv_usec = (timeout % 1000) * 1000; + tv.tv_nsec = (timeout % 1000) * 1000 * 1000; return qt_safe_select(nfds, fdread, fdwrite, 0, &tv); } @@ -1339,10 +1348,15 @@ bool QProcessPrivate::startDetached(const QString &program, const QStringList &a // To catch the startup of the child int startedPipe[2]; - qt_safe_pipe(startedPipe); + if (qt_safe_pipe(startedPipe) != 0) + return false; // To communicate the pid of the child int pidPipe[2]; - qt_safe_pipe(pidPipe); + if (qt_safe_pipe(pidPipe) != 0) { + qt_safe_close(startedPipe[0]); + qt_safe_close(startedPipe[1]); + return false; + } pid_t childPid = fork(); if (childPid == 0) { diff --git a/src/corelib/io/qresource.cpp b/src/corelib/io/qresource.cpp index 0ce3ce3611..7dfc9b977c 100644 --- a/src/corelib/io/qresource.cpp +++ b/src/corelib/io/qresource.cpp @@ -62,15 +62,6 @@ //#define DEBUG_RESOURCE_MATCH -#if defined(Q_OS_VXWORKS) -# if defined(m_data) -# undef m_data -# endif -# if defined(m_len) -# undef m_len -# endif -#endif - QT_BEGIN_NAMESPACE diff --git a/src/corelib/io/qresource.h b/src/corelib/io/qresource.h index 1623792e0b..88467bd53b 100644 --- a/src/corelib/io/qresource.h +++ b/src/corelib/io/qresource.h @@ -47,8 +47,6 @@ #include <QtCore/qstringlist.h> #include <QtCore/qlist.h> -QT_BEGIN_HEADER - QT_BEGIN_NAMESPACE @@ -98,6 +96,4 @@ private: QT_END_NAMESPACE -QT_END_HEADER - #endif // QRESOURCE_H diff --git a/src/corelib/io/qsavefile.cpp b/src/corelib/io/qsavefile.cpp new file mode 100644 index 0000000000..fee6a4c4d8 --- /dev/null +++ b/src/corelib/io/qsavefile.cpp @@ -0,0 +1,316 @@ +/**************************************************************************** +** +** Copyright (C) 2012 David Faure <faure@kde.org> +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qplatformdefs.h" +#include "qsavefile.h" +#include "private/qsavefile_p.h" +#include "qfileinfo.h" +#include "qabstractfileengine_p.h" +#include "qdebug.h" +#include "qtemporaryfile.h" +#include "private/qiodevice_p.h" +#include "private/qtemporaryfile_p.h" + +QT_BEGIN_NAMESPACE + +QSaveFilePrivate::QSaveFilePrivate() + : writeError(QFileDevice::NoError) +{ +} + +QSaveFilePrivate::~QSaveFilePrivate() +{ +} + +/*! + \class QSaveFile + \inmodule QtCore + \brief The QSaveFile class provides an interface for safely writing to files. + + \ingroup io + + \reentrant + + \since 5.1 + + QSaveFile is an I/O device for writing text and binary files, without losing + existing data if the writing operation fails. + + While writing, the contents will be written to a temporary file, and if + no error happened, commit() will move it to the final file. This ensures that + no data at the final file is lost in case an error happens while writing, + and no partially-written file is ever present at the final location. Always + use QSaveFile when saving entire documents to disk. + + QSaveFile automatically detects errors while writing, such as the full partition + situation, where write() cannot write all the bytes. It will remember that + an error happened, and will discard the temporary file in commit(). + + Much like with QFile, the file is opened with open(). Data is usually read + and written using QDataStream or QTextStream, but you can also call the + QIODevice-inherited functions read(), readLine(), readAll(), write(). + + Unlike QFile, calling close() is not allowed. commit() replaces it. If commit() + was not called and the QSaveFile instance is destroyed, the temporary file is + discarded. + + To abort saving due to an application error, call cancelWriting(), so that + even a call to commit() later on will not save. + + \sa QTextStream, QDataStream, QFileInfo, QDir, QFile, QTemporaryFile +*/ + +/*! + Constructs a new file object with the given \a parent. +*/ +QSaveFile::QSaveFile(QObject *parent) + : QFileDevice(*new QSaveFilePrivate, parent) +{ +} +/*! + Constructs a new file object to represent the file with the given \a name. +*/ +QSaveFile::QSaveFile(const QString &name) + : QFileDevice(*new QSaveFilePrivate, 0) +{ + Q_D(QSaveFile); + d->fileName = name; +} +/*! + Constructs a new file object with the given \a parent to represent the + file with the specified \a name. +*/ +QSaveFile::QSaveFile(const QString &name, QObject *parent) + : QFileDevice(*new QSaveFilePrivate, parent) +{ + Q_D(QSaveFile); + d->fileName = name; +} + +/*! + Destroys the file object, discarding the saved contents unless commit() was called. +*/ +QSaveFile::~QSaveFile() +{ + Q_D(QSaveFile); + QFileDevice::close(); + if (d->fileEngine) { + d->fileEngine->remove(); + delete d->fileEngine; + d->fileEngine = 0; + } +} + +/*! + Returns the name set by setFileName() or to the QSaveFile + constructor. + + \sa setFileName() +*/ +QString QSaveFile::fileName() const +{ + return d_func()->fileName; +} + +/*! + Sets the \a name of the file. The name can have no path, a + relative path, or an absolute path. + + \sa QFile::setFileName(), fileName() +*/ +void QSaveFile::setFileName(const QString &name) +{ + d_func()->fileName = name; +} + +/*! + Opens the file using OpenMode \a mode, returning true if successful; + otherwise false. + + Important: the \a mode must include QIODevice::WriteOnly. + It may also have additional flags, such as QIODevice::Text and QIODevice::Unbuffered. + + QIODevice::ReadWrite and QIODevice::Append are not supported at the moment. + + \sa QIODevice::OpenMode, setFileName() +*/ +bool QSaveFile::open(OpenMode mode) +{ + Q_D(QSaveFile); + if (isOpen()) { + qWarning("QSaveFile::open: File (%s) already open", qPrintable(fileName())); + return false; + } + unsetError(); + if ((mode & (ReadOnly | WriteOnly)) == 0) { + qWarning("QSaveFile::open: Open mode not specified"); + return false; + } + // In the future we could implement ReadWrite by copying from the existing file to the temp file... + if ((mode & ReadOnly) || (mode & Append)) { + qWarning("QSaveFile::open: Unsupported open mode 0x%x", int(mode)); + return false; + } + + // check if existing file is writable + QFileInfo existingFile(d->fileName); + if (existingFile.exists() && !existingFile.isWritable()) { + d->setError(QFileDevice::WriteError, QSaveFile::tr("Existing file %1 is not writable").arg(d->fileName)); + d->writeError = QFileDevice::WriteError; + return false; + } + d->fileEngine = new QTemporaryFileEngine(d->fileName); + // Same as in QFile: QIODevice provides the buffering, so there's no need to request it from the file engine. + if (!d->fileEngine->open(mode | QIODevice::Unbuffered)) { + QFileDevice::FileError err = d->fileEngine->error(); + if (err == QFileDevice::UnspecifiedError) + err = QFileDevice::OpenError; + d->setError(err, d->fileEngine->errorString()); + delete d->fileEngine; + d->fileEngine = 0; + return false; + } + + QFileDevice::open(mode); + if (existingFile.exists()) + setPermissions(existingFile.permissions()); + return true; +} + +/*! + \reimp + This method has been made private so that it cannot be called, in order to prevent mistakes. + In order to finish writing the file, call commit(). + If instead you want to abort writing, call cancelWriting(). +*/ +void QSaveFile::close() +{ + qFatal("QSaveFile::close called"); +} + +/*! + Commits the changes to disk, if all previous writes were successful. + + It is mandatory to call this at the end of the saving operation, otherwise the file will be + discarded. + + If an error happened during writing, deletes the temporary file and returns false. + Otherwise, renames it to the final fileName and returns true on success. + Finally, closes the device. + + \sa cancelWriting() +*/ +bool QSaveFile::commit() +{ + Q_D(QSaveFile); + if (!d->fileEngine) + return false; + + if (!isOpen()) { + qWarning("QSaveFile::commit: File (%s) is not open", qPrintable(fileName())); + return false; + } + QFileDevice::close(); // calls flush() + + // Sync to disk if possible. Ignore errors (e.g. not supported). + d->fileEngine->syncToDisk(); + + if (d->writeError != QFileDevice::NoError) { + d->fileEngine->remove(); + d->writeError = QFileDevice::NoError; + delete d->fileEngine; + d->fileEngine = 0; + return false; + } + // atomically replace old file with new file + // Can't use QFile::rename for that, must use the file engine directly + Q_ASSERT(d->fileEngine); + if (!d->fileEngine->renameOverwrite(d->fileName)) { + d->setError(d->fileEngine->error(), d->fileEngine->errorString()); + d->fileEngine->remove(); + delete d->fileEngine; + d->fileEngine = 0; + return false; + } + delete d->fileEngine; + d->fileEngine = 0; + return true; +} + +/*! + Cancels writing the new file. + + If the application changes its mind while saving, it can call cancelWriting(), + which sets an error code so that commit() will discard the temporary file. + + Alternatively, it can simply make sure not to call commit(). + + Further write operations are possible after calling this method, but none + of it will have any effect, the written file will be discarded. + + \sa commit() +*/ +void QSaveFile::cancelWriting() +{ + Q_D(QSaveFile); + if (!isOpen()) + return; + d->setError(QFileDevice::WriteError, QSaveFile::tr("Writing canceled by application")); + d->writeError = QFileDevice::WriteError; +} + +/*! + \reimp +*/ +qint64 QSaveFile::writeData(const char *data, qint64 len) +{ + Q_D(QSaveFile); + if (d->writeError != QFileDevice::NoError) + return -1; + + const qint64 ret = QFileDevice::writeData(data, len); + + if (d->error != QFileDevice::NoError) + d->writeError = d->error; + return ret; +} + +QT_END_NAMESPACE diff --git a/src/corelib/io/qsavefile.h b/src/corelib/io/qsavefile.h new file mode 100644 index 0000000000..32af4a708e --- /dev/null +++ b/src/corelib/io/qsavefile.h @@ -0,0 +1,90 @@ +/**************************************************************************** +** +** Copyright (C) 2012 David Faure <faure@kde.org> +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QSAVEFILE_H +#define QSAVEFILE_H + +#include <QtCore/qfiledevice.h> +#include <QtCore/qstring.h> + +#ifdef open +#error qsavefile.h must be included before any header file that defines open +#endif + +QT_BEGIN_NAMESPACE + + +class QAbstractFileEngine; +class QSaveFilePrivate; + +class Q_CORE_EXPORT QSaveFile : public QFileDevice +{ + Q_OBJECT + Q_DECLARE_PRIVATE(QSaveFile) + +public: + + explicit QSaveFile(const QString &name); + explicit QSaveFile(QObject *parent = 0); + explicit QSaveFile(const QString &name, QObject *parent); + ~QSaveFile(); + + QString fileName() const Q_DECL_OVERRIDE; + void setFileName(const QString &name); + + bool open(OpenMode flags) Q_DECL_OVERRIDE; + bool commit(); + + void cancelWriting(); + +protected: + qint64 writeData(const char *data, qint64 len) Q_DECL_OVERRIDE; + +private: + void close() Q_DECL_OVERRIDE; + +private: + Q_DISABLE_COPY(QSaveFile) +}; + +QT_END_NAMESPACE + +#endif // QSAVEFILE_H diff --git a/src/corelib/io/qsavefile_p.h b/src/corelib/io/qsavefile_p.h new file mode 100644 index 0000000000..27e687835b --- /dev/null +++ b/src/corelib/io/qsavefile_p.h @@ -0,0 +1,75 @@ +/**************************************************************************** +** +** Copyright (C) 2013 David Faure <faure@kde.org> +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QSAVEFILE_P_H +#define QSAVEFILE_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include "private/qfiledevice_p.h" + +QT_BEGIN_NAMESPACE + +class QSaveFilePrivate : public QFileDevicePrivate +{ + Q_DECLARE_PUBLIC(QSaveFile) + +protected: + QSaveFilePrivate(); + ~QSaveFilePrivate(); + + QString fileName; + + QFileDevice::FileError writeError; +}; + +QT_END_NAMESPACE + +#endif // QSAVEFILE_P_H diff --git a/src/corelib/io/qsettings.h b/src/corelib/io/qsettings.h index 99b8ac108f..a720b3d709 100644 --- a/src/corelib/io/qsettings.h +++ b/src/corelib/io/qsettings.h @@ -47,8 +47,6 @@ #include <QtCore/qstring.h> #include <QtCore/qscopedpointer.h> -QT_BEGIN_HEADER - QT_BEGIN_NAMESPACE QT_END_NAMESPACE @@ -198,6 +196,4 @@ QT_END_NAMESPACE #endif // QT_NO_SETTINGS -QT_END_HEADER - #endif // QSETTINGS_H diff --git a/src/corelib/io/qstandardpaths.h b/src/corelib/io/qstandardpaths.h index 9b95d26ce1..2376b7d6c8 100644 --- a/src/corelib/io/qstandardpaths.h +++ b/src/corelib/io/qstandardpaths.h @@ -44,8 +44,6 @@ #include <QtCore/qstringlist.h> -QT_BEGIN_HEADER - QT_BEGIN_NAMESPACE @@ -102,6 +100,4 @@ private: QT_END_NAMESPACE -QT_END_HEADER - #endif // QSTANDARDPATHS_H diff --git a/src/corelib/io/qtemporarydir.cpp b/src/corelib/io/qtemporarydir.cpp index 6782fcb986..755c31f371 100644 --- a/src/corelib/io/qtemporarydir.cpp +++ b/src/corelib/io/qtemporarydir.cpp @@ -52,7 +52,7 @@ #endif #include <stdlib.h> // mkdtemp -#if defined(Q_OS_QNX) || defined(Q_OS_WIN) +#if defined(Q_OS_QNX) || defined(Q_OS_WIN) || defined(Q_OS_ANDROID) #include <private/qfilesystemengine_p.h> #endif @@ -94,9 +94,9 @@ static QString defaultTemplateName() return QDir::tempPath() + QLatin1Char('/') + baseName + QLatin1String("-XXXXXX"); } -#if defined(Q_OS_QNX ) || defined(Q_OS_WIN) -static char *mkdtemp(char *templateName) +static char *q_mkdtemp(char *templateName) { +#if defined(Q_OS_QNX ) || defined(Q_OS_WIN) || defined(Q_OS_ANDROID) static const char letters[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; const size_t length = strlen(templateName); @@ -137,17 +137,17 @@ static char *mkdtemp(char *templateName) } } return 0; -} -#elif defined(Q_OS_LINUX_ANDROID) -extern char *mkdtemp(char *); +#else + return mkdtemp(templateName); #endif +} void QTemporaryDirPrivate::create(const QString &templateName) { QByteArray buffer = QFile::encodeName(templateName); if (!buffer.endsWith("XXXXXX")) buffer += "XXXXXX"; - if (mkdtemp(buffer.data())) { // modifies buffer + if (q_mkdtemp(buffer.data())) { // modifies buffer success = true; path = QFile::decodeName(buffer.constData()); } diff --git a/src/corelib/io/qtemporarydir.h b/src/corelib/io/qtemporarydir.h index b22c8f9329..47252cb5e5 100644 --- a/src/corelib/io/qtemporarydir.h +++ b/src/corelib/io/qtemporarydir.h @@ -45,8 +45,6 @@ #include <QtCore/qdir.h> #include <QtCore/QScopedPointer> -QT_BEGIN_HEADER - QT_BEGIN_NAMESPACE @@ -79,6 +77,4 @@ private: QT_END_NAMESPACE -QT_END_HEADER - #endif // QTEMPORARYDIR_H diff --git a/src/corelib/io/qtemporaryfile.cpp b/src/corelib/io/qtemporaryfile.cpp index 9408727d25..d3a6e3c238 100644 --- a/src/corelib/io/qtemporaryfile.cpp +++ b/src/corelib/io/qtemporaryfile.cpp @@ -44,10 +44,9 @@ #ifndef QT_NO_TEMPORARYFILE #include "qplatformdefs.h" +#include "private/qtemporaryfile_p.h" #include "private/qfile_p.h" -#include "private/qfsfileengine_p.h" #include "private/qsystemerror_p.h" -#include "private/qfilesystemengine_p.h" #if !defined(Q_OS_WIN) #include "private/qcore_unix_p.h" // overrides QT_OPEN @@ -218,36 +217,6 @@ static bool createFileFromTemplate(NativeFileHandle &file, } //************* QTemporaryFileEngine -class QTemporaryFileEngine : public QFSFileEngine -{ - Q_DECLARE_PRIVATE(QFSFileEngine) -public: - QTemporaryFileEngine(const QString &file, bool fileIsTemplate = true) - : QFSFileEngine(), filePathIsTemplate(fileIsTemplate), - filePathWasTemplate(fileIsTemplate) - { - Q_D(QFSFileEngine); - d->fileEntry = QFileSystemEntry(file); - - if (!filePathIsTemplate) - QFSFileEngine::setFileName(file); - } - - ~QTemporaryFileEngine(); - - bool isReallyOpen(); - void setFileName(const QString &file); - void setFileTemplate(const QString &fileTemplate); - - bool open(QIODevice::OpenMode flags); - bool remove(); - bool rename(const QString &newName); - bool close(); - - bool filePathIsTemplate; - bool filePathWasTemplate; -}; - QTemporaryFileEngine::~QTemporaryFileEngine() { QFSFileEngine::close(); @@ -398,6 +367,12 @@ bool QTemporaryFileEngine::rename(const QString &newName) return QFSFileEngine::rename(newName); } +bool QTemporaryFileEngine::renameOverwrite(const QString &newName) +{ + QFSFileEngine::close(); + return QFSFileEngine::renameOverwrite(newName); +} + bool QTemporaryFileEngine::close() { // Don't close the file, just seek to the front. @@ -407,19 +382,6 @@ bool QTemporaryFileEngine::close() } //************* QTemporaryFilePrivate -class QTemporaryFilePrivate : public QFilePrivate -{ - Q_DECLARE_PUBLIC(QTemporaryFile) - -protected: - QTemporaryFilePrivate(); - ~QTemporaryFilePrivate(); - - QAbstractFileEngine *engine() const; - - bool autoRemove; - QString templateName; -}; QTemporaryFilePrivate::QTemporaryFilePrivate() : autoRemove(true) { @@ -440,7 +402,7 @@ QAbstractFileEngine *QTemporaryFilePrivate::engine() const return fileEngine; } -static QString defaultTemplateName() +QString QTemporaryFilePrivate::defaultTemplateName() { QString baseName; #if defined(QT_BUILD_CORE_LIB) @@ -506,7 +468,7 @@ QTemporaryFile::QTemporaryFile() : QFile(*new QTemporaryFilePrivate) { Q_D(QTemporaryFile); - d->templateName = defaultTemplateName(); + d->templateName = QTemporaryFilePrivate::defaultTemplateName(); } QTemporaryFile::QTemporaryFile(const QString &templateName) @@ -529,7 +491,7 @@ QTemporaryFile::QTemporaryFile() : QFile(*new QTemporaryFilePrivate, 0) { Q_D(QTemporaryFile); - d->templateName = defaultTemplateName(); + d->templateName = QTemporaryFilePrivate::defaultTemplateName(); } /*! @@ -565,7 +527,7 @@ QTemporaryFile::QTemporaryFile(QObject *parent) : QFile(*new QTemporaryFilePrivate, parent) { Q_D(QTemporaryFile); - d->templateName = defaultTemplateName(); + d->templateName = QTemporaryFilePrivate::defaultTemplateName(); } /*! diff --git a/src/corelib/io/qtemporaryfile.h b/src/corelib/io/qtemporaryfile.h index b497d9de93..09aa53c33b 100644 --- a/src/corelib/io/qtemporaryfile.h +++ b/src/corelib/io/qtemporaryfile.h @@ -49,14 +49,13 @@ #error qtemporaryfile.h must be included before any header file that defines open #endif -QT_BEGIN_HEADER - QT_BEGIN_NAMESPACE #ifndef QT_NO_TEMPORARYFILE class QTemporaryFilePrivate; +class QLockFilePrivate; class Q_CORE_EXPORT QTemporaryFile : public QFile { @@ -98,6 +97,7 @@ protected: private: friend class QFile; + friend class QLockFilePrivate; Q_DISABLE_COPY(QTemporaryFile) }; @@ -105,6 +105,4 @@ private: QT_END_NAMESPACE -QT_END_HEADER - #endif // QTEMPORARYFILE_H diff --git a/src/corelib/io/qtemporaryfile_p.h b/src/corelib/io/qtemporaryfile_p.h new file mode 100644 index 0000000000..d274f60ecc --- /dev/null +++ b/src/corelib/io/qtemporaryfile_p.h @@ -0,0 +1,103 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QTEMPORARYFILE_P_H +#define QTEMPORARYFILE_P_H + +#include "private/qfsfileengine_p.h" +#include "private/qfilesystemengine_p.h" +#include "private/qfile_p.h" + +QT_BEGIN_NAMESPACE + +class QTemporaryFilePrivate : public QFilePrivate +{ + Q_DECLARE_PUBLIC(QTemporaryFile) + +protected: + QTemporaryFilePrivate(); + ~QTemporaryFilePrivate(); + + QAbstractFileEngine *engine() const; + + bool autoRemove; + QString templateName; + + static QString defaultTemplateName(); + + friend class QLockFilePrivate; +}; + +class QTemporaryFileEngine : public QFSFileEngine +{ + Q_DECLARE_PRIVATE(QFSFileEngine) +public: + QTemporaryFileEngine(const QString &file, bool fileIsTemplate = true) + : QFSFileEngine(), filePathIsTemplate(fileIsTemplate), + filePathWasTemplate(fileIsTemplate) + { + Q_D(QFSFileEngine); + d->fileEntry = QFileSystemEntry(file); + + if (!filePathIsTemplate) + QFSFileEngine::setFileName(file); + } + + ~QTemporaryFileEngine(); + + bool isReallyOpen(); + void setFileName(const QString &file); + void setFileTemplate(const QString &fileTemplate); + + bool open(QIODevice::OpenMode flags); + bool remove(); + bool rename(const QString &newName); + bool renameOverwrite(const QString &newName); + bool close(); + + bool filePathIsTemplate; + bool filePathWasTemplate; +}; + +QT_END_NAMESPACE + +#endif /* QTEMPORARYFILE_P_H */ + diff --git a/src/corelib/io/qtextstream.cpp b/src/corelib/io/qtextstream.cpp index 70c6eed9da..8459cdd158 100644 --- a/src/corelib/io/qtextstream.cpp +++ b/src/corelib/io/qtextstream.cpp @@ -226,12 +226,10 @@ static const int QTEXTSTREAM_BUFFERSIZE = 16384; */ #include "qtextstream.h" +#include "private/qtextstream_p.h" #include "qbuffer.h" #include "qfile.h" #include "qnumeric.h" -#ifndef QT_NO_TEXTCODEC -#include "qtextcodec.h" -#endif #ifndef Q_OS_WINCE #include <locale.h> #endif @@ -315,119 +313,7 @@ QT_END_NAMESPACE QT_BEGIN_NAMESPACE -#ifndef QT_NO_QOBJECT -class QDeviceClosedNotifier : public QObject -{ - Q_OBJECT -public: - inline QDeviceClosedNotifier() - { } - - inline void setupDevice(QTextStream *stream, QIODevice *device) - { - disconnect(); - if (device) - connect(device, SIGNAL(aboutToClose()), this, SLOT(flushStream())); - this->stream = stream; - } - -public Q_SLOTS: - inline void flushStream() { stream->flush(); } - -private: - QTextStream *stream; -}; -#endif - //------------------------------------------------------------------- -class QTextStreamPrivate -{ - Q_DECLARE_PUBLIC(QTextStream) -public: - QTextStreamPrivate(QTextStream *q_ptr); - ~QTextStreamPrivate(); - void reset(); - - // device - QIODevice *device; -#ifndef QT_NO_QOBJECT - QDeviceClosedNotifier deviceClosedNotifier; -#endif - bool deleteDevice; - - // string - QString *string; - int stringOffset; - QIODevice::OpenMode stringOpenMode; - -#ifndef QT_NO_TEXTCODEC - // codec - QTextCodec *codec; - QTextCodec::ConverterState readConverterState; - QTextCodec::ConverterState writeConverterState; - QTextCodec::ConverterState *readConverterSavedState; - bool autoDetectUnicode; -#endif - - // i/o - enum TokenDelimiter { - Space, - NotSpace, - EndOfLine - }; - - QString read(int maxlen); - bool scan(const QChar **ptr, int *tokenLength, - int maxlen, TokenDelimiter delimiter); - inline const QChar *readPtr() const; - inline void consumeLastToken(); - inline void consume(int nchars); - void saveConverterState(qint64 newPos); - void restoreToSavedConverterState(); - int lastTokenSize; - - // Return value type for getNumber() - enum NumberParsingStatus { - npsOk, - npsMissingDigit, - npsInvalidPrefix - }; - - inline bool getChar(QChar *ch); - inline void ungetChar(QChar ch); - NumberParsingStatus getNumber(qulonglong *l); - bool getReal(double *f); - - inline void write(const QString &data); - inline void putString(const QString &ch, bool number = false); - void putNumber(qulonglong number, bool negative); - - // buffers - bool fillReadBuffer(qint64 maxBytes = -1); - void resetReadBuffer(); - void flushWriteBuffer(); - QString writeBuffer; - QString readBuffer; - int readBufferOffset; - int readConverterSavedStateOffset; //the offset between readBufferStartDevicePos and that start of the buffer - qint64 readBufferStartDevicePos; - - // streaming parameters - int realNumberPrecision; - int integerBase; - int fieldWidth; - QChar padChar; - QTextStream::FieldAlignment fieldAlignment; - QTextStream::RealNumberNotation realNumberNotation; - QTextStream::NumberFlags numberFlags; - - // status - QTextStream::Status status; - - QLocale locale; - - QTextStream *q_ptr; -}; /*! \internal @@ -481,10 +367,7 @@ static void copyConverterStateHelper(QTextCodec::ConverterState *dest, } #endif -/*! - \internal -*/ -void QTextStreamPrivate::reset() +void QTextStreamPrivate::Params::reset() { realNumberPrecision = 6; integerBase = 0; @@ -493,6 +376,14 @@ void QTextStreamPrivate::reset() fieldAlignment = QTextStream::AlignRight; realNumberNotation = QTextStream::SmartNotation; numberFlags = 0; +} + +/*! + \internal +*/ +void QTextStreamPrivate::reset() +{ + params.reset(); device = 0; deleteDevice = false; @@ -985,15 +876,17 @@ inline void QTextStreamPrivate::putString(const QString &s, bool number) QString tmp = s; // handle padding - int padSize = fieldWidth - s.size(); + int padSize = params.fieldWidth - s.size(); if (padSize > 0) { - QString pad(padSize, padChar); - if (fieldAlignment == QTextStream::AlignLeft) { - tmp.append(QString(padSize, padChar)); - } else if (fieldAlignment == QTextStream::AlignRight - || fieldAlignment == QTextStream::AlignAccountingStyle) { - tmp.prepend(QString(padSize, padChar)); - if (fieldAlignment == QTextStream::AlignAccountingStyle && number) { + QString pad(padSize, params.padChar); + switch (params.fieldAlignment) { + case QTextStream::AlignLeft: + tmp.append(pad); + break; + case QTextStream::AlignRight: + case QTextStream::AlignAccountingStyle: + tmp.prepend(pad); + if (params.fieldAlignment == QTextStream::AlignAccountingStyle && number) { const QChar sign = s.size() > 0 ? s.at(0) : QChar(); if (sign == locale.negativeSign() || sign == locale.positiveSign()) { QChar *data = tmp.data(); @@ -1001,9 +894,11 @@ inline void QTextStreamPrivate::putString(const QString &s, bool number) data[0] = sign; } } - } else if (fieldAlignment == QTextStream::AlignCenter) { - tmp.prepend(QString(padSize/2, padChar)); - tmp.append(QString(padSize - padSize/2, padChar)); + break; + case QTextStream::AlignCenter: + tmp.prepend(QString(padSize/2, params.padChar)); + tmp.append(QString(padSize - padSize/2, params.padChar)); + break; } } @@ -1175,13 +1070,7 @@ void QTextStream::reset() { Q_D(QTextStream); - d->realNumberPrecision = 6; - d->integerBase = 0; - d->fieldWidth = 0; - d->padChar = QLatin1Char(' '); - d->fieldAlignment = QTextStream::AlignRight; - d->realNumberNotation = QTextStream::SmartNotation; - d->numberFlags = 0; + d->params.reset(); } /*! @@ -1400,7 +1289,7 @@ QString *QTextStream::string() const void QTextStream::setFieldAlignment(FieldAlignment mode) { Q_D(QTextStream); - d->fieldAlignment = mode; + d->params.fieldAlignment = mode; } /*! @@ -1411,7 +1300,7 @@ void QTextStream::setFieldAlignment(FieldAlignment mode) QTextStream::FieldAlignment QTextStream::fieldAlignment() const { Q_D(const QTextStream); - return d->fieldAlignment; + return d->params.fieldAlignment; } /*! @@ -1432,7 +1321,7 @@ QTextStream::FieldAlignment QTextStream::fieldAlignment() const void QTextStream::setPadChar(QChar ch) { Q_D(QTextStream); - d->padChar = ch; + d->params.padChar = ch; } /*! @@ -1443,7 +1332,7 @@ void QTextStream::setPadChar(QChar ch) QChar QTextStream::padChar() const { Q_D(const QTextStream); - return d->padChar; + return d->params.padChar; } /*! @@ -1461,7 +1350,7 @@ QChar QTextStream::padChar() const void QTextStream::setFieldWidth(int width) { Q_D(QTextStream); - d->fieldWidth = width; + d->params.fieldWidth = width; } /*! @@ -1472,7 +1361,7 @@ void QTextStream::setFieldWidth(int width) int QTextStream::fieldWidth() const { Q_D(const QTextStream); - return d->fieldWidth; + return d->params.fieldWidth; } /*! @@ -1486,7 +1375,7 @@ int QTextStream::fieldWidth() const void QTextStream::setNumberFlags(NumberFlags flags) { Q_D(QTextStream); - d->numberFlags = flags; + d->params.numberFlags = flags; } /*! @@ -1497,7 +1386,7 @@ void QTextStream::setNumberFlags(NumberFlags flags) QTextStream::NumberFlags QTextStream::numberFlags() const { Q_D(const QTextStream); - return d->numberFlags; + return d->params.numberFlags; } /*! @@ -1513,7 +1402,7 @@ QTextStream::NumberFlags QTextStream::numberFlags() const void QTextStream::setIntegerBase(int base) { Q_D(QTextStream); - d->integerBase = base; + d->params.integerBase = base; } /*! @@ -1525,7 +1414,7 @@ void QTextStream::setIntegerBase(int base) int QTextStream::integerBase() const { Q_D(const QTextStream); - return d->integerBase; + return d->params.integerBase; } /*! @@ -1539,7 +1428,7 @@ int QTextStream::integerBase() const void QTextStream::setRealNumberNotation(RealNumberNotation notation) { Q_D(QTextStream); - d->realNumberNotation = notation; + d->params.realNumberNotation = notation; } /*! @@ -1550,7 +1439,7 @@ void QTextStream::setRealNumberNotation(RealNumberNotation notation) QTextStream::RealNumberNotation QTextStream::realNumberNotation() const { Q_D(const QTextStream); - return d->realNumberNotation; + return d->params.realNumberNotation; } /*! @@ -1567,10 +1456,10 @@ void QTextStream::setRealNumberPrecision(int precision) Q_D(QTextStream); if (precision < 0) { qWarning("QTextStream::setRealNumberPrecision: Invalid precision (%d)", precision); - d->realNumberPrecision = 6; + d->params.realNumberPrecision = 6; return; } - d->realNumberPrecision = precision; + d->params.realNumberPrecision = precision; } /*! @@ -1582,7 +1471,7 @@ void QTextStream::setRealNumberPrecision(int precision) int QTextStream::realNumberPrecision() const { Q_D(const QTextStream); - return d->realNumberPrecision; + return d->params.realNumberPrecision; } /*! @@ -1722,7 +1611,7 @@ QTextStreamPrivate::NumberParsingStatus QTextStreamPrivate::getNumber(qulonglong consumeLastToken(); // detect int encoding - int base = integerBase; + int base = params.integerBase; if (base == 0) { QChar ch; if (!getChar(&ch)) @@ -2300,6 +2189,7 @@ void QTextStreamPrivate::putNumber(qulonglong number, bool negative) QString result; unsigned flags = 0; + const QTextStream::NumberFlags numberFlags = params.numberFlags; if (numberFlags & QTextStream::ShowBase) flags |= QLocalePrivate::ShowBase; if (numberFlags & QTextStream::ForceSign) @@ -2315,7 +2205,7 @@ void QTextStreamPrivate::putNumber(qulonglong number, bool negative) flags |= QLocalePrivate::ThousandsGroup; const QLocalePrivate *dd = locale.d; - int base = integerBase ? integerBase : 10; + int base = params.integerBase ? params.integerBase : 10; if (negative && base == 10) { result = dd->longLongToString(-static_cast<qlonglong>(number), -1, base, -1, flags); @@ -2330,7 +2220,7 @@ void QTextStreamPrivate::putNumber(qulonglong number, bool negative) result = dd->unsLongLongToString(number, -1, base, -1, flags); // workaround for backward compatibility - in octal form with // ShowBase flag set zero should be written as '00' - if (number == 0 && base == 8 && numberFlags & QTextStream::ShowBase + if (number == 0 && base == 8 && params.numberFlags & QTextStream::ShowBase && result == QLatin1String("0")) { result.prepend(QLatin1Char('0')); } @@ -2524,7 +2414,7 @@ QTextStream &QTextStream::operator<<(double f) flags |= QLocalePrivate::Alternate; const QLocalePrivate *dd = d->locale.d; - QString num = dd->doubleToString(f, d->realNumberPrecision, form, -1, flags); + QString num = dd->doubleToString(f, d->params.realNumberPrecision, form, -1, flags); d->putString(num, true); return *this; } @@ -2605,13 +2495,13 @@ QTextStream &QTextStream::operator<<(const void *ptr) { Q_D(QTextStream); CHECK_VALID_STREAM(*this); - int oldBase = d->integerBase; - NumberFlags oldFlags = d->numberFlags; - d->integerBase = 16; - d->numberFlags |= ShowBase; + const int oldBase = d->params.integerBase; + const NumberFlags oldFlags = d->params.numberFlags; + d->params.integerBase = 16; + d->params.numberFlags |= ShowBase; d->putNumber(reinterpret_cast<quintptr>(ptr), false); - d->integerBase = oldBase; - d->numberFlags = oldFlags; + d->params.integerBase = oldBase; + d->params.numberFlags = oldFlags; return *this; } @@ -3130,7 +3020,3 @@ QLocale QTextStream::locale() const QT_END_NAMESPACE -#ifndef QT_NO_QOBJECT -#include "qtextstream.moc" -#endif - diff --git a/src/corelib/io/qtextstream.h b/src/corelib/io/qtextstream.h index 3c25e0587a..6d143bdca7 100644 --- a/src/corelib/io/qtextstream.h +++ b/src/corelib/io/qtextstream.h @@ -54,8 +54,6 @@ #error qtextstream.h must be included before any header file that defines Status #endif -QT_BEGIN_HEADER - QT_BEGIN_NAMESPACE @@ -194,6 +192,7 @@ public: private: Q_DISABLE_COPY(QTextStream) + friend class QDebugStateSaverPrivate; QScopedPointer<QTextStreamPrivate> d_ptr; }; @@ -284,6 +283,4 @@ inline QTextStreamManipulator qSetRealNumberPrecision(int precision) QT_END_NAMESPACE -QT_END_HEADER - #endif // QTEXTSTREAM_H diff --git a/src/corelib/io/qtextstream_p.h b/src/corelib/io/qtextstream_p.h new file mode 100644 index 0000000000..d5d5288426 --- /dev/null +++ b/src/corelib/io/qtextstream_p.h @@ -0,0 +1,185 @@ +/**************************************************************************** +** +** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QTEXTSTREAM_P_H +#define QTEXTSTREAM_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include "qtextstream.h" +#ifndef QT_NO_TEXTCODEC +#include "qtextcodec.h" +#endif + +QT_BEGIN_NAMESPACE + +#ifndef QT_NO_QOBJECT +class QDeviceClosedNotifier : public QObject +{ + Q_OBJECT +public: + inline QDeviceClosedNotifier() + { } + + inline void setupDevice(QTextStream *stream, QIODevice *device) + { + disconnect(); + if (device) + connect(device, SIGNAL(aboutToClose()), this, SLOT(flushStream())); + this->stream = stream; + } + +public Q_SLOTS: + inline void flushStream() { stream->flush(); } + +private: + QTextStream *stream; +}; +#endif + +class QTextStreamPrivate +{ + Q_DECLARE_PUBLIC(QTextStream) +public: + QTextStreamPrivate(QTextStream *q_ptr); + ~QTextStreamPrivate(); + void reset(); + + // device + QIODevice *device; +#ifndef QT_NO_QOBJECT + QDeviceClosedNotifier deviceClosedNotifier; +#endif + bool deleteDevice; + + // string + QString *string; + int stringOffset; + QIODevice::OpenMode stringOpenMode; + +#ifndef QT_NO_TEXTCODEC + // codec + QTextCodec *codec; + QTextCodec::ConverterState readConverterState; + QTextCodec::ConverterState writeConverterState; + QTextCodec::ConverterState *readConverterSavedState; + bool autoDetectUnicode; +#endif + + // i/o + enum TokenDelimiter { + Space, + NotSpace, + EndOfLine + }; + + QString read(int maxlen); + bool scan(const QChar **ptr, int *tokenLength, + int maxlen, TokenDelimiter delimiter); + inline const QChar *readPtr() const; + inline void consumeLastToken(); + inline void consume(int nchars); + void saveConverterState(qint64 newPos); + void restoreToSavedConverterState(); + int lastTokenSize; + + // Return value type for getNumber() + enum NumberParsingStatus { + npsOk, + npsMissingDigit, + npsInvalidPrefix + }; + + inline bool getChar(QChar *ch); + inline void ungetChar(QChar ch); + NumberParsingStatus getNumber(qulonglong *l); + bool getReal(double *f); + + inline void write(const QString &data); + inline void putString(const QString &ch, bool number = false); + void putNumber(qulonglong number, bool negative); + + // buffers + bool fillReadBuffer(qint64 maxBytes = -1); + void resetReadBuffer(); + void flushWriteBuffer(); + QString writeBuffer; + QString readBuffer; + int readBufferOffset; + int readConverterSavedStateOffset; //the offset between readBufferStartDevicePos and that start of the buffer + qint64 readBufferStartDevicePos; + + // streaming parameters + class Params + { + public: + void reset(); + + int realNumberPrecision; + int integerBase; + int fieldWidth; + QChar padChar; + QTextStream::FieldAlignment fieldAlignment; + QTextStream::RealNumberNotation realNumberNotation; + QTextStream::NumberFlags numberFlags; + }; + Params params; + + // status + QTextStream::Status status; + + QLocale locale; + + QTextStream *q_ptr; +}; + +QT_END_NAMESPACE + +#endif // QTEXTSTREAM_P_H diff --git a/src/corelib/io/qtldurl.cpp b/src/corelib/io/qtldurl.cpp index 436e6a4568..dd4301e9f1 100644 --- a/src/corelib/io/qtldurl.cpp +++ b/src/corelib/io/qtldurl.cpp @@ -51,12 +51,22 @@ QT_BEGIN_NAMESPACE static bool containsTLDEntry(const QString &entry) { int index = qt_hash(entry) % tldCount; - int currentDomainIndex = tldIndices[index]; - while (currentDomainIndex < tldIndices[index+1]) { - QString currentEntry = QString::fromUtf8(tldData + currentDomainIndex); + + // select the right chunk from the big table + short chunk = 0; + uint chunkIndex = tldIndices[index], offset = 0; + while (tldIndices[index] >= tldChunks[chunk] && chunk < tldChunkCount) { + chunkIndex -= tldChunks[chunk]; + offset += tldChunks[chunk]; + chunk++; + } + + // check all the entries from the given index + while (chunkIndex < tldIndices[index+1] - offset) { + QString currentEntry = QString::fromUtf8(tldData[chunk] + chunkIndex); if (currentEntry == entry) return true; - currentDomainIndex += qstrlen(tldData + currentDomainIndex) + 1; // +1 for the ending \0 + chunkIndex += qstrlen(tldData[chunk] + chunkIndex) + 1; // +1 for the ending \0 } return false; } diff --git a/src/corelib/io/qurl.cpp b/src/corelib/io/qurl.cpp index 7ff23d931c..c71bb3afac 100644 --- a/src/corelib/io/qurl.cpp +++ b/src/corelib/io/qurl.cpp @@ -333,11 +333,6 @@ static inline QString ftpScheme() return QStringLiteral("ftp"); } -static inline QString httpScheme() -{ - return QStringLiteral("http"); -} - static inline QString fileScheme() { return QStringLiteral("file"); @@ -660,7 +655,7 @@ static const ushort encodedFragmentActions[] = { encode(']'), // 6 0 }; -static const ushort * const decodedFragmentInUrlActions = 0; +//static const ushort * const decodedFragmentInUrlActions = 0; static const ushort * const decodedFragmentInIsolationActions = 0; // the query is handled specially: the decodedQueryXXX tables are run with @@ -3765,6 +3760,37 @@ QString QUrl::errorString() const } /*! + \since 5.1 + + Converts a list of \a urls into a list of QStrings, using toString(\a options). +*/ +QStringList QUrl::toStringList(const QList<QUrl> &urls, FormattingOptions options) +{ + QStringList lst; + lst.reserve(urls.size()); + foreach (const QUrl &url, urls) + lst.append(url.toString(options)); + return lst; + +} + +/*! + \since 5.1 + + Converts a list of strings representing \a urls into a list of urls, using QUrl(str, \a mode). + Note that this means all strings must be urls, not for instance local paths. +*/ +QList<QUrl> QUrl::fromStringList(const QStringList &urls, ParsingMode mode) +{ + QList<QUrl> lst; + lst.reserve(urls.size()); + foreach (const QString &str, urls) { + lst.append(QUrl(str, mode)); + } + return lst; +} + +/*! \typedef QUrl::DataPtr \internal */ diff --git a/src/corelib/io/qurl.h b/src/corelib/io/qurl.h index bd35b44f17..de4ce754fb 100644 --- a/src/corelib/io/qurl.h +++ b/src/corelib/io/qurl.h @@ -50,8 +50,6 @@ #include <QtCore/qpair.h> #include <QtCore/qglobal.h> -QT_BEGIN_HEADER - QT_BEGIN_NAMESPACE @@ -322,6 +320,9 @@ public: static QString fromAce(const QByteArray &); static QByteArray toAce(const QString &); static QStringList idnWhitelist(); + static QStringList toStringList(const QList<QUrl> &uris, FormattingOptions options = FormattingOptions(PrettyDecoded)); + static QList<QUrl> fromStringList(const QStringList &uris, ParsingMode mode = TolerantMode); + static void setIdnWhitelist(const QStringList &); friend Q_CORE_EXPORT uint qHash(const QUrl &url, uint seed = 0) Q_DECL_NOTHROW; @@ -381,6 +382,4 @@ QT_END_NAMESPACE # include <QtCore/qurlquery.h> #endif -QT_END_HEADER - #endif // QURL_H diff --git a/src/corelib/io/qurlidna.cpp b/src/corelib/io/qurlidna.cpp index e2cd481035..fac1703da8 100644 --- a/src/corelib/io/qurlidna.cpp +++ b/src/corelib/io/qurlidna.cpp @@ -2336,27 +2336,42 @@ Q_AUTOTEST_EXPORT QString qt_punycodeDecoder(const QString &pc) } static const char * const idn_whitelist[] = { - "ac", "ar", "at", + "ac", "ar", "asia", "at", "biz", "br", - "cat", "ch", "cl", "cn", + "cat", "ch", "cl", "cn", "com", "de", "dk", "es", "fi", "gr", "hu", - "info", "io", "is", + "il", "info", "io", "is", "ir", "jp", "kr", - "li", "lt", + "li", "lt", "lu", "lv", "museum", - "no", + "name", "net", "no", "nu", "nz", "org", + "pl", "pr", "se", "sh", - "th", "tm", "tw", + "tel", "th", "tm", "tw", + "ua", "vn", + "xn--fiqs8s", // China + "xn--fiqz9s", // China + "xn--fzc2c9e2c", // Sri Lanka + "xn--j6w193g", // Hong Kong + "xn--kprw13d", // Taiwan + "xn--kpry57d", // Taiwan + "xn--mgba3a4f16a", // Iran + "xn--mgba3a4fra", // Iran "xn--mgbaam7a8h", // UAE + "xn--mgbayh7gpa", // Jordan "xn--mgberp4a5d4ar", // Saudi Arabia - "xn--wgbh1c" // Egypt + "xn--ogbpf8fl", // Syria + "xn--p1ai", // Russian Federation + "xn--wgbh1c", // Egypt + "xn--wgbl6a", // Qatar + "xn--xkc2al3hye2a" // Sri Lanka }; static const size_t idn_whitelist_size = sizeof idn_whitelist / sizeof *idn_whitelist; diff --git a/src/corelib/io/qurlquery.h b/src/corelib/io/qurlquery.h index 319fe3cf22..c515bf78c7 100644 --- a/src/corelib/io/qurlquery.h +++ b/src/corelib/io/qurlquery.h @@ -50,8 +50,6 @@ #include <QtCore/qstringlist.h> #endif -QT_BEGIN_HEADER - QT_BEGIN_NAMESPACE class QUrlQueryPrivate; @@ -173,6 +171,4 @@ inline QList<QByteArray> QUrl::allEncodedQueryItemValues(const QByteArray &key) QT_END_NAMESPACE -QT_END_HEADER - #endif // QURLQUERY_H diff --git a/src/corelib/io/qurltlds_p.h b/src/corelib/io/qurltlds_p.h index f4f525ced7..dfc69f500b 100644 --- a/src/corelib/io/qurltlds_p.h +++ b/src/corelib/io/qurltlds_p.h @@ -59,6423 +59,9898 @@ QT_BEGIN_NAMESPACE // for instructions see the program at // util/corelib/qurl-generateTLDs -static const quint16 tldCount = 3949; -static const quint16 tldIndices[] = { +static const quint16 tldCount = 6063; +static const quint32 tldIndices[] = { 0, -7, -14, -14, -20, -51, -61, -93, -100, -100, -116, -159, -167, -180, -180, -193, -234, -234, -234, -255, -255, -255, -280, -280, +13, +19, +36, +66, +90, +90, +113, +130, +151, +151, +151, +168, +179, +196, +203, +222, +222, +237, +237, +251, +258, 287, 287, -295, -303, -313, -326, -326, -380, -393, -413, -419, -419, -419, -424, -438, -438, -469, -515, -515, -515, -534, -534, -557, -557, -557, -557, -572, -572, -572, -579, -587, -597, -612, -612, -624, -636, -648, -662, -687, -709, -714, -740, -766, -789, -789, -805, -805, -810, -815, -815, -824, -824, -831, -857, -869, -891, -891, -916, -916, -916, -927, -934, -964, -971, +287, +287, +287, +314, +336, +352, +352, +352, +369, +369, +377, +396, +396, +396, +405, +405, +431, +431, +442, +451, +485, +495, +509, +509, +509, +524, +524, +533, +533, +552, +552, +552, +552, +577, +577, +593, +593, +593, +593, +593, +593, +622, +643, +643, +658, +691, +703, +715, +731, +731, +747, +781, +793, +793, +814, +826, +851, +851, +866, +885, +914, +929, +929, +929, +941, +947, +947, 987, 987, 987, -1008, -1008, -1016, -1016, -1030, -1030, -1052, -1075, -1075, -1082, -1087, -1115, -1135, -1135, -1135, -1172, -1178, -1178, -1178, -1202, -1207, -1220, -1220, -1266, -1266, -1266, -1266, -1272, -1290, -1316, -1316, -1332, -1332, -1339, -1339, -1352, -1352, -1389, -1389, -1408, -1415, -1437, -1444, -1489, -1489, -1502, -1502, -1512, -1518, -1539, -1555, -1562, +1003, +1061, +1080, +1080, +1080, +1104, +1104, +1138, +1148, +1148, +1148, +1148, +1160, +1179, +1179, +1208, +1208, +1225, +1225, +1273, +1273, +1291, +1291, +1304, +1304, +1304, +1304, +1318, +1335, +1335, +1335, +1349, +1349, +1364, +1364, +1364, +1364, +1402, +1402, +1402, +1402, +1430, +1455, +1506, +1537, +1537, +1559, +1573, +1578, +1578, +1578, +1578, 1584, -1598, -1607, -1607, -1607, -1632, -1652, -1652, -1658, -1658, -1675, +1592, +1599, +1599, +1599, +1606, +1641, +1641, +1663, +1663, +1663, +1663, +1663, 1682, -1709, -1733, -1748, -1776, -1783, -1783, -1790, -1797, -1826, -1850, -1850, -1856, -1880, -1887, -1901, -1921, -1947, -1961, -1967, -1967, -1967, -1972, -1986, -1986, -1986, -2009, -2029, -2029, -2047, -2061, -2075, -2075, -2075, -2075, -2075, -2075, -2082, -2082, -2124, -2124, -2129, -2162, -2162, -2162, -2236, -2256, -2263, -2276, -2283, -2313, -2313, -2347, -2380, -2387, -2387, -2387, -2431, -2438, -2445, -2452, -2459, -2459, -2469, -2490, -2516, -2527, -2540, -2540, -2586, -2610, -2630, -2630, -2653, -2660, -2669, -2693, -2693, -2710, -2710, -2719, -2719, -2734, -2740, -2740, -2753, -2753, -2763, -2770, -2775, -2782, -2789, -2802, -2820, -2827, -2827, -2841, -2855, -2855, -2865, -2872, -2884, -2884, -2919, -2937, -2955, -2962, -3012, -3042, -3073, -3083, -3083, -3100, -3105, -3112, -3131, -3131, -3166, -3180, -3187, -3194, -3211, -3218, -3223, -3233, -3249, -3259, -3268, -3314, -3314, -3324, -3324, -3336, -3336, -3336, +1682, +1689, +1689, +1689, +1715, +1731, +1731, +1741, +1761, +1777, +1777, +1777, +1777, +1777, +1796, +1796, +1824, +1847, +1847, +1854, +1876, +1876, +1876, +1908, +1908, +1925, +1952, +1974, +1991, +2010, +2010, +2010, +2010, +2028, +2048, +2066, +2066, +2091, +2119, +2151, +2151, +2151, +2175, +2175, +2175, +2205, +2219, +2232, +2281, +2281, +2281, +2302, +2311, +2327, +2327, +2327, +2340, +2340, +2340, +2368, +2386, +2404, +2414, +2423, +2423, +2423, +2423, +2443, +2443, +2450, +2487, +2487, +2487, +2487, +2494, +2509, +2509, +2509, +2535, +2545, +2615, +2615, +2615, +2633, +2633, +2641, +2688, +2688, +2688, +2702, +2708, +2730, +2748, +2748, +2748, +2748, +2764, +2798, +2807, +2815, +2826, +2826, +2835, +2864, +2864, +2898, +2898, +2905, +2915, +2922, +2922, +2938, +2938, +2967, +2967, +2967, +2986, +2986, +3002, +3008, +3018, +3052, +3066, +3099, +3099, +3115, +3115, +3115, +3159, +3159, +3172, +3186, +3186, +3262, +3262, +3262, +3305, 3336, 3350, -3363, -3376, -3398, -3416, -3445, -3464, -3488, -3488, -3497, -3545, -3552, -3552, -3552, -3566, -3573, -3573, -3573, -3581, -3581, -3603, -3603, -3615, -3621, -3621, -3683, -3683, -3710, -3710, -3716, -3716, -3748, -3770, -3791, -3803, -3810, -3817, -3833, -3846, -3846, -3852, -3876, -3876, -3882, -3903, -3910, -3939, -3939, -3939, -3947, -3962, -3962, -3981, -3994, -4021, -4030, -4042, -4085, -4085, -4096, -4096, -4104, -4123, -4123, -4123, -4143, -4154, -4164, -4194, -4194, -4194, -4205, -4205, -4222, -4238, -4301, -4309, -4322, -4331, -4331, -4331, -4331, -4331, -4347, -4365, -4375, -4375, -4385, -4398, -4412, -4430, -4430, -4437, -4447, -4463, -4472, -4472, -4472, -4484, -4484, -4484, -4484, -4484, -4490, -4490, -4511, -4511, -4522, -4522, -4522, -4522, -4528, -4528, +3394, +3411, +3411, +3424, +3483, +3505, +3532, +3532, +3532, +3538, +3538, +3561, +3575, +3580, +3601, +3601, +3601, +3601, +3601, +3601, +3601, +3601, +3635, +3635, +3635, +3686, +3704, +3704, +3736, +3749, +3783, +3783, +3816, +3840, +3877, +3885, +3885, +3885, +3885, +3907, +3944, +3944, +3956, +3963, +3963, +3963, +3963, +3975, +3975, +3975, +3993, +4038, +4062, +4062, +4062, +4071, +4071, +4084, +4097, +4119, +4119, +4119, +4135, +4135, +4166, +4178, +4178, +4208, +4225, +4285, +4300, +4300, +4300, +4300, +4318, +4318, +4318, +4336, +4348, +4354, +4354, +4388, +4388, +4416, +4433, +4433, +4433, +4433, +4433, +4433, +4450, +4450, +4450, +4450, +4467, +4467, +4480, +4514, +4524, 4534, -4551, -4551, -4551, -4564, -4583, -4583, -4611, -4611, -4611, -4622, -4622, -4649, -4668, -4677, -4692, -4692, -4692, -4705, -4723, -4723, -4723, -4729, -4729, -4743, -4743, -4750, -4750, -4763, -4770, -4776, -4776, -4776, -4793, -4811, -4811, -4811, -4821, -4821, -4841, -4857, -4891, -4897, -4903, -4903, -4903, -4919, -4935, -4942, -4958, -4958, -4975, -4975, -4975, -4985, -4985, -5020, -5032, +4552, +4552, +4572, +4572, +4599, +4641, +4659, +4659, +4659, +4666, +4666, +4666, +4717, +4769, +4785, +4797, +4797, +4815, +4853, +4859, +4868, +4894, +4894, +4894, +4920, +4930, +4972, +4972, +5005, +5005, +5023, +5023, 5032, -5040, -5053, -5068, -5079, -5079, -5101, -5115, -5115, -5135, -5154, -5161, -5161, -5168, -5168, -5184, -5210, -5210, -5238, -5255, -5278, -5285, -5308, -5318, -5327, -5327, -5333, -5333, -5340, -5348, -5355, -5366, -5377, -5384, -5408, -5415, -5422, -5435, -5442, -5482, -5482, -5482, -5482, -5498, -5527, -5534, -5541, -5572, -5572, -5572, -5579, -5591, -5602, -5602, -5621, -5621, -5646, -5664, -5671, -5671, -5681, -5696, -5707, -5716, -5716, -5723, -5723, -5732, +5059, +5059, +5080, +5094, +5100, +5100, +5100, +5100, +5100, +5118, +5145, +5145, +5145, +5153, +5221, +5256, +5289, +5296, +5306, +5306, +5343, +5343, +5343, +5362, +5369, +5433, +5451, +5451, +5451, +5470, +5470, +5470, +5490, +5506, +5528, +5548, +5548, +5548, +5548, +5563, +5576, +5585, +5636, +5636, +5661, +5661, +5668, +5685, +5698, +5715, 5742, -5742, -5763, -5770, -5776, -5790, -5790, -5797, -5806, -5816, -5832, -5882, -5882, -5882, -5882, -5893, -5934, -5934, -5965, -5965, -5980, -5980, -5980, -5980, -6007, -6017, -6034, -6051, -6065, -6075, -6075, -6091, -6097, -6097, -6109, -6109, -6109, -6122, -6147, -6168, -6168, -6191, -6191, -6191, -6191, -6191, -6198, -6217, -6224, -6224, -6231, -6245, -6252, -6252, -6270, -6270, -6284, -6305, -6315, -6322, -6322, -6322, -6329, -6329, -6329, -6353, -6361, -6361, -6375, -6391, -6405, -6405, -6415, -6431, -6431, -6431, -6431, -6458, -6475, -6475, -6475, -6482, -6489, -6496, -6496, -6503, -6520, -6520, -6520, -6527, -6527, +5748, +5756, +5800, +5800, +5800, +5827, +5827, +5846, +5864, +5910, +5926, +5941, +5952, +5952, +5958, +5958, +5976, +5985, +5991, +5991, +5991, +5998, +5998, +5998, +6011, +6011, +6060, +6076, +6088, +6105, +6124, +6124, +6124, +6157, +6157, +6157, +6157, +6174, +6190, +6190, +6190, +6209, +6228, +6228, +6228, +6228, +6234, +6234, +6234, +6234, +6234, +6249, +6264, +6264, +6290, +6308, +6346, +6362, +6362, +6400, +6420, +6432, +6455, +6455, +6464, +6491, +6491, +6491, +6497, +6524, +6544, +6544, +6544, 6544, -6561, -6573, -6573, -6580, -6580, -6587, -6587, -6592, -6592, -6592, -6592, -6599, -6599, -6612, -6633, -6649, -6649, -6669, -6676, -6683, -6683, -6713, -6720, -6727, -6736, -6736, -6746, -6770, -6807, -6814, -6827, -6846, -6846, -6864, -6864, -6864, -6864, -6881, -6888, -6888, -6888, +6559, +6576, +6619, +6682, +6682, +6716, +6716, +6716, +6716, +6716, +6716, +6730, +6745, +6783, +6783, +6801, +6817, +6841, +6841, +6858, +6858, 6914, -6935, -6935, -6935, -6953, -6959, -6966, -6983, -6983, -6983, -7013, -7023, -7023, -7023, -7023, +6925, +6943, +6954, +6954, +6954, +6973, +6973, +6973, +6987, +6987, +6987, +7005, 7037, -7044, -7058, -7079, -7086, -7123, -7134, -7155, -7168, +7037, +7050, +7050, +7075, +7090, +7090, +7096, +7108, +7124, +7124, +7136, +7136, +7146, +7169, 7178, -7203, -7227, -7236, -7258, -7265, -7274, -7274, -7303, -7303, -7314, -7314, -7345, -7352, -7367, -7377, -7388, -7388, -7402, -7402, -7409, -7421, -7421, -7467, -7484, -7484, -7484, +7197, +7197, +7197, +7204, +7204, +7268, +7268, +7288, +7311, +7311, +7321, +7334, +7334, +7387, +7417, +7426, +7444, +7444, +7460, +7470, 7491, -7532, -7532, -7539, -7546, -7546, -7553, -7573, -7573, -7573, -7580, -7587, -7594, -7594, -7594, -7606, -7606, -7637, -7637, -7637, -7664, -7664, -7664, -7677, -7684, -7701, -7723, -7723, -7723, -7723, -7734, -7734, -7734, -7748, -7748, -7748, -7748, -7759, -7759, -7775, -7775, -7782, -7789, -7817, -7824, -7831, -7836, -7865, -7865, +7516, +7516, +7535, +7535, +7555, +7555, +7555, +7555, +7575, +7597, +7597, +7597, +7597, +7607, +7627, +7627, +7652, +7710, +7710, +7719, +7737, +7737, +7737, +7737, +7737, +7747, +7747, +7753, +7773, +7773, +7793, +7828, +7841, +7860, +7860, +7876, 7876, 7901, 7901, -7908, -7918, -7938, -7945, -7945, -7957, -7964, -7979, -7986, -7994, -8007, -8007, -8014, -8021, -8061, -8061, -8071, -8088, -8131, -8138, -8153, -8160, -8160, -8160, -8175, -8183, +7901, +7911, +7911, +7911, +7911, +7924, +7941, +7951, +7983, +7983, +7990, +8008, +8008, +8018, +8018, +8031, +8056, +8063, +8077, +8077, +8090, +8100, +8165, +8192, +8192, +8192, +8192, +8197, 8197, -8211, -8211, -8211, -8243, -8243, -8243, -8243, -8259, -8259, -8259, -8259, -8259, -8266, -8275, -8281, -8281, -8281, -8281, -8288, -8288, +8197, +8197, +8197, +8197, +8227, +8237, +8253, +8253, 8309, 8309, 8309, -8330, -8330, -8330, -8330, -8337, -8343, -8343, -8360, -8370, -8370, -8380, -8380, -8386, -8386, -8397, -8415, -8415, -8428, -8454, -8460, -8475, -8492, -8526, +8309, +8329, +8329, +8329, +8345, +8378, +8398, +8420, +8420, +8420, +8436, +8452, +8497, +8538, 8554, 8554, 8583, 8583, 8583, -8598, -8607, -8617, -8617, +8616, 8642, 8652, 8652, -8652, -8662, -8688, -8688, -8704, -8704, -8747, -8765, -8775, -8783, -8811, -8835, -8835, -8835, -8850, -8859, -8884, -8910, -8919, -8952, -8978, -8978, -8991, -8991, -8991, -8999, -8999, -8999, -9030, -9030, -9030, -9030, -9030, -9041, -9048, -9048, -9054, -9054, -9054, -9086, -9108, -9108, -9119, -9119, -9130, -9144, -9152, -9161, -9174, -9194, -9207, -9207, -9207, -9232, -9242, -9242, -9271, -9290, -9308, -9308, -9308, -9308, -9320, -9333, -9343, -9356, -9379, -9379, +8672, +8690, +8699, +8699, +8715, +8715, +8737, +8767, +8767, +8767, +8780, +8800, +8837, +8867, +8896, +8931, +8948, +8959, +8981, +9002, +9008, +9017, +9017, +9017, +9017, +9044, +9044, +9044, +9069, +9087, +9087, +9087, +9087, +9104, +9136, +9173, +9173, +9199, +9199, +9199, +9199, +9222, +9233, +9257, +9257, +9257, +9272, +9272, +9284, +9316, +9346, +9346, +9346, +9362, 9379, -9395, -9395, -9406, -9419, -9419, -9419, -9419, -9450, -9485, -9485, -9497, -9497, -9505, -9517, -9528, -9528, +9404, +9413, +9413, +9413, +9439, +9439, +9447, +9460, +9479, +9479, +9486, +9499, +9506, +9506, +9513, 9551, -9564, -9586, -9586, -9608, -9608, -9626, -9626, -9626, -9653, -9653, -9681, -9681, -9681, -9698, -9698, -9698, -9714, -9729, -9737, -9737, -9765, -9765, -9765, -9765, -9765, -9825, -9844, -9866, -9880, -9880, -9880, -9880, -9886, -9895, -9895, -9895, -9895, -9895, -9913, -9913, -9924, -9958, -9958, -9967, -9975, -9975, -9975, -9981, -9998, -9998, -9998, +9551, +9577, +9577, +9634, +9634, +9671, +9693, +9700, +9700, +9732, +9774, +9774, +9780, +9827, +9851, +9875, +9875, +9911, +9937, +9937, +9944, +9944, +9944, +9964, +9992, +9999, +9999, +9999, +10006, 10012, -10036, -10036, -10066, -10079, -10097, +10019, +10026, +10047, +10059, +10059, +10076, +10083, +10083, +10083, +10089, +10089, +10089, +10096, 10121, -10133, -10142, -10142, -10142, -10156, -10173, -10173, -10173, -10196, -10205, -10205, -10205, -10205, -10218, -10234, -10240, -10240, -10240, -10264, -10273, -10286, -10286, -10286, -10286, -10299, -10299, -10309, -10309, -10339, -10358, -10358, -10374, -10374, -10390, -10390, -10413, -10413, -10439, -10461, -10467, +10121, +10137, +10137, +10137, +10137, +10154, +10161, +10161, +10168, +10177, +10177, +10231, +10238, +10261, +10268, +10288, +10295, +10303, +10320, +10344, +10387, +10421, +10421, +10421, 10467, 10467, -10492, -10492, 10501, -10528, -10528, -10528, -10539, -10583, -10583, -10583, -10613, -10613, -10619, -10628, -10645, -10645, -10645, -10650, -10671, -10687, -10709, -10709, -10709, -10709, -10709, -10727, +10517, +10535, +10552, +10577, +10577, +10577, +10577, +10577, +10615, +10621, +10639, +10639, +10639, +10682, +10682, +10698, +10698, +10716, 10727, -10727, -10727, -10733, -10733, -10768, -10768, -10773, -10780, -10788, -10788, +10750, +10774, +10781, 10797, -10797, -10835, -10835, -10845, -10852, -10861, -10861, -10861, -10861, -10861, -10861, -10861, -10875, -10888, -10907, -10907, -10907, -10920, -10920, -10932, -10946, -10977, -10977, -10997, -11008, -11037, -11059, -11059, -11059, -11067, -11067, -11067, -11067, -11067, -11077, -11091, -11102, +10804, +10804, +10804, +10816, +10836, +10850, +10850, +10857, +10857, +10878, +10878, +10934, +10934, +10934, +10934, +10934, +10934, +10934, +10941, +10941, +10941, +10948, +10973, +10984, +11015, +11015, +11015, +11041, +11058, +11066, +11066, +11066, +11087, +11097, 11102, -11112, -11125, +11108, +11115, +11122, +11122, +11122, 11129, -11129, -11154, -11154, -11154, -11164, -11164, -11189, -11189, -11189, -11189, -11189, -11196, -11196, -11227, -11238, -11247, -11256, -11265, -11265, -11286, +11160, +11194, +11194, +11215, +11224, +11224, +11280, +11297, 11307, -11330, -11337, -11378, -11378, -11389, -11413, -11454, -11469, -11475, -11475, -11475, -11475, -11503, -11503, -11503, -11503, -11534, -11534, -11550, -11550, -11557, -11557, -11557, -11557, -11574, -11585, -11585, -11603, -11626, -11643, -11643, -11643, -11643, -11663, -11663, -11682, -11696, -11696, -11696, -11696, -11706, -11706, -11706, -11706, -11723, -11723, -11757, -11757, -11773, -11795, -11813, -11836, -11836, -11883, -11903, -11952, -11965, -11965, -11984, -11997, -12008, -12008, -12008, -12024, -12043, -12065, -12071, -12099, -12129, -12140, -12140, -12146, -12161, -12161, -12161, -12161, -12167, -12167, -12180, -12186, -12208, -12226, -12243, -12243, -12252, -12252, -12274, -12289, -12302, -12302, -12313, -12313, -12313, -12313, -12358, -12358, -12358, -12369, -12375, -12391, -12391, -12391, -12391, -12405, -12410, -12416, -12416, -12436, -12436, -12436, -12443, -12443, -12462, -12477, -12492, -12492, -12503, -12519, -12525, -12531, -12571, -12571, -12591, -12591, -12601, -12641, -12641, -12641, -12657, -12657, -12657, -12699, -12699, -12699, -12712, -12728, -12744, -12761, -12769, -12782, -12793, -12823, -12836, -12851, -12863, -12890, -12900, -12900, -12900, -12910, -12910, -12924, -12924, -12924, -12924, -12924, -12952, -12984, -13003, -13038, -13038, -13056, -13056, -13056, +11319, +11352, +11364, +11364, +11399, +11399, +11430, +11430, +11445, +11478, +11500, +11508, +11526, +11526, +11539, +11539, +11583, +11583, +11624, +11654, +11654, +11661, +11679, +11714, +11721, +11733, +11769, +11778, +11786, +11805, +11820, +11857, +11864, +11877, +11877, +11892, +11892, +11892, +11908, +11915, +11922, +11940, +11947, +11975, +11998, +12021, +12028, +12028, +12046, +12068, +12086, +12109, +12116, +12130, +12150, +12150, +12150, +12150, +12157, +12182, +12205, +12212, +12219, +12219, +12229, +12229, +12229, +12250, +12271, +12285, +12285, +12292, +12330, +12330, +12349, +12349, +12357, +12357, +12357, +12357, +12389, +12409, +12409, +12448, +12459, +12473, +12480, +12489, +12489, +12497, +12535, +12542, +12568, +12575, +12590, +12620, +12645, +12652, +12665, +12672, +12683, +12683, +12709, +12716, +12723, +12746, +12746, +12746, +12771, +12771, +12796, +12796, +12803, +12803, +12803, +12838, +12856, +12872, +12872, +12872, +12872, +12872, +12872, +12889, +12899, +12899, +12899, +12899, +12917, +12934, +12934, +12947, +12969, +12969, +12976, +13012, 13056, -13074, -13081, -13093, -13103, -13103, -13112, -13119, -13132, -13132, -13132, -13141, -13151, -13183, -13193, -13206, -13206, -13206, -13236, -13252, -13267, -13267, -13294, -13307, -13307, -13307, -13343, -13349, -13349, -13349, -13375, -13375, -13375, -13384, -13384, -13384, -13393, -13393, -13393, -13402, -13414, -13425, -13445, -13467, -13485, -13499, -13509, -13528, -13528, -13549, -13549, -13559, -13570, -13570, -13570, -13570, -13598, -13637, -13647, -13647, -13661, -13673, -13682, -13687, -13694, -13694, -13720, -13733, -13742, -13748, -13771, -13795, -13795, -13814, -13821, -13821, -13855, -13862, -13862, -13862, -13874, -13874, -13897, -13909, -13909, -13947, -13947, -13952, -13952, -13970, -13979, -13979, -13979, -14008, -14049, -14049, -14049, -14049, -14049, -14049, -14060, -14083, -14083, -14091, -14101, -14101, -14101, -14101, -14118, -14136, -14195, -14195, -14195, -14213, -14213, -14232, -14232, -14253, -14253, +13063, +13092, +13118, +13142, +13163, +13202, +13237, +13256, +13284, +13295, +13302, +13326, +13355, +13372, +13383, +13398, +13424, +13452, +13452, +13452, +13494, +13533, +13547, +13547, +13551, +13558, +13610, +13657, +13665, +13692, +13692, +13707, +13714, +13714, +13714, +13728, +13728, +13750, +13763, +13782, +13782, +13819, +13840, +13840, +13858, +13867, +13888, +13925, +13925, +13950, +13960, +13960, +13974, +14014, +14051, +14067, +14086, +14095, +14102, +14102, +14102, +14123, +14123, +14123, +14144, +14168, +14168, +14175, +14175, +14175, +14175, +14186, +14237, +14237, 14258, -14275, -14275, -14304, -14311, -14311, -14318, -14318, -14318, -14318, -14318, -14318, -14325, -14325, -14345, -14345, -14379, -14389, -14422, -14422, -14422, -14422, -14435, -14441, -14441, -14460, -14460, -14471, -14471, -14481, -14495, -14495, -14495, -14502, -14502, -14502, -14502, -14524, -14533, -14541, -14552, -14552, -14552, -14552, -14563, -14563, -14568, -14568, -14585, -14595, -14602, -14628, -14628, -14645, -14672, -14678, -14697, -14697, -14734, -14757, -14764, -14771, -14771, -14771, -14796, -14815, -14822, -14845, -14861, -14861, -14861, -14873, -14873, -14873, -14902, -14920, -14920, -14926, -14926, -14926, -14941, -14949, -14949, -14949, -14949, -14949, -14960, -14960, -14971, -14971, -14998, -15003, -15003, -15003, -15013, -15013, -15027, -15027, -15027, -15043, -15053, -15063, -15074, -15083, -15093, -15093, -15121, -15121, -15128, -15128, -15144, -15144, -15144, -15144, -15165, -15170, -15170, -15170, -15170, -15170, -15170, -15170, -15186, -15206, -15206, -15206, -15224, -15236, -15236, -15252, -15258, -15258, -15258, -15258, -15264, -15277, -15288, -15307, -15307, -15318, -15328, -15328, -15334, -15334, -15363, -15399, -15399, -15422, -15438, -15447, -15447, -15456, -15456, -15456, -15495, -15495, -15495, -15495, -15511, -15511, -15530, -15557, -15566, -15582, -15590, -15590, -15604, -15604, -15625, -15635, -15655, -15655, -15655, -15655, -15655, -15665, -15675, -15675, -15675, -15675, -15675, -15682, -15682, -15682, -15694, -15719, -15749, -15749, -15794, -15794, -15837, -15854, -15854, -15861, -15861, -15861, -15861, -15884, -15900, -15911, -15931, -15931, -15931, -15931, -15931, -15963, -15963, -15996, -16006, -16013, -16024, +14258, +14258, +14292, +14292, +14328, +14338, +14338, +14338, +14364, +14390, +14390, +14423, +14454, +14469, +14512, +14512, +14512, +14512, +14512, +14512, +14512, +14525, +14535, +14550, +14572, +14578, +14591, +14603, +14603, +14603, +14619, +14619, +14619, +14619, +14656, +14679, +14700, +14725, +14725, +14725, +14725, +14725, +14730, +14751, +14767, +14767, +14767, +14767, +14787, +14820, +14837, +14837, +14865, +14865, +14882, +14882, +14882, +14882, +14882, +14892, +14892, +14892, +14912, +14929, +14947, +14947, +14947, +14947, +14947, +14947, +14966, +15018, +15034, +15044, +15055, +15055, +15073, +15118, +15118, +15118, +15146, +15158, +15169, +15175, +15175, +15175, +15181, +15181, +15181, +15247, +15279, +15292, +15292, +15292, +15292, +15326, +15331, +15365, +15389, +15398, +15412, +15426, +15433, +15433, +15433, +15433, +15469, +15490, +15490, +15506, +15523, +15553, +15553, +15571, +15571, +15585, +15602, +15602, +15602, +15602, +15602, +15631, +15658, +15669, +15699, +15716, +15716, +15757, +15789, +15796, +15796, +15796, +15796, +15815, +15840, +15898, +15898, +15919, +15933, +15933, +15940, +15946, +15946, +15964, +15964, +15964, +15973, +15979, +16008, +16019, +16019, 16034, -16049, -16049, -16049, -16059, -16059, -16059, -16059, -16059, -16059, -16059, -16064, -16075, -16104, -16104, -16117, -16124, -16124, -16124, -16124, -16130, -16145, -16159, -16190, -16193, -16196, -16210, -16224, -16243, -16255, -16261, -16280, -16283, -16292, -16295, -16295, -16301, -16304, +16042, +16057, +16073, +16095, +16095, +16112, +16121, +16139, +16139, +16139, +16148, +16148, +16148, +16148, +16165, +16187, +16187, +16199, +16199, +16215, +16215, +16215, +16231, +16240, +16284, +16305, +16305, 16322, -16325, -16328, -16349, -16355, -16382, -16408, -16414, -16414, -16414, -16458, -16477, -16480, -16485, -16488, -16514, -16520, -16530, -16530, -16546, -16562, -16597, -16603, -16622, -16622, -16646, -16669, -16672, -16715, -16715, -16715, -16718, -16718, -16727, -16733, -16752, -16770, -16787, -16794, -16810, -16827, -16840, -16850, -16876, -16901, -16901, -16901, -16916, -16919, -16926, -16943, -16972, -16978, -16978, -16978, -16981, -17008, -17008, -17016, -17053, -17053, -17053, -17053, -17072, -17086, -17105, -17139, -17153, -17162, -17162, -17177, -17177, -17177, -17177, -17195, -17218, -17221, -17221, -17237, -17276, -17276, -17300, -17319, -17339, -17357, -17370, -17383, -17400, -17407, -17419, -17439, -17439, -17449, -17465, -17475, -17504, -17527, -17527, -17534, -17548, -17564, -17564, -17598, -17598, -17601, -17630, -17649, -17669, -17669, -17679, -17686, +16343, +16362, +16383, +16393, +16393, +16411, +16419, +16425, +16436, +16461, +16468, +16468, +16468, +16490, +16490, +16490, +16507, +16528, +16528, +16528, +16538, +16555, +16566, +16566, +16590, +16590, +16605, +16623, +16636, +16636, +16636, +16656, +16666, +16696, +16713, +16743, +16760, +16781, +16797, +16811, +16811, +16823, +16838, +16859, +16879, +16879, +16879, +16902, +16908, +16908, +16908, +16908, +16966, +16966, +16966, +16975, +16992, +16992, +16992, +17033, +17069, +17069, +17100, +17117, +17133, +17151, +17151, +17159, +17203, +17203, +17220, +17226, +17226, +17245, +17245, +17259, +17259, +17269, +17295, +17295, +17295, +17353, +17386, +17394, +17394, +17394, +17409, +17409, +17442, +17442, +17454, +17509, +17509, +17509, +17532, +17532, +17532, +17550, +17561, +17561, +17561, +17561, +17561, +17561, +17561, +17561, +17561, +17575, +17581, +17581, +17581, +17620, +17627, +17640, +17640, +17677, +17677, +17688, +17688, +17722, +17734, +17747, +17757, +17757, 17757, -17776, -17796, -17810, -17840, -17840, -17877, -17884, -17884, -17911, -17936, -17970, +17803, +17820, +17846, +17892, +17892, +17899, +17899, +17919, +17919, +17968, 17980, -17995, -17995, -18008, -18011, -18036, -18075, -18097, -18097, -18104, -18115, -18115, -18129, -18134, -18141, -18141, -18157, -18180, -18190, -18217, -18224, -18252, -18284, -18284, -18296, -18299, -18312, -18322, -18338, -18348, -18348, -18363, -18372, -18387, -18387, -18390, +17996, +18021, +18021, +18021, +18021, +18050, +18050, +18072, +18102, +18119, +18119, +18132, +18132, +18132, +18146, +18146, +18165, +18184, +18184, +18192, +18192, +18192, +18223, +18223, +18223, +18231, +18231, +18231, +18231, +18257, +18270, +18300, +18313, +18331, +18331, +18331, +18351, +18351, +18382, +18392, +18392, +18392, 18402, +18402, +18418, 18445, -18445, -18445, -18466, -18479, -18479, -18498, -18508, -18511, -18511, -18511, -18511, -18511, -18526, -18558, -18586, -18622, +18519, +18519, +18528, +18542, +18571, +18595, +18616, +18628, +18628, 18643, -18670, -18686, -18710, -18720, -18739, -18739, -18742, -18745, -18771, -18774, -18777, -18791, -18813, -18816, -18822, -18839, -18845, -18851, -18854, -18878, -18881, -18896, -18896, -18899, -18926, -18937, -18940, -18953, -18963, -19010, -19010, -19017, -19046, -19060, -19060, -19087, -19095, -19101, -19101, -19128, -19146, -19157, -19157, -19188, +18678, +18690, +18715, +18731, +18731, +18751, +18763, +18763, +18763, +18779, +18793, +18793, +18824, +18840, +18840, +18856, +18856, +18864, +18864, +18902, +18902, +18933, +18946, +18946, +18946, +18946, +18946, +18946, +18955, +18955, +18973, +18979, +18992, +18992, +18992, +19008, +19016, +19016, +19033, +19033, +19044, +19044, +19044, +19044, +19082, +19129, +19149, 19198, -19205, -19223, -19230, -19255, -19280, -19280, -19283, -19292, -19301, -19320, -19323, -19323, -19341, -19341, -19365, -19378, -19381, -19394, -19423, -19433, -19440, +19210, +19210, +19210, +19219, +19219, +19219, +19227, +19261, +19261, +19268, +19291, +19319, +19319, +19319, +19331, +19359, +19369, +19369, +19384, +19384, +19406, +19413, 19466, -19490, -19490, -19490, -19497, -19504, -19511, -19511, -19518, -19545, -19568, -19575, -19575, -19583, -19586, -19592, -19592, -19609, -19622, -19629, -19641, -19641, -19656, -19673, -19700, -19723, -19733, -19746, -19759, -19769, -19782, -19789, -19795, -19831, -19834, -19841, -19851, -19854, -19880, -19895, -19898, -19898, -19911, -19922, -19950, -20020, +19482, +19482, +19494, +19515, +19522, +19570, +19570, +19570, +19610, +19625, +19632, +19639, +19658, +19665, +19672, +19672, +19679, +19679, +19692, +19719, +19749, +19756, +19776, +19807, +19817, +19817, +19837, +19844, +19876, +19906, +19906, +19923, +19923, +19942, +19958, +19973, +19995, +20002, +20023, 20030, -20059, -20062, -20089, -20107, -20151, -20154, -20175, +20036, +20036, +20060, +20060, +20066, +20073, +20108, +20116, +20131, +20131, +20131, +20166, +20183, +20202, 20205, -20208, -20229, -20229, -20255, -20261, -20261, -20283, -20335, -20362, -20385, -20392, -20392, -20392, -20392, -20418, -20418, -20418, +20215, +20233, +20233, +20236, +20243, +20253, +20281, +20284, +20294, +20297, +20315, +20355, +20400, +20415, 20418, +20428, 20443, -20446, -20446, -20452, -20452, +20461, 20467, -20467, -20489, -20489, -20498, -20525, -20554, -20560, +20470, +20476, +20499, +20499, +20513, +20513, +20516, +20523, +20546, +20549, 20575, -20589, -20589, -20589, -20614, -20652, -20659, -20659, -20668, -20679, -20679, -20679, -20685, +20615, +20615, +20618, +20682, 20685, -20685, -20685, -20685, -20685, -20696, -20733, -20760, -20766, -20769, -20792, -20792, -20792, -20792, -20813, -20813, -20813, -20813, -20826, -20826, -20846, -20862, -20880, +20691, +20700, +20727, +20776, +20779, +20800, +20816, +20858, 20887, -20901, -20908, -20933, -20938, -20958, -20969, -20978, -20978, -20978, -20985, -20985, -20985, -21000, -21010, -21010, -21014, -21026, -21033, -21041, -21041, -21051, -21051, -21064, -21071, -21113, -21120, -21120, -21127, -21134, -21142, -21164, -21164, -21164, -21188, -21195, -21208, -21215, -21226, -21226, -21226, -21238, -21249, -21255, -21255, -21265, -21279, -21296, -21301, -21315, -21321, -21331, -21331, -21331, -21337, -21343, -21343, -21351, -21351, -21361, -21368, -21383, -21383, -21389, -21413, -21437, -21449, -21462, -21478, -21506, -21534, -21546, -21546, -21557, -21580, -21595, -21595, -21595, -21595, -21626, -21626, -21646, -21670, -21676, -21688, -21688, -21716, -21731, -21762, -21762, -21762, -21762, -21762, -21783, -21789, -21799, -21828, -21828, +20898, +20898, +20898, +20923, +20926, +20949, +20952, +20959, +20965, +20974, +20980, +20996, +20996, +21021, +21039, +21039, +21052, +21055, +21076, +21079, +21091, +21094, +21114, +21114, +21117, +21117, +21124, +21143, +21196, +21196, +21196, +21196, +21196, +21205, +21212, +21261, +21278, +21293, +21333, +21354, +21366, +21373, +21408, +21433, +21439, +21442, +21442, +21445, +21448, +21460, +21463, +21466, +21476, +21479, +21529, +21568, +21574, +21574, +21577, +21604, +21611, +21611, +21631, +21649, +21689, +21692, +21714, +21752, +21752, +21780, +21787, +21813, 21837, -21845, -21868, -21874, -21874, -21880, -21880, -21889, -21901, -21910, -21941, -21941, -21959, -21959, -21959, -21966, -21966, -21972, -21972, -21995, -22011, +21840, +21857, +21885, +21888, +21888, +21911, +21918, +21928, +21928, +21934, +21970, +21983, +21992, +22012, +22019, +22036, 22043, -22043, -22051, -22051, -22060, -22060, -22060, -22074, -22086, -22086, -22099, -22099, -22120, -22120, -22134, -22144, -22150, -22158, -22164, -22164, -22171, -22199, -22210, -22210, -22210, -22220, +22050, +22078, +22112, +22115, +22122, +22125, +22174, +22208, +22211, +22221, 22228, 22228, -22239, -22261, -22304, -22304, -22312, -22349, -22349, -22349, -22357, -22381, -22381, -22390, -22390, -22390, -22390, -22402, -22413, -22413, -22422, -22422, -22445, -22445, -22445, -22456, -22456, +22240, +22254, +22254, +22273, +22291, +22327, +22355, +22358, +22368, +22368, +22368, +22368, +22384, +22397, +22415, +22418, +22418, +22439, +22459, +22459, 22469, -22479, -22501, -22512, -22528, -22528, -22528, -22528, -22528, -22528, -22528, -22540, +22488, +22507, +22524, +22524, 22540, +22543, 22546, 22546, 22546, 22546, -22569, -22591, -22591, -22591, -22591, -22610, -22655, -22655, -22667, -22667, -22677, -22677, -22692, -22692, -22702, -22702, -22702, -22717, -22736, +22553, +22575, +22581, +22584, +22587, +22595, +22607, +22607, +22614, +22624, +22650, +22686, +22699, +22705, +22718, 22750, -22755, -22780, -22785, -22822, -22844, -22859, -22871, -22909, -22949, -22962, -22973, -22979, -22988, -23007, -23027, -23035, -23072, -23082, -23082, -23109, -23116, -23130, -23158, -23166, -23166, -23172, -23177, -23189, -23219, -23219, -23250, -23273, -23281, -23281, -23281, -23281, -23281, +22753, +22772, +22782, +22789, +22825, +22838, +22890, +22913, +22916, +22926, +22932, +22946, +22986, +22986, +23015, +23050, +23073, +23076, +23079, +23101, +23132, +23152, +23211, +23237, +23240, +23259, +23284, 23287, -23287, -23299, -23305, -23315, -23315, -23321, -23328, -23334, -23355, -23355, -23355, -23355, -23355, -23366, -23390, -23396, -23396, -23396, -23396, -23402, -23418, -23424, -23424, -23438, -23446, -23446, -23446, -23500, -23525, -23569, -23592, -23592, -23592, -23605, -23614, -23614, -23614, -23627, -23633, -23657, -23673, -23673, -23673, -23689, -23689, -23701, -23701, -23701, -23713, -23713, -23713, -23738, -23758, -23775, -23775, -23794, -23794, -23803, -23803, -23803, -23803, -23813, -23826, -23845, -23845, -23845, -23845, -23872, -23872, -23872, -23888, -23888, -23900, -23900, -23906, -23906, -23906, -23906, -23906, -23924, -23924, -23924, -23930, -23930, -23939, -23949, -23971, -23971, -23971, -24000, -24012, -24042, -24042, -24042, -24042, -24042, -24070, -24076, -24094, -24094, -24094, -24123, -24123, -24123, -24134, -24150, +23302, +23308, +23311, +23311, +23311, +23318, +23325, +23339, +23352, +23369, +23380, +23430, +23437, +23457, +23460, +23466, +23473, +23516, +23519, +23522, +23534, +23549, +23568, +23589, +23609, +23631, +23642, +23645, +23676, +23683, +23693, +23696, +23730, +23746, +23790, +23807, +23819, +23840, +23843, +23843, +23868, +23885, +23898, +23905, +23921, +23921, +23938, +23979, +23988, +23994, +24022, +24029, +24059, +24059, +24081, +24100, +24100, +24107, +24131, 24150, -24150, -24150, -24150, -24150, -24155, -24179, -24179, -24189, -24189, -24189, -24198, -24198, -24218, -24218, -24218, -24234, -24251, -24257, -24276, +24181, +24181, +24184, +24187, +24209, +24239, +24252, +24265, +24271, +24274, +24300, 24305, -24321, -24321, -24321, -24334, -24334, -24334, -24349, -24356, -24361, -24372, -24372, -24372, -24388, -24396, -24396, -24402, -24410, -24410, -24428, -24428, -24450, -24450, +24308, +24311, +24314, +24330, +24333, +24333, +24333, +24336, +24339, +24345, +24348, +24351, +24378, +24384, +24422, +24435, +24446, 24467, -24485, -24495, -24495, -24495, -24507, -24507, -24514, -24531, -24531, -24531, +24470, +24473, +24492, +24505, +24508, +24508, 24531, -24531, -24537, -24537, -24558, -24572, -24584, -24584, -24601, -24601, -24607, -24615, -24615, -24632, -24632, -24632, -24632, -24661, -24676, -24676, -24724, -24751, -24751, -24774, -24774, -24783, -24793, -24793, -24793, -24813, -24819, -24819, -24826, -24826, -24842, -24858, -24872, -24872, -24890, -24890, -24890, -24890, -24890, -24890, -24890, -24890, -24890, -24906, -24906, -24917, -24928, -24947, -24947, -24947, -24947, -24947, -24947, -24947, -24947, -24947, -24963, -24983, -24991, -24991, -24991, -24991, -24991, -24991, -24991, -24991, -25007, -25007, -25007, -25007, -25007, -25007, -25007, -25030, -25040, -25040, -25040, -25040, -25040, -25059, -25097, +24551, +24593, +24617, +24640, +24652, +24652, +24668, +24668, +24668, +24717, +24748, +24748, +24766, +24769, +24775, +24791, +24791, +24829, +24829, +24851, +24861, +24867, +24913, +24946, +24946, +24965, +24968, +24968, +24981, +24981, +24994, +24994, +25009, +25012, +25015, +25026, +25031, +25043, +25043, +25056, +25056, +25056, +25056, +25062, +25075, +25099, +25106, +25118, +25118, +25118, +25118, +25126, 25132, -25149, -25159, -25169, -25169, -25169, -25192, -25192, -25192, -25192, -25205, -25205, -25216, -25221, -25221, -25233, -25233, -25240, -25250, -25256, -25273, -25273, -25303, -25321, -25321, -25321, -25333, -25333, -25333, -25333, -25370, -25370, -25402, -25418, -25418, -25439, -25439, -25454, -25454, -25454, -25463, -25477, -25526, -25526, -25526, -25526, -25545, -25562, -25572, -25572, -25582, -25582, -25582, +25183, +25183, +25200, +25219, +25225, +25241, +25247, +25259, +25274, +25322, +25322, +25336, +25336, +25336, +25360, +25368, +25368, +25368, +25374, +25381, +25387, +25398, +25417, +25417, +25417, +25431, +25466, +25492, +25500, +25549, +25569, +25569, +25590, +25590, 25597, -25610, -25634, -25641, -25641, -25641, -25668, -25668, -25675, -25707, -25727, -25727, -25741, -25756, -25756, -25779, -25811, -25811, -25811, -25817, -25817, -25817, -25827, -25827, -25827, -25827, -25827, -25836, -25836, -25836, -25836, -25850, -25850, +25616, +25622, +25640, +25640, +25640, +25655, +25655, +25671, +25671, +25691, +25706, +25706, +25706, +25738, +25738, +25746, +25759, +25759, +25781, +25781, +25802, +25815, 25860, -25884, -25901, -25922, -25936, -25946, -25969, -25969, -25969, -25969, -25975, -25975, -25987, -25987, -26065, -26065, +25860, +25867, +25877, +25877, +25877, +25913, +25913, +25953, +25980, +26002, +26013, +26026, +26026, +26032, +26032, +26038, +26050, +26050, +26059, 26065, -26084, -26084, -26103, +26071, +26087, +26122, 26128, -26141, -26151, -26169, -26169, -26169, -26180, -26191, -26191, -26191, -26197, -26197, -26205, -26211, -26235, -26235, -26235, -26235, -26235, -26235, -26245, -26245, -26259, -26259, -26259, -26259, -26284, -26284, -26325, -26325, -26355, -26364, -26364, -26402, -26418, -26418, -26425, -26432, -26432, -26454, -26504, -26513, -26525, -26525, -26525, -26525, -26525, -26545, -26545, -26571, -26590, -26597, -26597, -26597, -26597, -26597, +26146, +26164, +26185, +26212, +26212, +26229, +26229, +26236, +26248, +26266, +26290, +26311, +26311, +26311, +26311, +26321, +26352, +26365, +26371, +26371, +26394, +26403, +26435, +26435, +26435, +26435, +26485, +26516, +26522, +26528, +26565, +26565, +26600, 26639, -26648, -26659, -26666, -26672, -26672, -26672, -26672, -26672, -26694, -26701, -26701, -26701, -26724, -26724, -26746, -26753, -26774, -26774, -26774, -26774, -26806, -26824, -26824, -26830, -26852, -26882, -26882, -26889, -26889, -26889, -26889, -26889, -26889, -26903, -26911, -26918, -26918, -26928, -26948, -26948, -26970, -26970, -26985, -26996, -27045, -27045, -27058, -27058, -27068, -27068, -27104, -27155, -27155, -27155, -27155, -27155, -27172, -27172, -27172, -27172, -27189, -27195, -27195, -27223, -27223, -27223, -27223, -27244, -27290, -27322, -27332, -27364, +26649, +26649, +26649, +26649, +26700, +26735, +26745, +26759, +26778, +26778, +26801, +26810, +26810, +26829, +26836, +26849, +26849, +26856, +26856, +26874, +26883, +26883, +26883, +26883, +26899, +26915, +26915, +26915, +26915, +26936, +26951, +26958, +26958, +26975, +26994, +27000, +27010, +27041, +27066, +27073, +27110, +27150, +27150, +27168, +27168, +27175, +27184, +27184, +27184, +27196, +27209, +27224, +27242, +27242, +27248, +27248, +27278, +27298, +27314, +27320, +27363, 27371, 27371, -27371, -27401, -27401, -27417, -27417, +27393, +27399, +27399, +27405, +27405, +27405, +27411, +27418, +27425, +27431, 27431, -27470, -27470, -27470, -27470, -27484, -27484, -27484, -27484, -27484, -27496, -27496, -27515, -27515, -27543, -27560, -27576, -27604, -27622, -27631, -27631, -27638, -27649, -27672, -27682, -27682, -27682, -27707, -27717, -27724, -27732, -27755, -27755, -27755, -27768, -27768, -27783, -27789, -27799, -27799, -27799, -27818, -27826, -27838, -27848, -27848, -27848, -27855, -27862, -27862, -27896, -27921, -27921, -27943, -27954, -27954, -27976, -27976, -27976, -27985, -28002, -28012, -28019, -28034, -28034, -28046, -28068, -28097, -28122, -28122, -28131, -28137, -28151, -28151, -28172, -28190, +27455, +27469, +27475, +27475, +27475, +27475, +27475, +27500, +27500, +27523, +27523, +27558, +27574, +27580, +27650, +27663, +27679, +27679, +27733, +27745, +27754, +27761, +27774, +27774, +27782, +27816, +27854, +27854, +27875, +27875, +27875, +27930, +27947, +27967, +27967, +27979, +27986, +28007, +28015, +28036, +28036, +28060, +28060, +28078, +28078, +28078, +28085, +28085, +28091, +28105, +28119, +28119, +28157, +28157, +28163, +28175, +28196, +28196, 28196, -28211, -28211, -28264, -28273, -28286, -28324, -28324, -28324, -28354, -28354, -28361, -28397, -28417, -28417, -28424, -28435, -28461, -28461, -28470, -28483, -28483, -28483, -28483, -28483, -28483, -28483, -28515, -28531, -28531, +28230, +28230, +28230, +28230, +28256, +28265, +28265, +28281, +28281, +28299, +28310, +28325, +28325, +28344, +28353, +28353, +28389, +28389, +28389, +28399, +28421, +28444, +28444, +28478, +28525, +28525, 28549, -28575, -28575, -28575, -28582, -28599, -28615, -28630, -28630, +28549, +28579, +28579, +28594, +28607, +28621, +28638, 28672, -28711, -28723, -28723, -28731, -28752, -28752, -28752, -28763, -28763, -28775, -28775, -28775, -28775, -28775, -28775, -28805, -28814, -28830, -28861, -28882, -28882, -28902, -28918, -28937, -28952, -28959, -28998, -29009, -29009, -29009, -29009, -29019, -29019, -29019, -29019, -29019, -29057, -29069, -29076, -29076, -29076, -29076, -29076, -29082, -29082, -29082, -29117, -29117, -29117, +28679, +28679, +28679, +28690, +28738, +28748, +28748, +28748, +28748, +28748, +28769, +28803, +28810, +28810, +28819, +28819, +28819, +28826, +28853, +28853, +28853, +28860, +28873, +28898, +28898, +28913, +28913, +28913, +28930, +28930, +28956, +28981, +29024, +29024, +29044, +29044, +29074, +29085, +29104, 29117, -29134, -29134, -29159, -29159, -29185, -29185, -29196, -29196, -29242, -29248, -29256, -29280, -29301, -29307, -29307, -29307, -29314, -29314, -29338, -29356, -29367, -29367, -29381, -29391, -29399, -29399, -29414, -29434, -29434, -29441, -29473, -29484, -29503, -29520, -29520, -29548, -29565, -29572, -29572, -29572, -29572, -29572, -29597, -29597, -29620, -29655, -29660, -29660, -29660, -29667, -29674, -29688, -29698, -29705, -29728, -29740, -29740, -29761, -29761, -29767, -29780, -29787, -29794, -29794, -29807, -29820, -29820, -29820, -29820, -29832, -29844, -29855, -29855, -29855, -29867, -29867, -29867, -29867, -29881, -29881, -29905, -29905, -29905, -29923, -29923, -29948, -29948, -29948, -29976, -29986, -29996, -29996, -30030, -30030, -30054, -30054, -30070, -30070, -30070, -30077, -30077, -30087, -30107, -30107, -30115, -30141, -30178, -30178, -30201, -30201, -30201, -30207, -30229, -30239, -30254, -30268, -30277, -30311, -30323, -30323, -30331, -30331, -30331, -30331, -30331, -30353, -30365, -30374, -30374, -30374, -30380, -30380, -30380, -30380, -30410, -30410, -30410, -30443, -30443, -30453, -30462, -30472, -30472, -30472, -30472, -30472, -30472, -30489, -30500, -30500, -30500, -30532, -30532, -30553, -30577, -30599, -30599, -30609, -30640, -30640, -30640, -30664, -30676, -30676, -30676, -30692, -30719, -30728, -30728, -30742, -30742, -30749, -30749, -30760, -30770, -30770, -30783, -30783, -30783, -30804, -30847, -30847, -30847, -30847, -30857, -30857, -30857, -30857, -30875, -30875, -30895, -30895, -30921, -30926, -30926, -30926, +29125, +29125, +29146, +29153, +29153, +29160, +29175, +29189, +29189, +29214, +29214, +29214, +29224, +29224, +29224, +29234, +29299, +29318, +29325, +29325, +29343, +29400, +29417, +29417, +29436, +29436, +29436, +29436, +29454, +29460, +29460, +29478, +29478, +29478, +29487, +29487, +29516, +29516, +29549, +29559, +29559, +29576, +29587, +29609, +29609, +29630, +29630, +29644, +29644, +29644, +29644, +29664, +29664, +29686, +29711, +29734, +29734, +29741, +29752, +29752, +29778, +29798, +29805, +29819, +29835, +29842, +29849, +29866, +29884, +29891, +29891, +29919, +29943, +29993, +30000, +30010, +30016, +30046, +30069, +30085, +30085, +30102, +30124, +30143, +30150, +30150, +30169, +30169, +30216, +30230, +30256, +30256, +30265, +30280, +30304, +30320, +30324, +30340, +30354, +30364, +30382, +30396, +30396, +30407, +30457, +30473, +30490, +30490, +30490, +30514, +30514, +30539, +30562, +30583, +30615, +30622, +30622, +30629, +30638, +30662, +30662, +30688, +30712, +30712, +30721, +30721, +30721, +30721, +30721, +30758, +30792, +30811, +30811, +30811, +30843, +30843, +30876, +30876, +30876, +30876, +30889, +30909, +30923, 30945, 30945, -30945, -30945, -30959, -30959, -30959, -30959, -30972, -30972, -30984, -31011, -31011, -31048, -31056, -31056, -31070, -31077, -31077, -31110, -31110, -31115, -31122, -31139, -31159, -31159, -31165, -31171, -31171, -31197, -31204, -31211, -31211, -31221, -31228, -31228, -31245, -31245, -31245, -31252, -31265, -31265, -31265, -31265, -31294, -31305, -31320, -31333, -31333, -31333, -31343, -31350, -31357, -31369, -31369, -31379, -31385, -31391, -31407, -31407, -31407, -31423, -31423, -31423, -31434, -31454, -31470, -31511, -31521, -31521, -31521, -31542, -31582, -31582, -31597, -31597, -31597, -31614, -31623, -31645, -31645, +30980, +31031, +31059, +31078, +31108, +31125, +31137, +31174, +31200, +31200, +31200, +31200, +31207, +31237, +31237, +31259, +31279, +31307, +31335, +31378, +31378, +31378, +31378, +31397, +31437, +31443, +31467, +31467, +31483, +31527, +31537, +31548, +31557, +31564, +31564, +31589, +31603, +31647, 31661, -31661, -31669, -31669, -31676, -31676, -31706, -31720, -31726, -31743, -31785, -31804, -31817, -31817, -31835, -31846, -31863, -31885, -31885, -31896, -31907, -31907, -31907, -31922, -31922, -31929, -31929, -31929, -31936, -31943, -31949, -31949, -31949, -31959, -32006, -32024, -32031, -32031, -32038, -32063, -32095, -32095, -32105, -32105, -32105, -32105, -32105, -32125, -32134, -32140, -32176, -32185, -32195, -32195, -32195, -32195, -32202, -32202, -32218, -32236, -32259, -32294, +31677, +31677, +31690, +31709, +31709, +31762, +31769, +31776, +31799, +31841, +31841, +31848, +31869, +31875, +31875, +31904, +31904, +31925, +31939, +31952, +31984, +31984, +31984, +32029, +32029, +32029, +32045, +32055, +32086, +32086, +32124, +32152, +32152, +32159, +32159, +32184, +32190, +32211, +32231, +32231, +32238, +32261, +32268, +32284, +32284, +32284, +32284, 32300, -32305, -32305, -32305, 32323, -32337, -32352, -32359, -32374, -32381, -32388, -32388, -32388, -32402, +32351, +32358, +32396, +32396, +32396, 32402, 32402, -32402, -32418, -32428, -32428, -32428, -32450, -32450, -32450, -32462, -32467, -32480, -32480, -32480, -32487, -32502, -32509, -32525, -32560, -32570, -32583, -32597, -32623, -32637, -32644, -32667, -32707, -32725, -32725, -32747, -32747, -32751, -32758, -32789, -32807, -32824, -32824, -32824, -32824, -32843, -32843, -32850, -32876, -32908, -32915, -32946, -32965, -32965, -32982, -33002, -33009, -33029, -33064, -33084, -33098, -33098, -33098, -33098, +32414, +32414, +32438, +32449, +32455, +32483, +32490, +32510, +32541, +32548, +32578, +32585, +32592, +32592, +32592, +32616, +32625, +32641, +32671, +32681, +32681, +32688, +32711, +32737, +32754, +32761, +32761, +32777, +32810, +32817, +32817, +32817, +32817, +32817, +32844, +32867, +32901, +32943, +32956, +32974, +32983, +33004, +33004, +33050, +33066, +33072, +33072, +33080, +33080, 33110, 33110, -33151, -33158, -33180, -33198, -33205, -33227, -33227, -33237, -33237, -33253, -33258, -33277, -33292, -33315, -33315, -33333, -33348, -33348, -33348, +33134, +33157, +33164, +33200, +33200, +33207, +33244, +33244, +33309, +33316, +33316, +33316, +33316, +33316, +33323, +33341, 33348, -33348, -33348, -33348, -33355, -33355, -33355, -33390, -33408, -33423, -33437, -33452, -33458, -33465, -33480, -33480, +33361, +33394, +33394, +33394, +33394, +33432, +33442, +33470, +33470, +33470, +33487, 33487, -33494, -33504, -33511, -33551, -33551, -33558, -33589, -33595, -33595, +33487, +33516, +33548, +33562, +33562, +33569, +33584, +33584, +33584, 33602, -33627, -33644, -33668, -33668, -33668, -33676, -33676, -33716, -33728, -33747, -33747, -33769, -33775, -33789, -33803, -33803, -33810, -33810, -33810, -33820, -33820, -33820, -33820, -33843, -33843, -33843, -33879, -33889, -33889, -33889, -33903, -33917, -33931, -33959, -33993, -34000, -34014, -34037, -34043, -34055, -34055, +33621, +33621, +33629, +33645, +33645, +33652, +33652, +33672, +33691, +33707, +33714, +33721, +33721, +33735, +33766, +33772, +33772, +33772, +33779, +33779, +33824, +33844, +33844, +33850, +33867, +33867, +33874, +33874, +33874, +33874, +33901, +33946, +33960, +33971, +34019, +34050, 34077, -34083, -34090, -34099, -34099, -34115, -34115, -34133, -34140, -34167, -34172, -34184, -34221, -34245, -34252, -34252, +34084, +34103, +34110, +34121, +34128, +34157, +34193, +34193, +34220, 34259, -34318, +34272, +34272, +34272, +34279, +34294, +34300, +34313, 34318, 34325, -34325, -34352, -34400, -34415, -34422, -34422, -34431, -34438, -34445, -34445, -34473, -34473, -34489, -34489, -34489, -34489, -34499, -34499, -34499, -34516, -34536, -34551, -34564, -34580, -34580, -34580, -34589, +34333, +34347, +34354, +34361, +34368, +34368, +34368, +34408, +34433, +34467, +34504, +34504, +34547, +34547, +34554, +34561, +34561, +34561, +34582, 34589, -34589, -34613, -34648, -34648, -34648, -34655, -34664, -34681, -34681, -34698, -34698, -34720, -34736, +34611, +34627, +34637, +34637, +34637, +34641, +34666, +34666, +34683, +34690, +34690, +34699, +34699, +34716, 34749, 34749, -34765, -34778, -34785, -34795, -34819, -34819, -34829, -34841, -34848, -34854, -34854, -34854, -34878, -34894, -34894, -34900, -34917, -34934, -34940, -34970, -34998, -34998, -35004, -35004, -35012, -35012, -35012, -35020, -35020, -35032, -35038, -35062, -35062, -35062, -35068, -35068, -35082, -35092, -35096, -35107, -35118, -35134, -35155, -35155, -35166, -35178, -35178, -35195, -35201, -35201, -35201, -35226, -35226, +34756, +34756, +34756, +34756, +34777, +34777, +34777, +34820, +34827, +34862, +34874, +34881, +34881, +34903, +34903, +34903, +34920, +34949, +34949, +34949, +34949, +34968, +34968, +35003, +35003, +35015, +35039, +35039, +35081, +35093, +35093, +35115, +35115, +35132, +35132, +35132, +35132, +35157, 35226, -35226, -35256, -35262, -35272, -35280, +35241, +35248, +35266, +35266, +35273, +35273, +35273, +35273, +35299, 35299, -35332, -35354, -35354, -35354, -35370, -35386, -35417, -35417, -35460, -35473, -35478, -35495, -35504, -35504, -35518, -35552, -35589, -35624, -35624, -35637, -35637, -35643, -35643, -35669, -35682, -35695, -35702, -35709, -35709, -35726, -35739, -35749, -35756, -35756, -35778, -35803, -35810, -35829, -35883, +35306, +35334, +35365, +35365, +35406, +35428, +35428, +35441, +35474, +35506, +35506, +35529, +35529, +35548, +35555, +35574, +35574, +35574, +35595, +35630, +35644, +35649, +35698, +35750, +35750, +35762, +35762, +35762, +35798, +35842, +35849, +35866, +35878, +35885, +35892, 35899, -35905, -35911, -35911, +35899, +35906, +35906, +35906, 35923, -35947, -35954, -35980, -35987, -36034, -36052, -36063, -36095, -36106, -36106, +35944, +35951, +35961, +35978, +35984, +35992, +36023, +36060, +36076, +36085, 36113, -36120, -36140, -36140, -36153, -36160, -36160, -36167, -36203, -36203, -36218, -36218, -36225, -36253, -36259, -36284, -36296, -36310, -36324, -36331, -36344, -36367, -36367, -36367, -36412, -36412, -36422, -36463, -36463, -36463, -36479, -36490, -36513, -36520, -36520, -36527, -36527, -36527, -36540, -36574, -36594, -36594, -36605, -36621, -36621, -36641, -36641, -36641, -36659, -36682, -36682, -36682, -36682, -36705, -36705, -36705, -36720, -36720, -36755, -36755, -36771, -36771, -36771, -36788, -36806, -36835, -36845, -36875, -36875, -36903, -36921, -36928, -36928, -36940, -36940, -36940, -36966, -36966, -36973, -36983, -36998, -37004, -37014, -37024, -37024, -37032, -37038, -37038, -37061, -37074, -37074, -37091, -37098, -37105, -37105, -37133, -37141, -37141, -37148, -37191, -37191, -37197, -37197, -37210, -37224, -37224, -37231, -37250, -37257, -37273, -37273, -37280, -37287, -37294, -37300, -37307, -37330, -37348, -37348, -37359, -37359, -37359, -37377, -37392, -37398, -37412, -37431, -37469, -37486, -37508, -37517, -37535, -37535, -37542, -37542, -37549, -37549, -37549, -37549, -37556, -37576, -37576, -37583, -37590, -37597, -37604, -37604, -37621, -37635, -37676, -37676, -37704, -37711, -37728, +36144, +36144, +36159, +36166, +36166, +36173, +36173, +36201, +36201, +36220, +36227, +36227, +36227, +36247, +36263, +36270, +36270, +36315, +36315, +36322, +36330, +36354, +36408, +36420, +36420, +36440, +36454, +36454, +36454, +36461, +36474, +36529, +36569, +36667, +36674, +36674, +36700, +36707, +36707, +36714, +36721, +36721, +36731, +36760, +36781, +36793, +36800, +36800, +36847, +36854, +36868, +36938, +36945, +36967, +36967, +36992, +37008, +37050, +37050, +37050, +37068, +37081, +37088, +37113, +37145, +37145, +37145, +37145, +37165, +37171, +37171, +37198, +37198, +37211, +37239, +37247, +37298, +37341, +37341, +37367, +37400, +37422, +37458, +37492, +37530, +37530, +37530, +37537, +37551, +37566, +37592, +37614, +37614, +37631, +37638, +37645, +37652, +37664, +37702, +37714, +37721, 37728, -37737, -37737, -37737, -37750, -37757, -37778, -37785, -37785, -37819, -37826, -37833, -37843, -37850, -37869, -37914, -37921, -37935, +37740, +37770, +37770, +37793, +37809, +37830, +37830, +37841, +37841, +37867, +37867, +37883, +37890, +37890, +37910, +37926, 37942, -37949, -37982, -38013, -38013, -38013, -38023, -38057, -38077, -38097, -38110, -38117, -38123, -38133, -38133, -38133, -38140, -38140, -38148, -38159, -38179, -38192, -38205, -38218, -38218, -38218, -38218, -38218, -38218, -38218, -38218, -38218, -38218, -38218, -38218, -38225, -38225, -38230, -38246, -38258, -38280, -38287, -38294, -38294, -38294, -38301, -38318, -38318, -38340, -38371, -38371, -38384, -38420, -38440, -38453, -38481, -38506, -38522, -38534, +37957, +37991, +38010, +38010, +38026, +38079, +38086, +38093, +38112, +38119, +38136, +38136, +38155, +38189, +38210, +38220, +38248, +38278, +38278, +38314, +38339, +38339, +38354, +38370, +38385, +38399, +38417, +38441, +38469, +38476, +38483, +38499, +38499, +38499, +38521, 38559, -38559, -38559, -38564, -38564, -38581, -38604, -38604, -38611, -38620, -38626, -38635, -38635, -38635, -38666, -38674, +38599, +38617, +38624, +38624, +38660, +38673, 38688, -38693, -38710, -38722, -38722, -38722, -38729, -38734, -38752, -38792, -38818, -38825, +38742, +38774, +38774, +38799, +38799, +38830, +38861, +38861, 38861, +38861, +38861, +38890, 38902, -38934, -38949, -38949, -38960, -38969, -38985, -38985, -38996, -39013, -39024, -39024, -39032, -39061, -39074, +38909, +38944, +38989, +39007, +39045, +39063, 39089, -39123, -39123, -39123, -39140, -39161, -39180, -39206, -39215, -39254, -39261, -39277, -39284, -39314, -39314, -39330, -39340, -39340, -39371, -39371, -39392, +39096, +39109, +39109, +39114, +39127, +39162, +39177, +39177, +39200, +39218, +39226, +39226, +39257, +39293, +39293, +39324, +39324, +39352, +39364, +39364, +39377, +39395, +39395, +39413, 39430, -39430, -39437, -39444, -39461, -39468, -39468, -39485, -39517, -39524, -39538, -39543, -39548, -39555, +39459, +39469, +39469, +39479, +39479, +39479, +39503, +39518, +39528, +39528, +39528, +39540, +39565, +39565, 39581, -39588, -39588, -39609, -39609, -39616, -39652, +39605, +39622, +39653, +39670, 39670, -39677, -39677, -39684, -39691, -39702, -39717, -39717, -39717, -39724, -39749, -39760, -39766, -39775, -39791, -39791, -39814, -39827, -39827, -39837, -39859}; +39670, +39670, +39683, +39689, +39708, +39743, +39743, +39743, +39743, +39743, +39750, +39750, +39750, +39761, +39761, +39777, +39805, +39845, +39855, +39855, +39855, +39855, +39887, +39887, +39887, +39887, +39916, +39916, +39936, +39943, +39962, +39962, +39976, +39976, +40005, +40011, +40011, +40011, +40039, +40051, +40071, +40087, +40087, +40087, +40099, +40099, +40099, +40148, +40170, +40170, +40183, +40183, +40210, +40210, +40210, +40210, +40210, +40221, +40221, +40221, +40221, +40243, +40271, +40271, +40293, +40309, +40314, +40329, +40329, +40354, +40354, +40354, +40354, +40373, +40383, +40383, +40383, +40383, +40396, +40404, +40411, +40417, +40417, +40417, +40417, +40424, +40462, +40473, +40473, +40479, +40479, +40510, +40539, +40539, +40539, +40539, +40539, +40539, +40539, +40556, +40556, +40577, +40588, +40588, +40588, +40588, +40597, +40614, +40623, +40623, +40623, +40623, +40635, +40635, +40635, +40652, +40652, +40652, +40663, +40702, +40724, +40724, +40724, +40724, +40724, +40750, +40750, +40759, +40781, +40781, +40791, +40817, +40817, +40817, +40817, +40817, +40840, +40891, +40891, +40891, +40936, +40990, +40997, +41022, +41071, +41086, +41086, +41102, +41110, +41131, +41157, +41157, +41198, +41216, +41216, +41216, +41235, +41235, +41235, +41247, +41273, +41273, +41273, +41286, +41286, +41320, +41351, +41377, +41403, +41403, +41416, +41426, +41426, +41442, +41458, +41458, +41458, +41470, +41470, +41487, +41498, +41525, +41525, +41544, +41550, +41581, +41598, +41608, +41645, +41654, +41687, +41715, +41715, +41721, +41763, +41776, +41800, +41800, +41800, +41826, +41853, +41879, +41879, +41898, +41908, +41908, +41908, +41926, +41926, +41926, +41943, +41962, +41972, +41998, +42013, +42027, +42027, +42064, +42064, +42073, +42073, +42087, +42101, +42101, +42138, +42148, +42185, +42185, +42208, +42244, +42284, +42284, +42311, +42311, +42321, +42367, +42367, +42367, +42413, +42413, +42427, +42427, +42447, +42486, +42486, +42486, +42509, +42518, +42556, +42556, +42556, +42568, +42586, +42586, +42586, +42605, +42605, +42605, +42628, +42638, +42651, +42651, +42651, +42660, +42681, +42731, +42769, +42769, +42769, +42794, +42802, +42831, +42862, +42862, +42862, +42862, +42911, +42911, +42931, +42946, +42946, +42977, +42994, +43024, +43024, +43024, +43030, +43030, +43084, +43116, +43163, +43163, +43175, +43175, +43175, +43175, +43175, +43175, +43200, +43206, +43206, +43217, +43249, +43249, +43268, +43268, +43285, +43285, +43306, +43306, +43306, +43306, +43324, +43342, +43342, +43361, +43375, +43375, +43375, +43391, +43418, +43424, +43424, +43436, +43443, +43443, +43443, +43473, +43473, +43473, +43486, +43486, +43501, +43501, +43534, +43552, +43567, +43583, +43583, +43599, +43599, +43621, +43621, +43630, +43646, +43663, +43663, +43680, +43680, +43680, +43692, +43720, +43753, +43765, +43778, +43795, +43795, +43795, +43811, +43811, +43811, +43823, +43879, +43895, +43895, +43930, +43930, +43954, +43954, +43971, +43971, +43971, +44004, +44029, +44038, +44048, +44060, +44060, +44060, +44066, +44075, +44090, +44100, +44137, +44157, +44166, +44175, +44175, +44180, +44188, +44210, +44220, +44220, +44220, +44220, +44220, +44220, +44236, +44246, +44255, +44279, +44279, +44302, +44332, +44332, +44332, +44352, +44368, +44391, +44391, +44391, +44420, +44420, +44444, +44479, +44479, +44497, +44510, +44510, +44510, +44510, +44510, +44510, +44543, +44550, +44550, +44557, +44623, +44623, +44642, +44642, +44642, +44679, +44691, +44774, +44774, +44774, +44819, +44836, +44895, +44895, +44930, +44945, +44945, +45013, +45020, +45083, +45099, +45111, +45119, +45129, +45136, +45148, +45148, +45148, +45154, +45171, +45171, +45171, +45171, +45171, +45182, +45182, +45208, +45217, +45255, +45255, +45274, +45274, +45274, +45303, +45309, +45323, +45323, +45354, +45363, +45372, +45372, +45388, +45421, +45449, +45463, +45477, +45504, +45504, +45521, +45521, +45537, +45556, +45556, +45563, +45569, +45569, +45569, +45587, +45593, +45611, +45616, +45616, +45628, +45648, +45692, +45710, +45740, +45773, +45787, +45805, +45811, +45828, +45828, +45861, +45875, +45881, +45881, +45881, +45891, +45891, +45908, +45920, +45920, +45932, +45932, +45932, +45932, +45947, +45966, +45966, +46003, +46039, +46045, +46081, +46087, +46104, +46133, +46150, +46165, +46176, +46176, +46176, +46176, +46181, +46187, +46187, +46187, +46187, +46196, +46202, +46202, +46202, +46213, +46213, +46218, +46218, +46235, +46235, +46235, +46235, +46240, +46302, +46302, +46324, +46324, +46324, +46324, +46324, +46324, +46324, +46324, +46344, +46344, +46356, +46365, +46365, +46396, +46396, +46402, +46430, +46444, +46467, +46492, +46492, +46534, +46563, +46563, +46584, +46595, +46605, +46616, +46616, +46629, +46629, +46654, +46660, +46676, +46676, +46676, +46682, +46682, +46682, +46682, +46711, +46728, +46728, +46728, +46728, +46782, +46797, +46802, +46818, +46818, +46824, +46853, +46853, +46870, +46876, +46876, +46928, +46961, +46981, +46981, +47023, +47023, +47023, +47023, +47075, +47112, +47134, +47146, +47162, +47172, +47172, +47172, +47177, +47177, +47177, +47182, +47193, +47193, +47214, +47256, +47278, +47289, +47338, +47344, +47344, +47367, +47367, +47414, +47423, +47423, +47434, +47451, +47464, +47464, +47464, +47464, +47464, +47479, +47479, +47520, +47520, +47533, +47546, +47552, +47561, +47573, +47573, +47573, +47591, +47591, +47591, +47591, +47596, +47609, +47609, +47620, +47650, +47650, +47650, +47655, +47693, +47708, +47708, +47732, +47737, +47742, +47754, +47768, +47800, +47818, +47818, +47829, +47850, +47850, +47908, +47908, +47930, +47936, +47936, +47978, +47978, +47983, +48002, +48012, +48025, +48025, +48034, +48049, +48083, +48093, +48138, +48138, +48153, +48182, +48205, +48205, +48205, +48212, +48212, +48212, +48234, +48234, +48234, +48234, +48250, +48264, +48264, +48280, +48280, +48295, +48295, +48295, +48295, +48319, +48319, +48319, +48328, +48328, +48334, +48356, +48356, +48362, +48419, +48469, +48488, +48494, +48534, +48534, +48559, +48569, +48583, +48604, +48620, +48670, +48688, +48688, +48697, +48710, +48710, +48710, +48724, +48751, +48757, +48770, +48782, +48797, +48835, +48835, +48840, +48886, +48906, +48922, +48931, +48931, +48951, +48951, +48951, +48962, +48962, +48969, +49033, +49033, +49033, +49074, +49116, +49116, +49123, +49130, +49130, +49164, +49170, +49187, +49206, +49215, +49234, +49261, +49261, +49273, +49324, +49324, +49357, +49404, +49404, +49429, +49448, +49448, +49466, +49472, +49499, +49499, +49499, +49543, +49572, +49579, +49622, +49632, +49685, +49724, +49724, +49724, +49724, +49724, +49761, +49769, +49769, +49797, +49797, +49832, +49832, +49832, +49859, +49859, +49873, +49884, +49884, +49920, +49920, +49931, +49947, +49961, +49978, +50008, +50038, +50038, +50038, +50060, +50076, +50089, +50089, +50089, +50102, +50130, +50130, +50146, +50146, +50146, +50151, +50159, +50184, +50206, +50233, +50250, +50250, +50266, +50274, +50274, +50274, +50274, +50287, +50315, +50315, +50315, +50327, +50327, +50334, +50334, +50366, +50372, +50402, +50402, +50434, +50474, +50494, +50494, +50510, +50510, +50510, +50510, +50510, +50510, +50515, +50515, +50536, +50557, +50578, +50595, +50595, +50595, +50620, +50626, +50626, +50644, +50656, +50671, +50671, +50671, +50695, +50730, +50730, +50740, +50746, +50750, +50765, +50771, +50771, +50817, +50817, +50828, +50837, +50837, +50844, +50844, +50894, +50894, +50905, +50905, +50905, +50944, +50944, +50944, +50975, +51011, +51024, +51024, +51024, +51042, +51042, +51042, +51054, +51054, +51064, +51073, +51073, +51073, +51073, +51073, +51073, +51098, +51117, +51117, +51117, +51137, +51137, +51137, +51200, +51221, +51246, +51246, +51272, +51307, +51334, +51334, +51334, +51334, +51354, +51354, +51370, +51377, +51377, +51415, +51431, +51431, +51431, +51450, +51450, +51456, +51499, +51517, +51529, +51550, +51550, +51558, +51569, +51569, +51569, +51569, +51569, +51569, +51584, +51584, +51584, +51598, +51638, +51638, +51638, +51671, +51683, +51710, +51710, +51731, +51766, +51775, +51808, +51829, +51861, +51861, +51861, +51877, +51877, +51889, +51889, +51889, +51911, +51946, +51946, +51966, +51966, +51966, +51966, +51980, +51985, +51997, +51997, +51997, +51997, +52004, +52004, +52004, +52004, +52017, +52032, +52032, +52032, +52063, +52063, +52076, +52095, +52107, +52121, +52121, +52121, +52121, +52121, +52121, +52149, +52184, +52213, +52213, +52213, +52213, +52213, +52213, +52246, +52257, +52286, +52286, +52316, +52316, +52329, +52329, +52329, +52365, +52365, +52365, +52365, +52372, +52386, +52386, +52412, +52420, +52430, +52430, +52436, +52436, +52448, +52454, +52454, +52454, +52479, +52497, +52497, +52512, +52531, +52531, +52551, +52571, +52609, +52609, +52623, +52623, +52635, +52656, +52656, +52668, +52689, +52689, +52706, +52706, +52716, +52716, +52732, +52749, +52755, +52772, +52772, +52772, +52772, +52801, +52801, +52830, +52841, +52841, +52841, +52864, +52864, +52864, +52864, +52864, +52875, +52885, +52893, +52914, +52936, +52960, +52980, +53001, +53001, +53001, +53001, +53001, +53023, +53039, +53039, +53039, +53056, +53069, +53069, +53127, +53145, +53162, +53162, +53183, +53199, +53230, +53244, +53251, +53251, +53269, +53269, +53284, +53320, +53326, +53326, +53359, +53359, +53377, +53404, +53404, +53436, +53454, +53471, +53481, +53498, +53517, +53517, +53517, +53517, +53536, +53557, +53603, +53617, +53617, +53636, +53663, +53663, +53682, +53682, +53702, +53702, +53702, +53717, +53717, +53757, +53769, +53788, +53788, +53788, +53788, +53788, +53809, +53809, +53823, +53840, +53840, +53866, +53907, +53942, +53942, +53942, +53979, +54003, +54003, +54024, +54024, +54024, +54024, +54024, +54043, +54043, +54059, +54069, +54110, +54131, +54142, +54160, +54177, +54177, +54177, +54187, +54187, +54205, +54212, +54212, +54244, +54270, +54280, +54292, +54292, +54292, +54309, +54309, +54335, +54335, +54335, +54343, +54365, +54379, +54379, +54414, +54414, +54414, +54414, +54414, +54448, +54448, +54458, +54490, +54496, +54513, +54521, +54583, +54583, +54603, +54637, +54658, +54658, +54666, +54682, +54691, +54691, +54726, +54743, +54784, +54784, +54794, +54825, +54825, +54825, +54839, +54866, +54866, +54899, +54899, +54908, +54908, +54936, +54936, +54942, +54942, +54977, +54977, +54977, +54977, +54977, +54977, +54977, +54977, +54977, +54988, +54988, +54995, +55056, +55082, +55082, +55082, +55092, +55104, +55128, +55128, +55148, +55170, +55170, +55170, +55210, +55229, +55251, +55308, +55308, +55326, +55336, +55355, +55355, +55355, +55355, +55368, +55375, +55382, +55382, +55382, +55389, +55389, +55389, +55415, +55425, +55467, +55467, +55481, +55492, +55492, +55492, +55516, +55516, +55516, +55529, +55540, +55540, +55560, +55560, +55577, +55577, +55577, +55584, +55584, +55602, +55602, +55602, +55638, +55638, +55655, +55655, +55655, +55655, +55655, +55672, +55680, +55680, +55698, +55715, +55754, +55762, +55802, +55802, +55802, +55808, +55825, +55825, +55825, +55865, +55865, +55865, +55885, +55891, +55901, +55901, +55918, +55945, +55945, +55971, +55978, +55991, +56004, +56011, +56026, +56026, +56041, +56049, +56049, +56071, +56122, +56122, +56149, +56149, +56149, +56169, +56169, +56181, +56181, +56181, +56181, +56181, +56196, +56196, +56255, +56281, +56281, +56299, +56299, +56336, +56342, +56342, +56375, +56381, +56381, +56381, +56387, +56410, +56426, +56426, +56436, +56436, +56436, +56457, +56457, +56457, +56464, +56464, +56478, +56490, +56490, +56490, +56511, +56511, +56517, +56531, +56548, +56548, +56548, +56554, +56570, +56593, +56605, +56619, +56619, +56638, +56638, +56638, +56638, +56650, +56668, +56685, +56698, +56698, +56698, +56709, +56722, +56739, +56739, +56755, +56773, +56812, +56828, +56834, +56865, +56865, +56865, +56865, +56871, +56893, +56911, +56937, +56937, +56937, +56937, +56976, +56976, +57000, +57009, +57027, +57073, +57073, +57124, +57124, +57149, +57190, +57221, +57243, +57253, +57279, +57300, +57300, +57338, +57338, +57338, +57347, +57359, +57380, +57380, +57380, +57403, +57409, +57424, +57433, +57450, +57472, +57472, +57480, +57480, +57480, +57480, +57491, +57518, +57518, +57518, +57533, +57533, +57533, +57533, +57553, +57553, +57553, +57588, +57595, +57610, +57619, +57619, +57661, +57691, +57691, +57691, +57691, +57707, +57713, +57731, +57731, +57750, +57750, +57756, +57791, +57791, +57791, +57791, +57791, +57805, +57829, +57867, +57867, +57867, +57873, +57893, +57912, +57912, +57948, +57948, +57973, +57979, +57979, +57979, +57990, +58009, +58027, +58039, +58056, +58056, +58080, +58080, +58080, +58115, +58115, +58115, +58115, +58122, +58122, +58122, +58122, +58122, +58153, +58168, +58175, +58175, +58188, +58212, +58237, +58237, +58237, +58275, +58275, +58275, +58275, +58313, +58322, +58343, +58352, +58379, +58379, +58388, +58401, +58418, +58430, +58444, +58469, +58479, +58484, +58503, +58521, +58545, +58572, +58582, +58597, +58630, +58630, +58637, +58654, +58654, +58690, +58690, +58697, +58707, +58713, +58713, +58713, +58730, +58730, +58730, +58763, +58817, +58817, +58817, +58817, +58838, +58838, +58838, +58866, +58902, +58902, +58902, +58911, +58911, +58930, +58930, +58960, +58960, +58988, +59006, +59043, +59061, +59061, +59097, +59122, +59122, +59122, +59122, +59122, +59122, +59122, +59122, +59151, +59167, +59187, +59204, +59212, +59222, +59222, +59222, +59238, +59266, +59285, +59300, +59315, +59315, +59315, +59330, +59343, +59375, +59375, +59395, +59413, +59428, +59428, +59428, +59456, +59466, +59486, +59508, +59508, +59517, +59524, +59542, +59542, +59549, +59549, +59557, +59571, +59587, +59587, +59642, +59668, +59679, +59679, +59694, +59734, +59744, +59758, +59771, +59771, +59786, +59793, +59802, +59820, +59831, +59870, +59896, +59896, +59917, +59932, +59932, +59942, +59942, +59962, +59969, +59969, +60007, +60038, +60050, +60057, +60064, +60102, +60102, +60109, +60116, +60132, +60146, +60165, +60181, +60201, +60201, +60208, +60224, +60245, +60328, +60328, +60335, +60342, +60349, +60349, +60401, +60401, +60401, +60436, +60467, +60467, +60474, +60497, +60504, +60545, +60545, +60569, +60592, +60632, +60638, +60645, +60654, +60654, +60654, +60684, +60684, +60701, +60701, +60718, +60744, +60751, +60751, +60751, +60751, +60776, +60792, +60799, +60799, +60806, +60806, +60845, +60872, +60890, +60890, +60930, +60930, +60930, +60930, +60930, +60948, +60992, +61000, +61000, +61017, +61017, +61044, +61061, +61087, +61107, +61107, +61107, +61107, +61123, +61123, +61142, +61142, +61142, +61184, +61207, +61227, +61227, +61276, +61283, +61290, +61313, +61342, +61376, +61383, +61383, +61390, +61390, +61415, +61424, +61449, +61461, +61461, +61495, +61495, +61502, +61502, +61548, +61548, +61548, +61570, +61602, +61619, +61628, +61628, +61628, +61659, +61673, +61680, +61706, +61729, +61753, +61753, +61753, +61753, +61763, +61796, +61796, +61813, +61820, +61820, +61845, +61852, +61877, +61884, +61904, +61912, +61912, +61912, +61949, +61949, +61961, +61961, +61968, +61968, +61968, +61968, +62014, +62026, +62047, +62068, +62075, +62075, +62082, +62089, +62099, +62128, +62155, +62184, +62184, +62213, +62220, +62245, +62274, +62318, +62338, +62359, +62359, +62359, +62388, +62408, +62415, +62415, +62421, +62421, +62429, +62440, +62440, +62470, +62470, +62470, +62494, +62535, +62542, +62549, +62556, +62564, +62571, +62578, +62611, +62618, +62645, +62655, +62667, +62676, +62701, +62720, +62720, +62727, +62752, +62759, +62766, +62782, +62794, +62794, +62804, +62804, +62814, +62831, +62839, +62846, +62852, +62886, +62886, +62900, +62910, +62929, +62943, +62950, +62972, +62985, +62985, +62985, +62998, +63014, +63041, +63067, +63067, +63085, +63101, +63108, +63108, +63115, +63135, +63135, +63142, +63149, +63149, +63156, +63173, +63173, +63180, +63212, +63219, +63236, +63236, +63247, +63298, +63310, +63343, +63343, +63343, +63356, +63356, +63374, +63374, +63374, +63374, +63381, +63401, +63421, +63436, +63459, +63459, +63500, +63506, +63516, +63528, +63551, +63551, +63567, +63615, +63615, +63651, +63679, +63693, +63700, +63734, +63734, +63748, +63763, +63763, +63763, +63775, +63815, +63861, +63884, +63884, +63899, +63907, +63943, +63943, +63950, +63950, +63964, +63964, +63964, +63996, +64003, +64012, +64012, +64106, +64124, +64131, +64131, +64138, +64158, +64158, +64177, +64208, +64208, +64220, +64220, +64220, +64235, +64243, +64258, +64258, +64280, +64290, +64301, +64321, +64334, +64341, +64357, +64400, +64400, +64407, +64407, +64414, +64414, +64433, +64454, +64472, +64502, +64523, +64523, +64582, +64589, +64589, +64619, +64619, +64619, +64619, +64638, +64638, +64638, +64648, +64660, +64660, +64676, +64676, +64695, +64705, +64705, +64732, +64732, +64732, +64738, +64764, +64774, +64787, +64830, +64854, +64888, +64893, +64902, +64938, +64967, +64997, +64997, +65015, +65046, +65072, +65072, +65097, +65110, +65110, +65110, +65110, +65110, +65110, +65122, +65122, +65122, +65129, +65170, +65187, +65187, +65210, +65228, +65235, +65251, +65259, +65259, +65259, +65274, +65274, +65287, +65307, +65323, +65323, +65323, +65362, +65384, +65384, +65400, +65400, +65400, +65400, +65423, +65430, +65457, +65457, +65457, +65476, +65476, +65476, +65476, +65486, +65486, +65521, +65550, +65550, +65550, +65584, +65584, +65584, +65584, +65584, +65601, +65621, +65631, +65672, +65692, +65719, +65719, +65743, +65766, +65766, +65782, +65788, +65828, +65854, +65868, +65877, +65897, +65909, +65936, +65936, +65948, +65948, +65968, +65989, +65989, +65989, +65989, +66016, +66016, +66032, +66039, +66039, +66039, +66055, +66066, +66098, +66114, +66140, +66140, +66174, +66174, +66174, +66220, +66249, +66249, +66249, +66249, +66268, +66276, +66295, +66314, +66322, +66343, +66343, +66343, +66395, +66395, +66413, +66413, +66422, +66430, +66430, +66449, +66449, +66460, +66486, +66492, +66492, +66492, +66492, +66492, +66492, +66510, +66510, +66519, +66530, +66563, +66563, +66573, +66573, +66573, +66612, +66612, +66612, +66625, +66625, +66642, +66642, +66642, +66658, +66672, +66672, +66680, +66715, +66724, +66724, +66740, +66745, +66753, +66769, +66802, +66802, +66802, +66802, +66829, +66843, +66858, +66875, +66893, +66893, +66893, +66933, +66933, +66945, +66945, +66945, +66945, +66956, +66976, +66976, +66976, +66985, +67003, +67003, +67010, +67031, +67031, +67051, +67064, +67083, +67091, +67116, +67116, +67141, +67190, +67220, +67220, +67220, +67233, +67241, +67241, +67275, +67281, +67292, +67302, +67302, +67315, +67379, +67395, +67405, +67421, +67421, +67475, +67483, +67526, +67526, +67546, +67546, +67546, +67571, +67579, +67637, +67659, +67676, +67676, +67676, +67705, +67723, +67739, +67739, +67777, +67792, +67792, +67811, +67811, +67819, +67860, +67876, +67876, +67899, +67915, +67955, +67955, +67969, +67979, +67991, +67991, +67991, +68006, +68020, +68020, +68020, +68045, +68057, +68072, +68072, +68086, +68097, +68113, +68120, +68129, +68136, +68155, +68170, +68170, +68195, +68241, +68258, +68287, +68313, +68325, +68342, +68384, +68416, +68427, +68461, +68461, +68476, +68498, +68498, +68506, +68513, +68533, +68546, +68563, +68563, +68581, +68621, +68634, +68657, +68657, +68657, +68676, +68707, +68726, +68739, +68753, +68753, +68753, +68753, +68765, +68798, +68804, +68819, +68819, +68819, +68847, +68856, +68872, +68872, +68904, +68915, +68942, +68953, +68962, +68980, +69007, +69013, +69024, +69038, +69069, +69082, +69108, +69116, +69134, +69157, +69180, +69180, +69201, +69217, +69217, +69234, +69257, +69257, +69257, +69312, +69312, +69330, +69343, +69360, +69360, +69383, +69402, +69423, +69434, +69455, +69455, +69488, +69496, +69541, +69559, +69559, +69578, +69587, +69587, +69622, +69622, +69630, +69654, +69667, +69674, +69685, +69696, +69734, +69749, +69759, +69759, +69759, +69759, +69790, +69805, +69805, +69823, +69823, +69823, +69839, +69861, +69871, +69871, +69871, +69916, +69916, +69931, +69931, +69931, +69931, +69949, +70014, +70026, +70026, +70026, +70050, +70077, +70113, +70152, +70165, +70182, +70191, +70191, +70191, +70206, +70206, +70206, +70206, +70206, +70230, +70230, +70230, +70230, +70244, +70244, +70244, +70251, +70251, +70251, +70288, +70315, +70357, +70363, +70363, +70376, +70376, +70387, +70387, +70397, +70397, +70397, +70434, +70460, +70476, +70476, +70476, +70507, +70507, +70515, +70534, +70534, +70554, +70570, +70580, +70594, +70623, +70623, +70641, +70641, +70641, +70641, +70641, +70674, +70704, +70735, +70735, +70735, +70748, +70748, +70757, +70802, +70852, +70873, +70873, +70892, +70923, +70923, +70935, +70935, +70941, +70941, +70960, +70980, +70980, +71023, +71034, +71034, +71034, +71045, +71045, +71045, +71045, +71045, +71083, +71093, +71115, +71115, +71131, +71131, +71131, +71141, +71148, +71148, +71166, +71186, +71186, +71201, +71209, +71209, +71238, +71246, +71246, +71246, +71246, +71258, +71258, +71258, +71258, +71276, +71276, +71276, +71291, +71309, +71309, +71309, +71309, +71318, +71318, +71318, +71332, +71342, +71342, +71356, +71388, +71388, +71397, +71407, +71407, +71407, +71425, +71436, +71436, +71466, +71466, +71491, +71491, +71527, +71540, +71540, +71560, +71584, +71600, +71600, +71632, +71648, +71678, +71689, +71703, +71703, +71727, +71742, +71742, +71742, +71759, +71759, +71774, +71780, +71780, +71780, +71799, +71819, +71819, +71837, +71849, +71867, +71867, +71867, +71867, +71867, +71867, +71867, +71867, +71867, +71890, +71890, +71941, +71941, +71972, +72002, +72016, +72037, +72053, +72053, +72053, +72053, +72106, +72131, +72131, +72131, +72152, +72159, +72159, +72171, +72176, +72207, +72207, +72207, +72207, +72221, +72221, +72237, +72264, +72264, +72264, +72280, +72289, +72307, +72326, +72343, +72343, +72343, +72370, +72370, +72370, +72370, +72370, +72396, +72402, +72402, +72402, +72430, +72430, +72449, +72489, +72499, +72499, +72550, +72550, +72573, +72588, +72623, +72623, +72623, +72641, +72652, +72670, +72684, +72684, +72684, +72684, +72699, +72699, +72699, +72699, +72699, +72718, +72769, +72774, +72786, +72799, +72799, +72799, +72837, +72867, +72915, +72935, +72935, +72935, +72953, +72973, +72973, +72973, +72973, +73005, +73005, +73018, +73018, +73028, +73058, +73068, +73068, +73090, +73102, +73114, +73142, +73180, +73180, +73223, +73247, +73247, +73247, +73247, +73247, +73247, +73247, +73256, +73256, +73304, +73321, +73328, +73328, +73328, +73389, +73405, +73405, +73425, +73425, +73425, +73443, +73460, +73476, +73476, +73498, +73518, +73533, +73563, +73591, +73628, +73628, +73648, +73667, +73736, +73736, +73736, +73756, +73756, +73756, +73803, +73803, +73803, +73803, +73831, +73863, +73875, +73875, +73875, +73875, +73875, +73908, +73931, +73942, +73942, +73953, +73982, +74007, +74066, +74075, +74075, +74108, +74108, +74108, +74114, +74167, +74178, +74178, +74178, +74199, +74199, +74218, +74218, +74248, +74248, +74248, +74248, +74248, +74272, +74272, +74290, +74326, +74349, +74349, +74349, +74367, +74367, +74367, +74385, +74410, +74429, +74429, +74475, +74497, +74497, +74513, +74527, +74551, +74581, +74581, +74581, +74638, +74644, +74644, +74665, +74691, +74691, +74691, +74691, +74701, +74701, +74708, +74721, +74721, +74721, +74761, +74801, +74801, +74808, +74825, +74833, +74833, +74850, +74870, +74870, +74893, +74893, +74928, +74928, +74928, +74928, +74938, +74938, +74938, +74938, +74938, +74938, +74938, +74938, +74949, +74949, +74981, +75000, +75019, +75029, +75029, +75029, +75044, +75054, +75071, +75071, +75089, +75103, +75103, +75103, +75103, +75103, +75103, +75103, +75103, +75103, +75103, +75120, +75120, +75120, +75120, +75165, +75165, +75165, +75165, +75185, +75191, +75208, +75208, +75236, +75252, +75269, +75292, +75311, +75318, +75318, +75344, +75359, +75359, +75359, +75423, +75423, +75444, +75444, +75444, +75457, +75464, +75476, +75493, +75516, +75516, +75516, +75532, +75539}; -static const char tldData[] = { -"com.cn\0" -"com.co\0" -"hb.cn\0" -"med.br\0conf.lv\0wallonie.museum\0" -"namsos.no\0" -"\xe7\xb6\xb2\xe7\xbb\x9c.hk\0farmers.museum\0rel.pl\0" -"com.cu\0" -"military.museum\0" -"*.jm\0convent.museum\0cymru.museum\0malvik.no\0" -"univ.sn\0" -"gliding.aero\0" -"wodzislaw.pl\0" -"com.dm\0!pref.iwate.jp\0tran\xc3\xb8y.no\0pila.pl\0" -"mb.it\0*.ke\0lib.ri.us\0" -"com.ec\0*.kh\0tr\xc3\xb8gstad.no\0" -"com.ee\0" -"mobi.gp\0" +static const char *tldData[] = { +"vgs.no\0ah.no\0" +"ma.us\0" +"mizunami.gifu.jp\0" +"saitama.jp\0kimino.wakayama.jp\0" +"int.bo\0cambridge.museum\0" +"andasuolo.no\0lardal.no\0" +"transport.museum\0" +"nishinomiya.hyogo.jp\0" +"is-into-cars.com\0" +"karlsoy.no\0" +"bungoono.oita.jp\0" +"int.ci\0" +"chikujo.fukuoka.jp\0" +"aisai.aichi.jp\0" +"os.hedmark.no\0" +"int.co\0" +"komaki.aichi.jp\0seki.gifu.jp\0" +"wanouchi.gifu.jp\0lib.ri.us\0" +"higashiosaka.osaka.jp\0" +"org\0cechire.com\0" +"satte.saitama.jp\0" +"berg.no\0" +"saitama.saitama.jp\0" +"cc.sd.us\0" +"act.gov.au\0mansion.museum\0" +"fe.it\0y.se\0" +"gunma.jp\0" +"otoyo.kochi.jp\0miyoshi.saitama.jp\0" +"sa.gov.au\0" +"online.museum\0" +"abiko.chiba.jp\0" +"!educ.ar\0" +"agematsu.nagano.jp\0" +"akiruno.tokyo.jp\0lund.no\0" +"kasuga.hyogo.jp\0" +"nakano.tokyo.jp\0homeunix.net\0" +"ambulance.aero\0sv.it\0" +"shiso.hyogo.jp\0" +"fuso.aichi.jp\0delmenhorst.museum\0" +"dali.museum\0" +"brindisi.it\0" +"midori.gunma.jp\0" +"nantan.kyoto.jp\0" +"takaishi.osaka.jp\0imizu.toyama.jp\0" +"tonsberg.no\0" +"countryestate.museum\0" +"rawa-maz.pl\0" +"yokoshibahikari.chiba.jp\0" +"ontario.museum\0" +"certification.aero\0" +"franziskaner.museum\0cc.nj.us\0" +"genkai.saga.jp\0" +"tysfjord.no\0" +"ra.it\0" +"air-traffic-control.aero\0ina.ibaraki.jp\0" +"in-the-band.net\0" +"ainan.ehime.jp\0oita.oita.jp\0!national-library-scotland.uk\0" +"kamiichi.toyama.jp\0" +"ogata.akita.jp\0smola.no\0" +"matsushima.miyagi.jp\0langev\xc3\xa5g.no\0" +"vard\xc3\xb8.no\0" +"limanowa.pl\0" +"is-a-bruinsfan.org\0" +"yufu.oita.jp\0berkeley.museum\0" +"torino.it\0per.la\0" +"noheji.aomori.jp\0koebenhavn.museum\0isa-geek.com\0" +"choyo.kumamoto.jp\0" +"s\xc3\xb8r-odal.no\0" +"int.is\0bir.ru\0" +"jefferson.museum\0" +"brasil.museum\0" +"sologne.museum\0" +"shimosuwa.nagano.jp\0setagaya.tokyo.jp\0" +"tokoname.aichi.jp\0lerdal.no\0" +"!retina.ar\0boston.museum\0" +"bologna.it\0kimobetsu.hokkaido.jp\0yuzawa.niigata.jp\0" +"obuse.nagano.jp\0gs.svalbard.no\0" +"furudono.fukushima.jp\0" +"isla.pr\0ny.us\0" +"5.bg\0" +"lt.ua\0" "gran.no\0" -"wa.gov.au\0" -"com.dz\0kg.kr\0" -"zoological.museum\0gjerstad.no\0haugesund.no\0kharkov.ua\0" -"walbrzych.pl\0" -"civilization.museum\0" -"ha.no\0" -"*.kw\0" -"med.ec\0com.es\0" -"med.ee\0otago.museum\0svelvik.no\0" -"art.ht\0amber.museum\0elvendrell.museum\0rost.no\0" -"jx.cn\0gratangen.no\0" -"association.aero\0ca.it\0" -"zaporizhzhe.ua\0" -"com.fr\0" -"szex.hu\0" -"e-burg.ru\0" -"com.ge\0bokn.no\0" +"per.nf\0" +"int.la\0" +"kumakogen.ehime.jp\0nasu.tochigi.jp\0" +"shirataka.yamagata.jp\0" +"vet.br\0graz.museum\0" +"int.lk\0" +"plc.co.im\0md.us\0k12.gu.us\0" +"wildlife.museum\0" +"stokke.no\0" +"stordal.no\0oskol.ru\0" +"kosaka.akita.jp\0" +"kitami.hokkaido.jp\0" +"higashimatsuyama.saitama.jp\0" +"s\xc3\xb8rreisa.no\0poznan.pl\0" +"\xd1\x81\xd1\x80\xd0\xb1\0" +"tokuyama.yamaguchi.jp\0" +"tosa.kochi.jp\0est-le-patron.com\0" +"hachijo.tokyo.jp\0" +"ibaraki.osaka.jp\0rindal.no\0" +"taishi.osaka.jp\0ol.no\0" +"int.mv\0lib.az.us\0" +"int.mw\0hjartdal.no\0" +"imb.br\0\xc3\xb8ksnes.no\0" +"ishikawa.jp\0osen.no\0" +"nakamura.kochi.jp\0" +"seiyo.ehime.jp\0mincom.tn\0" +"chieti.it\0sakado.saitama.jp\0" +"enebakk.no\0cc.ca.us\0from-hi.com\0" +"kokonoe.oita.jp\0auto.pl\0" +"venice.it\0shimada.shizuoka.jp\0" +"surrey.museum\0" +"audnedaln.no\0" +"minamifurano.hokkaido.jp\0axis.museum\0webhop.info\0" +"is-not-certified.com\0" +"volda.no\0" +"is-a-lawyer.com\0" +"oga.akita.jp\0" +"higashimatsushima.miyagi.jp\0" +"tonaki.okinawa.jp\0" +"somna.no\0rovno.ua\0" +"nt.gov.au\0" +"cc.pr.us\0" +"cs.it\0bieszczady.pl\0" +"per.sg\0" +"research.museum\0endoftheinternet.org\0" +"int.pt\0" +"costume.museum\0" +"eisenbahn.museum\0slask.pl\0" +"gdynia.pl\0" +"wa.au\0pol.dz\0fukui.jp\0higashishirakawa.gifu.jp\0botanicalgarden.museum\0" +"automotive.museum\0" +"sshn.se\0" +"nogata.fukuoka.jp\0cc.nm.us\0is-an-anarchist.com\0" +"dontexist.com\0" +"an.it\0" +"uenohara.yamanashi.jp\0" +"midtre-gauldal.no\0" +"hm.no\0komvux.se\0" +"hidaka.wakayama.jp\0hobby-site.org\0" +"giske.no\0" +"sund.no\0" +"troms\xc3\xb8.no\0" +"zagan.pl\0" +"chikusei.ibaraki.jp\0wlocl.pl\0" +"in-addr.arpa\0notaires.fr\0altai.ru\0" +"int.ru\0" +"aquila.it\0" +"int.rw\0" +"ito.shizuoka.jp\0" +"missoula.museum\0kolobrzeg.pl\0" +"assabu.hokkaido.jp\0" +"sld.do\0meloy.no\0" +"ak.us\0" +"k12.md.us\0" +"kawanishi.yamagata.jp\0is-lost.org\0" +"ochi.kochi.jp\0" +"amami.kagoshima.jp\0gamo.shiga.jp\0" +"yamazoe.nara.jp\0" +"shirako.chiba.jp\0matsuda.kanagawa.jp\0int.tj\0" +"ota.tokyo.jp\0" +"kicks-ass.net\0" +"yamato.fukushima.jp\0shinjo.okayama.jp\0baltimore.museum\0ushistory.museum\0pro\0" +"mallorca.museum\0hoyanger.no\0hobby-site.com\0" +"narvik.no\0olsztyn.pl\0warmia.pl\0" +"pol.ht\0int.tt\0" +"mizusawa.iwate.jp\0h\xc3\xb8yanger.no\0przeworsk.pl\0" +"matsuno.ehime.jp\0" +"folkebibl.no\0" +"pb.ao\0taranto.it\0nomi.ishikawa.jp\0chizu.tottori.jp\0alta.no\0" +"8.bg\0okazaki.aichi.jp\0" +"goshiki.hyogo.jp\0lib.wi.us\0" +"or.at\0" +"stateofdelaware.museum\0" +"modern.museum\0" +"\xd1\x80\xd1\x84\0" +"or.bi\0himi.toyama.jp\0" +"kitaaiki.nagano.jp\0toga.toyama.jp\0" +"kutchan.hokkaido.jp\0tamaki.mie.jp\0finnoy.no\0int.vn\0" +"fujisawa.iwate.jp\0" +"homebuilt.aero\0cranbrook.museum\0" +"kv\xc3\xa6""fjord.no\0" +"or.ci\0saigawa.fukuoka.jp\0kutno.pl\0" +"asuke.aichi.jp\0kanonji.kagawa.jp\0" +"higashikagawa.kagawa.jp\0" +"inashiki.ibaraki.jp\0matta-varjjat.no\0" +"lviv.ua\0" +"or.cr\0mitane.akita.jp\0" +"*.kitakyushu.jp\0fujikawa.shizuoka.jp\0" +"egersund.no\0" +"srv.br\0" +"belgorod.ru\0" +"v\xc3\xa5gs\xc3\xb8y.no\0fh.se\0" +"tsuruta.aomori.jp\0shibuya.tokyo.jp\0k12.va.us\0" +"kamishihoro.hokkaido.jp\0" +"sogne.no\0" +"turystyka.pl\0" +"gujo.gifu.jp\0" +"experts-comptables.fr\0" +"yame.fukuoka.jp\0" +"annaka.gunma.jp\0kawagoe.mie.jp\0" +"wakayama.jp\0" +"openair.museum\0operaunite.com\0" +"wakuya.miyagi.jp\0" +"bjarkoy.no\0ivano-frankivsk.ua\0dyndns.tv\0is-a-linux-user.org\0" +"olbiatempio.it\0" +"etne.no\0fosnes.no\0" +"ginoza.okinawa.jp\0" +"krager\xc3\xb8.no\0" +"vn.ua\0" +"jx.cn\0bill.museum\0home.dyndns.org\0" +"lecco.it\0bihoro.hokkaido.jp\0" +"asaka.saitama.jp\0" +"tagajo.miyagi.jp\0" +"maintenance.aero\0" +"nordreisa.no\0" +"kamogawa.chiba.jp\0nebraska.museum\0" +"lib.nm.us\0" +"r\xc3\xa1isa.no\0" +"historisch.museum\0" +"is-a-republican.com\0" +"prd.fr\0yonaguni.okinawa.jp\0" +"bristol.museum\0crafts.museum\0blogsite.org\0" +"kasamatsu.gifu.jp\0" +"fin.ec\0" +"slg.br\0seirou.niigata.jp\0cahcesuolo.no\0from-ma.com\0" +"ba.it\0aq.it\0exhibition.museum\0heimatunduhren.museum\0" +"rg.it\0dyndns.ws\0" +"homedns.org\0" +"kakogawa.hyogo.jp\0" +"chikushino.fukuoka.jp\0mito.ibaraki.jp\0" +"dc.us\0" +"terni.it\0" +"or.id\0yoshida.shizuoka.jp\0" +"fukaya.saitama.jp\0rost.no\0" +"aomori.jp\0" +"aeroport.fr\0sabae.fukui.jp\0geology.museum\0" +"yakage.okayama.jp\0rahkkeravju.no\0" +"kasama.ibaraki.jp\0" +"frana.no\0" +"hatoyama.saitama.jp\0za.org\0" +"kitayama.wakayama.jp\0" +"bilbao.museum\0" +"or.it\0" +"!nawrastelecom.om\0" +"nanjo.okinawa.jp\0k12.me.us\0" +"mobi.gp\0" +"daisen.akita.jp\0bizen.okayama.jp\0hembygdsforbund.museum\0salangen.no\0" +"yoshikawa.saitama.jp\0homelinux.com\0" +"or.jp\0farmers.museum\0from-ri.com\0" +"\xe1\x83\x92\xe1\x83\x94\0" +"\xc3\xa5snes.no\0" +"assisi.museum\0muos\xc3\xa1t.no\0kemerovo.ru\0" +"musashino.tokyo.jp\0" +"sld.pa\0" +"kushimoto.wakayama.jp\0virginia.museum\0is-a-financialadvisor.com\0" +"yuasa.wakayama.jp\0" +"yachimata.chiba.jp\0" +"\xc3\xa5seral.no\0klabu.no\0" +"onna.okinawa.jp\0" +"hikone.shiga.jp\0or.kr\0" +"tranby.no\0lib.vt.us\0" +"carrier.museum\0" +"isa-geek.net\0" +"orsta.no\0" +"toyone.aichi.jp\0fortmissoula.museum\0zoology.museum\0" +"historicalsociety.museum\0" +"prd.km\0" +"iheya.okinawa.jp\0" +"kongsberg.no\0" +"dreamhosters.com\0" +"chicago.museum\0gjerdrum.no\0" +"pe.ca\0" +"cpa.pro\0" +"makurazaki.kagoshima.jp\0mashiki.kumamoto.jp\0" +"sondrio.it\0masaki.ehime.jp\0" +"numazu.shizuoka.jp\0" +"kawanishi.nara.jp\0" +"futaba.fukushima.jp\0nachikatsuura.wakayama.jp\0" +"airguard.museum\0" +"society.museum\0" +"ulm.museum\0" +"or.na\0" +"tohma.hokkaido.jp\0" +"masoy.no\0" +"or.mu\0" +"prd.mg\0" +"!omanpost.om\0" +"izumizaki.fukushima.jp\0nishikatsura.yamanashi.jp\0" +"miyazu.kyoto.jp\0" +"unj\xc3\xa1rga.no\0" +"noshiro.akita.jp\0" +"ryokami.saitama.jp\0" +"carboniaiglesias.it\0homeunix.org\0" +"australia.museum\0" +"sowa.ibaraki.jp\0" +"urausu.hokkaido.jp\0" +"kaisei.kanagawa.jp\0" +"vt.it\0" +"virtual.museum\0" +"hs.kr\0brand.se\0" +"daejeon.kr\0seaport.museum\0" +"takaoka.toyama.jp\0" +"kitakata.fukushima.jp\0fribourg.museum\0" +"montreal.museum\0" +"higashiyama.kyoto.jp\0\xd8\xa7\xd9\x84\xd8\xb3\xd8\xb9\xd9\x88\xd8\xaf\xd9\x8a\xd9\x87\0" +"chitose.hokkaido.jp\0" +"engine.aero\0" +"rome.it\0medical.museum\0" +"tjome.no\0" +"asti.it\0reggio-calabria.it\0" +"or.pw\0" +"to.it\0murayama.yamagata.jp\0" +"shiraoi.hokkaido.jp\0" +"joshkar-ola.ru\0" +"fetsund.no\0wa.us\0" +"nakaniikawa.toyama.jp\0wroclaw.pl\0lib.nh.us\0" +"ragusa.it\0nakanojo.gunma.jp\0r\xc3\xa5""de.no\0barrell-of-knowledge.info\0" +"yuza.yamagata.jp\0moareke.no\0cv.ua\0" +"anjo.aichi.jp\0" +"!omanmobile.om\0" +"fukuroi.shizuoka.jp\0space-to-rent.com\0" +"torahime.shiga.jp\0" +"gojome.akita.jp\0" +"at.it\0yawara.ibaraki.jp\0" +"\xd8\xa7\xd9\x84\xd8\xb3\xd8\xb9\xd9\x88\xd8\xaf\xd9\x8a\xd8\xa9\0" +"okutama.tokyo.jp\0naturbruksgymn.se\0est-mon-blogueur.com\0" +"gj\xc3\xb8vik.no\0" +"marylhurst.museum\0" +"ferrara.it\0" +"shimonita.gunma.jp\0" +"chernivtsi.ua\0" +"yusuhara.kochi.jp\0" +"indianmarket.museum\0from-nm.com\0" +"chambagri.fr\0" +"yono.saitama.jp\0romsa.no\0" +"lucerne.museum\0" +"pe.it\0" +"from-mn.com\0" +"kurgan.ru\0or.th\0" +"udmurtia.ru\0" +"k12.nj.us\0" +"c.bg\0atami.shizuoka.jp\0" +"herad.no\0" +"midatlantic.museum\0" +"\xd1\x83\xd0\xba\xd1\x80\0" +"inazawa.aichi.jp\0matsumoto.nagano.jp\0francaise.museum\0horten.no\0" +"isehara.kanagawa.jp\0" +"fuji.shizuoka.jp\0or.ug\0" +"oppdal.no\0" +"or.tz\0\xd9\x82\xd8\xb7\xd8\xb1\0" +"!nacion.ar\0shiroi.chiba.jp\0muncie.museum\0from-ct.com\0" +"television.museum\0doomdns.com\0" +"bod\xc3\xb8.no\0" +"seihi.nagasaki.jp\0" +"memorial.museum\0" +"slupsk.pl\0" +"arkhangelsk.ru\0or.us\0" +"pe.kr\0is-a-bulls-fan.com\0" +"matsubara.osaka.jp\0" +"ishigaki.okinawa.jp\0" +"nysa.pl\0from-nv.com\0" +"ishikawa.fukushima.jp\0" +"drobak.no\0" +"stpetersburg.museum\0" +"andria-trani-barletta.it\0" +"aibetsu.hokkaido.jp\0plants.museum\0silk.museum\0holtalen.no\0" +"lakas.hu\0" +"gs.of.no\0rauma.no\0" +"modena.it\0" +"kh.ua\0" +"togitsu.nagasaki.jp\0" +"newhampshire.museum\0" +"oirase.aomori.jp\0grajewo.pl\0fin.tn\0" +"depot.museum\0" +"nayoro.hokkaido.jp\0" +"forgot.her.name\0" +"sande.more-og-romsdal.no\0" +"reklam.hu\0" +"\xc3\xa5krehamn.no\0" +"ancona.it\0h\xc3\xa5.no\0" +"lib.as.us\0" +"marketplace.aero\0schweiz.museum\0" +"eu.int\0" +"urasoe.okinawa.jp\0" +"kaluga.ru\0" +"godo.gifu.jp\0" +"kitagawa.kochi.jp\0kr.com\0" +"pvt.ge\0" +"usuki.oita.jp\0" +"mino.gifu.jp\0" +"rovigo.it\0" +"yamada.fukuoka.jp\0amakusa.kumamoto.jp\0lajolla.museum\0uzhgorod.ua\0" +"shimane.jp\0workshop.museum\0" +"aero\0" +"shikatsu.aichi.jp\0warszawa.pl\0" +"wegrow.pl\0" +"koga.fukuoka.jp\0" +"funabashi.chiba.jp\0moriya.ibaraki.jp\0yamaga.kumamoto.jp\0" +"act.edu.au\0mbone.pl\0" +"ikaruga.nara.jp\0" +"shinichi.hiroshima.jp\0gjesdal.no\0" +"hanawa.fukushima.jp\0" +"tr.it\0wakasa.fukui.jp\0" +"\xe0\xa6\xac\xe0\xa6\xbe\xe0\xa6\x82\xe0\xa6\xb2\xe0\xa6\xbe\0" +"olbia-tempio.it\0" +"aizumisato.fukushima.jp\0convent.museum\0bd.se\0" +"fukuchi.fukuoka.jp\0takino.hyogo.jp\0vt.us\0" +"yazu.tottori.jp\0" +"kagoshima.jp\0loyalist.museum\0" +"kitahiroshima.hokkaido.jp\0fed.us\0" +"sandnessj\xc3\xb8""en.no\0varoy.no\0" +"hurdal.no\0" +"salem.museum\0jar.ru\0" +"yaizu.shizuoka.jp\0" +"cc.nv.us\0" +"airtraffic.aero\0" +"bg.it\0sukumo.kochi.jp\0" +"rm.it\0nishiokoppe.hokkaido.jp\0" +"house.museum\0" +"aizumi.tokushima.jp\0" +"hitachinaka.ibaraki.jp\0kicks-ass.org\0" +"hokuryu.hokkaido.jp\0k12.or.us\0" +"geisei.kochi.jp\0tatarstan.ru\0" +"toyotsu.fukuoka.jp\0meguro.tokyo.jp\0" +"myoko.niigata.jp\0" +"bronnoy.no\0" +"nishikawa.yamagata.jp\0" +"minamata.kumamoto.jp\0" +"gd.cn\0" +"trana.no\0" +"takasaki.gunma.jp\0cc.ma.us\0" +"trani-barletta-andria.it\0" +"\xe0\xaa\xad\xe0\xaa\xbe\xe0\xaa\xb0\xe0\xaa\xa4\0c.la\0" +"hanno.saitama.jp\0" +"ami.ibaraki.jp\0kurotaki.nara.jp\0" +"\xd8\xa7\xdb\x8c\xd8\xb1\xd8\xa7\xd9\x86.ir\0boldlygoingnowhere.org\0" +"f.bg\0unjarga.no\0lib.ia.us\0" +"\xc3\xb8rskog.no\0tingvoll.no\0" +"webhop.org\0" +"grue.no\0dyndns-blog.com\0" +"dyndns-web.com\0" +"zakopane.pl\0" +"britishcolumbia.museum\0turek.pl\0" +"omi.nagano.jp\0is-an-actor.com\0" +"ms.it\0gov.nc.tr\0" +"kijo.miyazaki.jp\0" +"starostwo.gov.pl\0mobi.tt\0" +"gs.ah.no\0" +"minobu.yamanashi.jp\0tr.no\0" +"mobi.tz\0" +"rakkestad.no\0" +"org.ac\0from-az.net\0" +"org.ae\0" +"org.af\0bj.cn\0" +"org.ag\0" +"org.ai\0" +"nanae.hokkaido.jp\0oshino.yamanashi.jp\0" +"org.al\0takashima.shiga.jp\0" +"org.an\0naha.okinawa.jp\0matsuzaki.shizuoka.jp\0bahn.museum\0" +"chungbuk.kr\0biev\xc3\xa1t.no\0homelinux.net\0" +"org.ba\0umi.fukuoka.jp\0" +"org.bb\0" +"mihama.wakayama.jp\0cyber.museum\0" +"org.au\0yorii.saitama.jp\0hagi.yamaguchi.jp\0" +"ms.kr\0" +"org.bh\0fujikawa.yamanashi.jp\0floro.no\0oryol.ru\0" +"org.bi\0sakahogi.gifu.jp\0" +"org.az\0niimi.okayama.jp\0" +"aguni.okinawa.jp\0sells-for-less.com\0" +"org.bm\0tsukuba.ibaraki.jp\0" +"org.bo\0" +"org.br\0r\xc3\xa6lingen.no\0" +"org.bs\0kuriyama.hokkaido.jp\0" +"org.bt\0" +"org.bw\0" +"nf.ca\0" +"org.ci\0" +"org.bz\0" +"hirogawa.wakayama.jp\0" "mordovia.ru\0" -"com.gh\0*.mm\0" -"com.gi\0z.se\0" -"cahcesuolo.no\0" -"hurdal.no\0joshkar-ola.ru\0" -"cadaques.museum\0ma.us\0" -"a.bg\0" -"com.gn\0bozen.it\0tambov.ru\0" -"*.gifu.jp\0*.tokyo.jp\0*.mt\0" -"com.gp\0travel\0cc.tx.us\0" -"com.gr\0hemne.no\0" -"*.ni\0" -"*.mz\0" -"cc.il.us\0" -"com.gy\0" -"zj.cn\0oksnes.no\0museum.tt\0" -"com.hk\0*.np\0" -"rc.it\0baseball.museum\0" -"com.hn\0exhibition.museum\0" -"h\xc3\xa1""bmer.no\0" +"org.cn\0k12.vt.us\0" +"org.co\0" +"if.ua\0" +"org.cu\0" +"futsu.nagasaki.jp\0hu.net\0" +"dyndns-pics.com\0" +"karumai.iwate.jp\0" +"org.dm\0" +"org.do\0" +"risor.no\0" +"kujukuri.chiba.jp\0abashiri.hokkaido.jp\0novosibirsk.ru\0" +"org.ec\0" +"ballangen.no\0k12.co.us\0" +"org.ee\0" +"navuotna.no\0pisz.pl\0" +"org.eg\0" +"mobi.na\0" +"tonami.toyama.jp\0" +"org.dz\0sci.eg\0\xc3\xa5rdal.no\0" +"environmentalconservation.museum\0edunet.tn\0" +"murakami.niigata.jp\0usarts.museum\0" +"eidfjord.no\0e-burg.ru\0from-mt.com\0from-nd.com\0" +"karasuyama.tochigi.jp\0utah.museum\0" +"maritimo.museum\0" +"union.aero\0org.es\0" +"esan.hokkaido.jp\0" +"namegawa.saitama.jp\0c.se\0" +"anamizu.ishikawa.jp\0kitakami.iwate.jp\0" +"ga.us\0" +"qld.au\0gjemnes.no\0" +"ichinoseki.iwate.jp\0makinohara.shizuoka.jp\0" +"bahccavuotna.no\0" +"is-an-actress.com\0" +"karm\xc3\xb8y.no\0" +"org.ge\0cesena-forli.it\0" +"vantaa.museum\0gaular.no\0" +"org.gg\0" +"org.gh\0cc.ny.us\0" +"org.gi\0" +"from-dc.com\0" +"fitjar.no\0vyatka.ru\0" +"org.gn\0museum\0" +"org.gp\0" +"org.gr\0beppu.oita.jp\0" +"groundhandling.aero\0org.gt\0okegawa.saitama.jp\0lib.ky.us\0" +"org.hk\0" +"org.hn\0" +"presidio.museum\0cc.md.us\0" +"bolzano.it\0" +"sosa.chiba.jp\0koenig.ru\0iki.fi\0" +"org.ht\0ebetsu.hokkaido.jp\0" +"fuel.aero\0org.hu\0" +"hole.no\0" +"blog.br\0tosu.saga.jp\0" +"k12.nh.us\0" +"i.bg\0" +"rs.ba\0" +"org.im\0" +"org.in\0" +"org.iq\0" +"lel.br\0org.ir\0kasahara.gifu.jp\0" +"org.is\0chofu.tokyo.jp\0notodden.no\0" +"org.je\0spjelkavik.no\0" +"vefsn.no\0" +"fukuoka.jp\0yamanobe.yamagata.jp\0yamanakako.yamanashi.jp\0" +"yaese.okinawa.jp\0" +"baikal.ru\0" +"from-me.org\0" +"kanazawa.ishikawa.jp\0nowaruda.pl\0" +"swidnica.pl\0" +"org.jo\0!city.yokohama.jp\0olkusz.pl\0" +"higashiura.aichi.jp\0mosjoen.no\0" +"vestv\xc3\xa5g\xc3\xb8y.no\0" +"takahama.aichi.jp\0dyn-o-saur.com\0" +"shimabara.nagasaki.jp\0" +"ebiz.tw\0" +"caserta.it\0org.kg\0" +"sc.cn\0org.ki\0" +"aizuwakamatsu.fukushima.jp\0is-a-teacher.com\0" +"sado.niigata.jp\0org.km\0resistance.museum\0" +"togo.aichi.jp\0org.kn\0skien.no\0" +"org.kp\0" +"org.la\0kommune.no\0" +"vic.edu.au\0miyoshi.aichi.jp\0org.lb\0" +"org.lc\0" +"cagliari.it\0" +"uscountryestate.museum\0h\xc3\xb8nefoss.no\0" +"gs.ol.no\0" +"riik.ee\0" +"g12.br\0ms.us\0nc.us\0" +"org.ky\0agro.pl\0" +"org.kz\0landes.museum\0doesntexist.com\0" +"org.lk\0" +"holt\xc3\xa5len.no\0" +"nedre-eiker.no\0" +"org.ma\0naroy.no\0" +"org.lr\0" +"org.ls\0" +"tagawa.fukuoka.jp\0" +"org.me\0" +"nonoichi.ishikawa.jp\0org.lv\0" +"org.mg\0horology.museum\0" +"utazas.hu\0ako.hyogo.jp\0" +"org.ly\0" +"org.mk\0sandnes.no\0" +"ayabe.kyoto.jp\0org.ml\0" +"office-on-the.net\0" +"minato.tokyo.jp\0org.mn\0" +"org.mo\0" +"koryo.nara.jp\0" +"org.na\0balsfjord.no\0" +"org.mu\0" +"hyuga.miyazaki.jp\0org.mv\0" +"perso.ht\0org.mw\0org.ng\0" +"org.mx\0" +"org.my\0" +"powiat.pl\0" +"kinokawa.wakayama.jp\0" +"shichinohe.aomori.jp\0" +"ru.com\0se.com\0" +"org.nr\0" +"environment.museum\0planetarium.museum\0" +"niigata.niigata.jp\0" +"name.hr\0" +"asago.hyogo.jp\0is-very-nice.org\0" +"hirata.fukushima.jp\0" +"sera.hiroshima.jp\0shizuoka.shizuoka.jp\0" +"nrw.museum\0" +"palace.museum\0" +"org.pa\0" +"cc.ak.us\0" +"wiki.br\0" +"shimotsuke.tochigi.jp\0org.pe\0press.se\0" +"org.pf\0" +"nishiizu.shizuoka.jp\0f.se\0" +"org.ph\0" +"is-a-llama.com\0" +"kamikawa.saitama.jp\0elblag.pl\0" +"kochi.jp\0gs.hm.no\0org.pk\0" +"org.pl\0" +"paleo.museum\0" +"org.pn\0" +"torsken.no\0" +"iwafune.tochigi.jp\0org.qa\0" +"org.pr\0" +"org.ps\0" +"bato.tochigi.jp\0org.pt\0" +"isumi.chiba.jp\0and\xc3\xb8y.no\0" +"tatsuno.nagano.jp\0org.py\0" +"pub.sa\0" +"portal.museum\0is-into-cartoons.com\0" +"sasayama.hyogo.jp\0" +"ibigawa.gifu.jp\0" +"uruma.okinawa.jp\0" +"orskog.no\0" +"cincinnati.museum\0" +"farmstead.museum\0" +"ftpaccess.cc\0" +"castres.museum\0org.ro\0" +"org.sa\0" +"sassari.it\0saka.hiroshima.jp\0org.sb\0" +"higashihiroshima.hiroshima.jp\0org.rs\0org.sc\0" +"org.sd\0" +"tokai.aichi.jp\0org.ru\0org.se\0" +"games.hu\0pn.it\0v\xc3\xa6r\xc3\xb8y.no\0" +"amsterdam.museum\0org.sg\0" +"campobasso.it\0org.sh\0" +"forli-cesena.it\0corvette.museum\0ath.cx\0" +"yokawa.hyogo.jp\0is-a-socialist.com\0" +"tjeldsund.no\0az.us\0" +"student.aero\0name.eg\0org.sl\0" +"l.bg\0sc.kr\0" +"org.sn\0" +"frankfurt.museum\0org.so\0" +"barcelona.museum\0from-wy.com\0" +"is-an-artist.com\0" +"dvrdns.org\0" +"ikata.ehime.jp\0" +"dr.na\0steinkjer.no\0org.st\0" +"yao.osaka.jp\0british.museum\0" +"grosseto.it\0gemological.museum\0lipetsk.ru\0" +"civilization.museum\0iron.museum\0org.sy\0" +"org.sz\0org.tj\0" +"tel\0" +"org.tm\0" +"honbetsu.hokkaido.jp\0minamioguni.kumamoto.jp\0org.tn\0" +"name.az\0ohira.miyagi.jp\0s\xc3\xb8ndre-land.no\0org.to\0" +"intl.tn\0" +"schlesisches.museum\0org.ua\0" +"cesenaforli.it\0" +"org.tt\0" +"org.tw\0org.ug\0" +"takehara.hiroshima.jp\0" +"bible.museum\0" +"narashino.chiba.jp\0" +"tsubame.niigata.jp\0hinohara.tokyo.jp\0" +"minamiawaji.hyogo.jp\0" +"is-into-anime.com\0" +"press.ma\0" +"nishihara.okinawa.jp\0" +"kita.osaka.jp\0kazo.saitama.jp\0org.vc\0" +"tagami.niigata.jp\0org.ve\0" +"lebork.pl\0" +"chuo.osaka.jp\0" +"kashiwa.chiba.jp\0turen.tn\0org.uy\0org.vi\0" +"flakstad.no\0org.uz\0isa-hockeynut.com\0" +"kyuragi.saga.jp\0" +"ichikai.tochigi.jp\0" +"aoste.it\0" +"org.vn\0" +"mishima.fukushima.jp\0" +"funagata.yamagata.jp\0" +"from-ms.com\0from-nc.com\0" +"psc.br\0" +"gorlice.pl\0" +"nl.ca\0chippubetsu.hokkaido.jp\0tone.ibaraki.jp\0i.ph\0" +"etajima.hiroshima.jp\0" +"uji.kyoto.jp\0sakai.osaka.jp\0la.us\0" +"aukra.no\0stranda.no\0stryn.no\0org.ws\0" +"tromsa.no\0" +"ind.br\0yoichi.hokkaido.jp\0" +"sayama.osaka.jp\0usenet.pl\0" +"amusement.aero\0maniwa.okayama.jp\0" +"katowice.pl\0is-a-nascarfan.com\0" +"okawa.kochi.jp\0" +"tomisato.chiba.jp\0cadaques.museum\0cc.dc.us\0" +"space.museum\0" +"afjord.no\0" +"oharu.aichi.jp\0" +"koriyama.fukushima.jp\0" +"il.us\0" +"n\xc3\xa1vuotna.no\0" +"satx.museum\0" +"misato.akita.jp\0" +"katsuragi.wakayama.jp\0history.museum\0" +"pharmacien.fr\0rieti.it\0" +"assassination.museum\0" +"j\xc3\xb8rpeland.no\0r\xc3\xb8yken.no\0" +"i.se\0" +"miyoshi.hiroshima.jp\0" +"computer.museum\0" +"tsubata.ishikawa.jp\0" +"kawakita.ishikawa.jp\0for-the.biz\0" +"fortworth.museum\0" +"akita.akita.jp\0storfjord.no\0" +"b\xc3\xa1hccavuotna.no\0" +"andebu.no\0" +"taketomi.okinawa.jp\0" +"isshiki.aichi.jp\0" +"taiji.wakayama.jp\0" +"haebaru.okinawa.jp\0" +"dell-ogliastra.it\0historichouses.museum\0trogstad.no\0" +"tx.us\0k12.pa.us\0" +"lib.ks.us\0" +"kherson.ua\0" +"uonuma.niigata.jp\0" +"bifuka.hokkaido.jp\0kouhoku.saga.jp\0luster.no\0" +"gotsu.shimane.jp\0r\xc3\xb8""d\xc3\xb8y.no\0" +"skiptvet.no\0" +"press.aero\0" +"sc.ug\0" +"sc.tz\0" +"hekinan.aichi.jp\0kariya.aichi.jp\0kounosu.saitama.jp\0quebec.museum\0" +"ind.gt\0kuromatsunai.hokkaido.jp\0" +"money.museum\0" +"historical.museum\0sc.us\0k12.mn.us\0" +"o.bg\0" +"chesapeakebay.museum\0ringerike.no\0" +"fst.br\0shitara.aichi.jp\0" +"urn.arpa\0" +"homelinux.org\0" +"ina.nagano.jp\0" +"its.me\0" +"kawakami.nagano.jp\0miyada.nagano.jp\0" +"ishikari.hokkaido.jp\0" +"national.museum\0" +"imabari.ehime.jp\0" +"akaiwa.okayama.jp\0rhcloud.com\0" +"kamaishi.iwate.jp\0" +"joyo.kyoto.jp\0" +"ind.in\0school.na\0" +"kiso.nagano.jp\0sevastopol.ua\0" +"shimoichi.nara.jp\0loten.no\0" +"selfip.net\0" +"a\xc3\xa9roport.ci\0ascoli-piceno.it\0" +"nuremberg.museum\0" +"otaki.saitama.jp\0chuvashia.ru\0defense.tn\0" +"mibu.tochigi.jp\0mitaka.tokyo.jp\0" +"odo.br\0" +"koori.fukushima.jp\0" +"omuta.fukuoka.jp\0med.pro\0" +"tomioka.gunma.jp\0kitakata.miyazaki.jp\0arteducation.museum\0" +"yamatotakada.nara.jp\0" +"brunel.museum\0" +"vik.no\0" +"sf.no\0" +"is-a-designer.com\0" +"perso.sn\0" +"lg.jp\0" +"hayashima.okayama.jp\0name.vn\0" +"gangwon.kr\0" +"atlanta.museum\0" +"coop.ht\0" +"veterinaire.km\0" +"gda.pl\0cc.wa.us\0" +"qsl.br\0mitsue.nara.jp\0" +"oumu.hokkaido.jp\0" +"zarow.pl\0" +"kisarazu.chiba.jp\0" +"perso.tn\0" +"ono.fukushima.jp\0" +"tas.au\0nordre-land.no\0" +"kanagawa.jp\0" +"pasadena.museum\0" +"uto.kumamoto.jp\0" +"sport.hu\0" +"yamatokoriyama.nara.jp\0stj\xc3\xb8rdal.no\0name.tj\0" +"nishigo.fukushima.jp\0" +"nikko.tochigi.jp\0" +"tsushima.nagasaki.jp\0" +"palmsprings.museum\0" +"coop.br\0yaroslavl.ru\0" +"meldal.no\0" +"takasago.hyogo.jp\0" +"name.tt\0" +"nl.no\0" +"webhop.net\0" +"nic.im\0sayama.saitama.jp\0" +"nic.in\0" +"tomakomai.hokkaido.jp\0" +"agano.niigata.jp\0" +"\xd9\x85\xd8\xb5\xd8\xb1\0go.dyndns.org\0" +"savona.it\0" +"kodaira.tokyo.jp\0" +"qld.gov.au\0" +"kashiwara.osaka.jp\0l.se\0" +"veterinaire.fr\0" +"university.museum\0" +"haugesund.no\0" +"hokuto.yamanashi.jp\0" +"lib.ok.us\0" +"pesarourbino.it\0n\xc3\xb8tter\xc3\xb8y.no\0" +"2000.hu\0froya.no\0" +"genova.it\0saskatchewan.museum\0" +"isleofman.museum\0" +"video.hu\0smolensk.ru\0" +"taira.toyama.jp\0" +"masfjorden.no\0" +"jessheim.no\0" +"science.museum\0" +"cc.or.us\0from-pa.com\0" +"muroran.hokkaido.jp\0" +"bs.it\0ube.yamaguchi.jp\0" +"si.it\0" +"catering.aero\0esashi.hokkaido.jp\0newmexico.museum\0tana.no\0" +"opole.pl\0" +"iruma.saitama.jp\0" +"hiroo.hokkaido.jp\0ogawa.ibaraki.jp\0rv.ua\0" +"nakatsugawa.gifu.jp\0\xc3\xa1k\xc5\x8boluokta.no\0" +"naie.hokkaido.jp\0kvinnherad.no\0" +"pilot.aero\0ws.na\0" +"yahaba.iwate.jp\0" +"birthplace.museum\0" +"name.qa\0" +"tahara.aichi.jp\0hashikami.aomori.jp\0name.pr\0" +"filatelia.museum\0" +"pt.it\0" +"chattanooga.museum\0" +"*.yokohama.jp\0" +"k12.mo.us\0" +"r.bg\0yugawara.kanagawa.jp\0" +"geometre-expert.fr\0koka.shiga.jp\0fundacio.museum\0hamar.no\0" +"yamanouchi.nagano.jp\0\xc3\xa5lesund.no\0" +"name.na\0" +"village.museum\0" +"shinkamigoto.nagasaki.jp\0name.mv\0" +"orkanger.no\0" +"mikasa.hokkaido.jp\0name.my\0balestrand.no\0kr\xc3\xa5""anghke.no\0" +"no.it\0pesaro-urbino.it\0" +"kamikawa.hyogo.jp\0" +"\xd8\xa8\xda\xbe\xd8\xa7\xd8\xb1\xd8\xaa\0" +"botany.museum\0" +"cc.na\0" +"ntr.br\0sango.nara.jp\0masuda.shimane.jp\0" +"ind.tn\0" +"trondheim.no\0" +"fermo.it\0kagamino.okayama.jp\0odda.no\0" +"askvoll.no\0" +"tottori.tottori.jp\0bronnoysund.no\0" +"ena.gifu.jp\0" +"\xd9\x81\xd9\x84\xd8\xb3\xd8\xb7\xd9\x8a\xd9\x86\0" +"evenes.no\0" +"shiriuchi.hokkaido.jp\0hino.tokyo.jp\0lib.vi.us\0" +"iide.yamagata.jp\0" +"sande.m\xc3\xb8re-og-romsdal.no\0" +"shibata.niigata.jp\0botanicgarden.museum\0lg.ua\0" +"\xc3\xa5s.no\0" +"namegata.ibaraki.jp\0" +"architecture.museum\0fineart.museum\0ostrowwlkp.pl\0" +"sorreisa.no\0" +"psi.br\0cc.vt.us\0" +"barrel-of-knowledge.info\0" +"kunitomi.miyazaki.jp\0name.mk\0" +"stor-elvdal.no\0uy.com\0" +"bonn.museum\0budejju.no\0rnu.tn\0" +"chiyoda.gunma.jp\0" +"yoro.gifu.jp\0" +"yasu.shiga.jp\0" +"amagasaki.hyogo.jp\0" +"m\xc3\xa1tta-v\xc3\xa1rjjat.no\0" +"jur.pro\0" +"mukawa.hokkaido.jp\0narviika.no\0" +"name.jo\0" +"marburg.museum\0tysv\xc3\xa6r.no\0" +"lorenskog.no\0" +"aland.fi\0yonezawa.yamagata.jp\0" +"gyeongnam.kr\0" +"maebashi.gunma.jp\0" +"tateshina.nagano.jp\0" +"yamato.kanagawa.jp\0dyndns.info\0" +"mosvik.no\0" +"crimea.ua\0" +"laakesvuemie.no\0" +"her\xc3\xb8y.m\xc3\xb8re-og-romsdal.no\0" +"embetsu.hokkaido.jp\0chiyoda.tokyo.jp\0kudamatsu.yamaguchi.jp\0gop.pk\0nic.tj\0" +"yalta.ua\0" +"oregon.museum\0" +"naples.it\0ginan.gifu.jp\0o.se\0" +"va.it\0tamayu.shimane.jp\0" +"ninomiya.kanagawa.jp\0" +"orenburg.ru\0" +"academy.museum\0" +"miyakonojo.miyazaki.jp\0appspot.com\0" +"moma.museum\0" +"lib.nv.us\0readmyblog.org\0" +"wake.okayama.jp\0" +"kusu.oita.jp\0ing.pa\0" +"blogdns.org\0" +"is-a-doctor.com\0" +"london.museum\0" +"group.aero\0fukumitsu.toyama.jp\0" +"osaki.miyagi.jp\0" +"is-a-techie.com\0" +"!nel.uk\0" +"otake.hiroshima.jp\0shinonsen.hyogo.jp\0" +"oshima.yamaguchi.jp\0mari-el.ru\0" +"obu.aichi.jp\0" +"bykle.no\0" +"yasuoka.nagano.jp\0" +"gs.cn\0" +"\xd8\xa7\xd9\x84\xd8\xa7\xd8\xb1\xd8\xaf\xd9\x86\0" +"chuo.fukuoka.jp\0" +"aero.tt\0" +"tokai.ibaraki.jp\0" +"nsw.edu.au\0" +"suzu.ishikawa.jp\0kitagawa.miyazaki.jp\0" +"kawaminami.miyazaki.jp\0aisho.shiga.jp\0gs.tr.no\0" +"bungotakada.oita.jp\0" +"center.museum\0maritime.museum\0timekeeping.museum\0" +"u.bg\0ecn.br\0" +"yamal.ru\0" +"aero.mv\0" +"botanical.museum\0at-band-camp.net\0" +"isa.us\0" +"kasumigaura.ibaraki.jp\0" +"ogawa.nagano.jp\0oppegard.no\0" +"avellino.it\0" +"samukawa.kanagawa.jp\0nat.tn\0" +"b\xc3\xb8mlo.no\0" +"gov.ac\0asso.fr\0" +"gov.ae\0konan.aichi.jp\0" +"gov.af\0" +"research.aero\0omitama.ibaraki.jp\0kita.tokyo.jp\0va.no\0" +"okaya.nagano.jp\0" +"zhitomir.ua\0" +"communication.museum\0" +"gov.al\0" +"kanra.gunma.jp\0kamisu.ibaraki.jp\0googlecode.com\0" +"sandefjord.no\0astrakhan.ru\0kamchatka.ru\0" +"gov.ba\0asso.gp\0" +"gov.bb\0" +"gov.as\0" +"okinawa.okinawa.jp\0" +"gov.au\0" +"gov.bf\0" +"gov.bh\0" +"gov.az\0bv.nl\0" +"pisa.it\0showa.yamanashi.jp\0" +"kawajima.saitama.jp\0uw.gov.pl\0" +"gov.bm\0" +"kunimi.fukushima.jp\0" +"gov.bo\0vologda.ru\0servebbs.net\0" +"lib.ut.us\0" +"gov.br\0naval.museum\0" +"gov.bs\0" +"gov.bt\0gov.cd\0minakami.gunma.jp\0" +"asso.ht\0ovre-eiker.no\0coop.tt\0" +"nt.edu.au\0mat.br\0" +"gov.by\0bale.museum\0" +"gov.bz\0cc.ga.us\0" +"aga.niigata.jp\0" +"gov.cl\0fredrikstad.no\0" +"gov.cm\0" +"gov.cn\0bushey.museum\0" +"gov.co\0" +"nu.ca\0" +"kamiamakusa.kumamoto.jp\0" +"aa.no\0" +"gov.cu\0" +"omachi.saga.jp\0k12.wy.us\0lib.ca.us\0" +"coop.mv\0" +"gov.cx\0coop.mw\0" +"asso.bj\0venezia.it\0windmill.museum\0" +"ac\0likes-pie.com\0" +"ad\0gov.dm\0kepno.pl\0" +"ae\0" +"af\0gov.do\0" +"aerodrome.aero\0ag\0" +"ai\0" +"gov.ec\0" +"milano.it\0" +"al\0gov.ee\0oguni.kumamoto.jp\0" +"am\0" +"an\0gov.eg\0" +"ao\0" +"kumiyama.kyoto.jp\0" +"aq\0ba\0asso.ci\0gov.dz\0hidaka.hokkaido.jp\0" +"bb\0hongo.hiroshima.jp\0shishikui.tokushima.jp\0" +"as\0blogdns.com\0" +"at\0" +"be\0idv.hk\0" +"agents.aero\0bf\0" +"aw\0bg\0notteroy.no\0" +"ax\0bh\0" +"bi\0" +"az\0bj\0" +"higashiizu.shizuoka.jp\0" +"bm\0norilsk.ru\0" +"bo\0" +"gos.pk\0" +"ca\0yawatahama.ehime.jp\0" +"br\0" +"bs\0cc\0chiropractic.museum\0" +"bt\0cd\0\xe7\xae\x87\xe4\xba\xba.hk\0en.it\0clock.museum\0r.se\0" +"cf\0" +"bw\0cg\0kobayashi.miyazaki.jp\0aurskog-h\xc3\xb8land.no\0valer.hedmark.no\0" +"ch\0" +"by\0ci\0" +"gv.ao\0bz\0" +"osakasayama.osaka.jp\0wv.us\0" +"cl\0gov.ge\0tozsde.hu\0nakagyo.kyoto.jp\0homeftp.org\0" +"cm\0" +"cn\0gov.gg\0bus.museum\0" +"gv.at\0co\0gov.gh\0" +"consultant.aero\0gov.gi\0kahoku.ishikawa.jp\0" +"shobara.hiroshima.jp\0coop.py\0" +"cr\0asso.dz\0" +"cu\0de\0gov.gn\0getmyip.com\0" +"cv\0" +"kasai.hyogo.jp\0amur.ru\0" +"cx\0" +"gov.gr\0" +"cz\0dj\0" +"dk\0ci.it\0" +"so.it\0" +"express.aero\0dm\0" +"do\0tomigusuku.okinawa.jp\0" +"oseto.nagasaki.jp\0" +"gov.hk\0va.us\0" +"ec\0" +"izumozaki.niigata.jp\0" +"ee\0" +"principe.st\0" +"eg\0" +"is-a-bookkeeper.com\0" +"dz\0" +"gov.ie\0" +"showa.fukushima.jp\0" +"noboribetsu.hokkaido.jp\0tourism.tn\0cc.ms.us\0cc.nc.us\0" +"es\0pz.it\0" +"gov.im\0" +"eu\0gov.in\0coop.km\0!british-library.uk\0\xd8\xa7\xdb\x8c\xd8\xb1\xd8\xa7\xd9\x86\0" +"artcenter.museum\0" +"suwa.nagano.jp\0" +"gov.iq\0nationalfirearms.museum\0lubin.pl\0" +"fi\0gov.ir\0aver\xc3\xb8y.no\0" +"x.bg\0gov.is\0" +"gov.it\0" +"radio.br\0gov.je\0sasebo.nagasaki.jp\0" +"fm\0monzaedellabrianza.it\0" +"ad.jp\0" +"fo\0" +"ga\0" +"fr\0" +"from-nj.com\0" +"gd\0" +"ge\0" +"gf\0gov.jo\0" +"gg\0" +"gh\0eiheiji.fukui.jp\0shintomi.miyazaki.jp\0odesa.ua\0" +"gi\0gifu.jp\0rockart.museum\0homeunix.com\0" +"nu.it\0" +"gl\0" +"gm\0publ.pt\0forgot.his.name\0" +"gov.kg\0" +"gp\0gov.ki\0karmoy.no\0" +"gq\0kr\xc3\xb8""dsherad.no\0" +"far.br\0gr\0roma.museum\0endofinternet.net\0" +"gs\0" +"gt\0gov.km\0inder\xc3\xb8y.no\0" +"nakama.fukuoka.jp\0gov.kn\0kvanangen.no\0" +"gw\0taiki.hokkaido.jp\0gov.kp\0" +"gov.la\0" +"gy\0haga.tochigi.jp\0gov.lb\0" +"gobo.wakayama.jp\0gov.lc\0" +"hk\0" +"natori.miyagi.jp\0" +"hm\0crotone.it\0snillfjord.no\0" +"hn\0" +"chiryu.aichi.jp\0gov.ky\0" +"gov.kz\0" +"hr\0gov.lk\0" +"ht\0id\0" +"hu\0ie\0nanbu.yamanashi.jp\0nesseby.no\0" +"ono.fukui.jp\0" +"vikna.no\0" +"gov.ma\0bashkiria.ru\0" +"gov.lr\0" +"niihama.ehime.jp\0" +"gov.lt\0" +"gov.me\0" +"im\0shonai.fukuoka.jp\0gov.lv\0" +"in\0gov.mg\0gorge.museum\0dyndns.org\0" +"io\0" +"gov.ly\0" +"iq\0" +"ir\0campidanomedio.it\0nichinan.miyazaki.jp\0gov.mk\0" +"is\0minamitane.kagoshima.jp\0gov.ml\0" +"it\0" +"je\0gov.mn\0" +"gov.mo\0" +"*.nagoya.jp\0" +"gov.mr\0est.pr\0" +"kinko.kagoshima.jp\0" +"gov.mu\0dudinka.ru\0" +"kouyama.kagoshima.jp\0gov.mv\0rnrt.tn\0" +"gov.mw\0gov.ng\0swiebodzin.pl\0" +"jo\0" +"jp\0gov.my\0" +"columbia.museum\0" +"udono.mie.jp\0" +"nx.cn\0oristano.it\0" +"kg\0" +"ki\0bygland.no\0gov.nr\0" +"toyoura.hokkaido.jp\0" +"\xe6\x94\xbf\xe5\xba\x9c.hk\0" +"taishi.hyogo.jp\0km\0" +"miyako.iwate.jp\0kn\0" +"hamatama.saga.jp\0" +"la\0stavropol.ru\0" +"kr\0" +"lc\0" +"cn.com\0" +"tarumizu.kagoshima.jp\0" +"ky\0li\0" +"kz\0" +"lk\0" +"tver.ru\0" +"uvic.museum\0" +"gov.ph\0" +"lyngen.no\0" +"koto.tokyo.jp\0ma\0cc.az.us\0" +"sannan.hyogo.jp\0gov.pk\0sells-it.net\0" +"ls\0mc\0gov.pl\0" +"lt\0md\0" +"lu\0me\0gov.pn\0" +"lv\0meland.no\0u.se\0servegame.org\0" +"mg\0" +"mh\0other.nf\0gov.qa\0" +"ly\0gov.pr\0" +"gov.ps\0" +"\xe7\xbb\x84\xe7\xbb\x87.hk\0nishio.aichi.jp\0mk\0gov.pt\0" +"ml\0miasta.pl\0" +"iwamizawa.hokkaido.jp\0ikeda.osaka.jp\0sejny.pl\0wy.us\0" +"kesennuma.miyagi.jp\0mn\0" +"mo\0" +"mp\0gov.py\0" +"mq\0na\0" +"mr\0selfip.org\0" +"tsuruoka.yamagata.jp\0ms\0touch.museum\0nc\0" +"matsumoto.kagoshima.jp\0mu\0ne\0" +"lecce.it\0wassamu.hokkaido.jp\0mv\0nf\0" +"hirono.fukushima.jp\0mw\0" +"mx\0" +"my\0" +"hamamatsu.shizuoka.jp\0" +"rikubetsu.hokkaido.jp\0jamal.ru\0" +"nl\0nieruchomosci.pl\0" +"cl.it\0hisayama.fukuoka.jp\0minami.kyoto.jp\0arai.shizuoka.jp\0" +"sr.it\0kikonai.hokkaido.jp\0" +"no\0" +"yakumo.hokkaido.jp\0" +"keisen.fukuoka.jp\0idv.tw\0" +"nr\0" +"b\xc3\xa5""d\xc3\xa5""ddj\xc3\xa5.no\0" +"ut.us\0" +"nu\0" +"gov.sa\0" +"gov.sb\0" +"gov.rs\0gov.sc\0" +"hi.cn\0gov.sd\0" +"orkdal.no\0gov.ru\0" +"fuoisku.no\0" +"shiraoka.saitama.jp\0building.museum\0gov.rw\0gov.sg\0" +"gov.sh\0" +"co.ae\0aeroclub.aero\0" +"pa\0" +"co.ag\0" +"gov.sl\0" +"ag.it\0higashi.okinawa.jp\0lancashire.museum\0" +"pe\0" +"pf\0" +"oygarden.no\0" +"!siemens.om\0ph\0" +"aikawa.kanagawa.jp\0" +"co.ao\0tempioolbia.it\0" +"lierne.no\0pk\0gov.st\0" +"co.ba\0force.museum\0pl\0" +"pm\0asso.re\0" +"pn\0" +"co.at\0dep.no\0irkutsk.ru\0gov.sx\0" +"gov.sy\0" +"qa\0gov.tj\0" +"pr\0" +"historyofscience.museum\0ps\0gov.tl\0" +"co.bi\0pt\0gov.tm\0" +"higashinaruse.akita.jp\0madrid.museum\0gov.tn\0" +"gov.to\0\xe0\xb9\x84\xe0\xb8\x97\xe0\xb8\xa2\0" +"pw\0cc.la.us\0" +"tarui.gifu.jp\0gov.ua\0" +"py\0" +"kyotango.kyoto.jp\0gov.tt\0" +"tourism.pl\0co.ca\0" +"leirfjord.no\0" +"gov.tw\0" +"tenkawa.nara.jp\0" +"minowa.nagano.jp\0" +"co.bw\0takazaki.miyazaki.jp\0ullensvang.no\0" +"andoy.no\0" +"co.ci\0" +"finland.museum\0tysnes.no\0re\0" +"e12.ve\0" +"co.cl\0austevoll.no\0wolomin.pl\0" +"kunstunddesign.museum\0" +"k\xc3\xa5""fjord.no\0gov.vc\0" +"gov.ve\0" +"co.cr\0kasuga.fukuoka.jp\0" +"iris.arpa\0cc.il.us\0" +"latina.it\0copenhagen.museum\0ro\0" +"sa\0" +"sb\0" +"mc.it\0um.gov.pl\0rs\0sc\0" +"futtsu.chiba.jp\0incheon.kr\0sd\0" +"ru\0se\0gov.vn\0" +"oppeg\xc3\xa5rd.no\0" +"rw\0sg\0" +"sh\0" +"cnt.br\0harima.hyogo.jp\0si\0" +"1.bg\0" +"sk\0" +"sl\0" +"sm\0" +"plaza.museum\0sn\0" +"so\0" +"sr\0" +"tc\0" +"st\0td\0" +"su\0" +"tf\0" +"nishiawakura.okayama.jp\0tg\0" +"sx\0th\0" +"unbi.ba\0sumita.iwate.jp\0forsand.no\0sy\0" +"sz\0tj\0gov.ws\0" +"asso.nc\0tk\0" +"artgallery.museum\0tl\0" +"tm\0" +"tn\0" +"toda.saitama.jp\0to\0" +"for-some.biz\0" +"ua\0" +"yatsushiro.kumamoto.jp\0" +"!rakpetroleum.om\0tt\0" +"taishin.fukushima.jp\0beeldengeluid.museum\0" +"hellas.museum\0tv\0gr.com\0" +"fujimi.nagano.jp\0tw\0ug\0" +"rennesoy.no\0" +"asahi.nagano.jp\0" +"ogano.saitama.jp\0mjondalen.no\0loabat.no\0cc.tx.us\0" +"kikuchi.kumamoto.jp\0gniezno.pl\0" +"iwaizumi.iwate.jp\0" +"va\0" +"co.gg\0" +"nesset.no\0us\0vc\0" +"parma.it\0hasama.oita.jp\0b\xc3\xa1l\xc3\xa1t.no\0ve\0" +"kashima.ibaraki.jp\0vg\0" +"k12.ut.us\0" +"uy\0vi\0" +"monza-e-della-brianza.it\0ebina.kanagawa.jp\0uz\0" +"kosa.kumamoto.jp\0nagi.okayama.jp\0" +"yomitan.okinawa.jp\0" +"vn\0" +"ouda.nara.jp\0" +"ogliastra.it\0" +"co.gy\0cc.sc.us\0" +"vu\0" +"wf\0" +"webhop.biz\0" +"x.se\0" +"farm.museum\0" +"nord-fron.no\0" +"co.id\0" +"mil.ac\0co.hu\0" +"suzuka.mie.jp\0sigdal.no\0" +"mil.ae\0" +"forde.no\0ws\0" +"ivgu.no\0" +"co.im\0" +"mil.al\0co.in\0uchiko.ehime.jp\0mer\xc3\xa5ker.no\0s\xc3\xb8rum.no\0" +"vibo-valentia.it\0" +"nango.fukushima.jp\0" +"co.ir\0" +"mil.ba\0\xc3\xa5mot.no\0" +"co.it\0" +"te.it\0co.je\0" +"ostre-toten.no\0" +"engineer.aero\0kumamoto.jp\0nativeamerican.museum\0" +"miyama.mie.jp\0" +"mil.az\0nagawa.nagano.jp\0" +"eng.pro\0" +"co.jp\0" +"mil.bo\0" +"hl.cn\0" +"sk\xc3\xa1nit.no\0" +"mil.br\0uda.nara.jp\0" +"pvt.k12.ma.us\0" +"medio-campidano.it\0columbus.museum\0" +"sakaiminato.tottori.jp\0yt\0" +"asso.km\0" +"mil.by\0higashiyodogawa.osaka.jp\0nanbu.tottori.jp\0" +"intelligence.museum\0" +"mil.cl\0aioi.hyogo.jp\0" +"mil.cn\0" +"mil.co\0levanger.no\0" +"co.kr\0" +"co.lc\0from-wi.com\0" +"kawai.iwate.jp\0" +"b\xc3\xb8.telemark.no\0" +"tsurugi.ishikawa.jp\0" +"flekkefjord.no\0" +"furniture.museum\0newyork.museum\0" +"asso.mc\0" +"mil.do\0co.ma\0" +"nagara.chiba.jp\0co.ls\0" +"mil.ec\0bolt.hu\0co.me\0" +"uhren.museum\0" +"joso.ibaraki.jp\0niyodogawa.kochi.jp\0gs.sf.no\0" +"mil.eg\0" +"lib.il.us\0" +"umaji.kochi.jp\0kurashiki.okayama.jp\0" +"kakinoki.shimane.jp\0oishida.yamagata.jp\0" +"bearalv\xc3\xa1hki.no\0sokndal.no\0" +"wa.gov.au\0sx.cn\0co.na\0" +"art.museum\0" +"mo-i-rana.no\0" +"co.mu\0" +"co.mw\0" +"design.aero\0" +"vadso.no\0" +"am.br\0" +"co.nl\0" +"hidaka.kochi.jp\0" +"tokushima.jp\0communications.museum\0" +"co.no\0" +"oh.us\0blogdns.net\0" +"4.bg\0nord-odal.no\0" +"kumamoto.kumamoto.jp\0" +"altoadige.it\0koto.shiga.jp\0" +"yasaka.nagano.jp\0" +"mil.ge\0" +"jaworzno.pl\0" +"saito.miyazaki.jp\0" +"mil.gh\0toyoake.aichi.jp\0" +"mombetsu.hokkaido.jp\0" +"fauske.no\0" +"nishi.fukuoka.jp\0alaska.museum\0" +"marnardal.no\0" +"on.ca\0" +"higashikurume.tokyo.jp\0" +"gs.nl.no\0" +"mil.gt\0reggioemilia.it\0r\xc3\xb8st.no\0" +"fnd.br\0bjark\xc3\xb8y.no\0l\xc3\xa6rdal.no\0tromso.no\0krakow.pl\0" +"takahashi.okayama.jp\0hasvik.no\0" +"co.pl\0" +"zt.ua\0" +"katsuyama.fukui.jp\0co.pn\0homeftp.net\0" +"mil.hn\0fuchu.tokyo.jp\0omaha.museum\0" +"date.hokkaido.jp\0shimokawa.hokkaido.jp\0" +"tyumen.ru\0" +"mil.id\0philadelphiaarea.museum\0sanfrancisco.museum\0" +"honjo.akita.jp\0living.museum\0co.pw\0" +"beiarn.no\0" +"ullensaker.no\0" +"tozawa.yamagata.jp\0" +"aya.miyazaki.jp\0uk.net\0" +"sklep.pl\0" +"hokuto.hokkaido.jp\0" +"mil.in\0" +"tsaritsyn.ru\0" +"mil.iq\0" +"minami.fukuoka.jp\0" +"naklo.pl\0" +"susaki.kochi.jp\0" +"karatsu.saga.jp\0" +"fg.it\0badajoz.museum\0" +"for-better.biz\0" +"mil.jo\0" +"midsund.no\0co.rs\0" +"shimane.shimane.jp\0" +"hi.us\0" +"d\xc3\xb8nna.no\0" +"york.museum\0spydeberg.no\0co.rw\0" +"hamatonbetsu.hokkaido.jp\0" +"mil.kg\0" +"!nic.ar\0kagami.kochi.jp\0dynalias.com\0" +"civilaviation.aero\0modelling.aero\0uz.ua\0" +"nanao.ishikawa.jp\0" +"mil.km\0" +"modum.no\0" +"badaddja.no\0" +"mil.kr\0co.st\0" +"oi.kanagawa.jp\0" +"author.aero\0cr.it\0" +"co.th\0" +"versailles.museum\0co.sz\0co.tj\0" +"encyclopedic.museum\0" +"mil.kz\0grong.no\0" +"co.tm\0" +"minamiboso.chiba.jp\0lib.ma.us\0servebbs.org\0" +"kiev.ua\0" +"journalist.aero\0co.ua\0" +"te.ua\0" +"co.tt\0" +"co.ug\0" +"mil.lv\0" +"mil.mg\0" +"co.tz\0" +"council.aero\0ibaraki.jp\0" +"family.museum\0" +"rc.it\0" +"hl.no\0ostrowiec.pl\0co.us\0" +"!statecouncil.om\0co.ve\0" +"!congresodelalengua3.ar\0nalchik.ru\0" +"mil.mv\0halsa.no\0" +"co.vi\0" +"takayama.gifu.jp\0fujishiro.ibaraki.jp\0os.hordaland.no\0sirdal.no\0co.uz\0" +"fj.cn\0mil.my\0" +"kazuno.akita.jp\0" +"unzen.nagasaki.jp\0mizuho.tokyo.jp\0indianapolis.museum\0" +"from-id.com\0" +"hurum.no\0" +"mil.no\0" +"pordenone.it\0" +"kvam.no\0" +"mutsuzawa.chiba.jp\0artdeco.museum\0" +"hamada.shimane.jp\0philadelphia.museum\0" +"kudoyama.wakayama.jp\0" +"mishima.shizuoka.jp\0minami-alps.yamanashi.jp\0k12.mi.us\0" +"nanmoku.gunma.jp\0" +"ashikaga.tochigi.jp\0" +"from-wv.com\0" +"\xe5\x8f\xb0\xe6\xb9\xbe\0" +"kawatana.nagasaki.jp\0" +"oslo.no\0" +"fukuchiyama.kyoto.jp\0" +"kisofukushima.nagano.jp\0" +"okayama.jp\0mil.pe\0" +"mil.ph\0" +"mi.it\0" +"russia.museum\0" +"abo.pa\0mil.pl\0" +"nobeoka.miyazaki.jp\0shinjuku.tokyo.jp\0" +"ok.us\0" +"7.bg\0mil.qa\0" +"verran.no\0suwalki.pl\0" +"onjuku.chiba.jp\0szczytno.pl\0lv.ua\0" +"mitou.yamaguchi.jp\0mil.py\0" +"chita.ru\0" +"hirono.iwate.jp\0" +"embroidery.museum\0" +"mad.museum\0" +"kawaue.gifu.jp\0" +"shiiba.miyazaki.jp\0" +"asnes.no\0" +"media.hu\0sande.vestfold.no\0\xd8\xb9\xd9\x85\xd8\xa7\xd9\x86\0" +"lib.de.us\0" +"erotika.hu\0ski.museum\0" +"parti.se\0on-the-web.tv\0" +"works.aero\0gb.com\0dyndns-free.com\0" +"biz.bb\0firm.ht\0rifu.miyagi.jp\0watari.miyagi.jp\0" +"takagi.nagano.jp\0biz.at\0" +"surgeonshall.museum\0skanit.no\0" +"florida.museum\0" +"kani.gifu.jp\0" +"biz.az\0mil.ru\0" +"isesaki.gunma.jp\0" +"firm.in\0yusui.kagoshima.jp\0mil.rw\0" +"mil.sh\0" +"inderoy.no\0" +"software.aero\0kushiro.hokkaido.jp\0pyatigorsk.ru\0" +"bindal.no\0" +"sakegawa.yamagata.jp\0" +"ninohe.iwate.jp\0yonago.tottori.jp\0" +"mil.st\0" +"galsa.no\0" +"mil.sy\0" +"salvadordali.museum\0mil.tj\0" +"mil.tm\0" +"for-our.info\0" +"shikama.miyagi.jp\0mil.to\0" +"yaotsu.gifu.jp\0" +"niki.hokkaido.jp\0" +"hikawa.shimane.jp\0stat.no\0" +"joetsu.niigata.jp\0mil.tw\0" +"firm.co\0bruxelles.museum\0endofinternet.org\0" +"asahi.mie.jp\0mil.tz\0" +"sor-varanger.no\0dynathome.net\0" +"skoczow.pl\0" +"shonai.yamagata.jp\0" +"stadt.museum\0" +"roma.it\0" +"shijonawate.osaka.jp\0" +"mil.vc\0" +"mil.ve\0" +"honai.ehime.jp\0" +"muko.kyoto.jp\0" +"karpacz.pl\0mil.uy\0us.com\0" +"k12.az.us\0" +"\xe6\x95\x99\xe8\x82\xb2.hk\0" +"monza-brianza.it\0shingo.aomori.jp\0toshima.tokyo.jp\0prochowice.pl\0" +"kuju.oita.jp\0cr.ua\0" +"eid.no\0" +"kyowa.hokkaido.jp\0" +"higashikagura.hokkaido.jp\0otari.nagano.jp\0kiyama.saga.jp\0" +"rochester.museum\0" +"fuchu.hiroshima.jp\0" +"hasuda.saitama.jp\0" +"ap.it\0" +"fm.br\0dagestan.ru\0" +"gs.va.no\0" +"shinshiro.aichi.jp\0lowicz.pl\0" +"taiwa.miyagi.jp\0yekaterinburg.ru\0" +"wielun.pl\0" +"geelvinck.museum\0" +"slattum.no\0" +"utsunomiya.tochigi.jp\0" +"bern.museum\0rivne.ua\0" +"miners.museum\0" +"com.ac\0kraanghke.no\0" +"pa.it\0davvenj\xc3\xa1rga.no\0" +"com.af\0tsushima.aichi.jp\0" +"com.ag\0asmatart.museum\0" +"com.ai\0" +"etnedal.no\0" +"com.al\0snaase.no\0media.pl\0" +"sula.no\0vanylven.no\0" +"com.an\0" +"torino.museum\0" +"helsinki.museum\0" +"com.ba\0" +"com.bb\0" +"kimitsu.chiba.jp\0" +"tarama.okinawa.jp\0" +"com.au\0" +"com.aw\0\xe4\xb8\xaa\xe4\xba\xba.hk\0aremark.no\0" +"com.bh\0vestre-slidre.no\0" +"com.bi\0goto.nagasaki.jp\0higashisumiyoshi.osaka.jp\0" +"com.az\0" +"rollag.no\0" +"bc.ca\0" +"com.bm\0oceanographique.museum\0" +"mesaverde.museum\0mi.th\0" +"com.bo\0gs.aa.no\0" +"jerusalem.museum\0" +"com.br\0is-a-green.com\0" +"com.bs\0nagasaki.jp\0" +"com.bt\0" +"nishiwaki.hyogo.jp\0" +"verbania.it\0takarazuka.hyogo.jp\0georgia.museum\0" +"com.by\0com.ci\0" +"com.bz\0uchinomi.kagawa.jp\0" +"ehime.jp\0" +"shinjo.nara.jp\0" +"com.cn\0shiki.saitama.jp\0" +"com.co\0cc.wv.us\0" +"xxx\0" +"tychy.pl\0nkz.ru\0" +"tobe.ehime.jp\0" +"strand.no\0" +"biz.ki\0ivanovo.ru\0" +"com.cu\0com.de\0" +"s\xc3\xa1l\xc3\xa1t.no\0" +"hichiso.gifu.jp\0nirasaki.yamanashi.jp\0flesberg.no\0" +"mi.us\0k12.il.us\0" +"jgora.pl\0sumy.ua\0" +"com.dm\0izumo.shimane.jp\0" +"com.do\0hiranai.aomori.jp\0" +"jor.br\0!city.sendai.jp\0" +"omaezaki.shizuoka.jp\0" +"turin.it\0nissedal.no\0skierva.no\0" +"com.ec\0" +"com.ee\0" +"cc.va.us\0" +"com.eg\0nagano.nagano.jp\0" +"halloffame.museum\0leka.no\0" +"com.dz\0morioka.iwate.jp\0" +"lesja.no\0" +"vibovalentia.it\0nishi.osaka.jp\0kg.kr\0" +"!city.kawasaki.jp\0flanders.museum\0" +"com.es\0florence.it\0" +"kumano.hiroshima.jp\0from-sd.com\0" +"mo.cn\0yamagata.nagano.jp\0!nic.tr\0" +"yamanashi.jp\0" +"is-with-theband.com\0" +"canada.museum\0" +"bardu.no\0tr\xc3\xb8gstad.no\0" +"fm.it\0biz.mv\0bialowieza.pl\0!nic.uk\0" +"com.fr\0vs.it\0kunohe.iwate.jp\0aoki.nagano.jp\0biz.mw\0" +"izumi.osaka.jp\0koeln.museum\0" +"gulen.no\0ruovat.no\0" +"agr.br\0com.ge\0nes.buskerud.no\0" +"fukudomi.saga.jp\0" +"dnsdojo.com\0" +"com.gh\0hitachi.ibaraki.jp\0selfip.biz\0" +"com.gi\0nakagawa.nagano.jp\0" +"biz.nr\0" +"com.gn\0nishiaizu.fukushima.jp\0" +"com.gp\0bearalvahki.no\0" +"m\xc3\xa5lselv.no\0kchr.ru\0" +"com.gr\0tosashimizu.kochi.jp\0" +"tas.gov.au\0nosegawa.nara.jp\0" +"com.gt\0kanan.osaka.jp\0oyer.no\0\xe0\xa4\xad\xe0\xa4\xbe\xe0\xa4\xb0\xe0\xa4\xa4\0" +"shinagawa.tokyo.jp\0" +"com.gy\0tn.it\0kyoto.jp\0kurume.fukuoka.jp\0" +"yk.ca\0" +"com.hk\0itako.ibaraki.jp\0" +"hammarfeasta.no\0" +"broker.aero\0com.hn\0shinshinotsu.hokkaido.jp\0" +"k12.ri.us\0" +"czeladz.pl\0" +"dovre.no\0" "com.hr\0" -"fg.it\0stathelle.no\0defense.tn\0" -"com.ht\0" -"qld.gov.au\0*.nz\0" -"davvenj\xc3\xa1rga.no\0*.om\0" -"vang.no\0" -"*.kumamoto.jp\0" -"vercelli.it\0usenet.pl\0" -"com.io\0stalbans.museum\0" -"com.iq\0" -"*.pg\0" -"com.is\0klabu.no\0skiptvet.no\0" -"med.ht\0field.museum\0" -"gr.it\0gj\xc3\xb8vik.no\0tromsa.no\0lib.mi.us\0" -"ca.na\0" -"hagebostad.no\0k12.ma.us\0" -"*.qa\0" -"*.niigata.jp\0" -"monzaebrianza.it\0com.jo\0comunica\xc3\xa7\xc3\xb5""es.museum\0" -"gr.jp\0" -"ballangen.no\0*.py\0" -"scienceandindustry.museum\0" -"nuoro.it\0com.kg\0" +"com.ht\0ebino.miyazaki.jp\0" +"celtic.museum\0" +"fujimi.saitama.jp\0biz.pk\0dyndns-at-home.com\0" +"asn.au\0biz.pl\0" +"kanzaki.saga.jp\0" +"nannestad.no\0" +"yachiyo.ibaraki.jp\0" +"kaizuka.osaka.jp\0r\xc3\xa5holt.no\0biz.pr\0is-into-games.com\0" +"\xe9\xa6\x99\xe6\xb8\xaf\0" +"com.io\0" +"ri.it\0komoro.nagano.jp\0" +"com.iq\0gyokuto.kumamoto.jp\0googleapis.com\0" +"com.is\0" +"issmarterthanyou.com\0" +"de.us\0" +"castle.museum\0!parliament.uk\0" +"shimodate.ibaraki.jp\0" +"g\xc3\xa1ivuotna.no\0" +"kviteseid.no\0" +"yabu.hyogo.jp\0naamesjevuemie.no\0" +"com.jo\0science-fiction.museum\0zaporizhzhe.ua\0" +"tanabe.kyoto.jp\0" +"aejrie.no\0" +"sakae.nagano.jp\0is-a-nurse.com\0" +"moriguchi.osaka.jp\0stjordalshalsen.no\0" +"pd.it\0ot.it\0com.kg\0tokke.no\0" "com.ki\0" -"im.it\0idv.tw\0" -"*.akita.jp\0com.km\0r\xc3\xb8ros.no\0sopot.pl\0" -"!pref.yamanashi.jp\0" +"bibai.hokkaido.jp\0tsk.ru\0" +"fm.no\0" +"com.km\0kirovograd.ua\0" +"b.bg\0tomi.nagano.jp\0" "com.kp\0" -"!pref.kochi.jp\0com.la\0" +"ballooning.aero\0com.la\0" "com.lb\0" -"com.lc\0stjordalshalsen.no\0sigdal.no\0cc.nm.us\0" -"samnanger.no\0" -"drobak.no\0" -"vt.it\0" -"catering.aero\0com.ky\0" -"com.kz\0cc.ca.us\0" -"com.lk\0" -"grosseto.it\0mosvik.no\0" -"namsskogan.no\0" -"loten.no\0" -"chirurgiens-dentistes.fr\0" -"com.lr\0bremanger.no\0" -"gs.cn\0" -"com.lv\0lib.co.us\0" -"com.mg\0" -"passenger-association.aero\0" -"com.ly\0yekaterinburg.ru\0" -"vladivostok.ru\0" -"com.mk\0beeldengeluid.museum\0" +"com.lc\0lutsk.ua\0" +"yatomi.aichi.jp\0" +"virtuel.museum\0firm.ro\0" +"navigation.aero\0b.br\0com.ky\0" +"com.kz\0" +"tenei.fukushima.jp\0chungnam.kr\0com.lk\0" +"mo.it\0" +"dnsdojo.org\0" +"com.lr\0\xd8\xa7\xd9\x84\xd8\xb3\xd8\xb9\xd9\x88\xd8\xaf\xdb\x8c\xd8\xa9\0" +"opoczno.pl\0" +"pa.us\0" +"saga.jp\0kvinesdal.no\0biz.tj\0" +"com.lv\0" +"gose.nara.jp\0com.mg\0" +"nagaokakyo.kyoto.jp\0tcm.museum\0" +"com.ly\0" +"kawasaki.miyagi.jp\0cieszyn.pl\0" +"com.mk\0" "com.ml\0" -"art.pl\0" -"com.mo\0" -"britishcolumbia.museum\0tx.us\0" -"com.na\0sakhalin.ru\0*.sv\0" -"mc.it\0" -"amsterdam.museum\0udm.ru\0" +"com.mo\0siljan.no\0biz.tt\0" +"akita.jp\0" +"com.na\0cc.wy.us\0" +"riodejaneiro.museum\0marine.ru\0" +"averoy.no\0" "com.mu\0" -"com.mv\0com.nf\0" -"com.mw\0com.ng\0il.us\0" -"geometre-expert.fr\0com.mx\0" -"med.ly\0com.my\0" -"ag.it\0" -"*.tr\0" -"!pref.oita.jp\0" -"hoyanger.no\0skedsmo.no\0" -"com.nr\0turystyka.pl\0" -"koebenhavn.museum\0" -"quebec.museum\0" -"stord.no\0*.uk\0" -"act.au\0" -"br.it\0cb.it\0gyeonggi.kr\0jobs.tt\0lib.hi.us\0" -"*.ve\0" -"*.saga.jp\0wildlife.museum\0com.pa\0" -"monzabrianza.it\0sciencehistory.museum\0stange.no\0oskol.ru\0principe.st\0*.uy\0" -"plaza.museum\0com.pe\0" -"com.pf\0" -"eigersund.no\0" +"com.mv\0com.nf\0tolga.no\0" +"com.mw\0com.ng\0vladimir.ru\0" +"com.mx\0deatnu.no\0" +"com.my\0" +"mihara.kochi.jp\0" +"hyllestad.no\0melhus.no\0lib.co.us\0" +"eng.br\0" +"mashike.hokkaido.jp\0com.nr\0" +"minamiminowa.nagano.jp\0" +"moroyama.saitama.jp\0moscow.museum\0" +"phoenix.museum\0vladikavkaz.ru\0from-nh.com\0" +"jan-mayen.no\0" +"granvin.no\0khv.ru\0" +"cc.ut.us\0" +"mj\xc3\xb8ndalen.no\0biz.vn\0" +"accident-investigation.aero\0v\xc3\xa5ler.hedmark.no\0" +"kisosaki.mie.jp\0" +"nb.ca\0" +"firm.nf\0" +"biz\0doshi.yamanashi.jp\0com.pa\0" +"lib.ar.us\0dyndns-ip.com\0" +"fukushima.fukushima.jp\0" +"com.pe\0" +"misasa.tottori.jp\0fuossko.no\0com.pf\0" "com.ph\0" -"manx.museum\0marylhurst.museum\0" -"md.ci\0pi.it\0schweiz.museum\0com.pk\0" -"grp.lk\0fr\xc3\xb8ya.no\0com.pl\0press.se\0" -"us.com\0" -"b.bg\0cremona.it\0communication.museum\0art.sn\0" -"med.pa\0" -"com.pr\0" +"tokashiki.okinawa.jp\0\xc4\x8d\xc3\xa1hcesuolo.no\0" +"moriyama.shiga.jp\0museumcenter.museum\0hof.no\0vegarshei.no\0com.pk\0" +"com.pl\0" +"com.qa\0" +"imperia.it\0com.pr\0" "com.ps\0" -"com.pt\0" -"k12.in.us\0" -"ah.cn\0bahcavuotna.no\0" -"sondrio.it\0arkhangelsk.ru\0" -"cargo.aero\0" -"council.aero\0" -"museum.mv\0hattfjelldal.no\0spydeberg.no\0med.pl\0" -"niepce.museum\0museum.mw\0" -"anthropology.museum\0" -"pharmacien.fr\0smola.no\0" -"fin.ec\0" -"selbu.no\0" -"workinggroup.aero\0nm.us\0" -"museum.no\0com.re\0" -"cc.vt.us\0" -"village.museum\0" -"ca.us\0" -"*.sapporo.jp\0" -"teramo.it\0" +"vv.it\0com.pt\0" +"ayagawa.kagawa.jp\0davvenjarga.no\0" +"iwakuni.yamaguchi.jp\0com.py\0k12.dc.us\0" +"royken.no\0" +"pri.ee\0nishikata.tochigi.jp\0" +"urawa.saitama.jp\0" +"equipment.aero\0sweden.museum\0" +"kyowa.akita.jp\0guovdageaidnu.no\0" +"ogaki.gifu.jp\0" +"com.re\0" +"emergency.aero\0" +"ikusaka.nagano.jp\0" +"hirosaki.aomori.jp\0" +"jobs.tt\0" +"maryland.museum\0" "com.ro\0" -"*.ye\0" -"com.sa\0" -"com.sb\0" -"so.it\0com.sc\0" -"jolster.no\0com.sd\0" +"com.sa\0is-found.org\0" +"usa.oita.jp\0com.sb\0" +"frogn.no\0com.sc\0" +"com.sd\0" "com.ru\0" "com.rw\0com.sg\0" -"sydney.museum\0" -"sa.edu.au\0" -"tom.ru\0" -"com.sl\0*.za\0" -"\xe7\xbd\x91\xe7\xb5\xa1.hk\0naturbruksgymn.se\0com.sn\0" -"assedic.fr\0com.so\0" -"!pref.mie.jp\0*.yu\0" -"med.sa\0" -"newspaper.museum\0holmestrand.no\0dnepropetrovsk.ua\0" -"christiansburg.museum\0roan.no\0" -"pesaro-urbino.it\0med.sd\0com.st\0" -"s\xc3\xb8gne.no\0" -"nuernberg.museum\0" -"*.zm\0" -"com.sy\0" -"*.nagano.jp\0com.tj\0" -"nt.gov.au\0news.hu\0paderborn.museum\0" -"boston.museum\0" -"com.tn\0" +"inawashiro.fukushima.jp\0com.sh\0" +"yn.cn\0" +"com.sl\0" +"togakushi.nagano.jp\0unazuki.toyama.jp\0com.sn\0" +"porsanger.no\0com.so\0" +"av.it\0" +"gc.ca\0okinawa.jp\0" +"com.st\0" +"asn.lv\0namdalseid.no\0tn.us\0" +"amber.museum\0com.sy\0broke-it.net\0podzone.net\0" +"net.ac\0com.tj\0" +"selfip.com\0" +"net.ae\0ofunato.iwate.jp\0shichikashuku.miyagi.jp\0" +"net.af\0yoita.niigata.jp\0com.tm\0" +"net.ag\0com.tn\0dynalias.net\0" "com.to\0" -"broadcast.museum\0" +"net.ai\0eidsberg.no\0" "com.ua\0" -"*.zw\0" -"baikal.ru\0" -"bykle.no\0com.tt\0" -"verdal.no\0" -"roros.no\0" -"fi.cr\0carboniaiglesias.it\0chuvashia.ru\0com.tw\0" -"k12.ca.us\0" -"eidsvoll.no\0" -"*.ishikawa.jp\0" -"dolls.museum\0" -"naval.museum\0" -"karasjok.no\0tysvar.no\0" -"bielawa.pl\0com.vc\0" -"svalbard.no\0deatnu.no\0rnd.ru\0" -"grandrapids.museum\0" -"bauern.museum\0k12.pr.us\0" -"press.ma\0" -"*.kagawa.jp\0fribourg.museum\0przeworsk.pl\0com.vi\0" -"com.uz\0" -"babia-gora.pl\0" -"com.vn\0" -"med.pro\0" -"suedtirol.it\0kursk.ru\0" -"bonn.museum\0" -"lt.it\0" -"design.aero\0microlight.aero\0americanantiques.museum\0meland.no\0" -"insurance.aero\0aarborte.no\0" -"kh.ua\0" -"macerata.it\0architecture.museum\0" -"rovigo.it\0rawa-maz.pl\0" -"store.nf\0levanger.no\0" -"b\xc3\xa1jddar.no\0" -"not.br\0" -"com.ws\0" -"!pref.kagawa.jp\0" -"!omanpost.om\0" -"vt.us\0" -"gs.ah.no\0vladikavkaz.ru\0" -"no.it\0" -"in.na\0szkola.pl\0a.se\0" -"aid.pl\0" -"workshop.museum\0vegarshei.no\0" -"sund.no\0" -"bs.it\0flora.no\0" -"agriculture.museum\0" -"koeln.museum\0" -"minnesota.museum\0k12.il.us\0" -"froya.no\0" -"aeroport.fr\0" -"davvenjarga.no\0zgora.pl\0ivano-frankivsk.ua\0" -"*.gunma.jp\0" -"amot.no\0" -"mus.br\0chungbuk.kr\0" -"ggf.br\0lorenskog.no\0" -"jeonbuk.kr\0" -"k12.vi.us\0" -"c.bg\0sande.more-og-romsdal.no\0" -"perugia.it\0" -"massa-carrara.it\0" -"michigan.museum\0" -"archaeology.museum\0mosj\xc3\xb8""en.no\0czest.pl\0koenig.ru\0\xe0\xb6\xbd\xe0\xb6\x82\xe0\xb6\x9a\xe0\xb7\x8f\0" -"mobi.tt\0" -"kraanghke.no\0" -"cc.in.us\0" -"re.it\0lib.vt.us\0" -"dell-ogliastra.it\0" -"s\xc3\xb8mna.no\0" -"k12.wv.us\0" -"gok.pk\0fh.se\0" -"luzern.museum\0" -"fi.it\0swidnica.pl\0" -"cbg.ru\0" -"latina.it\0" -"vibovalentia.it\0" -"modum.no\0" -"safety.aero\0" -"sp.it\0" -"science.museum\0ah.no\0" -"norddal.no\0" -"cc.na\0" -"re.kr\0" -"dielddanuorri.no\0" -"force.museum\0" -"torino.it\0cc.md.us\0" -"artanddesign.museum\0pisz.pl\0" -"olsztyn.pl\0" -"unsa.ba\0rade.no\0vinnica.ua\0" -"in.rs\0astrakhan.ru\0" -"sogne.no\0" -"homebuilt.aero\0" -"polkowice.pl\0" -"hole.no\0health.vn\0" -"fj.cn\0" -"davvesiida.no\0" -"vic.au\0" -"kongsberg.no\0" -"pub.sa\0" -"vv.it\0" -"!pref.tottori.jp\0" -"*.sendai.jp\0in.th\0" -"lib.pa.us\0" -"chiropractic.museum\0" -"mobi.na\0aca.pro\0" -"konyvelo.hu\0sciencecenters.museum\0" -"he.cn\0" -"in.ua\0" -"!city.nagoya.jp\0" -"muenchen.museum\0" -"psi.br\0" -"maryland.museum\0" -"!statecouncil.om\0" -"tr\xc3\xa6na.no\0" -"!pref.yamagata.jp\0jewishart.museum\0" -"lu.it\0me.it\0" -"chel.ru\0" -"tatarstan.ru\0" -"adult.ht\0in.us\0" -"kafjord.no\0" -"\xd7\x99\xd7\xa8\xd7\x95\xd7\xa9\xd7\x9c\xd7\x99\xd7\x9d.museum\0" -"net.ac\0k12.ec\0" -"net.ae\0bashkiria.ru\0" -"net.af\0!omantel.om\0" -"net.ag\0" -"net.ai\0" -"!pref.toyama.jp\0" -"net.al\0timekeeping.museum\0" -"net.an\0design.museum\0fin.tn\0" -"ethnology.museum\0" -"perso.ht\0asker.no\0b.se\0" -"net.ba\0" -"net.bb\0flanders.museum\0" -"mincom.tn\0" -"frana.no\0" -"bt.it\0" -"net.bh\0" -"auto.pl\0" +"lugansk.ua\0" +"net.al\0" +"nishihara.kumamoto.jp\0com.tt\0" +"net.an\0cymru.museum\0heritage.museum\0" +"sarpsborg.no\0com.tw\0com.ug\0" +"net.ba\0higashiyamato.tokyo.jp\0\xd8\xaa\xd9\x88\xd9\x86\xd8\xb3\0" +"net.bb\0pg.it\0" +"net.au\0" +"meiwa.gunma.jp\0" +"as.us\0" +"net.bh\0ri.us\0" +"e.bg\0" "net.az\0" -"treviso.it\0" -"war.museum\0" +"roan.no\0" +"com.vc\0\xe5\x8f\xb0\xe7\x81\xa3\0" "net.bm\0" -"langevag.no\0m\xc3\xa5lselv.no\0" +"com.ve\0" "net.bo\0" -"gol.no\0" -"folkebibl.no\0" -"net.br\0" -"net.bs\0troandin.no\0saotome.st\0lib.tn.us\0" -"md.us\0k12.ut.us\0" -"d.bg\0cambridge.museum\0\xc3\xa5s.no\0" +"net.br\0com.uy\0com.vi\0fuettertdasnetz.de\0" +"net.bs\0tran\xc3\xb8y.no\0com.uz\0" +"net.bt\0higashiomi.shiga.jp\0kms.ru\0" +"accident-prevention.aero\0from-ca.com\0" +"ozora.hokkaido.jp\0com.vn\0dyndns-server.com\0" "net.ci\0" "net.bz\0" -"sch.ae\0undersea.museum\0odda.no\0" +"livinghistory.museum\0" "net.cn\0" -"net.co\0c.la\0" -"gliwice.pl\0" -"aurskog-h\xc3\xb8land.no\0" -"andria-trani-barletta.it\0" -"net.cu\0loab\xc3\xa1t.no\0" -"rep.kp\0" -"\xe7\xbb\x84\xe7\xb9\x94.hk\0" -"gallery.museum\0" -"\xc3\xb8rland.no\0" -"store.ro\0" -"net.dm\0" -"somna.no\0" -"hemnes.no\0" -"ringebu.no\0k12.ky.us\0" -"net.ec\0" -"dn.ua\0" -"tarnobrzeg.pl\0" -"soc.lk\0" -"romsa.no\0" -"bamble.no\0" -"net.dz\0lutsk.ua\0" -"barlettatraniandria.it\0ta.it\0countryestate.museum\0" -"kaszuby.pl\0" -"*.yamaguchi.jp\0cranbrook.museum\0store.st\0" -"southcarolina.museum\0lib.md.us\0" -"textile.museum\0" -"cheltenham.museum\0hurum.no\0" -"*.oita.jp\0" -"shop.ht\0cc.me.us\0" -"shop.hu\0turin.it\0" -"louvre.museum\0" -"k12.ar.us\0" -"consulting.aero\0" -"gv.ao\0" -"sauherad.no\0" -"gv.at\0net.ge\0" -"ostre-toten.no\0lib.ok.us\0" -"net.gg\0pilots.museum\0" -"2000.hu\0geology.museum\0" -"net.gn\0" -"mazowsze.pl\0bir.ru\0" +"net.co\0ryuoh.shiga.jp\0" +"krokstadelva.no\0" +"lib.wa.us\0" +"cat\0" +"oz.au\0net.cu\0from-sc.com\0" +"chocolate.museum\0" +"sch.ae\0" +"iwate.jp\0" +"museum.tt\0com.ws\0" +"net.dm\0selje.no\0is-very-good.org\0" +"net.do\0" +"net.ec\0gildesk\xc3\xa5l.no\0" +"moriyoshi.akita.jp\0rl.no\0mo.us\0blogspot.re\0" +"net.eg\0" +"hachioji.tokyo.jp\0childrens.museum\0" +"shizuoka.jp\0" +"net.dz\0" +"minamiizu.shizuoka.jp\0" +"is-a-patsfan.org\0" +"inagawa.hyogo.jp\0blogspot.ro\0" +"yamagata.jp\0gsm.pl\0" +"suldal.no\0dlugoleka.pl\0blogspot.se\0" +"blogspot.sg\0" +"\xd8\xa7\xd9\x8a\xd8\xb1\xd8\xa7\xd9\x86\0dnsalias.com\0" +"kamikawa.hokkaido.jp\0kamoenai.hokkaido.jp\0" +"blogspot.sk\0" +"siracusa.it\0k12.wi.us\0" +"oksnes.no\0\xed\x95\x9c\xea\xb5\xad\0" +"vardo.no\0starachowice.pl\0" +"net.ge\0ishinomaki.miyagi.jp\0oji.nara.jp\0\xd8\xa7\xd9\x84\xd8\xb3\xd8\xb9\xd9\x88\xd8\xaf\xdb\x8c\xdb\x83\0blogspot.td\0" +"trustee.museum\0" +"net.gg\0" +"misato.saitama.jp\0" +"ppg.br\0" +"net.gn\0chikuho.fukuoka.jp\0" "net.gp\0" -"net.gr\0" -"oxford.museum\0" -"per.la\0" -"eastafrica.museum\0" -"meeres.museum\0" -"net.gy\0*.shizuoka.jp\0" -"\xe5\x95\x86\xe6\xa5\xad.tw\0" -"net.hk\0" +"osoyro.no\0dyndns-office.com\0" +"net.gr\0higashikawa.hokkaido.jp\0" +"net.gt\0monzabrianza.it\0mr.no\0eidsvoll.no\0" +"aridagawa.wakayama.jp\0" +"sykkylven.no\0" +"minamiaiki.nagano.jp\0blogspot.tw\0" +"net.gy\0naturhistorisches.museum\0" +"net.hk\0zaporizhzhia.ua\0" +"mifune.kumamoto.jp\0" "net.hn\0" -"philadelphiaarea.museum\0" -"osen.no\0" +"kahoku.yamagata.jp\0" +"asakawa.fukushima.jp\0" +"barlettatraniandria.it\0blogspot.mr\0" "net.ht\0net.id\0" -"fundacio.museum\0" -"j\xc3\xb8rpeland.no\0" -"\xe6\x95\x99\xe8\x82\xb2.hk\0" -"divtasvuodna.no\0" -"student.aero\0sch.gg\0net.im\0" -"\xe7\xbd\x91\xe7\xbb\x9c.cn\0net.in\0" +"b.se\0" +"ud.it\0tsuchiura.ibaraki.jp\0naturalhistory.museum\0" +"matsushige.tokushima.jp\0nanto.toyama.jp\0from-al.com\0" +"blogspot.mx\0" +"nagakute.aichi.jp\0zamami.okinawa.jp\0" +"net.im\0ikawa.akita.jp\0lib.ne.us\0blogspot.nl\0" +"net.in\0" +"yokkaichi.mie.jp\0" +"blogspot.no\0" "net.iq\0" "net.ir\0" "net.is\0" "net.je\0" -"kepno.pl\0lapy.pl\0" -"per.nf\0" -"gov\0*.shimane.jp\0" -"artcenter.museum\0" -"k\xc3\xa5""fjord.no\0" -"net.jo\0" -"eu.int\0" -"c.se\0" +"from.hr\0cc.oh.us\0" +"biratori.hokkaido.jp\0" +"sch.gg\0" +"taxi.aero\0" +"bi.it\0treviso.it\0" +"ro.it\0" +"mine.nu\0" +"net.jo\0tenri.nara.jp\0alvdal.no\0" +"ikeda.hokkaido.jp\0here-for-more.info\0" +"owani.aomori.jp\0" +"uri.arpa\0" +"tsukui.kanagawa.jp\0bryne.no\0" +"shibetsu.hokkaido.jp\0grozny.ru\0" +"jewelry.museum\0" "net.kg\0" -"ce.it\0net.ki\0" -"sch.id\0os.hedmark.no\0" -"columbus.museum\0" -"arteducation.museum\0" +"net.ki\0" +"sakura.chiba.jp\0nittedal.no\0" +"kawazu.shizuoka.jp\0" "net.kn\0" -"kr.com\0" -"net.la\0bushey.museum\0cc.gu.us\0" -"net.lb\0" +"net.la\0hoylandet.no\0" +"net.lb\0\xc3\xa5mli.no\0" "net.lc\0" -"gs.bu.no\0" -"e164.arpa\0" -"chieti.it\0labour.museum\0" -"sch.ir\0creation.museum\0krodsherad.no\0" -"net.ky\0" -"net.kz\0me.us\0" -"e.bg\0sch.je\0net.lk\0" -"zlg.br\0suwalki.pl\0" -"\xe5\x80\x8b\xe4\xba\xba.hk\0net.ma\0" -"net.lr\0" -"sch.jo\0notaires.km\0net.me\0" -"net.lv\0karate.museum\0" -"net.ly\0karm\xc3\xb8y.no\0" -"rg.it\0" +"mihama.fukui.jp\0yamagata.gifu.jp\0blogspot.pt\0" +"sch.id\0" +"aca.pro\0" +"sanjo.niigata.jp\0net.ky\0" +"tsukumi.oita.jp\0net.kz\0oceanographic.museum\0k12.nm.us\0" +"h.bg\0net.lk\0" +"miharu.fukushima.jp\0" +"aknoluokta.no\0" +"net.ma\0" +"tw.cn\0net.lr\0" +"kamikitayama.nara.jp\0miyashiro.saitama.jp\0chernihiv.ua\0" +"ichikawa.hyogo.jp\0comunica\xc3\xa7\xc3\xb5""es.museum\0" +"sch.ir\0oki.fukuoka.jp\0yoshioka.gunma.jp\0akkeshi.hokkaido.jp\0net.me\0kazimierz-dolny.pl\0blogspot.it\0" +"net.lv\0" +"sch.je\0yoshida.saitama.jp\0" +"net.ly\0" "net.mk\0" -"net.ml\0evenes.no\0" -"ngo.lk\0net.mo\0egyptian.museum\0" -"marine.ru\0" -"realestate.pl\0" +"net.ml\0" +"museum.mv\0" +"hokkaido.jp\0net.mo\0museum.mw\0" +"\xc3\xa1lt\xc3\xa1.no\0vestnes.no\0" +"blogspot.jp\0" +"sch.jo\0" +"yokoze.saitama.jp\0stathelle.no\0blogspot.com.ar\0" "net.mu\0" "net.mv\0net.nf\0" -"net.mw\0net.ng\0gda.pl\0" +"adult.ht\0ne.jp\0coldwar.museum\0net.mw\0net.ng\0museum.no\0blogspot.com.au\0" "net.mx\0" -"freemasonry.museum\0net.my\0enebakk.no\0" -"karlsoy.no\0" -"\xe7\xbd\x91\xe7\xbb\x9c.hk\0\xc3\xb8rskog.no\0" -"randaberg.no\0" -"club.aero\0" -"certification.aero\0sr.it\0" -"center.museum\0so.gov.pl\0" -"caa.aero\0" -"sch.lk\0tvedestrand.no\0" +"skydiving.aero\0net.my\0" +"nakasatsunai.hokkaido.jp\0" +"undersea.museum\0" +"kainan.wakayama.jp\0sebastopol.ua\0cc.hi.us\0" +"gamagori.aichi.jp\0" +"gyeongbuk.kr\0" "net.nr\0" -"luroy.no\0" -"aukra.no\0s\xc3\xa1lat.no\0lib.me.us\0" -"ddr.museum\0" -"york.museum\0stryn.no\0k12.nm.us\0" -"per.sg\0" -"judaica.museum\0" -"verona.it\0" -"agdenes.no\0" -"cng.br\0sch.ly\0" -"net.pa\0" -"author.aero\0" -"naturalhistory.museum\0steiermark.museum\0bu.no\0" -"sn\xc3\xa5sa.no\0net.pe\0" -"net.ph\0" -"savannahga.museum\0batsfjord.no\0lib.oh.us\0" +"jorpeland.no\0blogspot.kr\0" +"bellevue.museum\0blogspot.com.br\0" +"kanegasaki.iwate.jp\0" +"ne.kr\0" +"aosta.it\0mima.tokushima.jp\0" +"pro.az\0km.ua\0" +"nakanoto.ishikawa.jp\0sch.lk\0" +"nome.pt\0" +"nagareyama.chiba.jp\0himeji.hyogo.jp\0denmark.museum\0" +"echizen.fukui.jp\0net.pa\0\xe4\xb8\xad\xe5\x9b\xbd\0from-oh.com\0" +"kongsvinger.no\0ringebu.no\0" +"tsukigata.hokkaido.jp\0m\xc3\xa5s\xc3\xb8y.no\0" +"pro.br\0net.pe\0bar.pro\0" +"viterbo.it\0heroy.more-og-romsdal.no\0" +"omihachiman.shiga.jp\0labor.museum\0" +"toho.fukuoka.jp\0tome.miyagi.jp\0net.ph\0" "net.pk\0" -"net.pl\0" -"net.pn\0" -"washingtondc.museum\0" +"sch.ly\0net.pl\0" +"saijo.ehime.jp\0" +"shiojiri.nagano.jp\0net.pn\0" +"newport.museum\0\xe4\xb8\xad\xe5\x9c\x8b\0" +"\xe6\x95\x8e\xe8\x82\xb2.hk\0net.qa\0" "net.pr\0" "net.ps\0" "net.pt\0" -"nordkapp.no\0" -"emergency.aero\0krokstadelva.no\0" -"satx.museum\0ngo.ph\0omsk.ru\0" -"texas.museum\0" -"ngo.pl\0" -"mantova.it\0gu.us\0" -"!pref.shiga.jp\0isa.us\0" -"usa.museum\0" -"gb.net\0k12.vi\0" -"iveland.no\0" -"tempio-olbia.it\0" +"akrehamn.no\0" +"oshu.iwate.jp\0lincoln.museum\0fjell.no\0" +"selfip.info\0" +"hol.no\0" +"net.py\0" +"blogspot.fi\0" +"kakegawa.shizuoka.jp\0cc.co.us\0" +"com\0schoenbrunn.museum\0" +"microlight.aero\0" +"shimogo.fukushima.jp\0" +"leirvik.no\0" +"veg\xc3\xa5rshei.no\0blogspot.fr\0" +"blogspot.com.es\0" +"pro.ec\0" +"civilisation.museum\0" +"g\xc3\xa1\xc5\x8bgaviika.no\0" +"nago.okinawa.jp\0" +"station.museum\0" +"akashi.hyogo.jp\0ichinohe.iwate.jp\0" +"tsukiyono.gunma.jp\0" +"b\xc3\xa1hcavuotna.no\0" +"notogawa.shiga.jp\0sciencehistory.museum\0s\xc3\xb8r-fron.no\0" "net.sa\0" "net.sb\0" -"works.aero\0net.sc\0komvux.se\0" +"net.sc\0blogspot.gr\0" "net.sd\0" -"net.ru\0" -"0.bg\0" -"forlicesena.it\0net.rw\0net.sg\0" -"klodzko.pl\0" -"detroit.museum\0wegrow.pl\0" -"net.sl\0" -"glogow.pl\0" -"store.bb\0air.museum\0" -"net.so\0" -"katowice.pl\0" -"nsk.ru\0" -"pisa.it\0eid.no\0" -"net.st\0" -"film.hu\0" -"tuva.ru\0d.se\0" +"mandal.no\0net.ru\0" +"net.rw\0e.se\0net.sg\0" +"flight.aero\0alabama.museum\0net.sh\0" +"dgca.aero\0dominic.ua\0" +"vestby.no\0" +"kuroishi.aomori.jp\0gs.hl.no\0" +"sorfold.no\0net.sl\0blogspot.hk\0" +"nemuro.hokkaido.jp\0l\xc3\xa1hppi.no\0wi.us\0" +"tsuno.miyazaki.jp\0net.so\0" +"giessen.museum\0" +"l\xc3\xb8ten.no\0dn.ua\0" +"wada.nagano.jp\0" +"sch.qa\0net.st\0" +"shiroishi.saga.jp\0" +"blogspot.hu\0blogspot.ie\0" +"teramo.it\0kuzumaki.iwate.jp\0" "net.th\0" "net.sy\0" -"viterbo.it\0tsaritsyn.ru\0perso.sn\0net.tj\0" -"lib.gu.us\0" -"plc.co.im\0sec.ps\0" -"r\xc3\xa1hkker\xc3\xa1vju.no\0kazimierz-dolny.pl\0net.tn\0" -"net.to\0" -"veterinaire.km\0" +"net.tj\0cc.ok.us\0" +"uozu.toyama.jp\0net.tm\0" +"bl.it\0naoshima.kagawa.jp\0ne.pw\0net.tn\0" +"ohi.fukui.jp\0fusa.no\0net.to\0blogspot.in\0" +"hirakata.osaka.jp\0" "net.ua\0" -"info.ht\0net.tt\0" -"info.hu\0" -"exchange.aero\0" -"sch.sa\0net.tw\0" -"andriatranibarletta.it\0perso.tn\0" -"f.bg\0malselv.no\0" +"fujiyoshida.yamanashi.jp\0beskidy.pl\0" +"ed.ao\0net.tt\0" +"kochi.kochi.jp\0" +"southcarolina.museum\0valle.no\0blogspot.be\0dnsdojo.net\0" +"tomika.gifu.jp\0muosat.no\0net.tw\0" +"minamiyamashiro.kyoto.jp\0" +"itano.tokushima.jp\0blogspot.bj\0" +"tainai.niigata.jp\0zachpomor.pl\0" +"komono.mie.jp\0project.museum\0" +"blogspot.ca\0" "net.vc\0" -"trana.no\0" -"ns.ca\0" -"net.vi\0" -"lucca.it\0oristano.it\0" -"usarts.museum\0net.vn\0" -"gon.pk\0" -"pl.ua\0" -"eastcoast.museum\0" -"novara.it\0" -"k12.ks.us\0" -"dp.ua\0" -"nesseby.no\0" -"!pref.wakayama.jp\0" -"repbody.aero\0" -"jamison.museum\0lugansk.ua\0" -"ss.it\0" -"alessandria.it\0" -"hadsel.no\0net.ws\0" -"\xe0\xae\x9a\xe0\xae\xbf\xe0\xae\x99\xe0\xaf\x8d\xe0\xae\x95\xe0\xae\xaa\xe0\xaf\x8d\xe0\xae\xaa\xe0\xaf\x82\xe0\xae\xb0\xe0\xaf\x8d\0" -"veterinaire.fr\0leirfjord.no\0" -"massacarrara.it\0north.museum\0" -"project.museum\0" -"other.nf\0" -"k12.nh.us\0" -"mat.br\0artgallery.museum\0" -"sr.gov.pl\0" -"gamvik.no\0" -"info.ec\0lancashire.museum\0" -"fm.br\0ltd.co.im\0" -"americana.museum\0southwest.museum\0cc.ak.us\0" -"enna.it\0lunner.no\0" -"v\xc3\xa5gan.no\0" -"mari.ru\0" -"accident-investigation.aero\0" -"sor-aurdal.no\0lib.ny.us\0" -"novosibirsk.ru\0" -"bjugn.no\0" -"n\xc3\xa6r\xc3\xb8y.no\0ostrowwlkp.pl\0" -"info.bb\0foundation.museum\0" -"brand.se\0" -"info.at\0!pref.akita.jp\0l\xc3\xb8ten.no\0" -"coal.museum\0miners.museum\0" -"glass.museum\0" -"info.az\0" -"frog.museum\0szczytno.pl\0nov.ru\0" -"sunndal.no\0" -"gen.in\0" -"gx.cn\0" -"web.co\0*.mie.jp\0hobol.no\0\xe5\x8f\xb0\xe6\xb9\xbe\0" -"logistics.aero\0plo.ps\0" -"erotika.hu\0" -"torsken.no\0" -"exeter.museum\0" -"info.co\0" -"selje.no\0" -"storfjord.no\0" -"barum.no\0lind\xc3\xa5s.no\0" +"aerobatic.aero\0benevento.it\0sch.sa\0" +"nakadomari.aomori.jp\0ibara.okayama.jp\0net.ve\0" +"elvendrell.museum\0" +"pro.ht\0tomari.hokkaido.jp\0blogspot.cf\0" +"hikimi.shimane.jp\0" +"net.uy\0net.vi\0blogspot.ch\0" +"net.uz\0" +"servebbs.com\0" +"k.bg\0" +"ed.ci\0net.vn\0" +"paragliding.aero\0otobe.hokkaido.jp\0" +"sakai.fukui.jp\0" +"rikuzentakata.iwate.jp\0" +"journalism.museum\0" +"news.hu\0" +"susono.shizuoka.jp\0blogspot.de\0" +"ed.cr\0mediocampidano.it\0blogspot.cv\0" +"soma.fukushima.jp\0blogspot.com\0" +"blogspot.cz\0is-a-player.com\0" +"blogspot.dk\0" +"consulado.st\0" +"shingu.fukuoka.jp\0" +"inami.wakayama.jp\0" +"education.museum\0" +"sciencecenters.museum\0net.ws\0" +"lib.ga.us\0" +"bergen.no\0" +"prato.it\0shiwa.iwate.jp\0" +"bo.nordland.no\0" +"foggia.it\0" +"pp.az\0ne.ug\0" +"chirurgiens-dentistes.fr\0" +"toyama.jp\0ne.tz\0" +"forum.hu\0chita.aichi.jp\0" +"nisshin.aichi.jp\0" +"lc.it\0mitake.gifu.jp\0solund.no\0" +"ogose.saitama.jp\0" +"kunst.museum\0" +"ne.us\0" +"furukawa.miyagi.jp\0" +"nakatombetsu.hokkaido.jp\0lib.tn.us\0" +"\xc3\xa5l.no\0" +"fareast.ru\0" +"railroad.museum\0" +"yamaguchi.jp\0sakae.chiba.jp\0" +"atsuma.hokkaido.jp\0minamimaki.nagano.jp\0" +"marker.no\0" +"yabuki.fukushima.jp\0from-ak.com\0" +"settlers.museum\0rubtsovsk.ru\0" +"akabira.hokkaido.jp\0" +"pro.na\0" +"yurihonjo.akita.jp\0" +"kuji.iwate.jp\0" +"morotsuka.miyazaki.jp\0pro.mv\0" +"mx.na\0" +"cargo.aero\0ohira.tochigi.jp\0" +"fyresdal.no\0" +"trieste.it\0tokyo.jp\0" +"midori.chiba.jp\0" +"manx.museum\0" +"soo.kagoshima.jp\0kunstsammlung.museum\0rzeszow.pl\0" +"samegawa.fukushima.jp\0" "leasing.aero\0" -"championship.aero\0fst.br\0" -"lierne.no\0" -"!gobiernoelectronico.ar\0""1.bg\0" -"corporation.museum\0" -"al.it\0*.miyagi.jp\0" -"*.aomori.jp\0" -"\xd8\xa7\xd9\x84\xd8\xa7\xd8\xb1\xd8\xaf\xd9\x86\0" -"amursk.ru\0" -"vestvagoy.no\0" -"\xd8\xa7\xdb\x8c\xd8\xb1\xd8\xa7\xd9\x86.ir\0cc.fl.us\0" -"os.hordaland.no\0" -"pistoia.it\0" -"tver.ru\0e.se\0" -"res.in\0*.yamagata.jp\0syzran.ru\0" -"capebreton.museum\0sandnessj\xc3\xb8""en.no\0" -"ternopil.ua\0" -"shop.pl\0" -"tank.museum\0" -"m\xc3\xa5s\xc3\xb8y.no\0" -"potenza.it\0time.museum\0" -"mjondalen.no\0" -"eng.br\0nedre-eiker.no\0" -"air-surveillance.aero\0" -"nt.au\0am.br\0pn.it\0" -"oystre-slidre.no\0ug.gov.pl\0" -"g.bg\0nesodden.no\0vologda.ru\0" -"parma.it\0tula.ru\0" -"*.nara.jp\0ak.us\0" -"nt.ca\0konin.pl\0" -"kiev.ua\0" -"skierv\xc3\xa1.no\0vestre-toten.no\0" -"ri.it\0botanical.museum\0farsund.no\0veg\xc3\xa5rshei.no\0dagestan.ru\0" -"ind.br\0k-uralsk.ru\0" -"rahkkeravju.no\0cmw.ru\0" -"canada.museum\0" -"fm.it\0" -"cc.wi.us\0" -"web.id\0aver\xc3\xb8y.no\0" -"dudinka.ru\0" -"baghdad.museum\0fitjar.no\0grane.no\0" -"gs.fm.no\0" -"sumy.ua\0" -"al.no\0" -"westfalen.museum\0" -"oregon.museum\0" -"bruxelles.museum\0elk.pl\0" -"planetarium.museum\0sn\xc3\xa5""ase.no\0" -"s\xc3\xb8rreisa.no\0" -"gs.st.no\0skien.no\0" -"bible.museum\0ivanovo.ru\0" -"avellino.it\0" -"tgory.pl\0" -"family.museum\0" -"ppg.br\0k12.as.us\0" -"trader.aero\0gorlice.pl\0" -"cc.al.us\0" -"ogliastra.it\0" -"is.it\0lib.nv.us\0" -"dr.na\0" -"media.hu\0nesna.no\0fl.us\0" -"uri.arpa\0" -"bjerkreim.no\0" -"charter.aero\0" -"genova.it\0" -"it.ao\0botany.museum\0hapmir.no\0" -"educational.museum\0" -"helsinki.museum\0" -"memorial.museum\0" -"web.lk\0pharmacy.museum\0" -"aircraft.aero\0appspot.com\0" -"ferrara.it\0beskidy.pl\0" -"hi.cn\0" -"taxi.aero\0flekkefjord.no\0" -"varoy.no\0" -"ragusa.it\0ambulance.museum\0" -"can.museum\0" -"*.osaka.jp\0isleofman.museum\0fm.no\0warmia.pl\0" -"educator.aero\0asmatart.museum\0" -"mi.it\0" -"kutno.pl\0" -"skedsmokorset.no\0" -"2.bg\0" -"*.kagoshima.jp\0km.ua\0" -"!city.sendai.jp\0" -"web.nf\0st.no\0cc.ri.us\0" -"reggiocalabria.it\0" -"wi.us\0" -"ancona.it\0newjersey.museum\0nnov.ru\0" -"f.se\0" -"ind.in\0" -"info.vn\0" -"andoy.no\0" -"ch.it\0fredrikstad.no\0guovdageaidnu.no\0" -"fjaler.no\0" -"sa.com\0" -"gs.nt.no\0" -"masfjorden.no\0" -"pordenone.it\0" -"po.it\0basel.museum\0" -"chambagri.fr\0" -"h.bg\0web.pk\0" -"london.museum\0" -"sciencecenter.museum\0\xe0\xb9\x84\xe0\xb8\x97\xe0\xb8\xa2\0" -"unbi.ba\0augustow.pl\0" -"wolomin.pl\0" -"notaires.fr\0tcm.museum\0al.us\0" -"nu.ca\0!pref.nagano.jp\0" -"info.tn\0" -"lib.wa.us\0" -"ed.ao\0info.tt\0" -"barreau.bj\0" -"k12.wy.us\0" -"pp.az\0gop.pk\0" -"int\0" -"l\xc3\xb8renskog.no\0podhale.pl\0" -"voagat.no\0" -"telekommunikation.museum\0" -"qld.au\0" -"te.it\0freiburg.museum\0snasa.no\0" -"gjemnes.no\0" -"sejny.pl\0" -"media.pl\0" -"skjak.no\0" -"watchandclock.museum\0" -"ed.ci\0pacific.museum\0" -"theater.museum\0info.ro\0" -"uk.com\0" -"campobasso.it\0aquarium.museum\0tysv\xc3\xa6r.no\0" -"kragero.no\0" -"windmill.museum\0info.sd\0" -"sologne.museum\0sande.m\xc3\xb8re-og-romsdal.no\0" -"nt.no\0cc.mi.us\0" -"ed.cr\0" -"academy.museum\0zachpomor.pl\0" -"tananger.no\0v\xc3\xa1rgg\xc3\xa1t.no\0ri.us\0" +"higashi.fukuoka.jp\0kids.us\0" +"assedic.fr\0" +"state.museum\0czest.pl\0" +"wallonie.museum\0podzone.org\0" +"hitoyoshi.kumamoto.jp\0" +"hamura.tokyo.jp\0" +"h.se\0" +"minoh.osaka.jp\0" +"tako.chiba.jp\0kafjord.no\0" +"freemasonry.museum\0" +"lib.mo.us\0" +"ed.jp\0pro.pr\0" +"film.hu\0" +"act.au\0" +"in.na\0" +"no.com\0" +"higashiizumo.shimane.jp\0elburg.museum\0" +"siedlce.pl\0" +"bo.it\0" +"chikugo.fukuoka.jp\0from-mo.com\0" +"!city.kitakyushu.jp\0sopot.pl\0" +"togura.nagano.jp\0" +"handson.museum\0sb.ua\0" +"rennebu.no\0" +"milan.it\0" +"kamioka.akita.jp\0" +"cc.mi.us\0" +"from-de.com\0" +"urayasu.chiba.jp\0" +"varggat.no\0" +"takatsuki.shiga.jp\0k12.ms.us\0k12.nc.us\0" +"n.bg\0sakaki.nagano.jp\0" +"uwajima.ehime.jp\0skaun.no\0" +"kursk.ru\0" +"tabayama.yamanashi.jp\0" +"ryazan.ru\0" +"oyabe.toyama.jp\0health.vn\0" +"higashiyoshino.nara.jp\0" +"isen.kagoshima.jp\0nogi.tochigi.jp\0broadcast.museum\0" +"iitate.fukushima.jp\0yawata.kyoto.jp\0daegu.kr\0" +"obihiro.hokkaido.jp\0rebun.hokkaido.jp\0kamo.niigata.jp\0" +"vrn.ru\0" +"higashimurayama.tokyo.jp\0" +"ora.gunma.jp\0shimoji.okinawa.jp\0pro.tt\0lib.wv.us\0" +"odate.akita.jp\0" +"shoo.okayama.jp\0" +"tula.ru\0" +"uchinada.ishikawa.jp\0" +"sh.cn\0kawahara.tottori.jp\0" +"ingatlan.hu\0chikuma.nagano.jp\0vaksdal.no\0" +"foundation.museum\0" +"lewismiller.museum\0" +"trentino.it\0" +"qc.ca\0piacenza.it\0bokn.no\0" +"in.rs\0tom.ru\0" +"cng.br\0lebesby.no\0nh.us\0k12.ia.us\0" +"noto.ishikawa.jp\0arita.saga.jp\0" +"svizzera.museum\0ask\xc3\xb8y.no\0" +"kiyose.tokyo.jp\0frosta.no\0" +"ks.ua\0pro.vn\0" +"namsos.no\0" "federation.aero\0" -"web.tj\0" -"matta-varjjat.no\0" -"steigen.no\0" -"local\0akrehamn.no\0" -"!pref.chiba.jp\0info.pk\0" -"info.pl\0""6bone.pl\0" -"klepp.no\0kherson.ua\0" -"ketrzyn.pl\0info.pr\0" -"sweden.museum\0" -"lardal.no\0" -"!retina.ar\0gz.cn\0" -"barletta-trani-andria.it\0vikna.no\0" -"bearalv\xc3\xa1hki.no\0" -"broker.aero\0gov.nc.tr\0" -"info.na\0k12.fl.us\0" -"hembygdsforbund.museum\0" -"entertainment.aero\0jerusalem.museum\0l\xc3\xa6rdal.no\0" -"hitra.no\0sogndal.no\0" -"farmequipment.museum\0info.mv\0info.nf\0\xc3\xa5lg\xc3\xa5rd.no\0" -"la-spezia.it\0" -"skanland.no\0fam.pk\0" -"skole.museum\0" -"art.museum\0" -"presidio.museum\0" -"3.bg\0public.museum\0" -"h\xc3\xb8yanger.no\0zagan.pl\0" -"an.it\0" -"philadelphia.museum\0info.nr\0" -"pesarourbino.it\0g\xc3\xa1ivuotna.no\0" +"naumburg.museum\0" +"szczecin.pl\0" +"koza.wakayama.jp\0" "poltava.ua\0" -"nt.ro\0" -"station.museum\0" -"mi.th\0" -"altoadige.it\0" -"nu.it\0" -"usculture.museum\0g.se\0" -"h\xc3\xa1mm\xc3\xa1rfeasta.no\0" -"daegu.kr\0info.la\0" -"dovre.no\0" -"ci.it\0horology.museum\0" -"bergbau.museum\0" -"press.museum\0" -"gangwon.kr\0" -"!city.kitakyushu.jp\0sor-varanger.no\0cc.hi.us\0" -"fuossko.no\0" -"zp.ua\0" -"american.museum\0" -"fl\xc3\xa5.no\0mi.us\0" -"i.bg\0" -"od.ua\0" -"encyclopedic.museum\0" -"ind.tn\0" -"midatlantic.museum\0" -"newyork.museum\0" -"castres.museum\0" -"act.edu.au\0" -"topology.museum\0" -"ed.jp\0" -"of.by\0" -"iris.arpa\0inf.br\0askim.no\0pyatigorsk.ru\0" -"nord-fron.no\0nsn.us\0" -"beardu.no\0" -"agrar.hu\0corvette.museum\0chtr.k12.ma.us\0" +"sorum.no\0ed.pw\0from-ky.com\0" +"nishiazai.shiga.jp\0" +"in.th\0" +"moseushi.hokkaido.jp\0sn\xc3\xa5sa.no\0" +"nankoku.kochi.jp\0" +"orland.no\0" +"miyoshi.tokushima.jp\0larvik.no\0ks.us\0" +"loppa.no\0" +"*.kobe.jp\0childrensgarden.museum\0" +"sakai.ibaraki.jp\0\xd8\xa7\xd9\x84\xd9\x8a\xd9\x85\xd9\x86\0" +"in.ua\0" +"inf.br\0\xe7\xbd\x91\xe7\xb5\xa1.hk\0h\xc3\xb8ylandet.no\0skedsmo.no\0" +"dynalias.org\0" +"kurobe.toyama.jp\0gol.no\0" +"not.br\0shingu.wakayama.jp\0" +"nakai.kanagawa.jp\0cc.de.us\0" +"azumino.nagano.jp\0rade.no\0" +"dyndns-at-work.com\0" +"travel.pl\0" +"katsuura.chiba.jp\0" +"oiso.kanagawa.jp\0" +"it.ao\0cim.br\0in.us\0" +"bamble.no\0" +"inf.cu\0mimata.miyazaki.jp\0" +"bo.telemark.no\0" +"karasjohka.no\0" +"hanyu.saitama.jp\0artanddesign.museum\0" +"padua.it\0" +"health.museum\0" +"edu\0aseral.no\0" +"carbonia-iglesias.it\0nikaho.akita.jp\0" +"r\xc3\xb8ros.no\0" +"matsudo.chiba.jp\0yoshinogari.saga.jp\0" +"\xc3\xb8ystre-slidre.no\0k.se\0" +"bodo.no\0holmestrand.no\0vestvagoy.no\0" +"horokanai.hokkaido.jp\0matsue.shimane.jp\0" +"oyodo.nara.jp\0dnsalias.net\0" +"fr\xc3\xb8ya.no\0" +"monzaebrianza.it\0katagami.akita.jp\0istmein.de\0" +"tochigi.tochigi.jp\0lea\xc5\x8bgaviika.no\0komforb.se\0" +"design.museum\0" +"hanamigawa.chiba.jp\0" +"zj.cn\0nahari.kochi.jp\0discovery.museum\0" +"carraramassa.it\0elk.pl\0" +"cc.pa.us\0" +"kaga.ishikawa.jp\0tokamachi.niigata.jp\0" +"br.it\0cb.it\0" +"plc.ly\0agrinet.tn\0" +"gs.fm.no\0surgut.ru\0" +"usa.museum\0pp.ru\0pp.se\0" +"lib.la.us\0" +"go.ci\0\xe8\x87\xba\xe7\x81\xa3\0" +"rodoy.no\0" +"niikappu.hokkaido.jp\0" +"kure.hiroshima.jp\0fudai.iwate.jp\0maizuru.kyoto.jp\0" +"passenger-association.aero\0iveland.no\0" +"go.cr\0takayama.nagano.jp\0" +"game.tw\0" +"tvedestrand.no\0chernovtsy.ua\0" +"entertainment.aero\0trader.aero\0" +"shikaoi.hokkaido.jp\0komagane.nagano.jp\0travel.tt\0" +"katsushika.tokyo.jp\0" +"suita.osaka.jp\0" +"nasushiobara.tochigi.jp\0za.com\0" +"q.bg\0cody.museum\0" +"esp.br\0sagamihara.kanagawa.jp\0" +"pp.ua\0" +"andriatranibarletta.it\0mikawa.yamagata.jp\0naustdal.no\0" +"takinoue.hokkaido.jp\0gs.oslo.no\0" +"shiroishi.miyagi.jp\0community.museum\0bievat.no\0" +"from-ia.com\0" +"rep.kp\0luxembourg.museum\0" +"sk.ca\0" +"vic.gov.au\0" +"yamanashi.yamanashi.jp\0hemne.no\0" +"ulsan.kr\0k12.ky.us\0" +"is-a-caterer.com\0" +"kozagawa.wakayama.jp\0" +"capebreton.museum\0" +"is-a-musician.com\0" +"kaita.hiroshima.jp\0" +"seto.aichi.jp\0" +"yoshino.nara.jp\0" +"muenster.museum\0os\xc3\xb8yro.no\0" +"li.it\0" +"hokksund.no\0" +"snz.ru\0" +"hannan.osaka.jp\0brumunddal.no\0" +"fukushima.jp\0" +"tgory.pl\0kv.ua\0" +"hachinohe.aomori.jp\0media.museum\0" +"hidaka.saitama.jp\0" +"oto.fukuoka.jp\0" +"kozaki.chiba.jp\0" +"sandnessjoen.no\0" +"christiansburg.museum\0" +"res.aero\0" +"ashiya.hyogo.jp\0" +"soeda.fukuoka.jp\0" +"nuernberg.museum\0" +"sakhalin.ru\0" +"go.id\0soundandvision.museum\0" +"tajimi.gifu.jp\0tonosho.kagawa.jp\0" +"from-ut.com\0" +"aki.kochi.jp\0" +"niiza.saitama.jp\0" +"stalowa-wola.pl\0" +"from-ne.com\0" +"tado.mie.jp\0abeno.osaka.jp\0bergbau.museum\0dallas.museum\0" +"inf.mk\0cc.tn.us\0" +"onomichi.hiroshima.jp\0saga.saga.jp\0" +"go.it\0motoyama.kochi.jp\0" +"iwakura.aichi.jp\0" +"kashihara.nara.jp\0inagi.tokyo.jp\0" +"\xe7\xbd\x91\xe7\xbb\x9c.cn\0judaica.museum\0" +"ilawa.pl\0" +"lib.pr.us\0" +"buryatia.ru\0" +"go.jp\0" +"snasa.no\0" +"otaki.chiba.jp\0" +"mielno.pl\0" +"tachiarai.fukuoka.jp\0settsu.osaka.jp\0" +"hikari.yamaguchi.jp\0" +"cc.as.us\0" +"cc.ri.us\0" +"jobs\0" +"mail.pl\0" +"santacruz.museum\0n.se\0" +"hapmir.no\0" +"go.kr\0k12.sc.us\0" +"lib.ny.us\0" +"nuoro.it\0" +"sogndal.no\0sosnowiec.pl\0" +"asaminami.hiroshima.jp\0" +"isernia.it\0froland.no\0vang.no\0" +"nanporo.hokkaido.jp\0" +"dyndns-wiki.com\0" +"bari.it\0bahcavuotna.no\0" +"panama.museum\0santafe.museum\0" +"ce.it\0shirakawa.gifu.jp\0" +"aircraft.aero\0ptz.ru\0iamallama.com\0" +"takayama.gunma.jp\0" +"ama.aichi.jp\0" +"yakumo.shimane.jp\0taito.tokyo.jp\0" +"cmw.ru\0" +"res.in\0" +"hb.cn\0tohnosho.chiba.jp\0kashiba.nara.jp\0soni.nara.jp\0ostroleka.pl\0" +"aogashima.tokyo.jp\0" +"minano.saitama.jp\0lur\xc3\xb8y.no\0cc.mo.us\0" +"gjerstad.no\0" +"yashiro.hyogo.jp\0hitachiomiya.ibaraki.jp\0hakone.kanagawa.jp\0watch-and-clock.museum\0" +"pv.it\0toyohashi.aichi.jp\0okuizumo.shimane.jp\0" +"shop.ht\0olawa.pl\0" +"shop.hu\0sukagawa.fukushima.jp\0marugame.kagawa.jp\0v\xc3\xa5g\xc3\xa5.no\0" +"\xe7\xb5\x84\xe7\xbb\x87.hk\0usantiques.museum\0udm.ru\0" +"railway.museum\0" +"t.bg\0tsubetsu.hokkaido.jp\0kariwa.niigata.jp\0tsurugashima.saitama.jp\0" +"etc.br\0" +"obira.hokkaido.jp\0ide.kyoto.jp\0educational.museum\0bydgoszcz.pl\0" "figueres.museum\0" -"!pref.gunma.jp\0medizinhistorisches.museum\0" -"tjeldsund.no\0" -"nebraska.museum\0" -"bellevue.museum\0" -"abo.pa\0k12.al.us\0" -"info.ki\0" -"inf.cu\0sv.it\0" -"jfk.museum\0" -"!city.osaka.jp\0swinoujscie.pl\0" -"bydgoszcz.pl\0" -"!city.kyoto.jp\0" -"uvic.museum\0" -"madrid.museum\0steinkjer.no\0" -"lib.ma.us\0" -"sirdal.no\0" -"n\xc3\xb8tter\xc3\xb8y.no\0" -"taranto.it\0starnberg.museum\0" -"vic.gov.au\0pvt.ge\0pors\xc3\xa1\xc5\x8bgu.no\0" -"naroy.no\0ris\xc3\xb8r.no\0" -"va.it\0salem.museum\0starachowice.pl\0" -"!nawrastelecom.om\0" -"town.museum\0te.ua\0" -"se.net\0" -"kemerovo.ru\0" -"lerdal.no\0" -"gs.va.no\0" -"kms.ru\0" -"consulado.st\0" +"langevag.no\0" +"tinn.no\0" +"\xe7\xbd\x91\xe7\xbb\x9c.hk\0" +"ens.tn\0" +"vercelli.it\0" +"ac.ae\0" +"newspaper.museum\0" +"potenza.it\0" +"komatsushima.tokushima.jp\0" +"gs.rl.no\0" +"nakayama.yamagata.jp\0abu.yamaguchi.jp\0" +"lind\xc3\xa5s.no\0pila.pl\0" +"ac.at\0tamatsukuri.ibaraki.jp\0" +"ac.be\0" +"durham.museum\0" +"sn.cn\0kadena.okinawa.jp\0atm.pl\0" "haram.no\0" -"tysnes.no\0" -"!pref.ibaraki.jp\0hamburg.museum\0" -"\xc3\xa5rdal.no\0" -"airline.aero\0" -"crew.aero\0newhampshire.museum\0" -"muenster.museum\0" -"aerodrome.aero\0" -"heroy.nordland.no\0belau.pw\0" -"kamchatka.ru\0" -"b\xc3\xa5""d\xc3\xa5""ddj\xc3\xa5.no\0lillehammer.no\0hi.us\0" -"hk.cn\0" -"!city.kobe.jp\0berlevag.no\0" -"ardal.no\0" -"askoy.no\0" -"vardo.no\0" -"fyresdal.no\0" -"sassari.it\0" -"video.hu\0drammen.no\0" -"lyngen.no\0nakhodka.ru\0" -"ip6.arpa\0games.hu\0" -"online.museum\0" -"k12.sd.us\0" -"4.bg\0sebastopol.ua\0" -"ao.it\0atlanta.museum\0" -"lebork.pl\0" -"ravenna.it\0" -"railway.museum\0songdalen.no\0" -"!pref.shimane.jp\0delaware.museum\0ed.pw\0" -"f\xc3\xb8rde.no\0" -"living.museum\0" -"juif.museum\0" -"lomza.pl\0" -"h.se\0" -"!bl.uk\0" -"portland.museum\0\xe7\xb5\x84\xe7\xb9\x94.tw\0" -"stj\xc3\xb8rdal.no\0" -"lecce.it\0" -"bz.it\0" -"farmstead.museum\0va.no\0" -"express.aero\0!nacion.ar\0" -"presse.km\0gs.of.no\0" -"\xe5\x8f\xb0\xe7\x81\xa3\0" -"og.ao\0gyeongbuk.kr\0vestv\xc3\xa5g\xc3\xb8y.no\0" -"prd.fr\0" -"pp.ru\0pp.se\0" -"forum.hu\0!pref.saga.jp\0" -"kvalsund.no\0" -"!city.kawasaki.jp\0n\xc3\xa5\xc3\xa5mesjevuemie.no\0" -"j.bg\0" -"vlaanderen.museum\0" -"cc.va.us\0" -"\xd8\xa7\xd9\x8a\xd8\xb1\xd8\xa7\xd9\x86.ir\0alabama.museum\0" -"school.museum\0her\xc3\xb8y.m\xc3\xb8re-og-romsdal.no\0" -"\xc3\xa5seral.no\0" -"traniandriabarletta.it\0" -"flog.br\0" -"presse.ml\0" -"k\xc3\xa1r\xc3\xa1\xc5\xa1johka.no\0" -"historisch.museum\0" -"farm.museum\0palmsprings.museum\0oslo.no\0dyroy.no\0stranda.no\0" -"gs.rl.no\0r\xc3\xa5""de.no\0" -"bomlo.no\0s\xc3\xb8rum.no\0" -"jan-mayen.no\0ivgu.no\0" -"coop\0" -"agr.br\0k12.ak.us\0" -"!nic.ar\0catanzaro.it\0fusa.no\0" -"hu.com\0" -"inf.mk\0" -"vet.br\0" -"k12.mt.us\0k12.nd.us\0" -"vlog.br\0\xe5\x85\xac\xe5\x8f\xb8.cn\0sandnessjoen.no\0" -"lib.az.us\0" -"nsw.edu.au\0of.no\0\xc3\xb8stre-toten.no\0" -"*.okinawa.jp\0" -"vb.it\0" -"asso.fr\0firenze.it\0" -"trieste.it\0" -"\xe5\x85\xac\xe5\x8f\xb8.hk\0" -"museet.museum\0" -"prd.km\0" -"navuotna.no\0lib.ca.us\0" -"cc.nv.us\0" -"asso.gp\0" -"meraker.no\0" -"h\xc3\xa1pmir.no\0" -"i.ph\0" -"sx.cn\0jeonnam.kr\0" -"halden.no\0" -"fed.us\0" -"medio-campidano.it\0tsk.ru\0" -"barcelona.museum\0" -"giessen.museum\0roma.museum\0" -"hl.cn\0" -"\xe0\xae\x87\xe0\xae\xb2\xe0\xae\x99\xe0\xaf\x8d\xe0\xae\x95\xe0\xaf\x88\0" -"biz.bb\0benevento.it\0rl.no\0bygland.no\0" -"port.fr\0asso.ht\0prd.mg\0" -"biz.at\0" -"tra.kp\0" -"*.aichi.jp\0khabarovsk.ru\0" -"campidano-medio.it\0" -"biz.az\0" -"newmexico.museum\0va.us\0" +"aichi.jp\0" +"mihama.aichi.jp\0" +"mizumaki.fukuoka.jp\0serveftp.net\0" +"portland.museum\0from-in.com\0" +"hagebostad.no\0" +"nara.jp\0go.pw\0" +"sa.edu.au\0ukiha.fukuoka.jp\0" +"*.ar\0nyny.museum\0" +"media.aero\0*.bd\0" +"ine.kyoto.jp\0bu.no\0" +"br.com\0" +"ac.ci\0" +"onagawa.miyagi.jp\0" +"nt.au\0" +"ac.cn\0from-tx.com\0" +"*.bn\0" +"sor-odal.no\0" +"ac.cr\0ikeda.gifu.jp\0" +"sobetsu.hokkaido.jp\0culture.museum\0zgrad.ru\0" +"tadotsu.kagawa.jp\0" +"machida.tokyo.jp\0chernigov.ua\0" +"kembuchi.hokkaido.jp\0from-mi.com\0" +"sor-aurdal.no\0" +"pippu.hokkaido.jp\0" +"nt.ca\0" +"mitoyo.kagawa.jp\0" +"*.ck\0tsuwano.shimane.jp\0gs.mr.no\0" +"toyo.kochi.jp\0" +"ky.us\0" +"tranoy.no\0" +"br\xc3\xb8nn\xc3\xb8ysund.no\0" +"hemsedal.no\0" +"rendalen.no\0" +"*.cy\0utsira.no\0" +"takasu.hokkaido.jp\0" +"correios-e-telecomunica\xc3\xa7\xc3\xb5""es.museum\0" +"tsuyama.okayama.jp\0beauxarts.museum\0" +"gr.it\0" +"firenze.it\0misugi.mie.jp\0and.museum\0" +"go.th\0" +"semboku.akita.jp\0" +"tokushima.tokushima.jp\0go.tj\0" +"buzen.fukuoka.jp\0" +"land-4-sale.us\0" +"nyc.museum\0" +"mobi\0" +"gr.jp\0" +"raisa.no\0" +"go.ug\0" +"*.er\0go.tz\0" +"*.et\0" +"vc.it\0h\xc3\xa1pmir.no\0" +"*.fj\0" +"scientist.aero\0*.fk\0yamato.kumamoto.jp\0modalen.no\0stargard.pl\0" +"ac.gn\0sumida.tokyo.jp\0" +"historisches.museum\0" +"kvits\xc3\xb8y.no\0" +"store.nf\0" +"yoka.hyogo.jp\0omachi.nagano.jp\0" +"ch.it\0" +"overhalla.no\0likescandy.com\0" +"www.ro\0se.net\0" +"nakamichi.yamanashi.jp\0" +"adm.br\0dnipropetrovsk.ua\0" +"vindafjord.no\0k12.ak.us\0is-a-rockstar.com\0" +"ac.id\0minamiechizen.fukui.jp\0" +"*.gu\0children.museum\0" +"tsu.mie.jp\0" +"fr\xc3\xa6na.no\0" +"gliwice.pl\0" +"he.cn\0aid.pl\0" +"ac.im\0kishiwada.osaka.jp\0" +"ac.in\0" "finearts.museum\0" -"murmansk.ru\0" -"\xc3\xb8rsta.no\0radom.pl\0k12.sc.us\0" -"5.bg\0kvinesdal.no\0" -"ap.it\0" -"*.fukushima.jp\0" -"asso.bj\0" -"mad.museum\0" -"lebesby.no\0" -"og.it\0glas.museum\0sauda.no\0" -"i.se\0" -"k12.tx.us\0" -"asso.ci\0mk.ua\0" -"cesena-forli.it\0" -"lowicz.pl\0" -"k12.id.us\0" -"tas.gov.au\0" -"lukow.pl\0" -"utazas.hu\0" -"maritimo.museum\0bjark\xc3\xb8y.no\0" -"adm.br\0" -"pr.it\0lib.vi.us\0" -"bergamo.it\0k12.va.us\0" -"k.bg\0" -"railroad.museum\0" -"!british-library.uk\0" -"cincinnati.museum\0" -"sorreisa.no\0" -"asso.dz\0!nel.uk\0" -"rm.it\0" -"nv.us\0" -"nx.cn\0gos.pk\0" -"vic.edu.au\0" -"biella.it\0tjome.no\0" -"r\xc3\xb8yken.no\0" -"beiarn.no\0" -"qc.ca\0" -"georgia.museum\0square.museum\0" -"labor.museum\0omasvuotna.no\0cc.la.us\0" -"br.com\0reggioemilia.it\0" -"kristiansund.no\0" -"sorum.no\0" -"orsta.no\0" -"furniture.museum\0surrey.museum\0eng.pro\0" -"asn.lv\0balat.no\0" -"lavangen.no\0sld.pa\0" -"fla.no\0k12.ms.us\0k12.nc.us\0" -"bardu.no\0" +"ac.ir\0" +"\xe5\x80\x8b\xe4\xba\xba.hk\0lucca.it\0odessa.ua\0" +"massa-carrara.it\0" +"happou.akita.jp\0colonialwilliamsburg.museum\0k12.nv.us\0" +"w.bg\0lib.in.us\0" +"*.il\0" +"scotland.museum\0" +"ac.jp\0" +"shimoda.shizuoka.jp\0is-by.us\0" +"kui.hiroshima.jp\0" +"us.na\0" +"reggio-emilia.it\0asahi.ibaraki.jp\0saintlouis.museum\0" +"kashima.saga.jp\0arboretum.museum\0" +"bandai.fukushima.jp\0" +"chikuhoku.nagano.jp\0hayakawa.yamanashi.jp\0" +"*.jm\0namikata.ehime.jp\0haibara.shizuoka.jp\0bytom.pl\0" +"furano.hokkaido.jp\0zushi.kanagawa.jp\0" +"\xe7\xbb\x84\xe7\xb9\x94.hk\0*.sendai.jp\0" +"ulan-ude.ru\0" +"ac.kr\0beardu.no\0" +"lib.gu.us\0" +"*.ke\0" +"*.kh\0" +"vinnica.ua\0" +"takahata.yamagata.jp\0" +"honjyo.akita.jp\0scienceandindustry.museum\0" +"tokorozawa.saitama.jp\0" +"meraker.no\0" +"katsuragi.nara.jp\0h\xc3\xa1mm\xc3\xa1rfeasta.no\0bialystok.pl\0" +"ac.ma\0" +"lo.it\0akagi.shimane.jp\0" +"tawaramoto.nara.jp\0obanazawa.yamagata.jp\0ac.me\0" +"genoa.it\0" +"iz.hr\0*.kw\0" +"og.ao\0yakutia.ru\0" +"taku.saga.jp\0" +"heguri.nara.jp\0" +"mansions.museum\0folldal.no\0omasvuotna.no\0" +"cherkassy.ua\0" +"trainer.aero\0" +"ac.mu\0" +"cc.wi.us\0" +"ac.mw\0ac.ng\0" +"cartoonart.museum\0" +"*.mm\0" +"paris.museum\0" +"can.museum\0" +"juedisches.museum\0from-vt.com\0" +"*.mt\0" +"narita.chiba.jp\0fukushima.hokkaido.jp\0" +"awaji.hyogo.jp\0" +"lodi.it\0is-uberleet.com\0" +"*.ni\0" +"*.mz\0" +"engerdal.no\0" +"square.museum\0" +"saroma.hokkaido.jp\0neues.museum\0" +"reggiocalabria.it\0" +"*.np\0ac.pa\0" +"mb.ca\0seika.kyoto.jp\0" +"higashiagatsuma.gunma.jp\0iizuna.nagano.jp\0nesoddtangen.no\0" +"nakatane.kagoshima.jp\0" +"nt.no\0" +"tendo.yamagata.jp\0brandywinevalley.museum\0" +"*.nz\0" +"kunitachi.tokyo.jp\0" +"b\xc3\xa6rum.no\0" +"*.om\0tuva.ru\0" +"balat.no\0" +"sue.fukuoka.jp\0" +"iwata.shizuoka.jp\0tysvar.no\0ac.pr\0" +"skodje.no\0" +"ama.shimane.jp\0illustration.museum\0idrett.no\0" +"better-than.tv\0" +"ashiya.fukuoka.jp\0leksvik.no\0" +"*.pg\0wloclawek.pl\0t.se\0" +"mie.jp\0" +"kawamata.fukushima.jp\0" "donostia.museum\0" -"club.tw\0" -"elburg.museum\0" -"gs.hl.no\0lodingen.no\0" -"samara.ru\0" -"vc.it\0*.nagasaki.jp\0" -"fosnes.no\0" -"fuel.aero\0" +"is-a-chef.org\0" +"guernsey.museum\0" +"saku.nagano.jp\0" +"minamisanriku.miyagi.jp\0" +"penza.ru\0" +"ta.it\0" +"kawanabe.kagoshima.jp\0" +"ac.rs\0" +"okayama.okayama.jp\0kamiizumi.saitama.jp\0annefrank.museum\0" +"association.aero\0gushikami.okinawa.jp\0ac.ru\0ac.se\0" +"zentsuji.kagawa.jp\0" +"ac.rw\0" +"nagahama.shiga.jp\0narusawa.yamanashi.jp\0" +"telekommunikation.museum\0" +"crew.aero\0" +"services.aero\0" +"gx.cn\0konan.shiga.jp\0" +"misaki.osaka.jp\0" +"fukui.fukui.jp\0toya.hokkaido.jp\0toyonaka.osaka.jp\0" +"sugito.saitama.jp\0" +"cc.ne.us\0" +"hornindal.no\0" +"noda.iwate.jp\0" +"wakkanai.hokkaido.jp\0nt.ro\0" +"ac.th\0" +"ringsaker.no\0" +"ac.sz\0ac.tj\0" +"arq.br\0nnov.ru\0" +"itami.hyogo.jp\0kashiwazaki.niigata.jp\0" +"z.bg\0" +"eti.br\0showa.gunma.jp\0unnan.shimane.jp\0sos.pl\0" +"rishiri.hokkaido.jp\0" +"aso.kumamoto.jp\0" +"store.ro\0" +"otofuke.hokkaido.jp\0" +"*.sv\0ac.ug\0" +"ae.org\0" +"iida.nagano.jp\0kitanakagusuku.okinawa.jp\0ac.tz\0teaches-yoga.com\0" +"shimokitayama.nara.jp\0arakawa.saitama.jp\0" +"og.it\0joboji.iwate.jp\0kainan.tokushima.jp\0" +"ski.no\0" +"lib.ee\0" +"itakura.gunma.jp\0sor-fron.no\0*.tr\0" +"vf.no\0" +"astronomy.museum\0" +"takatsuki.osaka.jp\0" +"store.st\0" +"rokunohe.aomori.jp\0" +"kiyokawa.kanagawa.jp\0od.ua\0" +"kvalsund.no\0" +"ashoro.hokkaido.jp\0utazu.kagawa.jp\0ibestad.no\0*.uk\0" +"urbinopesaro.it\0lyngdal.no\0ac.vn\0" +"koshu.yamanashi.jp\0michigan.museum\0r\xc3\xb8mskog.no\0" +"kitagata.saga.jp\0omsk.ru\0" +"mashiko.tochigi.jp\0" +"kofu.yamanashi.jp\0" +"mb.it\0" +"medizinhistorisches.museum\0" +"inuyama.aichi.jp\0dnsalias.org\0is-a-chef.com\0" +"otaki.nagano.jp\0austrheim.no\0" +"ar.com\0" +"0.bg\0anthropology.museum\0hvaler.no\0shop.pl\0" +"lib.va.us\0" +"fukusaki.hyogo.jp\0baths.museum\0culturalcenter.museum\0" +"show.aero\0iraq.museum\0r\xc3\xa1hkker\xc3\xa1vju.no\0" +"kamakura.kanagawa.jp\0toyono.osaka.jp\0" +"vega.no\0" +"sumoto.hyogo.jp\0film.museum\0" +"kadogawa.miyazaki.jp\0garden.museum\0" +"schokoladen.museum\0!nls.uk\0" +"konskowola.pl\0" +"legnica.pl\0" +"caltanissetta.it\0wajima.ishikawa.jp\0" +"mragowo.pl\0" +"hattfjelldal.no\0" +"kuwana.mie.jp\0" +"tsuga.tochigi.jp\0" +"itayanagi.aomori.jp\0v\xc3\xa5gan.no\0" +"museumvereniging.museum\0zp.ua\0" +"kawanehon.shizuoka.jp\0" +"american.museum\0" +"dolls.museum\0" +"\xe0\xa6\xad\xe0\xa6\xbe\xe0\xa6\xb0\xe0\xa6\xa4\0" +"hiroshima.jp\0betainabox.com\0" +"kawaba.gunma.jp\0" +"*.ye\0" +"law.pro\0" +"kin.okinawa.jp\0skj\xc3\xa5k.no\0" +"is-a-conservative.com\0" +"americana.museum\0k12.vi.us\0" +"yamada.toyama.jp\0" +"miasa.nagano.jp\0" +"conf.au\0" +"aure.no\0*.za\0" +"oizumi.gunma.jp\0lodingen.no\0" +"from-or.com\0" "qc.com\0" -"skjervoy.no\0" -"bill.museum\0kv\xc3\xa6""fjord.no\0" -"skydiving.aero\0*.tokushima.jp\0" -"!congresodelalengua3.ar\0laquila.it\0k12.ct.us\0" -"gorge.museum\0linz.museum\0sherbrooke.museum\0" -"tranoy.no\0ing.pa\0" -"ptz.ru\0" -"kr.it\0prato.it\0stat.no\0" +"fc.it\0farmequipment.museum\0w.se\0" +"vi.it\0" +"archaeological.museum\0moss.no\0" +"khakassia.ru\0*.zm\0isteingeek.de\0" +"izumi.kagoshima.jp\0imageandsound.museum\0" +"suisse.museum\0gu.us\0" +"tajiri.osaka.jp\0" +"*.zw\0" +"kiyosato.hokkaido.jp\0" +"takaharu.miyazaki.jp\0" +"takanabe.miyazaki.jp\0" +"paroch.k12.ma.us\0" +"hatsukaichi.hiroshima.jp\0" +"cn.it\0" +"ranzan.saitama.jp\0" +"murmansk.ru\0" +"hamburg.museum\0" +"es.kr\0heroy.nordland.no\0" +"barletta-trani-andria.it\0lib.me.us\0" +"hob\xc3\xb8l.no\0" +"ck.ua\0" +"gov\0" +"city.hu\0fhs.no\0" +"hk.cn\0" +"ascolipiceno.it\0motorcycle.museum\0skanland.no\0" +"qld.edu.au\0" +"cc.nh.us\0" +"gub.uy\0" +"trani-andria-barletta.it\0birkenes.no\0is-a-cpa.com\0" +"trapani.it\0" +"art.br\0kibichuo.okayama.jp\0tananger.no\0" +"otama.fukushima.jp\0kiho.mie.jp\0" +"nose.osaka.jp\0nakagawa.tokushima.jp\0" +"is-slick.com\0" +"assn.lk\0\xe5\x95\x86\xe6\xa5\xad.tw\0" +"from-ga.com\0" +"\xe6\x96\xb0\xe5\x8a\xa0\xe5\x9d\xa1\0" +"cc.ks.us\0" +"kamagaya.chiba.jp\0grp.lk\0" +"hioki.kagoshima.jp\0" +"nagato.yamaguchi.jp\0" +"control.aero\0gliding.aero\0tsumagoi.gunma.jp\0nishitosa.kochi.jp\0" +"kitadaito.okinawa.jp\0" +"art.do\0zoological.museum\0" +"toyako.hokkaido.jp\0plo.ps\0" +"cq.cn\0kadoma.osaka.jp\0basel.museum\0" +"osakikamijima.hiroshima.jp\0" +"elverum.no\0cc.in.us\0" +"shingu.hyogo.jp\0" +"art.dz\0" +"avoues.fr\0lu.it\0me.it\0nerima.tokyo.jp\0" +"military.museum\0" +"satosho.okayama.jp\0" +"st.no\0" +"3.bg\0yamagata.ibaraki.jp\0humanities.museum\0" +"championship.aero\0" +"does-it.net\0" +"higashi.fukushima.jp\0" +"taxi.br\0" +"kharkiv.ua\0" +"ushuaia.museum\0" +"kumano.mie.jp\0" +"unsa.ba\0shimamoto.osaka.jp\0wodzislaw.pl\0" +"yokosuka.kanagawa.jp\0is-leet.com\0" +"jevnaker.no\0" +"minamiashigara.kanagawa.jp\0" +"ryugasaki.ibaraki.jp\0" +"tsuno.kochi.jp\0flora.no\0kuzbass.ru\0" +"nesna.no\0" +"yachiyo.chiba.jp\0civilwar.museum\0" +"matsumae.hokkaido.jp\0" +"kumatori.osaka.jp\0namsskogan.no\0" +"knowsitall.info\0" +"linz.museum\0" +"sakuragawa.ibaraki.jp\0" +"toride.ibaraki.jp\0traeumtgerade.de\0" +"store.bb\0jolster.no\0" +"pilots.museum\0" +"asia\0" +"kustanai.ru\0" +"art.ht\0" +"pubol.museum\0" +"england.museum\0" +"shimizu.shizuoka.jp\0kartuzy.pl\0" +"volgograd.ru\0" +"tateyama.toyama.jp\0" +"augustow.pl\0" +"askoy.no\0z.se\0" +"obama.nagasaki.jp\0k12.ca.us\0" +"higashine.yamagata.jp\0wales.museum\0" +"kiwa.mie.jp\0izena.okinawa.jp\0" +"js.cn\0kanna.gunma.jp\0from-tn.com\0" +"brescia.it\0" +"aip.ee\0otoineppu.hokkaido.jp\0" +"sakyo.kyoto.jp\0kami.miyagi.jp\0" +"serveftp.org\0" +"miyama.fukuoka.jp\0hakui.ishikawa.jp\0" +"adv.br\0" +"exeter.museum\0" +"nichinan.tottori.jp\0vi.us\0" +"enna.it\0" +"flor\xc3\xb8.no\0" +"cn.ua\0" +"from-co.net\0" +"hn.cn\0" +"andria-barletta-trani.it\0" +"himeshima.oita.jp\0" +"boleslawiec.pl\0" +"nishiarita.saga.jp\0" +"al.it\0sydney.museum\0" +"washingtondc.museum\0" +"iglesiascarbonia.it\0kanuma.tochigi.jp\0" +"educator.aero\0" +"from-ny.net\0" +"watchandclock.museum\0" +"frog.museum\0" +"takamori.kumamoto.jp\0" +"is-a-blogger.com\0" +"habmer.no\0" +"consulting.aero\0" +"ogawa.saitama.jp\0" +"fi.cr\0" +"hanggliding.aero\0" +"minamiise.mie.jp\0\xc3\xa5lg\xc3\xa5rd.no\0" +"ueda.nagano.jp\0lebtimnetz.de\0" +"karelia.ru\0" +"zlg.br\0koge.tottori.jp\0" +"kvitsoy.no\0" +"vagsoy.no\0" +"time.no\0" +"toyotomi.hokkaido.jp\0" +"tj.cn\0nes.akershus.no\0" +"med.br\0fujioka.gunma.jp\0" +"imakane.hokkaido.jp\0" +"yamakita.kanagawa.jp\0" +"okinoshima.shimane.jp\0" +"gs.jan-mayen.no\0" +"kasugai.aichi.jp\0" +"texas.museum\0" +"tsugaru.aomori.jp\0miyawaka.fukuoka.jp\0otsuki.yamanashi.jp\0" +"6.bg\0suedtirol.it\0" +"koya.wakayama.jp\0" +"shikokuchuo.ehime.jp\0" "\xd0\xb8\xd0\xba\xd0\xbe\xd0\xbc.museum\0" -"cosenza.it\0" -"stj\xc3\xb8rdalshalsen.no\0" -"finland.museum\0leka.no\0cc.pr.us\0" -"historichouses.museum\0s\xc3\xa1l\xc3\xa1t.no\0" -"venice.it\0" -"biz.ki\0" -"g\xc3\xa1ls\xc3\xa1.no\0" -"\xe7\xbb\x84\xe7\xbb\x87.hk\0" -"*.yamanashi.jp\0" -"rad\xc3\xb8y.no\0" -"6.bg\0" -"fareast.ru\0" -"paragliding.aero\0ba.it\0aq.it\0" -"sk\xc3\xa5nland.no\0" -"its.me\0" -"us.na\0" -"hl.no\0cc.ga.us\0" -"ac\0granvin.no\0" -"ad\0qld.edu.au\0!city.sapporo.jp\0" -"ae\0" -"af\0" -"ag\0crotone.it\0" -"dallas.museum\0" -"ai\0brussels.museum\0" -"dali.museum\0" -"la.us\0" -"al\0salzburg.museum\0" -"am\0" -"an\0cl.it\0" -"ao\0" -"aq\0ba\0" -"bb\0" -"as\0lajolla.museum\0" -"at\0" -"be\0" -"bf\0inderoy.no\0snz.ru\0" -"aw\0bg\0" -"ax\0bh\0cim.br\0ltd.gi\0biz.mv\0" -"bi\0xz.cn\0\xe7\xb5\x84\xe7\xb9\x94.hk\0biz.mw\0" -"az\0bj\0" -"bm\0tranibarlettaandria.it\0naamesjevuemie.no\0" -"chattanooga.museum\0" -"bo\0" -"l.bg\0" -"ca\0" -"br\0stateofdelaware.museum\0" -"bs\0cc\0" -"cd\0biz.nr\0" -"cf\0berlev\xc3\xa5g.no\0" -"bw\0cg\0snaase.no\0" -"ch\0harvestcelebration.museum\0ck.ua\0" -"by\0ci\0" -"bz\0bahccavuotna.no\0" -"cl\0yuzhno-sakhalinsk.ru\0" -"cm\0halsa.no\0lyngdal.no\0" -"cn\0" -"co\0rn.it\0childrens.museum\0frankfurt.museum\0" -"cr\0" -"pskov.ru\0" -"cu\0de\0" -"cv\0fr.it\0lib.ky.us\0" -"aseral.no\0kvam.no\0" -"cx\0hellas.museum\0" -"hof.no\0" -"cz\0dj\0k12.la.us\0" -"dk\0moscow.museum\0" -"sosnowiec.pl\0" -"dm\0biz.pk\0" -"schokoladen.museum\0biz.pl\0" -"far.br\0arna.no\0tynset.no\0" -"even\xc3\xa1\xc5\xa1\xc5\xa1i.no\0" -"ec\0" -"biz.pr\0" -"ee\0celtic.museum\0" -"scientist.aero\0modern.museum\0" -"pr.us\0" -"dz\0" -"mj\xc3\xb8ndalen.no\0s\xc3\xb8r-odal.no\0" -"!nic.tr\0" -"conference.aero\0vestnes.no\0k12.mn.us\0" -"!pref.hiroshima.jp\0" -"es\0trapani.it\0" -"fermo.it\0vard\xc3\xb8.no\0" -"eu\0gs.hm.no\0r\xc3\xb8""d\xc3\xb8y.no\0stordal.no\0" -"gc.ca\0!nhs.uk\0" -"jgora.pl\0" -"fi\0stjordal.no\0" -"fm\0!mediaphone.om\0" -"kirov.ru\0pvt.k12.ma.us\0" -"fo\0" -"ga\0hyllestad.no\0" -"gov.ac\0fr\0andriabarlettatrani.it\0ga.us\0" -"gov.ae\0gd\0estate.museum\0" -"gov.af\0ge\0tolga.no\0" -"gf\0asso.re\0cc.oh.us\0" -"gg\0florida.museum\0" -"presse.ci\0gh\0" -"gi\0k12.dc.us\0" -"ltd.lk\0orland.no\0" -"gov.al\0" -"gl\0tokke.no\0" -"hanggliding.aero\0gm\0" -"hareid.no\0" -"gov.ba\0tj.cn\0gp\0" -"gov.bb\0gq\0" -"gov.as\0gr\0agrigento.it\0lc.it\0" -"gs\0kalmykia.ru\0aero.tt\0" -"gov.bf\0" -"county.museum\0" -"gov.bh\0hn.cn\0gw\0" -"gov.az\0gy\0assn.lk\0guernsey.museum\0" -"hk\0" -"gov.bm\0h\xc3\xa6gebostad.no\0biz.tj\0" -"hm\0computer.museum\0" -"gov.bo\0hn\0kl\xc3\xa6""bu.no\0" -"pulawy.pl\0" -"gov.br\0" -"trd.br\0gov.bs\0hr\0reggio-calabria.it\0historyofscience.museum\0lipetsk.ru\0" -"gov.cd\0*.nagoya.jp\0" -"ht\0id\0spjelkavik.no\0" -"hu\0ie\0aero.mv\0" -"marketplace.aero\0mn.it\0biz.tt\0" -"gov.by\0saintlouis.museum\0mer\xc3\xa5ker.no\0" -"gov.bz\0" -"7.bg\0gov.cl\0virtual.museum\0" -"gov.cm\0vennesla.no\0kr.ua\0" -"gov.cn\0im\0ar.it\0galsa.no\0rovno.ua\0" -"gov.co\0in\0" -"io\0limanowa.pl\0" -"iq\0k12.ga.us\0" -"ir\0" -"riik.ee\0is\0\xc3\xa1laheadju.no\0" -"gov.cu\0it\0hawaii.museum\0seaport.museum\0" -"je\0pubol.museum\0hm.no\0" -"gov.cx\0" -"*.chiba.jp\0" -"*.kawasaki.jp\0" -"k.se\0" -"gov.dm\0" -"aland.fi\0vik.no\0" -"yk.ca\0jo\0kobierzyce.pl\0" -"jp\0biz.vn\0" -"presse.fr\0lib.il.us\0\xe9\xa6\x99\xe6\xb8\xaf\0" -"gov.ec\0" -"transport.museum\0bronnoy.no\0" -"slg.br\0gov.ee\0asso.nc\0bievat.no\0" -"nyny.museum\0" -"kg\0" -"mo-i-rana.no\0" -"gov.dz\0ki\0" +"kameyama.mie.jp\0missile.museum\0" +"fhv.se\0hu.com\0" +"art.pl\0" +"tamano.okayama.jp\0" +"taketa.oita.jp\0" +"\xc3\xb8yer.no\0oystre-slidre.no\0rad\xc3\xb8y.no\0" +"me.tz\0" +"takahagi.ibaraki.jp\0steam.museum\0" +"technology.museum\0" +"med.ec\0asakuchi.okayama.jp\0" +"med.ee\0stavanger.no\0merseine.nu\0" +"al.no\0porsangu.no\0" +"stavern.no\0me.us\0" +"lib.ct.us\0" +"emp.br\0tr\xc3\xa6na.no\0" +"kayabe.hokkaido.jp\0" +"sekigahara.gifu.jp\0" +"udine.it\0shacknet.nu\0" +"presse.km\0posts-and-telecommunications.museum\0" +"is-a-chef.net\0" +"gokase.miyazaki.jp\0" +"choshi.chiba.jp\0podhale.pl\0" +"archaeology.museum\0" +"localhistory.museum\0" +"krasnoyarsk.ru\0" +"minamidaito.okinawa.jp\0yorkshire.museum\0" +"lavangen.no\0" +"oyamazaki.kyoto.jp\0" +"nagasaki.nagasaki.jp\0" +"\xc3\xa1laheadju.no\0" +"kameoka.kyoto.jp\0" +"bielawa.pl\0\xd8\xa7\xd9\x84\xd8\xac\xd8\xb2\xd8\xa7\xd8\xa6\xd8\xb1\0" +"\xd7\x99\xd7\xa8\xd7\x95\xd7\xa9\xd7\x9c\xd7\x99\xd7\x9d.museum\0art.sn\0from-pr.com\0" +"takata.fukuoka.jp\0dielddanuorri.no\0" +"fujisato.akita.jp\0association.museum\0" +"gouv.fr\0fi.it\0presse.ml\0" +"nakagawa.hokkaido.jp\0" +"tanabe.wakayama.jp\0" "monmouth.museum\0" -"suldal.no\0" -"bc.ca\0km\0zt.ua\0" -"pt.it\0kn\0" -"fineart.museum\0" -"la\0" -"kr\0gulen.no\0" -"m.bg\0mo.cn\0lc\0alaheadju.no\0g\xc3\xa1\xc5\x8bgaviika.no\0" -"nowaruda.pl\0cc.ut.us\0" -"br\xc3\xb8nn\xc3\xb8y.no\0" -"ky\0li\0overhalla.no\0" -"kz\0khv.ru\0" -"lk\0" -"artdeco.museum\0" -"ma\0fortworth.museum\0kostroma.ru\0" -"ro.it\0kirkenes.no\0vestby.no\0" -"urbino-pesaro.it\0ls\0mc\0alstahaug.no\0" -"blog.br\0gov.ge\0lt\0md\0" -"lu\0me\0botanicgarden.museum\0" -"gov.gg\0lv\0oh.us\0" -"gov.gh\0mg\0valley.museum\0" -"gov.gi\0mh\0" -"ly\0sandiego.museum\0" -"mk\0" -"ml\0" -"gov.gn\0rollag.no\0naklo.pl\0" -"mn\0" -"mo\0" -"mp\0leirvik.no\0" -"gov.gr\0mq\0na\0cc.ks.us\0" -"mr\0" -"ms\0nc\0" -"valer.hedmark.no\0" -"mu\0ne\0" -"mv\0nf\0" -"mw\0" -"mx\0nord-odal.no\0jur.pro\0" -"my\0" -"gov.hk\0name.hr\0" -"nl\0" -"astronomy.museum\0lib.nm.us\0" -"catania.it\0" -"no\0" -"skjerv\xc3\xb8y.no\0" -"k12.ne.us\0" -"monza-e-della-brianza.it\0!pref.fukushima.jp\0nr\0" -"gov.ie\0" -"stuttgart.museum\0nu\0cc.mn.us\0" -"karasjohka.no\0" -"engine.aero\0bearalvahki.no\0" -"oyer.no\0" -"ve.it\0" -"gov.im\0froland.no\0cc.ar.us\0" -"gov.in\0magadan.ru\0" -"pescara.it\0" -"gov.iq\0usdecorativearts.museum\0" -"gov.ir\0pa\0" -"gov.is\0" -"gov.it\0lavagis.no\0" -"gov.je\0" -"naustdal.no\0pe\0k12.or.us\0" -"gd.cn\0carraramassa.it\0pf\0" -"ph\0" -"cc.ny.us\0" -"rissa.no\0" -"info\0pk\0pomorze.pl\0" -"pl\0" -"gov.jo\0asso.km\0pn\0" -"*.okayama.jp\0cieszyn.pl\0" -"freight.aero\0" -"pr\0" -"narvik.no\0ps\0" -"!pref.aichi.jp\0elverum.no\0pt\0" -"edunet.tn\0" -"gov.kg\0" -"flatanger.no\0marker.no\0pw\0" -"gov.ki\0nuremberg.museum\0" -"aip.ee\0" -"gov.km\0" -"gov.kn\0" -"gov.kp\0" -"rieti.it\0gov.la\0bajddar.no\0" -"gov.lb\0aviation.museum\0" -"gov.lc\0" -"asso.mc\0" -"re\0" -"ut.us\0" -"sa.gov.au\0gov.ky\0" -"mo.it\0gov.kz\0" -"gov.lk\0" -"iraq.museum\0" -"badajoz.museum\0" -"8.bg\0inder\xc3\xb8y.no\0" -"monticello.museum\0ro\0ks.ua\0" -"gov.ma\0svizzera.museum\0" -"gov.lr\0sa\0" -"matera.it\0sb\0" -"gov.lt\0rs\0sc\0" -"gov.me\0sd\0" -"gov.lv\0ru\0se\0" -"gov.mg\0" -"rw\0sg\0" -"gov.ly\0assisi.museum\0kids.museum\0sh\0" -"si\0" -"gov.mk\0" -"gov.ml\0sk\0" -"sl\0" -"gov.mn\0airguard.museum\0sm\0" -"gov.mo\0l.se\0sn\0" -"so\0" -"gov.mr\0ks.us\0" -"name.az\0sr\0" -"naturhistorisches.museum\0tc\0" -"trainer.aero\0cn.it\0urbinopesaro.it\0gov.mu\0nativeamerican.museum\0st\0td\0" -"gov.mv\0su\0" -"trentino.it\0gov.mw\0gov.ng\0tf\0" -"tg\0" -"co.ae\0venezia.it\0gov.my\0th\0" -"!pref.ehime.jp\0sy\0" -"co.ag\0lewismiller.museum\0ostrowiec.pl\0sz\0tj\0" -"tk\0" -"motorcycle.museum\0tl\0" -"birdart.museum\0trogstad.no\0tm\0" -"tn\0" -"humanities.museum\0to\0" -"pu.it\0gov.nr\0ua\0lib.ut.us\0" -"co.ao\0" -"co.ba\0trondheim.no\0tt\0" -"in-addr.arpa\0tempioolbia.it\0!city.yokohama.jp\0mn.us\0" -"n.bg\0schoenbrunn.museum\0tv\0" -"co.at\0aremark.no\0tw\0ug\0" -"jus.br\0" -"co.bi\0bialowieza.pl\0ar.us\0" -"audnedaln.no\0kustanai.ru\0" -"va\0" -"us\0vc\0" -"newport.museum\0" -"kopervik.no\0gov.ph\0vg\0" -"ny.us\0vi\0" -"co.bw\0finn\xc3\xb8y.no\0gov.pk\0uz\0" -"honefoss.no\0gov.pl\0lanbib.se\0" -"co.ci\0" -"gov.pn\0intl.tn\0" -"act.gov.au\0vn\0" -"television.museum\0gov.pr\0" -"sykkylven.no\0v\xc3\xa5ler.hedmark.no\0gov.ps\0" -"gov.pt\0" -"co.cr\0vu\0" -"legnica.pl\0" -"sa.au\0" -"bjarkoy.no\0" -"openair.museum\0birkenes.no\0lib.nj.us\0" -"fylkesbibl.no\0holt\xc3\xa5len.no\0" -"iz.hr\0" -"ws\0" -"oceanographique.museum\0" -"b\xc3\xa1id\xc3\xa1r.no\0cc.mo.us\0" -"\xc3\xb8ygarden.no\0" -"contemporary.museum\0" -"gb.com\0cc.as.us\0" -"belluno.it\0gov.sa\0" -"gov.sb\0" -"gov.rs\0gov.sc\0" -"gov.sd\0" -"!pref.nagasaki.jp\0gov.ru\0" -"asia\0" -"sa.cr\0gov.rw\0gov.sg\0" -"kuzbass.ru\0" -"gs.vf.no\0" -"gov.sl\0" -"norfolk.museum\0" -"k12.de.us\0" -"mil\0" -"rendalen.no\0" -"gov.st\0" -"agro.pl\0" -"orkdal.no\0" -"le.it\0gov.sy\0" -"gov.tj\0" -"co.gg\0nore-og-uvdal.no\0v\xc3\xa5ler.\xc3\xb8stfold.no\0" -"gov.tl\0" -"gov.tn\0" -"gov.to\0" -"kids.us\0" -"equipment.aero\0gov.ua\0" -"!city.niigata.jp\0gov.tt\0" -"sel.no\0" -"l\xc3\xa4ns.museum\0" -"gov.tw\0" -"rennebu.no\0" -"egersund.no\0" -"medecin.km\0" -"co.gy\0" -"!mecon.ar\0" -"berlin.museum\0" -"carrara-massa.it\0" -"9.bg\0" -"pri.ee\0gov.vc\0" -"at.it\0" -"muosat.no\0" -"co.id\0" -"co.hu\0" -"etne.no\0" -"\xc3\xa1lt\xc3\xa1.no\0" -"gov.vn\0" -"modelling.aero\0" -"co.im\0" -"co.in\0\xc3\xa5krehamn.no\0m.se\0" -"gouv.fr\0*.kitakyushu.jp\0" -"narviika.no\0" -"rennes\xc3\xb8y.no\0" -"co.ir\0afjord.no\0" -"lea\xc5\x8bgaviika.no\0buryatia.ru\0" -"co.it\0coastaldefence.museum\0" -"co.je\0vf.no\0" -"osteroy.no\0" -"uslivinghistory.museum\0" -"aerobatic.aero\0" -"mesaverde.museum\0mining.museum\0" -"a\xc3\xa9roport.ci\0gov.ws\0" -"co.jp\0copenhagen.museum\0" -"pv.it\0" -"r\xc3\xb8mskog.no\0" -"vossevangen.no\0porsanger.no\0" -"salat.no\0mo.us\0" -"o.bg\0imperia.it\0carrier.museum\0" -"carbonia-iglesias.it\0" -"as.us\0" -"alvdal.no\0" -"state.museum\0mandal.no\0cn.ua\0" -"cuneo.it\0" +"dyr\xc3\xb8y.no\0" +"takikawa.hokkaido.jp\0urakawa.hokkaido.jp\0" +"shibecha.hokkaido.jp\0" +"sand\xc3\xb8y.no\0" +"collection.museum\0" +"kusatsu.gunma.jp\0" +"pulawy.pl\0" +"monticello.museum\0" +"med.ht\0" +"ct.it\0otago.museum\0alaheadju.no\0" +"omotego.fukushima.jp\0name\0" +"balsan.it\0" +"ogi.saga.jp\0" +"okawa.fukuoka.jp\0" +"norfolk.museum\0n\xc3\xa6r\xc3\xb8y.no\0" "gouv.ht\0" -"!city.okayama.jp\0co.kr\0" -"co.lc\0" -"sa.it\0" -"donna.no\0" -"sortland.no\0" -"tomsk.ru\0" -"birthplace.museum\0l\xc3\xb8""dingen.no\0" -"ge.it\0orenburg.ru\0" -"cn.com\0" -"co.ma\0" -"co.ls\0skaun.no\0name.vn\0" -"navigation.aero\0" -"cagliari.it\0co.me\0portal.museum\0" +"kaminokawa.tochigi.jp\0" +"hammerfest.no\0" +"hiraya.nagano.jp\0settlement.museum\0" +"toei.aichi.jp\0santabarbara.museum\0" +"\xc3\xb8rsta.no\0" +"ao.it\0sano.tochigi.jp\0jondal.no\0" +"re.it\0" +"kamitsue.oita.jp\0" +"sola.no\0" +"laspezia.it\0luzern.museum\0salat.no\0stv.ru\0est-a-la-maison.com\0" +"avocat.fr\0sm\xc3\xb8la.no\0" +"bando.ibaraki.jp\0kawakami.nara.jp\0" +"*.kawasaki.jp\0ngo.lk\0" "gouv.bj\0" -"udine.it\0" -"engineer.aero\0" -"szczecin.pl\0" -"wales.museum\0" -"co.na\0bo.telemark.no\0" -"austin.museum\0" -"k12.mo.us\0" -"co.mu\0" -"gouv.ci\0" -"co.mw\0" -"esp.br\0" -"naturalhistorymuseum.museum\0" -"mosjoen.no\0" -"solund.no\0" -"name.tj\0" -"sand\xc3\xb8y.no\0" -"kunstunddesign.museum\0" -"cartoonart.museum\0collection.museum\0gsm.pl\0" -"aure.no\0" -"!pref.yamaguchi.jp\0historical.museum\0" -"name.tt\0" -"england.museum\0valle.no\0" -"cc.ok.us\0" -"salangen.no\0" -"gloppen.no\0" -"cc.co.us\0" -"contemporaryart.museum\0" -"tas.edu.au\0" -"trading.aero\0" -"mazury.pl\0" -"!pref.aomori.jp\0co.pl\0" -"opoczno.pl\0" -"*.kobe.jp\0co.pn\0" -"oppegard.no\0" -"co.pw\0" -"saltdal.no\0smolensk.ru\0" -"na.it\0\xc4\x8d\xc3\xa1hcesuolo.no\0" -"vgs.no\0evenassi.no\0" -"parachuting.aero\0jl.cn\0maritime.museum\0bd.se\0" -"badaddja.no\0" -"bergen.no\0" -"brussel.museum\0" -"avoues.fr\0" -"cesenaforli.it\0" -"oregontrail.museum\0" -"ullensaker.no\0" -"jobs\0" -"accident-prevention.aero\0" -"n.se\0" -"association.museum\0california.museum\0" -"cultural.museum\0co.rs\0" -"zoology.museum\0" -"pruszkow.pl\0" -"control.aero\0nt.edu.au\0net\0komforb.se\0" -"lincoln.museum\0aurland.no\0name.pr\0co.rw\0" -"ostroleka.pl\0" -"isernia.it\0" -"tm.fr\0" -"gs.ol.no\0" -"nb.ca\0marnardal.no\0" -"williamsburg.museum\0" -"!jet.uk\0" -"suisse.museum\0\xc3\xa5""fjord.no\0flakstad.no\0" -"karmoy.no\0" -"yn.cn\0chesapeakebay.museum\0" -"nsw.au\0" -"amur.ru\0co.st\0" -"imb.br\0siellak.no\0\xe7\xb6\xb2\xe8\xb7\xaf.tw\0" -"name.na\0" -"co.th\0" -"p.bg\0" -"co.sz\0co.tj\0" -"name.mv\0\xc3\xa5lesund.no\0lib.in.us\0" -"lucerne.museum\0naumburg.museum\0" -"society.museum\0name.my\0" -"tinn.no\0" -"co.tt\0" -"unj\xc3\xa1rga.no\0" -"co.ug\0" -"lib.wy.us\0" -"co.tz\0" -"ass.km\0" -"ok.us\0" -"tm.hu\0kongsvinger.no\0" -"ibestad.no\0" -"juedisches.museum\0co.us\0" -"cq.cn\0" -"rs.ba\0" -"wa.edu.au\0co.vi\0" -"co.uz\0" -"health.museum\0" -"grue.no\0" -"automotive.museum\0journalism.museum\0settlement.museum\0" -"qh.cn\0interactive.museum\0" -"snillfjord.no\0!national-library-scotland.uk\0" -"balsfjord.no\0lib.nh.us\0" -"kolobrzeg.pl\0" -"gs.tm.no\0" -"h\xc3\xb8nefoss.no\0" -"ol.no\0" -"music.museum\0moareke.no\0" -"b\xc3\xb8.nordland.no\0" -"name.mk\0lier.no\0" -"eidfjord.no\0" -"sc.cn\0tm.km\0" -"jelenia-gora.pl\0sanok.pl\0" -"intelligence.museum\0" -"srv.br\0elblag.pl\0" -"judygarland.museum\0" -"padua.it\0" -"k12.co.us\0" -"lindesnes.no\0" -"name.jo\0izhevsk.ru\0" -"yorkshire.museum\0mel\xc3\xb8y.no\0" -"tm.mc\0lib.pr.us\0" -"hjartdal.no\0" +"sennan.osaka.jp\0" +"greta.fr\0" +"minamiuonuma.niigata.jp\0h\xc3\xa1""bmer.no\0" +"sanuki.kagawa.jp\0" +"cosenza.it\0kota.aichi.jp\0takko.aomori.jp\0" +"gamvik.no\0" +"kaneyama.fukushima.jp\0cc.ky.us\0" +"stjohn.museum\0" +"habikino.osaka.jp\0askim.no\0" +"gouv.ci\0musashimurayama.tokyo.jp\0" +"gs.bu.no\0" +"teshikaga.hokkaido.jp\0al.us\0" +"re.kr\0" +"kyotamba.kyoto.jp\0minnesota.museum\0" +"ise.mie.jp\0" +"med.ly\0" +"safety.aero\0kyonan.chiba.jp\0koga.ibaraki.jp\0skedsmokorset.no\0" +"!www.ck\0sherbrooke.museum\0" +"\xe7\xb6\xb2\xe7\xb5\xa1.cn\0" +"b\xc3\xa1jddar.no\0" +"fuchu.toyama.jp\0conf.lv\0" +"yonabaru.okinawa.jp\0" +"9.bg\0ujiie.tochigi.jp\0" +"numata.hokkaido.jp\0luroy.no\0sortland.no\0" +"yamamoto.miyagi.jp\0" +"morimachi.shizuoka.jp\0" +"iijima.nagano.jp\0ichikawamisato.yamanashi.jp\0upow.gov.pl\0" +"losangeles.museum\0" +"club.aero\0" +"kommunalforbund.se\0" +"drangedal.no\0" +"ngo.ph\0" +"tur.br\0" +"ngo.pl\0" +"nishinoomote.kagoshima.jp\0" +"lib.dc.us\0" +"chihayaakasaka.osaka.jp\0eastafrica.museum\0" +"leitungsen.de\0" +"aurland.no\0" +"misawa.aomori.jp\0med.pa\0" +"inabe.mie.jp\0" +"laquila.it\0" +"tm.fr\0toon.ehime.jp\0" +"kusatsu.shiga.jp\0" +"med.pl\0" +"hofu.yamaguchi.jp\0" +"mamurogawa.yamagata.jp\0vinnytsia.ua\0" +"miyota.nagano.jp\0" +"parachuting.aero\0" +"suli.hu\0" +"yasugi.shimane.jp\0" +"johana.toyama.jp\0" +"yaita.tochigi.jp\0!nawras.om\0izhevsk.ru\0" +"frei.no\0" +"kumenan.okayama.jp\0kikugawa.shizuoka.jp\0" +"vr.it\0" +"ambulance.museum\0" +"tsunan.niigata.jp\0matsubushi.saitama.jp\0" +"ichiba.tokushima.jp\0" +"tm.hu\0" +"\xe7\xb6\xb2\xe7\xb5\xa1.hk\0" +"id.au\0perugia.it\0" +"gotemba.shizuoka.jp\0fla.no\0" +"kamikoani.akita.jp\0sec.ps\0" +"med.sa\0" +"skole.museum\0" +"airport.aero\0" +"med.sd\0" +"sibenik.museum\0" +"sondre-land.no\0" +"jpn.com\0" +"shimamaki.hokkaido.jp\0" +"owariasahi.aichi.jp\0utashinai.hokkaido.jp\0hotel.tz\0" +"namie.fukushima.jp\0komi.ru\0" +"malvik.no\0lib.nj.us\0" +"k-uralsk.ru\0" +"xz.cn\0lukow.pl\0" +"iiyama.nagano.jp\0steiermark.museum\0radom.pl\0blogspot.co.at\0" +"saltdal.no\0vladivostok.ru\0" +"int\0kira.aichi.jp\0" +"flog.br\0shiranuka.hokkaido.jp\0nsk.ru\0" +"ar.it\0" +"tono.iwate.jp\0fujiidera.osaka.jp\0" +"tm.km\0" +"ct.us\0" +"kuchinotsu.nagasaki.jp\0" +"shinto.gunma.jp\0" +"trysil.no\0" +"saves-the-whales.com\0" +"off.ai\0" +"county.museum\0" +"tank.museum\0" +"is-a-hard-worker.com\0" +"pc.it\0" +"tm.mc\0kyiv.ua\0" +"onojo.fukuoka.jp\0" "tm.mg\0" -"bari.it\0milano.it\0" -"lg.jp\0" -"zgrad.ru\0" -"sm\xc3\xb8la.no\0" -"communications.museum\0" -"arts.co\0seoul.kr\0engerdal.no\0" +"onga.fukuoka.jp\0" +"a.bg\0vlog.br\0lib.id.us\0" +"kalmykia.ru\0" +"alto-adige.it\0" +"shibukawa.gunma.jp\0" +"toba.mie.jp\0" +"misato.shimane.jp\0" +"kitahata.saga.jp\0" +"for-more.biz\0" +"siellak.no\0" +"la-spezia.it\0" +"mn.it\0seljord.no\0" +"mihama.chiba.jp\0" +"miyako.fukuoka.jp\0" +"fujinomiya.shizuoka.jp\0moka.tochigi.jp\0" +"cultural.museum\0" +"tm.no\0" +"kamisato.saitama.jp\0magadan.ru\0" +"mk.ua\0" +"\xe0\xae\x87\xe0\xae\xa8\xe0\xaf\x8d\xe0\xae\xa4\xe0\xae\xbf\xe0\xae\xaf\xe0\xae\xbe\0" +"motobu.okinawa.jp\0" +"r\xc3\xb8yrvik.no\0is-a-geek.com\0" +"shizukuishi.iwate.jp\0omura.nagasaki.jp\0" +"rec.br\0kai.yamanashi.jp\0" +"monza.it\0" +"teo.br\0pescara.it\0" +"yugawa.fukushima.jp\0circus.museum\0kirkenes.no\0" +"air-surveillance.aero\0br\xc3\xb8nn\xc3\xb8y.no\0roros.no\0rnd.ru\0" +"pharmacy.museum\0gs.nt.no\0" +"bmd.br\0takizawa.iwate.jp\0bunkyo.tokyo.jp\0" +"motegi.tochigi.jp\0youth.museum\0" +"gob.bo\0tamba.hyogo.jp\0" +"lib.tx.us\0" +"kitashiobara.fukushima.jp\0" +"rec.co\0kautokeino.no\0" +"baseball.museum\0dinosaur.museum\0tm.pl\0" +"grane.no\0" "oster\xc3\xb8y.no\0" -"\xe6\x95\x8e\xe8\x82\xb2.hk\0foggia.it\0verran.no\0" -"orskog.no\0voronezh.ru\0kv.ua\0" -"av.it\0" -"tm.no\0nissedal.no\0" -"historisches.museum\0gs.mr.no\0" -"medecin.fr\0" -"montreal.museum\0" -"o.se\0" -"!metro.tokyo.jp\0sola.no\0" -"k12.tn.us\0" -"floro.no\0" -"milan.it\0*.shiga.jp\0" -"berkeley.museum\0" -"maintenance.aero\0" -"ws.na\0" -"lindas.no\0cc.ia.us\0" -"brescia.it\0embroidery.museum\0" -"arezzo.it\0tm.pl\0" -"r\xc3\xa6lingen.no\0" -"burghof.museum\0" -"rec.br\0" -"q.bg\0" -"!nawras.om\0" -"hammarfeasta.no\0" -"moss.no\0" -"on.ca\0" -"gouv.rw\0" -"luxembourg.museum\0" -"rec.co\0british.museum\0" -"reggio-emilia.it\0" -"gouv.sn\0lib.wv.us\0" -"avocat.fr\0" -"simbirsk.ru\0" -"jar.ru\0" -"monza-brianza.it\0" -"tm.ro\0" -"imageandsound.museum\0" -"jpn.com\0mr.no\0" -"siracusa.it\0" -"norilsk.ru\0tm.se\0" -"tn.it\0" -"jeju.kr\0" -"!pref.fukuoka.jp\0" -"*.hyogo.jp\0portlligat.museum\0" -"!pref.osaka.jp\0" -"siena.it\0sc.kr\0omaha.museum\0saskatchewan.museum\0" -"phoenix.museum\0vanylven.no\0" -"botanicalgarden.museum\0" -"turek.pl\0" -"vagsoy.no\0" -"riodejaneiro.museum\0" -"vi.it\0" -"uy.com\0" -"kristiansand.no\0" -"sd.cn\0trento.it\0" -"muncie.museum\0" -"berg.no\0meldal.no\0" -"nes.buskerud.no\0" -"saratov.ru\0" -"gs.oslo.no\0" -"harstad.no\0vaga.no\0" -"research.museum\0" -"brunel.museum\0ia.us\0" -"test.tj\0" -"columbia.museum\0" -"ms.it\0stockholm.museum\0" -"reklam.hu\0" -"pomorskie.pl\0lg.ua\0" -"bg.it\0historicalsociety.museum\0rns.tn\0" -"mallorca.museum\0surgut.ru\0cc.sc.us\0" -"ushistory.museum\0" -"palana.ru\0" -"snoasa.no\0" -"naturalsciences.museum\0" -"yaroslavl.ru\0" -"unjarga.no\0" -"p.se\0" -"ingatlan.hu\0" -"irc.pl\0" -"savona.it\0" -"cr.it\0" -"test.ru\0cc.tn.us\0" -"ms.kr\0museumvereniging.museum\0" -"time.no\0k12.ia.us\0" -"vladimir.ru\0" -"correios-e-telecomunica\xc3\xa7\xc3\xb5""es.museum\0" -"gouv.km\0nationalfirearms.museum\0" -"m\xc3\xa1latvuopmi.no\0" -"aero\0yosemite.museum\0" -"r.bg\0school.na\0" -"cc.vi.us\0" -"*.wakayama.jp\0" -"beauxarts.museum\0averoy.no\0ullensvang.no\0bar.pro\0" -"!city.hiroshima.jp\0" -"b\xc3\xa1hccavuotna.no\0" -"frosta.no\0" -"gdynia.pl\0" -"medical.museum\0" -"embaixada.st\0" -"balsan.it\0vantaa.museum\0" -"za.net\0" -"!city.saitama.jp\0lib.ks.us\0" -"fnd.br\0" -"ru.com\0se.com\0hol.no\0modalen.no\0" -"gouv.ml\0chukotka.ru\0" -"malopolska.pl\0" -"mansion.museum\0" -"iki.fi\0children.museum\0" -"cyber.museum\0rec.nf\0mo\xc3\xa5reke.no\0" -"to.it\0" -"hasvik.no\0" -"\xc3\xb8yer.no\0" -"arts.ro\0sc.ug\0" -"lib.ar.us\0" -"sc.tz\0cc.ms.us\0cc.nc.us\0" -"etc.br\0poznan.pl\0" -"cnt.br\0viking.museum\0" -"*.miyazaki.jp\0" -"melhus.no\0" -"skodje.no\0vevelstad.no\0" -"sc.us\0" -"upow.gov.pl\0" -"!city.fukuoka.jp\0brandywinevalley.museum\0natuurwetenschappen.museum\0tranby.no\0" -"bahn.museum\0msk.ru\0" -"delmenhorst.museum\0" -"russia.museum\0fuoisku.no\0" -"shell.museum\0" -"r\xc3\xa1isa.no\0" -"hs.kr\0udmurtia.ru\0" -"palermo.it\0" -"pilot.aero\0" -"tn.us\0" -"priv.hu\0" -"li.it\0" -"kr\xc3\xa5""anghke.no\0mosreg.ru\0" -"lib.fl.us\0" -"plants.museum\0" -"ulsan.kr\0national.museum\0" -"mil.ac\0!pref.nara.jp\0surgeonshall.museum\0" -"mil.ae\0santacruz.museum\0vi.us\0" -"wlocl.pl\0" -"mt.it\0napoli.it\0alaska.museum\0arts.nf\0" -"missoula.museum\0" -"rec.ro\0" -"mil.al\0" -"marburg.museum\0waw.pl\0" -"pharmaciens.km\0indianapolis.museum\0larsson.museum\0" -"cc.sd.us\0" -"mil.ba\0mobi\0" -"indianmarket.museum\0" -"recreation.aero\0padova.it\0" -"varese.it\0parti.se\0" -"mil.az\0" -"mil.bo\0!pref.kagoshima.jp\0khmelnitskiy.ua\0" -"rygge.no\0" -"os\xc3\xb8yro.no\0" -"mil.br\0" -"cs.it\0" -"austevoll.no\0fjell.no\0" -"mil.by\0" -"!pref.tokushima.jp\0org\0" -"mil.cn\0gs.svalbard.no\0" -"mil.co\0" -"pz.it\0lib.va.us\0\xd1\x80\xd1\x84\0" -"\xe4\xb8\xaa\xe4\xba\xba.hk\0ms.us\0nc.us\0k12.wi.us\0" -"s.bg\0drangedal.no\0" -"en.it\0" -"culturalcenter.museum\0" -"house.museum\0divttasvuotna.no\0" -"fhs.no\0" -"circus.museum\0" -"priv.at\0" -"mil.ec\0" -"ruovat.no\0" -"midsund.no\0vagan.no\0" -"casadelamoneda.museum\0" -"bristol.museum\0" -"and.museum\0" -"ascolipiceno.it\0computerhistory.museum\0vyatka.ru\0" -"uhren.museum\0" -"lahppi.no\0" -"*.yokohama.jp\0cody.museum\0lib.al.us\0" |