From nobody Sun May 5 19:34:51 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 155412391990787.98927931796118; Mon, 1 Apr 2019 06:05:19 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 881A33092656; Mon, 1 Apr 2019 13:05:17 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 2C527608E1; Mon, 1 Apr 2019 13:05:17 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id C331B3FB11; Mon, 1 Apr 2019 13:05:14 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id x31D5CZ6015997 for ; Mon, 1 Apr 2019 09:05:12 -0400 Received: by smtp.corp.redhat.com (Postfix) id CDB2B1001DD1; Mon, 1 Apr 2019 13:05:12 +0000 (UTC) Received: from angien.brq.redhat.com (unknown [10.43.2.229]) by smtp.corp.redhat.com (Postfix) with ESMTP id 50CDF1001E65 for ; Mon, 1 Apr 2019 13:05:12 +0000 (UTC) From: Peter Krempa To: libvir-list@redhat.com Date: Mon, 1 Apr 2019 15:04:52 +0200 Message-Id: In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 01/10] qemu: conf: Clear spice/vnc passwords from memory when freeing conf object X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.43]); Mon, 01 Apr 2019 13:05:18 +0000 (UTC) Content-Type: text/plain; charset="utf-8" We should not keep secrets randomly on the heap. Signed-off-by: Peter Krempa --- src/qemu/qemu_conf.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c index 42122dcd97..f23a0c0222 100644 --- a/src/qemu/qemu_conf.c +++ b/src/qemu/qemu_conf.c @@ -363,12 +363,12 @@ static void virQEMUDriverConfigDispose(void *obj) VIR_FREE(cfg->vncTLSx509certdir); VIR_FREE(cfg->vncTLSx509secretUUID); VIR_FREE(cfg->vncListen); - VIR_FREE(cfg->vncPassword); + VIR_DISPOSE_STRING(cfg->vncPassword); VIR_FREE(cfg->vncSASLdir); VIR_FREE(cfg->spiceTLSx509certdir); VIR_FREE(cfg->spiceListen); - VIR_FREE(cfg->spicePassword); + VIR_DISPOSE_STRING(cfg->spicePassword); VIR_FREE(cfg->spiceSASLdir); VIR_FREE(cfg->chardevTLSx509certdir); --=20 2.20.1 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Sun May 5 19:34:51 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1554123919486863.1954586606856; Mon, 1 Apr 2019 06:05:19 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 9C356307D986; Mon, 1 Apr 2019 13:05:17 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 620905D9D4; Mon, 1 Apr 2019 13:05:17 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 6F8743FB12; Mon, 1 Apr 2019 13:05:15 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id x31D5Do9016007 for ; Mon, 1 Apr 2019 09:05:13 -0400 Received: by smtp.corp.redhat.com (Postfix) id A6C5C1001E65; Mon, 1 Apr 2019 13:05:13 +0000 (UTC) Received: from angien.brq.redhat.com (unknown [10.43.2.229]) by smtp.corp.redhat.com (Postfix) with ESMTP id 2A6E21001DD1 for ; Mon, 1 Apr 2019 13:05:12 +0000 (UTC) From: Peter Krempa To: libvir-list@redhat.com Date: Mon, 1 Apr 2019 15:04:53 +0200 Message-Id: <8c0b14afeb1b805fd4bf3539e3b306c791284833.1554123828.git.pkrempa@redhat.com> In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 02/10] util: alloc: Add automatic cleanup/disposal of strings X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.48]); Mon, 01 Apr 2019 13:05:18 +0000 (UTC) Content-Type: text/plain; charset="utf-8" VIR_AUTODISPOSE_STR is similar to VIR_AUTOFREE(char *) but uses virDispose for clearing of the stored string. This patch also refactors VIR_DISPOSE to use the new helper which is used for the new macro. Signed-off-by: Peter Krempa Reviewed-by: J=C3=A1n Tomko --- src/libvirt_private.syms | 1 + src/util/viralloc.c | 16 ++++++++++++++++ src/util/viralloc.h | 14 ++++++++++++-- 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 73ef24d66f..bae7f646fe 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1427,6 +1427,7 @@ virAllocTestOOM; virAllocVar; virDeleteElementsN; virDispose; +virDisposeString; virExpandN; virFree; virInsertElementsN; diff --git a/src/util/viralloc.c b/src/util/viralloc.c index b583294760..e82bfa0acd 100644 --- a/src/util/viralloc.c +++ b/src/util/viralloc.c @@ -618,3 +618,19 @@ void virDispose(void *ptrptr, *countptr =3D 0; errno =3D save_errno; } + + +/** + * virDisposeString: + * @ptrptr: pointer to pointer for a string which should be sanitized and = cleared + * + * See virDispose. + */ +void +virDisposeString(char **strptr) +{ + if (!*strptr) + return; + + virDispose(strptr, strlen(*strptr), sizeof(char), NULL); +} diff --git a/src/util/viralloc.h b/src/util/viralloc.h index 226d4d9b64..a1708b772c 100644 --- a/src/util/viralloc.h +++ b/src/util/viralloc.h @@ -79,6 +79,8 @@ void virFree(void *ptrptr) ATTRIBUTE_NONNULL(1); void virDispose(void *ptrptr, size_t count, size_t element_size, size_t *c= ountptr) ATTRIBUTE_NONNULL(1); +void virDisposeString(char **strptr) + ATTRIBUTE_NONNULL(1); /** * VIR_ALLOC: @@ -575,9 +577,17 @@ void virDispose(void *ptrptr, size_t count, size_t ele= ment_size, size_t *countpt * * This macro is not safe to be used on arguments with side effects. */ -# define VIR_DISPOSE_STRING(ptr) virDispose(1 ? (void *) &(ptr) : (ptr), \ - (ptr) ? strlen((ptr)) : 0, 1, = NULL) +# define VIR_DISPOSE_STRING(ptr) virDisposeString(&(ptr)) +/** + * VIR_AUTODISPOSE_STR: + * + * Macro to automatically free and clear the memory allocated to + * the string variable declared with it by calling virDisposeString + * when the variable goes out of scope. + */ +# define VIR_AUTODISPOSE_STR \ + __attribute__((cleanup(virDisposeString))) char * /** * VIR_DISPOSE: --=20 2.20.1 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Sun May 5 19:34:51 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1554123938305515.240436944249; Mon, 1 Apr 2019 06:05:38 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id D356486668; Mon, 1 Apr 2019 13:05:36 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id A5D301001DD1; Mon, 1 Apr 2019 13:05:36 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 5FA29180338B; Mon, 1 Apr 2019 13:05:36 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id x31D5ENO016017 for ; Mon, 1 Apr 2019 09:05:14 -0400 Received: by smtp.corp.redhat.com (Postfix) id 8396B1001DD1; Mon, 1 Apr 2019 13:05:14 +0000 (UTC) Received: from angien.brq.redhat.com (unknown [10.43.2.229]) by smtp.corp.redhat.com (Postfix) with ESMTP id 03B711001E65 for ; Mon, 1 Apr 2019 13:05:13 +0000 (UTC) From: Peter Krempa To: libvir-list@redhat.com Date: Mon, 1 Apr 2019 15:04:54 +0200 Message-Id: In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 03/10] Use VIR_AUTODISPOSE_STR instead of VIR_DISPOSE_STRING where possible X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.26]); Mon, 01 Apr 2019 13:05:37 +0000 (UTC) Content-Type: text/plain; charset="utf-8" Refactor code paths which clear strings on cleanup paths to use the automatic helper. Signed-off-by: Peter Krempa Reviewed-by: J=C3=A1n Tomko --- src/libxl/libxl_conf.c | 3 +-- src/qemu/qemu_command.c | 3 +-- src/rpc/virnetlibsshsession.c | 10 +++------- src/storage/storage_backend_rbd.c | 3 +-- tools/virsh-secret.c | 3 +-- 5 files changed, 7 insertions(+), 15 deletions(-) diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c index e55a9fe22e..0c7a5f3dd5 100644 --- a/src/libxl/libxl_conf.c +++ b/src/libxl/libxl_conf.c @@ -980,7 +980,7 @@ libxlMakeNetworkDiskSrc(virStorageSourcePtr src, char *= *srcstr) { virConnectPtr conn =3D NULL; uint8_t *secret =3D NULL; - char *base64secret =3D NULL; + VIR_AUTODISPOSE_STR base64secret =3D NULL; size_t secretlen =3D 0; char *username =3D NULL; int ret =3D -1; @@ -1008,7 +1008,6 @@ libxlMakeNetworkDiskSrc(virStorageSourcePtr src, char= **srcstr) cleanup: VIR_DISPOSE_N(secret, secretlen); - VIR_DISPOSE_STRING(base64secret); virObjectUnref(conn); return ret; } diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index f81d20e5f7..98d67dab2c 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -842,7 +842,7 @@ static int qemuBuildRBDSecinfoURI(virBufferPtr buf, qemuDomainSecretInfoPtr secinfo) { - char *base64secret =3D NULL; + VIR_AUTODISPOSE_STR base64secret =3D NULL; if (!secinfo) { virBufferAddLit(buf, ":auth_supported=3Dnone"); @@ -858,7 +858,6 @@ qemuBuildRBDSecinfoURI(virBufferPtr buf, virBufferEscape(buf, '\\', ":", ":key=3D%s:auth_supported=3Dcephx\\;none", base64secret); - VIR_DISPOSE_STRING(base64secret); break; case VIR_DOMAIN_SECRET_INFO_TYPE_AES: diff --git a/src/rpc/virnetlibsshsession.c b/src/rpc/virnetlibsshsession.c index e851e40d48..832d4fd87d 100644 --- a/src/rpc/virnetlibsshsession.c +++ b/src/rpc/virnetlibsshsession.c @@ -605,7 +605,7 @@ static int virNetLibsshAuthenticatePassword(virNetLibsshSessionPtr sess, virNetLibsshAuthMethodPtr priv) { - char *password =3D NULL; + VIR_AUTODISPOSE_STR password =3D NULL; const char *errmsg; int ret =3D -1; @@ -657,10 +657,7 @@ virNetLibsshAuthenticatePassword(virNetLibsshSessionPt= r sess, virReportError(VIR_ERR_AUTH_FAILED, _("authentication failed: %s"), errmsg); - return ret; - cleanup: - VIR_DISPOSE_STRING(password); return ret; } @@ -1052,7 +1049,7 @@ virNetLibsshSessionAuthAddPrivKeyAuth(virNetLibsshSes= sionPtr sess, { int ret; virNetLibsshAuthMethodPtr auth; - char *pass =3D NULL; + VIR_AUTODISPOSE_STR pass =3D NULL; char *file =3D NULL; if (!keyfile) { @@ -1076,7 +1073,7 @@ virNetLibsshSessionAuthAddPrivKeyAuth(virNetLibsshSes= sionPtr sess, goto error; } - auth->password =3D pass; + VIR_STEAL_PTR(auth->password, pass); auth->filename =3D file; auth->method =3D VIR_NET_LIBSSH_AUTH_PRIVKEY; auth->ssh_flags =3D SSH_AUTH_METHOD_PUBLICKEY; @@ -1088,7 +1085,6 @@ virNetLibsshSessionAuthAddPrivKeyAuth(virNetLibsshSes= sionPtr sess, return ret; error: - VIR_DISPOSE_STRING(pass); VIR_FREE(file); goto cleanup; } diff --git a/src/storage/storage_backend_rbd.c b/src/storage/storage_backen= d_rbd.c index 61ebb9b541..29f6a5de60 100644 --- a/src/storage/storage_backend_rbd.c +++ b/src/storage/storage_backend_rbd.c @@ -209,7 +209,7 @@ virStorageBackendRBDOpenRADOSConn(virStorageBackendRBDS= tatePtr ptr, virStorageAuthDefPtr authdef =3D source->auth; unsigned char *secret_value =3D NULL; size_t secret_value_size =3D 0; - char *rados_key =3D NULL; + VIR_AUTODISPOSE_STR rados_key =3D NULL; virBuffer mon_host =3D VIR_BUFFER_INITIALIZER; size_t i; const char *client_mount_timeout =3D "30"; @@ -343,7 +343,6 @@ virStorageBackendRBDOpenRADOSConn(virStorageBackendRBDS= tatePtr ptr, cleanup: VIR_DISPOSE_N(secret_value, secret_value_size); - VIR_DISPOSE_STRING(rados_key); virObjectUnref(conn); virBufferFreeAndReset(&mon_host); diff --git a/tools/virsh-secret.c b/tools/virsh-secret.c index 9227fd064c..b9fc5ededf 100644 --- a/tools/virsh-secret.c +++ b/tools/virsh-secret.c @@ -253,7 +253,7 @@ static bool cmdSecretGetValue(vshControl *ctl, const vshCmd *cmd) { virSecretPtr secret; - char *base64 =3D NULL; + VIR_AUTODISPOSE_STR base64 =3D NULL; unsigned char *value; size_t value_size; bool ret =3D false; @@ -274,7 +274,6 @@ cmdSecretGetValue(vshControl *ctl, const vshCmd *cmd) cleanup: VIR_DISPOSE_N(value, value_size); - VIR_DISPOSE_STRING(base64); virSecretFree(secret); return ret; } --=20 2.20.1 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Sun May 5 19:34:51 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 155412394059558.67329545962821; Mon, 1 Apr 2019 06:05:40 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 051EAC0733EC; Mon, 1 Apr 2019 13:05:39 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id D2FB25D706; Mon, 1 Apr 2019 13:05:38 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 81B3C3FB15; Mon, 1 Apr 2019 13:05:37 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id x31D5FlQ016022 for ; Mon, 1 Apr 2019 09:05:15 -0400 Received: by smtp.corp.redhat.com (Postfix) id 5B891108F835; Mon, 1 Apr 2019 13:05:15 +0000 (UTC) Received: from angien.brq.redhat.com (unknown [10.43.2.229]) by smtp.corp.redhat.com (Postfix) with ESMTP id D310A1001DD1 for ; Mon, 1 Apr 2019 13:05:14 +0000 (UTC) From: Peter Krempa To: libvir-list@redhat.com Date: Mon, 1 Apr 2019 15:04:55 +0200 Message-Id: In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 04/10] util: buffer: Remove struct member munging X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Mon, 01 Apr 2019 13:05:39 +0000 (UTC) Content-Type: text/plain; charset="utf-8" This was meant to stop abusing the members directly, but we don't do this for other cases. Additionally this did not stop the test from touching the members. Remove the header obscurization. Signed-off-by: Peter Krempa Reviewed-by: J=C3=A1n Tomko --- src/util/virbuffer.c | 12 ------------ src/util/virbuffer.h | 16 ++++++---------- tests/virbuftest.c | 2 +- 3 files changed, 7 insertions(+), 23 deletions(-) diff --git a/src/util/virbuffer.c b/src/util/virbuffer.c index 12bdd13d39..8bb9c8e1fa 100644 --- a/src/util/virbuffer.c +++ b/src/util/virbuffer.c @@ -23,24 +23,12 @@ #include #include "c-ctype.h" -#define __VIR_BUFFER_C__ - #include "virbuffer.h" #include "virerror.h" #include "virstring.h" #define VIR_FROM_THIS VIR_FROM_NONE -/* If adding more fields, ensure to edit buf.h to match - the number of fields */ -struct _virBuffer { - unsigned int size; - unsigned int use; - unsigned int error; /* errno value, or -1 for usage error */ - int indent; - char *content; -}; - /** * virBufferFail * @buf: the buffer diff --git a/src/util/virbuffer.h b/src/util/virbuffer.h index b399c90154..16cd8515d6 100644 --- a/src/util/virbuffer.h +++ b/src/util/virbuffer.h @@ -35,19 +35,15 @@ typedef struct _virBuffer virBuffer; typedef virBuffer *virBufferPtr; -# ifndef __VIR_BUFFER_C__ -# define VIR_BUFFER_INITIALIZER { 0, 0, 0, 0, NULL } +# define VIR_BUFFER_INITIALIZER { 0, 0, 0, 0, NULL } -/* This struct must be kept in sync with the real struct - in the buf.c impl file */ struct _virBuffer { - unsigned int a; - unsigned int b; - unsigned int c; - int d; - char *e; + unsigned int size; + unsigned int use; + unsigned int error; /* errno value, or -1 for usage error */ + int indent; + char *content; }; -# endif const char *virBufferCurrentContent(virBufferPtr buf); char *virBufferContentAndReset(virBufferPtr buf); diff --git a/tests/virbuftest.c b/tests/virbuftest.c index 34f02b1281..b608da94d4 100644 --- a/tests/virbuftest.c +++ b/tests/virbuftest.c @@ -29,7 +29,7 @@ static int testBufInfiniteLoop(const void *data) * which was the case after the above addchar at the time of the bug. * This test is a bit fragile, since it relies on virBuffer internals. */ - if (virAsprintf(&addstr, "%*s", buf->a - buf->b - 1, "a") < 0) + if (virAsprintf(&addstr, "%*s", buf->size - buf->use - 1, "a") < 0) goto out; if (info->doEscape) --=20 2.20.1 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Sun May 5 19:34:51 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1554123937950846.371865674278; Mon, 1 Apr 2019 06:05:37 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id AFB573086228; Mon, 1 Apr 2019 13:05:36 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 8724A5D706; Mon, 1 Apr 2019 13:05:36 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 447053FB30; Mon, 1 Apr 2019 13:05:35 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id x31D5GgW016037 for ; Mon, 1 Apr 2019 09:05:16 -0400 Received: by smtp.corp.redhat.com (Postfix) id 376361001E65; Mon, 1 Apr 2019 13:05:16 +0000 (UTC) Received: from angien.brq.redhat.com (unknown [10.43.2.229]) by smtp.corp.redhat.com (Postfix) with ESMTP id ADF791001DD1 for ; Mon, 1 Apr 2019 13:05:15 +0000 (UTC) From: Peter Krempa To: libvir-list@redhat.com Date: Mon, 1 Apr 2019 15:04:56 +0200 Message-Id: In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 05/10] util: alloc: Clean also stack'd data with VIR_AUTOCLEAN X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.42]); Mon, 01 Apr 2019 13:05:37 +0000 (UTC) Content-Type: text/plain; charset="utf-8" VIR_AUTOCLEAN uses __attribute__(cleanup) to clean stack'd data types. The implementation calls the callback but did not clean the stack'd structure besides to what the called function did. This adds a memset call to clean it when unrolling the stack to achieve the same stack cleanlines as with VIR_AUTOFREE and VIR_AUTOPTR. The change from inline to ATTRIBUTE_UNUSED is necessary as gcc was moaning that inlining would sometimes increase code size. Signed-off-by: Peter Krempa --- cfg.mk | 2 +- src/util/viralloc.h | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/cfg.mk b/cfg.mk index a62d4db13b..932cdb8664 100644 --- a/cfg.mk +++ b/cfg.mk @@ -1306,7 +1306,7 @@ exclude_file_name_regexp--sc_prohibit_getenv =3D \ ^tests/.*\.[ch]$$ exclude_file_name_regexp--sc_avoid_attribute_unused_in_header =3D \ - ^(src/util/virlog\.h|src/network/bridge_driver\.h)$$ + ^(src/util/virlog\.h|src/network/bridge_driver\.h|src/util/viralloc\.h)$$ exclude_file_name_regexp--sc_prohibit_mixed_case_abbreviations =3D \ ^src/(vbox/vbox_CAPI.*.h|esx/esx_vi.(c|h)|esx/esx_storage_backend_iscsi.= c)$$ diff --git a/src/util/viralloc.h b/src/util/viralloc.h index a1708b772c..c8133938bf 100644 --- a/src/util/viralloc.h +++ b/src/util/viralloc.h @@ -637,9 +637,10 @@ void virAllocTestHook(void (*func)(int, void*), void *= data); * take pointer to @type. */ # define VIR_DEFINE_AUTOCLEAN_FUNC(type, func) \ - static inline void VIR_AUTOCLEAN_FUNC_NAME(type)(type *_ptr) \ + static void ATTRIBUTE_UNUSED VIR_AUTOCLEAN_FUNC_NAME(type)(type *_ptr)= \ { \ (func)(_ptr); \ + memset(_ptr, 0, sizeof(*_ptr));\ } /** --=20 2.20.1 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Sun May 5 19:34:51 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1554123943619286.4722541395579; Mon, 1 Apr 2019 06:05:43 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 980A3C059B7A; Mon, 1 Apr 2019 13:05:41 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 6304E611C2; Mon, 1 Apr 2019 13:05:41 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 23B821819AFF; Mon, 1 Apr 2019 13:05:41 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id x31D5Hju016042 for ; Mon, 1 Apr 2019 09:05:17 -0400 Received: by smtp.corp.redhat.com (Postfix) id 118C61001DD1; Mon, 1 Apr 2019 13:05:17 +0000 (UTC) Received: from angien.brq.redhat.com (unknown [10.43.2.229]) by smtp.corp.redhat.com (Postfix) with ESMTP id 88389108426E for ; Mon, 1 Apr 2019 13:05:16 +0000 (UTC) From: Peter Krempa To: libvir-list@redhat.com Date: Mon, 1 Apr 2019 15:04:57 +0200 Message-Id: In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 06/10] util: alloc: Introduce VIR_TMP X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Mon, 01 Apr 2019 13:05:42 +0000 (UTC) Content-Type: text/plain; charset="utf-8" Allow preserving the holy serenity of the stack by clearing out temp pointer when leaving the scope. --- src/libvirt_private.syms | 1 + src/util/viralloc.c | 7 +++++++ src/util/viralloc.h | 15 +++++++++++++++ 3 files changed, 23 insertions(+) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index bae7f646fe..2f98ac901f 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1425,6 +1425,7 @@ virAllocTestHook; virAllocTestInit; virAllocTestOOM; virAllocVar; +virClearPtr; virDeleteElementsN; virDispose; virDisposeString; diff --git a/src/util/viralloc.c b/src/util/viralloc.c index e82bfa0acd..6dd19fb36b 100644 --- a/src/util/viralloc.c +++ b/src/util/viralloc.c @@ -634,3 +634,10 @@ virDisposeString(char **strptr) virDispose(strptr, strlen(*strptr), sizeof(char), NULL); } + + +void +virClearPtr(void *ptrptr) +{ + *(void **)ptrptr =3D NULL; +} diff --git a/src/util/viralloc.h b/src/util/viralloc.h index c8133938bf..1b1d23b3af 100644 --- a/src/util/viralloc.h +++ b/src/util/viralloc.h @@ -81,6 +81,8 @@ void virDispose(void *ptrptr, size_t count, size_t elemen= t_size, size_t *countpt ATTRIBUTE_NONNULL(1); void virDisposeString(char **strptr) ATTRIBUTE_NONNULL(1); +void virClearPtr(void *varptr) + ATTRIBUTE_NONNULL(1); /** * VIR_ALLOC: @@ -694,4 +696,17 @@ void virAllocTestHook(void (*func)(int, void*), void *= data); # define VIR_AUTOUNREF(type) \ __attribute__((cleanup(virObjectAutoUnref))) type +/** + * VIR_TMP: + * @type: type of the pointer to be NULLed automatically + * + * Marks the pointer as temporary which should be cleared when leaving sco= pe. + * + * This macro declares a temporary variable of @type which is set to NULL = when + * the variable is leaving scope. This keeps the stack tidy. Note that no + * resources are freed or cleared otherwise. @type must be a pointer. + */ +# define VIR_TMP(type) \ + __attribute__((cleanup(virClearPtr))) type + #endif /* LIBVIRT_VIRALLOC_H */ --=20 2.20.1 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Sun May 5 19:34:51 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 15541239467301022.8346175057706; Mon, 1 Apr 2019 06:05:46 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 89195309267D; Mon, 1 Apr 2019 13:05:45 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 61F565C22E; Mon, 1 Apr 2019 13:05:45 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 193683FA46; Mon, 1 Apr 2019 13:05:45 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id x31D5Hwu016048 for ; Mon, 1 Apr 2019 09:05:17 -0400 Received: by smtp.corp.redhat.com (Postfix) id E1B1F1001DD1; Mon, 1 Apr 2019 13:05:17 +0000 (UTC) Received: from angien.brq.redhat.com (unknown [10.43.2.229]) by smtp.corp.redhat.com (Postfix) with ESMTP id 637891001E65 for ; Mon, 1 Apr 2019 13:05:17 +0000 (UTC) From: Peter Krempa To: libvir-list@redhat.com Date: Mon, 1 Apr 2019 15:04:58 +0200 Message-Id: <696c9975ab17f3533e64e7c2542f55696bfc2ba6.1554123828.git.pkrempa@redhat.com> In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 07/10] qemu: Use VIR_TMP to stop leaking pointer to VNC password pointer to stack X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.43]); Mon, 01 Apr 2019 13:05:46 +0000 (UTC) Content-Type: text/plain; charset="utf-8" Spare a few cpu cycles to allow us feeling a bit better about ourselves. --- src/qemu/qemu_hotplug.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 4e94d80f21..7f46b1fd9f 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -4210,7 +4210,7 @@ qemuDomainChangeGraphicsPasswords(virQEMUDriverPtr dr= iver, const char *expire; char *validTo =3D NULL; const char *connected =3D NULL; - const char *password; + VIR_TMP(const char *) password; int ret =3D -1; virQEMUDriverConfigPtr cfg =3D virQEMUDriverGetConfig(driver); --=20 2.20.1 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Sun May 5 19:34:51 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1554123950858648.2490181398903; Mon, 1 Apr 2019 06:05:50 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 8017B3082E63; Mon, 1 Apr 2019 13:05:49 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 56DE260260; Mon, 1 Apr 2019 13:05:49 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 08F803FA4B; Mon, 1 Apr 2019 13:05:49 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id x31D5JBn016063 for ; Mon, 1 Apr 2019 09:05:19 -0400 Received: by smtp.corp.redhat.com (Postfix) id 4294D108BEF0; Mon, 1 Apr 2019 13:05:19 +0000 (UTC) Received: from angien.brq.redhat.com (unknown [10.43.2.229]) by smtp.corp.redhat.com (Postfix) with ESMTP id 3F5E81001DD1 for ; Mon, 1 Apr 2019 13:05:18 +0000 (UTC) From: Peter Krempa To: libvir-list@redhat.com Date: Mon, 1 Apr 2019 15:04:59 +0200 Message-Id: <7139daeb647dcb57cf310d9194935bcf4b188b4b.1554123828.git.pkrempa@redhat.com> In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 08/10] util: Introduce 'virpin' module for dealing with PIN numbers X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.46]); Mon, 01 Apr 2019 13:05:50 +0000 (UTC) Content-Type: text/plain; charset="utf-8" In https://www.redhat.com/archives/libvir-list/2019-February/msg01475.html I was notified that I forgot to deal with the possibility that the JSON number would contain jtomko's PIN number. I had to look around for a leaked list of PIN numbers to avoid the problem described in the review. This commit implements a checker which will allow deciding when to nuke the JSON number string. We obviously have to spare a few CPU cycles to make Jano feel safer. --- src/libvirt_private.syms | 4 + src/util/Makefile.inc.am | 2 + src/util/virpin.c | 1053 ++++++++++++++++++++++++++++++++++++++ src/util/virpin.h | 30 ++ tests/utiltest.c | 30 ++ 5 files changed, 1119 insertions(+) create mode 100644 src/util/virpin.c create mode 100644 src/util/virpin.h diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 2f98ac901f..8423bbb682 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -2662,6 +2662,10 @@ virPidFileWrite; virPidFileWritePath; +# util/virpin.h +virPinIsJanos; + + # util/virpolkit.h virPolkitAgentCreate; virPolkitAgentDestroy; diff --git a/src/util/Makefile.inc.am b/src/util/Makefile.inc.am index aa5c6cbe03..494881158e 100644 --- a/src/util/Makefile.inc.am +++ b/src/util/Makefile.inc.am @@ -148,6 +148,8 @@ UTIL_SOURCES =3D \ util/virpci.h \ util/virpidfile.c \ util/virpidfile.h \ + util/virpin.c \ + util/virpin.h \ util/virpolkit.c \ util/virpolkit.h \ util/virportallocator.c \ diff --git a/src/util/virpin.c b/src/util/virpin.c new file mode 100644 index 0000000000..3313d1078a --- /dev/null +++ b/src/util/virpin.c @@ -0,0 +1,1053 @@ +/* + * virpin.c: helper APIs for managing PINs + * + * Copyright (C) 2019/04/01 The Game + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see + * . + */ + +#include +#include "virpin.h" +#include "viralloc.h" +#include "virstring.h" + +/* This is a list of leaked pin codes obtained from + * https://pastebin.com/2qbRKh3R which I've found on the dark web. */ +static const char *virPinList[] =3D { +"0000", "0001", "0002", "0003", "0004", "0005", "0006", "0007", "0008", "0= 009", +"0010", "0011", "0012", "0013", "0014", "0015", "0016", "0017", "0018", "0= 019", +"0020", "0021", "0022", "0023", "0024", "0025", "0026", "0027", "0028", "0= 029", +"0030", "0031", "0032", "0033", "0034", "0035", "0036", "0037", "0038", "0= 039", +"0040", "0041", "0042", "0043", "0044", "0045", "0046", "0047", "0048", "0= 049", +"0050", "0051", "0052", "0053", "0054", "0055", "0056", "0057", "0058", "0= 059", +"0060", "0061", "0062", "0063", "0064", "0065", "0066", "0067", "0068", "0= 069", +"0070", "0071", "0072", "0073", "0074", "0075", "0076", "0077", "0078", "0= 079", +"0080", "0081", "0082", "0083", "0084", "0085", "0086", "0087", "0088", "0= 089", +"0090", "0091", "0092", "0093", "0094", "0095", "0096", "0097", "0098", "0= 099", +"0100", "0101", "0102", "0103", "0104", "0105", "0106", "0107", "0108", "0= 109", +"0110", "0111", "0112", "0113", "0114", "0115", "0116", "0117", "0118", "0= 119", +"0120", "0121", "0122", "0123", "0124", "0125", "0126", "0127", "0128", "0= 129", +"0130", "0131", "0132", "0133", "0134", "0135", "0136", "0137", "0138", "0= 139", +"0140", "0141", "0142", "0143", "0144", "0145", "0146", "0147", "0148", "0= 149", +"0150", "0151", "0152", "0153", "0154", "0155", "0156", "0157", "0158", "0= 159", +"0160", "0161", "0162", "0163", "0164", "0165", "0166", "0167", "0168", "0= 169", +"0170", "0171", "0172", "0173", "0174", "0175", "0176", "0177", "0178", "0= 179", +"0180", "0181", "0182", "0183", "0184", "0185", "0186", "0187", "0188", "0= 189", +"0190", "0191", "0192", "0193", "0194", "0195", "0196", "0197", "0198", "0= 199", +"0200", "0201", "0202", "0203", "0204", "0205", "0206", "0207", "0208", "0= 209", +"0210", "0211", "0212", "0213", "0214", "0215", "0216", "0217", "0218", "0= 219", +"0220", "0221", "0222", "0223", "0224", "0225", "0226", "0227", "0228", "0= 229", +"0230", "0231", "0232", "0233", "0234", "0235", "0236", "0237", "0238", "0= 239", +"0240", "0241", "0242", "0243", "0244", "0245", "0246", "0247", "0248", "0= 249", +"0250", "0251", "0252", "0253", "0254", "0255", "0256", "0257", "0258", "0= 259", +"0260", "0261", "0262", "0263", "0264", "0265", "0266", "0267", "0268", "0= 269", +"0270", "0271", "0272", "0273", "0274", "0275", "0276", "0277", "0278", "0= 279", +"0280", "0281", "0282", "0283", "0284", "0285", "0286", "0287", "0288", "0= 289", +"0290", "0291", "0292", "0293", "0294", "0295", "0296", "0297", "0298", "0= 299", +"0300", "0301", "0302", "0303", "0304", "0305", "0306", "0307", "0308", "0= 309", +"0310", "0311", "0312", "0313", "0314", "0315", "0316", "0317", "0318", "0= 319", +"0320", "0321", "0322", "0323", "0324", "0325", "0326", "0327", "0328", "0= 329", +"0330", "0331", "0332", "0333", "0334", "0335", "0336", "0337", "0338", "0= 339", +"0340", "0341", "0342", "0343", "0344", "0345", "0346", "0347", "0348", "0= 349", +"0350", "0351", "0352", "0353", "0354", "0355", "0356", "0357", "0358", "0= 359", +"0360", "0361", "0362", "0363", "0364", "0365", "0366", "0367", "0368", "0= 369", +"0370", "0371", "0372", "0373", "0374", "0375", "0376", "0377", "0378", "0= 379", +"0380", "0381", "0382", "0383", "0384", "0385", "0386", "0387", "0388", "0= 389", +"0390", "0391", "0392", "0393", "0394", "0395", "0396", "0397", "0398", "0= 399", +"0400", "0401", "0402", "0403", "0404", "0405", "0406", "0407", "0408", "0= 409", +"0410", "0411", "0412", "0413", "0414", "0415", "0416", "0417", "0418", "0= 419", +"0420", "0421", "0422", "0423", "0424", "0425", "0426", "0427", "0428", "0= 429", +"0430", "0431", "0432", "0433", "0434", "0435", "0436", "0437", "0438", "0= 439", +"0440", "0441", "0442", "0443", "0444", "0445", "0446", "0447", "0448", "0= 449", +"0450", "0451", "0452", "0453", "0454", "0455", "0456", "0457", "0458", "0= 459", +"0460", "0461", "0462", "0463", "0464", "0465", "0466", "0467", "0468", "0= 469", +"0470", "0471", "0472", "0473", "0474", "0475", "0476", "0477", "0478", "0= 479", +"0480", "0481", "0482", "0483", "0484", "0485", "0486", "0487", "0488", "0= 489", +"0490", "0491", "0492", "0493", "0494", "0495", "0496", "0497", "0498", "0= 499", +"0500", "0501", "0502", "0503", "0504", "0505", "0506", "0507", "0508", "0= 509", +"0510", "0511", "0512", "0513", "0514", "0515", "0516", "0517", "0518", "0= 519", +"0520", "0521", "0522", "0523", "0524", "0525", "0526", "0527", "0528", "0= 529", +"0530", "0531", "0532", "0533", "0534", "0535", "0536", "0537", "0538", "0= 539", +"0540", "0541", "0542", "0543", "0544", "0545", "0546", "0547", "0548", "0= 549", +"0550", "0551", "0552", "0553", "0554", "0555", "0556", "0557", "0558", "0= 559", +"0560", "0561", "0562", "0563", "0564", "0565", "0566", "0567", "0568", "0= 569", +"0570", "0571", "0572", "0573", "0574", "0575", "0576", "0577", "0578", "0= 579", +"0580", "0581", "0582", "0583", "0584", "0585", "0586", "0587", "0588", "0= 589", +"0590", "0591", "0592", "0593", "0594", "0595", "0596", "0597", "0598", "0= 599", +"0600", "0601", "0602", "0603", "0604", "0605", "0606", "0607", "0608", "0= 609", +"0610", "0611", "0612", "0613", "0614", "0615", "0616", "0617", "0618", "0= 619", +"0620", "0621", "0622", "0623", "0624", "0625", "0626", "0627", "0628", "0= 629", +"0630", "0631", "0632", "0633", "0634", "0635", "0636", "0637", "0638", "0= 639", +"0640", "0641", "0642", "0643", "0644", "0645", "0646", "0647", "0648", "0= 649", +"0650", "0651", "0652", "0653", "0654", "0655", "0656", "0657", "0658", "0= 659", +"0660", "0661", "0662", "0663", "0664", "0665", "0666", "0667", "0668", "0= 669", +"0670", "0671", "0672", "0673", "0674", "0675", "0676", "0677", "0678", "0= 679", +"0680", "0681", "0682", "0683", "0684", "0685", "0686", "0687", "0688", "0= 689", +"0690", "0691", "0692", "0693", "0694", "0695", "0696", "0697", "0698", "0= 699", +"0700", "0701", "0702", "0703", "0704", "0705", "0706", "0707", "0708", "0= 709", +"0710", "0711", "0712", "0713", "0714", "0715", "0716", "0717", "0718", "0= 719", +"0720", "0721", "0722", "0723", "0724", "0725", "0726", "0727", "0728", "0= 729", +"0730", "0731", "0732", "0733", "0734", "0735", "0736", "0737", "0738", "0= 739", +"0740", "0741", "0742", "0743", "0744", "0745", "0746", "0747", "0748", "0= 749", +"0750", "0751", "0752", "0753", "0754", "0755", "0756", "0757", "0758", "0= 759", +"0760", "0761", "0762", "0763", "0764", "0765", "0766", "0767", "0768", "0= 769", +"0770", "0771", "0772", "0773", "0774", "0775", "0776", "0777", "0778", "0= 779", +"0780", "0781", "0782", "0783", "0784", "0785", "0786", "0787", "0788", "0= 789", +"0790", "0791", "0792", "0793", "0794", "0795", "0796", "0797", "0798", "0= 799", +"0800", "0801", "0802", "0803", "0804", "0805", "0806", "0807", "0808", "0= 809", +"0810", "0811", "0812", "0813", "0814", "0815", "0816", "0817", "0818", "0= 819", +"0820", "0821", "0822", "0823", "0824", "0825", "0826", "0827", "0828", "0= 829", +"0830", "0831", "0832", "0833", "0834", "0835", "0836", "0837", "0838", "0= 839", +"0840", "0841", "0842", "0843", "0844", "0845", "0846", "0847", "0848", "0= 849", +"0850", "0851", "0852", "0853", "0854", "0855", "0856", "0857", "0858", "0= 859", +"0860", "0861", "0862", "0863", "0864", "0865", "0866", "0867", "0868", "0= 869", +"0870", "0871", "0872", "0873", "0874", "0875", "0876", "0877", "0878", "0= 879", +"0880", "0881", "0882", "0883", "0884", "0885", "0886", "0887", "0888", "0= 889", +"0890", "0891", "0892", "0893", "0894", "0895", "0896", "0897", "0898", "0= 899", +"0900", "0901", "0902", "0903", "0904", "0905", "0906", "0907", "0908", "0= 909", +"0910", "0911", "0912", "0913", "0914", "0915", "0916", "0917", "0918", "0= 919", +"0920", "0921", "0922", "0923", "0924", "0925", "0926", "0927", "0928", "0= 929", +"0930", "0931", "0932", "0933", "0934", "0935", "0936", "0937", "0938", "0= 939", +"0940", "0941", "0942", "0943", "0944", "0945", "0946", "0947", "0948", "0= 949", +"0950", "0951", "0952", "0953", "0954", "0955", "0956", "0957", "0958", "0= 959", +"0960", "0961", "0962", "0963", "0964", "0965", "0966", "0967", "0968", "0= 969", +"0970", "0971", "0972", "0973", "0974", "0975", "0976", "0977", "0978", "0= 979", +"0980", "0981", "0982", "0983", "0984", "0985", "0986", "0987", "0988", "0= 989", +"0990", "0991", "0992", "0993", "0994", "0995", "0996", "0997", "0998", "0= 999", +"1000", "1001", "1002", "1003", "1004", "1005", "1006", "1007", "1008", "1= 009", +"1010", "1011", "1012", "1013", "1014", "1015", "1016", "1017", "1018", "1= 019", +"1020", "1021", "1022", "1023", "1024", "1025", "1026", "1027", "1028", "1= 029", +"1030", "1031", "1032", "1033", "1034", "1035", "1036", "1037", "1038", "1= 039", +"1040", "1041", "1042", "1043", "1044", "1045", "1046", "1047", "1048", "1= 049", +"1050", "1051", "1052", "1053", "1054", "1055", "1056", "1057", "1058", "1= 059", +"1060", "1061", "1062", "1063", "1064", "1065", "1066", "1067", "1068", "1= 069", +"1070", "1071", "1072", "1073", "1074", "1075", "1076", "1077", "1078", "1= 079", +"1080", "1081", "1082", "1083", "1084", "1085", "1086", "1087", "1088", "1= 089", +"1090", "1091", "1092", "1093", "1094", "1095", "1096", "1097", "1098", "1= 099", +"1100", "1101", "1102", "1103", "1104", "1105", "1106", "1107", "1108", "1= 109", +"1110", "1111", "1112", "1113", "1114", "1115", "1116", "1117", "1118", "1= 119", +"1120", "1121", "1122", "1123", "1124", "1125", "1126", "1127", "1128", "1= 129", +"1130", "1131", "1132", "1133", "1134", "1135", "1136", "1137", "1138", "1= 139", +"1140", "1141", "1142", "1143", "1144", "1145", "1146", "1147", "1148", "1= 149", +"1150", "1151", "1152", "1153", "1154", "1155", "1156", "1157", "1158", "1= 159", +"1160", "1161", "1162", "1163", "1164", "1165", "1166", "1167", "1168", "1= 169", +"1170", "1171", "1172", "1173", "1174", "1175", "1176", "1177", "1178", "1= 179", +"1180", "1181", "1182", "1183", "1184", "1185", "1186", "1187", "1188", "1= 189", +"1190", "1191", "1192", "1193", "1194", "1195", "1196", "1197", "1198", "1= 199", +"1200", "1201", "1202", "1203", "1204", "1205", "1206", "1207", "1208", "1= 209", +"1210", "1211", "1212", "1213", "1214", "1215", "1216", "1217", "1218", "1= 219", +"1220", "1221", "1222", "1223", "1224", "1225", "1226", "1227", "1228", "1= 229", +"1230", "1231", "1232", "1233", "1234", "1235", "1236", "1237", "1238", "1= 239", +"1240", "1241", "1242", "1243", "1244", "1245", "1246", "1247", "1248", "1= 249", +"1250", "1251", "1252", "1253", "1254", "1255", "1256", "1257", "1258", "1= 259", +"1260", "1261", "1262", "1263", "1264", "1265", "1266", "1267", "1268", "1= 269", +"1270", "1271", "1272", "1273", "1274", "1275", "1276", "1277", "1278", "1= 279", +"1280", "1281", "1282", "1283", "1284", "1285", "1286", "1287", "1288", "1= 289", +"1290", "1291", "1292", "1293", "1294", "1295", "1296", "1297", "1298", "1= 299", +"1300", "1301", "1302", "1303", "1304", "1305", "1306", "1307", "1308", "1= 309", +"1310", "1311", "1312", "1313", "1314", "1315", "1316", "1317", "1318", "1= 319", +"1320", "1321", "1322", "1323", "1324", "1325", "1326", "1327", "1328", "1= 329", +"1330", "1331", "1332", "1333", "1334", "1335", "1336", "1337", "1338", "1= 339", +"1340", "1341", "1342", "1343", "1344", "1345", "1346", "1347", "1348", "1= 349", +"1350", "1351", "1352", "1353", "1354", "1355", "1356", "1357", "1358", "1= 359", +"1360", "1361", "1362", "1363", "1364", "1365", "1366", "1367", "1368", "1= 369", +"1370", "1371", "1372", "1373", "1374", "1375", "1376", "1377", "1378", "1= 379", +"1380", "1381", "1382", "1383", "1384", "1385", "1386", "1387", "1388", "1= 389", +"1390", "1391", "1392", "1393", "1394", "1395", "1396", "1397", "1398", "1= 399", +"1400", "1401", "1402", "1403", "1404", "1405", "1406", "1407", "1408", "1= 409", +"1410", "1411", "1412", "1413", "1414", "1415", "1416", "1417", "1418", "1= 419", +"1420", "1421", "1422", "1423", "1424", "1425", "1426", "1427", "1428", "1= 429", +"1430", "1431", "1432", "1433", "1434", "1435", "1436", "1437", "1438", "1= 439", +"1440", "1441", "1442", "1443", "1444", "1445", "1446", "1447", "1448", "1= 449", +"1450", "1451", "1452", "1453", "1454", "1455", "1456", "1457", "1458", "1= 459", +"1460", "1461", "1462", "1463", "1464", "1465", "1466", "1467", "1468", "1= 469", +"1470", "1471", "1472", "1473", "1474", "1475", "1476", "1477", "1478", "1= 479", +"1480", "1481", "1482", "1483", "1484", "1485", "1486", "1487", "1488", "1= 489", +"1490", "1491", "1492", "1493", "1494", "1495", "1496", "1497", "1498", "1= 499", +"1500", "1501", "1502", "1503", "1504", "1505", "1506", "1507", "1508", "1= 509", +"1510", "1511", "1512", "1513", "1514", "1515", "1516", "1517", "1518", "1= 519", +"1520", "1521", "1522", "1523", "1524", "1525", "1526", "1527", "1528", "1= 529", +"1530", "1531", "1532", "1533", "1534", "1535", "1536", "1537", "1538", "1= 539", +"1540", "1541", "1542", "1543", "1544", "1545", "1546", "1547", "1548", "1= 549", +"1550", "1551", "1552", "1553", "1554", "1555", "1556", "1557", "1558", "1= 559", +"1560", "1561", "1562", "1563", "1564", "1565", "1566", "1567", "1568", "1= 569", +"1570", "1571", "1572", "1573", "1574", "1575", "1576", "1577", "1578", "1= 579", +"1580", "1581", "1582", "1583", "1584", "1585", "1586", "1587", "1588", "1= 589", +"1590", "1591", "1592", "1593", "1594", "1595", "1596", "1597", "1598", "1= 599", +"1600", "1601", "1602", "1603", "1604", "1605", "1606", "1607", "1608", "1= 609", +"1610", "1611", "1612", "1613", "1614", "1615", "1616", "1617", "1618", "1= 619", +"1620", "1621", "1622", "1623", "1624", "1625", "1626", "1627", "1628", "1= 629", +"1630", "1631", "1632", "1633", "1634", "1635", "1636", "1637", "1638", "1= 639", +"1640", "1641", "1642", "1643", "1644", "1645", "1646", "1647", "1648", "1= 649", +"1650", "1651", "1652", "1653", "1654", "1655", "1656", "1657", "1658", "1= 659", +"1660", "1661", "1662", "1663", "1664", "1665", "1666", "1667", "1668", "1= 669", +"1670", "1671", "1672", "1673", "1674", "1675", "1676", "1677", "1678", "1= 679", +"1680", "1681", "1682", "1683", "1684", "1685", "1686", "1687", "1688", "1= 689", +"1690", "1691", "1692", "1693", "1694", "1695", "1696", "1697", "1698", "1= 699", +"1700", "1701", "1702", "1703", "1704", "1705", "1706", "1707", "1708", "1= 709", +"1710", "1711", "1712", "1713", "1714", "1715", "1716", "1717", "1718", "1= 719", +"1720", "1721", "1722", "1723", "1724", "1725", "1726", "1727", "1728", "1= 729", +"1730", "1731", "1732", "1733", "1734", "1735", "1736", "1737", "1738", "1= 739", +"1740", "1741", "1742", "1743", "1744", "1745", "1746", "1747", "1748", "1= 749", +"1750", "1751", "1752", "1753", "1754", "1755", "1756", "1757", "1758", "1= 759", +"1760", "1761", "1762", "1763", "1764", "1765", "1766", "1767", "1768", "1= 769", +"1770", "1771", "1772", "1773", "1774", "1775", "1776", "1777", "1778", "1= 779", +"1780", "1781", "1782", "1783", "1784", "1785", "1786", "1787", "1788", "1= 789", +"1790", "1791", "1792", "1793", "1794", "1795", "1796", "1797", "1798", "1= 799", +"1800", "1801", "1802", "1803", "1804", "1805", "1806", "1807", "1808", "1= 809", +"1810", "1811", "1812", "1813", "1814", "1815", "1816", "1817", "1818", "1= 819", +"1820", "1821", "1822", "1823", "1824", "1825", "1826", "1827", "1828", "1= 829", +"1830", "1831", "1832", "1833", "1834", "1835", "1836", "1837", "1838", "1= 839", +"1840", "1841", "1842", "1843", "1844", "1845", "1846", "1847", "1848", "1= 849", +"1850", "1851", "1852", "1853", "1854", "1855", "1856", "1857", "1858", "1= 859", +"1860", "1861", "1862", "1863", "1864", "1865", "1866", "1867", "1868", "1= 869", +"1870", "1871", "1872", "1873", "1874", "1875", "1876", "1877", "1878", "1= 879", +"1880", "1881", "1882", "1883", "1884", "1885", "1886", "1887", "1888", "1= 889", +"1890", "1891", "1892", "1893", "1894", "1895", "1896", "1897", "1898", "1= 899", +"1900", "1901", "1902", "1903", "1904", "1905", "1906", "1907", "1908", "1= 909", +"1910", "1911", "1912", "1913", "1914", "1915", "1916", "1917", "1918", "1= 919", +"1920", "1921", "1922", "1923", "1924", "1925", "1926", "1927", "1928", "1= 929", +"1930", "1931", "1932", "1933", "1934", "1935", "1936", "1937", "1938", "1= 939", +"1940", "1941", "1942", "1943", "1944", "1945", "1946", "1947", "1948", "1= 949", +"1950", "1951", "1952", "1953", "1954", "1955", "1956", "1957", "1958", "1= 959", +"1960", "1961", "1962", "1963", "1964", "1965", "1966", "1967", "1968", "1= 969", +"1970", "1971", "1972", "1973", "1974", "1975", "1976", "1977", "1978", "1= 979", +"1980", "1981", "1982", "1983", "1984", "1985", "1986", "1987", "1988", "1= 989", +"1990", "1991", "1992", "1993", "1994", "1995", "1996", "1997", "1998", "1= 999", +"2000", "2001", "2002", "2003", "2004", "2005", "2006", "2007", "2008", "2= 009", +"2010", "2011", "2012", "2013", "2014", "2015", "2016", "2017", "2018", "2= 019", +"2020", "2021", "2022", "2023", "2024", "2025", "2026", "2027", "2028", "2= 029", +"2030", "2031", "2032", "2033", "2034", "2035", "2036", "2037", "2038", "2= 039", +"2040", "2041", "2042", "2043", "2044", "2045", "2046", "2047", "2048", "2= 049", +"2050", "2051", "2052", "2053", "2054", "2055", "2056", "2057", "2058", "2= 059", +"2060", "2061", "2062", "2063", "2064", "2065", "2066", "2067", "2068", "2= 069", +"2070", "2071", "2072", "2073", "2074", "2075", "2076", "2077", "2078", "2= 079", +"2080", "2081", "2082", "2083", "2084", "2085", "2086", "2087", "2088", "2= 089", +"2090", "2091", "2092", "2093", "2094", "2095", "2096", "2097", "2098", "2= 099", +"2100", "2101", "2102", "2103", "2104", "2105", "2106", "2107", "2108", "2= 109", +"2110", "2111", "2112", "2113", "2114", "2115", "2116", "2117", "2118", "2= 119", +"2120", "2121", "2122", "2123", "2124", "2125", "2126", "2127", "2128", "2= 129", +"2130", "2131", "2132", "2133", "2134", "2135", "2136", "2137", "2138", "2= 139", +"2140", "2141", "2142", "2143", "2144", "2145", "2146", "2147", "2148", "2= 149", +"2150", "2151", "2152", "2153", "2154", "2155", "2156", "2157", "2158", "2= 159", +"2160", "2161", "2162", "2163", "2164", "2165", "2166", "2167", "2168", "2= 169", +"2170", "2171", "2172", "2173", "2174", "2175", "2176", "2177", "2178", "2= 179", +"2180", "2181", "2182", "2183", "2184", "2185", "2186", "2187", "2188", "2= 189", +"2190", "2191", "2192", "2193", "2194", "2195", "2196", "2197", "2198", "2= 199", +"2200", "2201", "2202", "2203", "2204", "2205", "2206", "2207", "2208", "2= 209", +"2210", "2211", "2212", "2213", "2214", "2215", "2216", "2217", "2218", "2= 219", +"2220", "2221", "2222", "2223", "2224", "2225", "2226", "2227", "2228", "2= 229", +"2230", "2231", "2232", "2233", "2234", "2235", "2236", "2237", "2238", "2= 239", +"2240", "2241", "2242", "2243", "2244", "2245", "2246", "2247", "2248", "2= 249", +"2250", "2251", "2252", "2253", "2254", "2255", "2256", "2257", "2258", "2= 259", +"2260", "2261", "2262", "2263", "2264", "2265", "2266", "2267", "2268", "2= 269", +"2270", "2271", "2272", "2273", "2274", "2275", "2276", "2277", "2278", "2= 279", +"2280", "2281", "2282", "2283", "2284", "2285", "2286", "2287", "2288", "2= 289", +"2290", "2291", "2292", "2293", "2294", "2295", "2296", "2297", "2298", "2= 299", +"2300", "2301", "2302", "2303", "2304", "2305", "2306", "2307", "2308", "2= 309", +"2310", "2311", "2312", "2313", "2314", "2315", "2316", "2317", "2318", "2= 319", +"2320", "2321", "2322", "2323", "2324", "2325", "2326", "2327", "2328", "2= 329", +"2330", "2331", "2332", "2333", "2334", "2335", "2336", "2337", "2338", "2= 339", +"2340", "2341", "2342", "2343", "2344", "2345", "2346", "2347", "2348", "2= 349", +"2350", "2351", "2352", "2353", "2354", "2355", "2356", "2357", "2358", "2= 359", +"2360", "2361", "2362", "2363", "2364", "2365", "2366", "2367", "2368", "2= 369", +"2370", "2371", "2372", "2373", "2374", "2375", "2376", "2377", "2378", "2= 379", +"2380", "2381", "2382", "2383", "2384", "2385", "2386", "2387", "2388", "2= 389", +"2390", "2391", "2392", "2393", "2394", "2395", "2396", "2397", "2398", "2= 399", +"2400", "2401", "2402", "2403", "2404", "2405", "2406", "2407", "2408", "2= 409", +"2410", "2411", "2412", "2413", "2414", "2415", "2416", "2417", "2418", "2= 419", +"2420", "2421", "2422", "2423", "2424", "2425", "2426", "2427", "2428", "2= 429", +"2430", "2431", "2432", "2433", "2434", "2435", "2436", "2437", "2438", "2= 439", +"2440", "2441", "2442", "2443", "2444", "2445", "2446", "2447", "2448", "2= 449", +"2450", "2451", "2452", "2453", "2454", "2455", "2456", "2457", "2458", "2= 459", +"2460", "2461", "2462", "2463", "2464", "2465", "2466", "2467", "2468", "2= 469", +"2470", "2471", "2472", "2473", "2474", "2475", "2476", "2477", "2478", "2= 479", +"2480", "2481", "2482", "2483", "2484", "2485", "2486", "2487", "2488", "2= 489", +"2490", "2491", "2492", "2493", "2494", "2495", "2496", "2497", "2498", "2= 499", +"2500", "2501", "2502", "2503", "2504", "2505", "2506", "2507", "2508", "2= 509", +"2510", "2511", "2512", "2513", "2514", "2515", "2516", "2517", "2518", "2= 519", +"2520", "2521", "2522", "2523", "2524", "2525", "2526", "2527", "2528", "2= 529", +"2530", "2531", "2532", "2533", "2534", "2535", "2536", "2537", "2538", "2= 539", +"2540", "2541", "2542", "2543", "2544", "2545", "2546", "2547", "2548", "2= 549", +"2550", "2551", "2552", "2553", "2554", "2555", "2556", "2557", "2558", "2= 559", +"2560", "2561", "2562", "2563", "2564", "2565", "2566", "2567", "2568", "2= 569", +"2570", "2571", "2572", "2573", "2574", "2575", "2576", "2577", "2578", "2= 579", +"2580", "2581", "2582", "2583", "2584", "2585", "2586", "2587", "2588", "2= 589", +"2590", "2591", "2592", "2593", "2594", "2595", "2596", "2597", "2598", "2= 599", +"2600", "2601", "2602", "2603", "2604", "2605", "2606", "2607", "2608", "2= 609", +"2610", "2611", "2612", "2613", "2614", "2615", "2616", "2617", "2618", "2= 619", +"2620", "2621", "2622", "2623", "2624", "2625", "2626", "2627", "2628", "2= 629", +"2630", "2631", "2632", "2633", "2634", "2635", "2636", "2637", "2638", "2= 639", +"2640", "2641", "2642", "2643", "2644", "2645", "2646", "2647", "2648", "2= 649", +"2650", "2651", "2652", "2653", "2654", "2655", "2656", "2657", "2658", "2= 659", +"2660", "2661", "2662", "2663", "2664", "2665", "2666", "2667", "2668", "2= 669", +"2670", "2671", "2672", "2673", "2674", "2675", "2676", "2677", "2678", "2= 679", +"2680", "2681", "2682", "2683", "2684", "2685", "2686", "2687", "2688", "2= 689", +"2690", "2691", "2692", "2693", "2694", "2695", "2696", "2697", "2698", "2= 699", +"2700", "2701", "2702", "2703", "2704", "2705", "2706", "2707", "2708", "2= 709", +"2710", "2711", "2712", "2713", "2714", "2715", "2716", "2717", "2718", "2= 719", +"2720", "2721", "2722", "2723", "2724", "2725", "2726", "2727", "2728", "2= 729", +"2730", "2731", "2732", "2733", "2734", "2735", "2736", "2737", "2738", "2= 739", +"2740", "2741", "2742", "2743", "2744", "2745", "2746", "2747", "2748", "2= 749", +"2750", "2751", "2752", "2753", "2754", "2755", "2756", "2757", "2758", "2= 759", +"2760", "2761", "2762", "2763", "2764", "2765", "2766", "2767", "2768", "2= 769", +"2770", "2771", "2772", "2773", "2774", "2775", "2776", "2777", "2778", "2= 779", +"2780", "2781", "2782", "2783", "2784", "2785", "2786", "2787", "2788", "2= 789", +"2790", "2791", "2792", "2793", "2794", "2795", "2796", "2797", "2798", "2= 799", +"2800", "2801", "2802", "2803", "2804", "2805", "2806", "2807", "2808", "2= 809", +"2810", "2811", "2812", "2813", "2814", "2815", "2816", "2817", "2818", "2= 819", +"2820", "2821", "2822", "2823", "2824", "2825", "2826", "2827", "2828", "2= 829", +"2830", "2831", "2832", "2833", "2834", "2835", "2836", "2837", "2838", "2= 839", +"2840", "2841", "2842", "2843", "2844", "2845", "2846", "2847", "2848", "2= 849", +"2850", "2851", "2852", "2853", "2854", "2855", "2856", "2857", "2858", "2= 859", +"2860", "2861", "2862", "2863", "2864", "2865", "2866", "2867", "2868", "2= 869", +"2870", "2871", "2872", "2873", "2874", "2875", "2876", "2877", "2878", "2= 879", +"2880", "2881", "2882", "2883", "2884", "2885", "2886", "2887", "2888", "2= 889", +"2890", "2891", "2892", "2893", "2894", "2895", "2896", "2897", "2898", "2= 899", +"2900", "2901", "2902", "2903", "2904", "2905", "2906", "2907", "2908", "2= 909", +"2910", "2911", "2912", "2913", "2914", "2915", "2916", "2917", "2918", "2= 919", +"2920", "2921", "2922", "2923", "2924", "2925", "2926", "2927", "2928", "2= 929", +"2930", "2931", "2932", "2933", "2934", "2935", "2936", "2937", "2938", "2= 939", +"2940", "2941", "2942", "2943", "2944", "2945", "2946", "2947", "2948", "2= 949", +"2950", "2951", "2952", "2953", "2954", "2955", "2956", "2957", "2958", "2= 959", +"2960", "2961", "2962", "2963", "2964", "2965", "2966", "2967", "2968", "2= 969", +"2970", "2971", "2972", "2973", "2974", "2975", "2976", "2977", "2978", "2= 979", +"2980", "2981", "2982", "2983", "2984", "2985", "2986", "2987", "2988", "2= 989", +"2990", "2991", "2992", "2993", "2994", "2995", "2996", "2997", "2998", "2= 999", +"3000", "3001", "3002", "3003", "3004", "3005", "3006", "3007", "3008", "3= 009", +"3010", "3011", "3012", "3013", "3014", "3015", "3016", "3017", "3018", "3= 019", +"3020", "3021", "3022", "3023", "3024", "3025", "3026", "3027", "3028", "3= 029", +"3030", "3031", "3032", "3033", "3034", "3035", "3036", "3037", "3038", "3= 039", +"3040", "3041", "3042", "3043", "3044", "3045", "3046", "3047", "3048", "3= 049", +"3050", "3051", "3052", "3053", "3054", "3055", "3056", "3057", "3058", "3= 059", +"3060", "3061", "3062", "3063", "3064", "3065", "3066", "3067", "3068", "3= 069", +"3070", "3071", "3072", "3073", "3074", "3075", "3076", "3077", "3078", "3= 079", +"3080", "3081", "3082", "3083", "3084", "3085", "3086", "3087", "3088", "3= 089", +"3090", "3091", "3092", "3093", "3094", "3095", "3096", "3097", "3098", "3= 099", +"3100", "3101", "3102", "3103", "3104", "3105", "3106", "3107", "3108", "3= 109", +"3110", "3111", "3112", "3113", "3114", "3115", "3116", "3117", "3118", "3= 119", +"3120", "3121", "3122", "3123", "3124", "3125", "3126", "3127", "3128", "3= 129", +"3130", "3131", "3132", "3133", "3134", "3135", "3136", "3137", "3138", "3= 139", +"3140", "3141", "3142", "3143", "3144", "3145", "3146", "3147", "3148", "3= 149", +"3150", "3151", "3152", "3153", "3154", "3155", "3156", "3157", "3158", "3= 159", +"3160", "3161", "3162", "3163", "3164", "3165", "3166", "3167", "3168", "3= 169", +"3170", "3171", "3172", "3173", "3174", "3175", "3176", "3177", "3178", "3= 179", +"3180", "3181", "3182", "3183", "3184", "3185", "3186", "3187", "3188", "3= 189", +"3190", "3191", "3192", "3193", "3194", "3195", "3196", "3197", "3198", "3= 199", +"3200", "3201", "3202", "3203", "3204", "3205", "3206", "3207", "3208", "3= 209", +"3210", "3211", "3212", "3213", "3214", "3215", "3216", "3217", "3218", "3= 219", +"3220", "3221", "3222", "3223", "3224", "3225", "3226", "3227", "3228", "3= 229", +"3230", "3231", "3232", "3233", "3234", "3235", "3236", "3237", "3238", "3= 239", +"3240", "3241", "3242", "3243", "3244", "3245", "3246", "3247", "3248", "3= 249", +"3250", "3251", "3252", "3253", "3254", "3255", "3256", "3257", "3258", "3= 259", +"3260", "3261", "3262", "3263", "3264", "3265", "3266", "3267", "3268", "3= 269", +"3270", "3271", "3272", "3273", "3274", "3275", "3276", "3277", "3278", "3= 279", +"3280", "3281", "3282", "3283", "3284", "3285", "3286", "3287", "3288", "3= 289", +"3290", "3291", "3292", "3293", "3294", "3295", "3296", "3297", "3298", "3= 299", +"3300", "3301", "3302", "3303", "3304", "3305", "3306", "3307", "3308", "3= 309", +"3310", "3311", "3312", "3313", "3314", "3315", "3316", "3317", "3318", "3= 319", +"3320", "3321", "3322", "3323", "3324", "3325", "3326", "3327", "3328", "3= 329", +"3330", "3331", "3332", "3333", "3334", "3335", "3336", "3337", "3338", "3= 339", +"3340", "3341", "3342", "3343", "3344", "3345", "3346", "3347", "3348", "3= 349", +"3350", "3351", "3352", "3353", "3354", "3355", "3356", "3357", "3358", "3= 359", +"3360", "3361", "3362", "3363", "3364", "3365", "3366", "3367", "3368", "3= 369", +"3370", "3371", "3372", "3373", "3374", "3375", "3376", "3377", "3378", "3= 379", +"3380", "3381", "3382", "3383", "3384", "3385", "3386", "3387", "3388", "3= 389", +"3390", "3391", "3392", "3393", "3394", "3395", "3396", "3397", "3398", "3= 399", +"3400", "3401", "3402", "3403", "3404", "3405", "3406", "3407", "3408", "3= 409", +"3410", "3411", "3412", "3413", "3414", "3415", "3416", "3417", "3418", "3= 419", +"3420", "3421", "3422", "3423", "3424", "3425", "3426", "3427", "3428", "3= 429", +"3430", "3431", "3432", "3433", "3434", "3435", "3436", "3437", "3438", "3= 439", +"3440", "3441", "3442", "3443", "3444", "3445", "3446", "3447", "3448", "3= 449", +"3450", "3451", "3452", "3453", "3454", "3455", "3456", "3457", "3458", "3= 459", +"3460", "3461", "3462", "3463", "3464", "3465", "3466", "3467", "3468", "3= 469", +"3470", "3471", "3472", "3473", "3474", "3475", "3476", "3477", "3478", "3= 479", +"3480", "3481", "3482", "3483", "3484", "3485", "3486", "3487", "3488", "3= 489", +"3490", "3491", "3492", "3493", "3494", "3495", "3496", "3497", "3498", "3= 499", +"3500", "3501", "3502", "3503", "3504", "3505", "3506", "3507", "3508", "3= 509", +"3510", "3511", "3512", "3513", "3514", "3515", "3516", "3517", "3518", "3= 519", +"3520", "3521", "3522", "3523", "3524", "3525", "3526", "3527", "3528", "3= 529", +"3530", "3531", "3532", "3533", "3534", "3535", "3536", "3537", "3538", "3= 539", +"3540", "3541", "3542", "3543", "3544", "3545", "3546", "3547", "3548", "3= 549", +"3550", "3551", "3552", "3553", "3554", "3555", "3556", "3557", "3558", "3= 559", +"3560", "3561", "3562", "3563", "3564", "3565", "3566", "3567", "3568", "3= 569", +"3570", "3571", "3572", "3573", "3574", "3575", "3576", "3577", "3578", "3= 579", +"3580", "3581", "3582", "3583", "3584", "3585", "3586", "3587", "3588", "3= 589", +"3590", "3591", "3592", "3593", "3594", "3595", "3596", "3597", "3598", "3= 599", +"3600", "3601", "3602", "3603", "3604", "3605", "3606", "3607", "3608", "3= 609", +"3610", "3611", "3612", "3613", "3614", "3615", "3616", "3617", "3618", "3= 619", +"3620", "3621", "3622", "3623", "3624", "3625", "3626", "3627", "3628", "3= 629", +"3630", "3631", "3632", "3633", "3634", "3635", "3636", "3637", "3638", "3= 639", +"3640", "3641", "3642", "3643", "3644", "3645", "3646", "3647", "3648", "3= 649", +"3650", "3651", "3652", "3653", "3654", "3655", "3656", "3657", "3658", "3= 659", +"3660", "3661", "3662", "3663", "3664", "3665", "3666", "3667", "3668", "3= 669", +"3670", "3671", "3672", "3673", "3674", "3675", "3676", "3677", "3678", "3= 679", +"3680", "3681", "3682", "3683", "3684", "3685", "3686", "3687", "3688", "3= 689", +"3690", "3691", "3692", "3693", "3694", "3695", "3696", "3697", "3698", "3= 699", +"3700", "3701", "3702", "3703", "3704", "3705", "3706", "3707", "3708", "3= 709", +"3710", "3711", "3712", "3713", "3714", "3715", "3716", "3717", "3718", "3= 719", +"3720", "3721", "3722", "3723", "3724", "3725", "3726", "3727", "3728", "3= 729", +"3730", "3731", "3732", "3733", "3734", "3735", "3736", "3737", "3738", "3= 739", +"3740", "3741", "3742", "3743", "3744", "3745", "3746", "3747", "3748", "3= 749", +"3750", "3751", "3752", "3753", "3754", "3755", "3756", "3757", "3758", "3= 759", +"3760", "3761", "3762", "3763", "3764", "3765", "3766", "3767", "3768", "3= 769", +"3770", "3771", "3772", "3773", "3774", "3775", "3776", "3777", "3778", "3= 779", +"3780", "3781", "3782", "3783", "3784", "3785", "3786", "3787", "3788", "3= 789", +"3790", "3791", "3792", "3793", "3794", "3795", "3796", "3797", "3798", "3= 799", +"3800", "3801", "3802", "3803", "3804", "3805", "3806", "3807", "3808", "3= 809", +"3810", "3811", "3812", "3813", "3814", "3815", "3816", "3817", "3818", "3= 819", +"3820", "3821", "3822", "3823", "3824", "3825", "3826", "3827", "3828", "3= 829", +"3830", "3831", "3832", "3833", "3834", "3835", "3836", "3837", "3838", "3= 839", +"3840", "3841", "3842", "3843", "3844", "3845", "3846", "3847", "3848", "3= 849", +"3850", "3851", "3852", "3853", "3854", "3855", "3856", "3857", "3858", "3= 859", +"3860", "3861", "3862", "3863", "3864", "3865", "3866", "3867", "3868", "3= 869", +"3870", "3871", "3872", "3873", "3874", "3875", "3876", "3877", "3878", "3= 879", +"3880", "3881", "3882", "3883", "3884", "3885", "3886", "3887", "3888", "3= 889", +"3890", "3891", "3892", "3893", "3894", "3895", "3896", "3897", "3898", "3= 899", +"3900", "3901", "3902", "3903", "3904", "3905", "3906", "3907", "3908", "3= 909", +"3910", "3911", "3912", "3913", "3914", "3915", "3916", "3917", "3918", "3= 919", +"3920", "3921", "3922", "3923", "3924", "3925", "3926", "3927", "3928", "3= 929", +"3930", "3931", "3932", "3933", "3934", "3935", "3936", "3937", "3938", "3= 939", +"3940", "3941", "3942", "3943", "3944", "3945", "3946", "3947", "3948", "3= 949", +"3950", "3951", "3952", "3953", "3954", "3955", "3956", "3957", "3958", "3= 959", +"3960", "3961", "3962", "3963", "3964", "3965", "3966", "3967", "3968", "3= 969", +"3970", "3971", "3972", "3973", "3974", "3975", "3976", "3977", "3978", "3= 979", +"3980", "3981", "3982", "3983", "3984", "3985", "3986", "3987", "3988", "3= 989", +"3990", "3991", "3992", "3993", "3994", "3995", "3996", "3997", "3998", "3= 999", +"4000", "4001", "4002", "4003", "4004", "4005", "4006", "4007", "4008", "4= 009", +"4010", "4011", "4012", "4013", "4014", "4015", "4016", "4017", "4018", "4= 019", +"4020", "4021", "4022", "4023", "4024", "4025", "4026", "4027", "4028", "4= 029", +"4030", "4031", "4032", "4033", "4034", "4035", "4036", "4037", "4038", "4= 039", +"4040", "4041", "4042", "4043", "4044", "4045", "4046", "4047", "4048", "4= 049", +"4050", "4051", "4052", "4053", "4054", "4055", "4056", "4057", "4058", "4= 059", +"4060", "4061", "4062", "4063", "4064", "4065", "4066", "4067", "4068", "4= 069", +"4070", "4071", "4072", "4073", "4074", "4075", "4076", "4077", "4078", "4= 079", +"4080", "4081", "4082", "4083", "4084", "4085", "4086", "4087", "4088", "4= 089", +"4090", "4091", "4092", "4093", "4094", "4095", "4096", "4097", "4098", "4= 099", +"4100", "4101", "4102", "4103", "4104", "4105", "4106", "4107", "4108", "4= 109", +"4110", "4111", "4112", "4113", "4114", "4115", "4116", "4117", "4118", "4= 119", +"4120", "4121", "4122", "4123", "4124", "4125", "4126", "4127", "4128", "4= 129", +"4130", "4131", "4132", "4133", "4134", "4135", "4136", "4137", "4138", "4= 139", +"4140", "4141", "4142", "4143", "4144", "4145", "4146", "4147", "4148", "4= 149", +"4150", "4151", "4152", "4153", "4154", "4155", "4156", "4157", "4158", "4= 159", +"4160", "4161", "4162", "4163", "4164", "4165", "4166", "4167", "4168", "4= 169", +"4170", "4171", "4172", "4173", "4174", "4175", "4176", "4177", "4178", "4= 179", +"4180", "4181", "4182", "4183", "4184", "4185", "4186", "4187", "4188", "4= 189", +"4190", "4191", "4192", "4193", "4194", "4195", "4196", "4197", "4198", "4= 199", +"4200", "4201", "4202", "4203", "4204", "4205", "4206", "4207", "4208", "4= 209", +"4210", "4211", "4212", "4213", "4214", "4215", "4216", "4217", "4218", "4= 219", +"4220", "4221", "4222", "4223", "4224", "4225", "4226", "4227", "4228", "4= 229", +"4230", "4231", "4232", "4233", "4234", "4235", "4236", "4237", "4238", "4= 239", +"4240", "4241", "4242", "4243", "4244", "4245", "4246", "4247", "4248", "4= 249", +"4250", "4251", "4252", "4253", "4254", "4255", "4256", "4257", "4258", "4= 259", +"4260", "4261", "4262", "4263", "4264", "4265", "4266", "4267", "4268", "4= 269", +"4270", "4271", "4272", "4273", "4274", "4275", "4276", "4277", "4278", "4= 279", +"4280", "4281", "4282", "4283", "4284", "4285", "4286", "4287", "4288", "4= 289", +"4290", "4291", "4292", "4293", "4294", "4295", "4296", "4297", "4298", "4= 299", +"4300", "4301", "4302", "4303", "4304", "4305", "4306", "4307", "4308", "4= 309", +"4310", "4311", "4312", "4313", "4314", "4315", "4316", "4317", "4318", "4= 319", +"4320", "4321", "4322", "4323", "4324", "4325", "4326", "4327", "4328", "4= 329", +"4330", "4331", "4332", "4333", "4334", "4335", "4336", "4337", "4338", "4= 339", +"4340", "4341", "4342", "4343", "4344", "4345", "4346", "4347", "4348", "4= 349", +"4350", "4351", "4352", "4353", "4354", "4355", "4356", "4357", "4358", "4= 359", +"4360", "4361", "4362", "4363", "4364", "4365", "4366", "4367", "4368", "4= 369", +"4370", "4371", "4372", "4373", "4374", "4375", "4376", "4377", "4378", "4= 379", +"4380", "4381", "4382", "4383", "4384", "4385", "4386", "4387", "4388", "4= 389", +"4390", "4391", "4392", "4393", "4394", "4395", "4396", "4397", "4398", "4= 399", +"4400", "4401", "4402", "4403", "4404", "4405", "4406", "4407", "4408", "4= 409", +"4410", "4411", "4412", "4413", "4414", "4415", "4416", "4417", "4418", "4= 419", +"4420", "4421", "4422", "4423", "4424", "4425", "4426", "4427", "4428", "4= 429", +"4430", "4431", "4432", "4433", "4434", "4435", "4436", "4437", "4438", "4= 439", +"4440", "4441", "4442", "4443", "4444", "4445", "4446", "4447", "4448", "4= 449", +"4450", "4451", "4452", "4453", "4454", "4455", "4456", "4457", "4458", "4= 459", +"4460", "4461", "4462", "4463", "4464", "4465", "4466", "4467", "4468", "4= 469", +"4470", "4471", "4472", "4473", "4474", "4475", "4476", "4477", "4478", "4= 479", +"4480", "4481", "4482", "4483", "4484", "4485", "4486", "4487", "4488", "4= 489", +"4490", "4491", "4492", "4493", "4494", "4495", "4496", "4497", "4498", "4= 499", +"4500", "4501", "4502", "4503", "4504", "4505", "4506", "4507", "4508", "4= 509", +"4510", "4511", "4512", "4513", "4514", "4515", "4516", "4517", "4518", "4= 519", +"4520", "4521", "4522", "4523", "4524", "4525", "4526", "4527", "4528", "4= 529", +"4530", "4531", "4532", "4533", "4534", "4535", "4536", "4537", "4538", "4= 539", +"4540", "4541", "4542", "4543", "4544", "4545", "4546", "4547", "4548", "4= 549", +"4550", "4551", "4552", "4553", "4554", "4555", "4556", "4557", "4558", "4= 559", +"4560", "4561", "4562", "4563", "4564", "4565", "4566", "4567", "4568", "4= 569", +"4570", "4571", "4572", "4573", "4574", "4575", "4576", "4577", "4578", "4= 579", +"4580", "4581", "4582", "4583", "4584", "4585", "4586", "4587", "4588", "4= 589", +"4590", "4591", "4592", "4593", "4594", "4595", "4596", "4597", "4598", "4= 599", +"4600", "4601", "4602", "4603", "4604", "4605", "4606", "4607", "4608", "4= 609", +"4610", "4611", "4612", "4613", "4614", "4615", "4616", "4617", "4618", "4= 619", +"4620", "4621", "4622", "4623", "4624", "4625", "4626", "4627", "4628", "4= 629", +"4630", "4631", "4632", "4633", "4634", "4635", "4636", "4637", "4638", "4= 639", +"4640", "4641", "4642", "4643", "4644", "4645", "4646", "4647", "4648", "4= 649", +"4650", "4651", "4652", "4653", "4654", "4655", "4656", "4657", "4658", "4= 659", +"4660", "4661", "4662", "4663", "4664", "4665", "4666", "4667", "4668", "4= 669", +"4670", "4671", "4672", "4673", "4674", "4675", "4676", "4677", "4678", "4= 679", +"4680", "4681", "4682", "4683", "4684", "4685", "4686", "4687", "4688", "4= 689", +"4690", "4691", "4692", "4693", "4694", "4695", "4696", "4697", "4698", "4= 699", +"4700", "4701", "4702", "4703", "4704", "4705", "4706", "4707", "4708", "4= 709", +"4710", "4711", "4712", "4713", "4714", "4715", "4716", "4717", "4718", "4= 719", +"4720", "4721", "4722", "4723", "4724", "4725", "4726", "4727", "4728", "4= 729", +"4730", "4731", "4732", "4733", "4734", "4735", "4736", "4737", "4738", "4= 739", +"4740", "4741", "4742", "4743", "4744", "4745", "4746", "4747", "4748", "4= 749", +"4750", "4751", "4752", "4753", "4754", "4755", "4756", "4757", "4758", "4= 759", +"4760", "4761", "4762", "4763", "4764", "4765", "4766", "4767", "4768", "4= 769", +"4770", "4771", "4772", "4773", "4774", "4775", "4776", "4777", "4778", "4= 779", +"4780", "4781", "4782", "4783", "4784", "4785", "4786", "4787", "4788", "4= 789", +"4790", "4791", "4792", "4793", "4794", "4795", "4796", "4797", "4798", "4= 799", +"4800", "4801", "4802", "4803", "4804", "4805", "4806", "4807", "4808", "4= 809", +"4810", "4811", "4812", "4813", "4814", "4815", "4816", "4817", "4818", "4= 819", +"4820", "4821", "4822", "4823", "4824", "4825", "4826", "4827", "4828", "4= 829", +"4830", "4831", "4832", "4833", "4834", "4835", "4836", "4837", "4838", "4= 839", +"4840", "4841", "4842", "4843", "4844", "4845", "4846", "4847", "4848", "4= 849", +"4850", "4851", "4852", "4853", "4854", "4855", "4856", "4857", "4858", "4= 859", +"4860", "4861", "4862", "4863", "4864", "4865", "4866", "4867", "4868", "4= 869", +"4870", "4871", "4872", "4873", "4874", "4875", "4876", "4877", "4878", "4= 879", +"4880", "4881", "4882", "4883", "4884", "4885", "4886", "4887", "4888", "4= 889", +"4890", "4891", "4892", "4893", "4894", "4895", "4896", "4897", "4898", "4= 899", +"4900", "4901", "4902", "4903", "4904", "4905", "4906", "4907", "4908", "4= 909", +"4910", "4911", "4912", "4913", "4914", "4915", "4916", "4917", "4918", "4= 919", +"4920", "4921", "4922", "4923", "4924", "4925", "4926", "4927", "4928", "4= 929", +"4930", "4931", "4932", "4933", "4934", "4935", "4936", "4937", "4938", "4= 939", +"4940", "4941", "4942", "4943", "4944", "4945", "4946", "4947", "4948", "4= 949", +"4950", "4951", "4952", "4953", "4954", "4955", "4956", "4957", "4958", "4= 959", +"4960", "4961", "4962", "4963", "4964", "4965", "4966", "4967", "4968", "4= 969", +"4970", "4971", "4972", "4973", "4974", "4975", "4976", "4977", "4978", "4= 979", +"4980", "4981", "4982", "4983", "4984", "4985", "4986", "4987", "4988", "4= 989", +"4990", "4991", "4992", "4993", "4994", "4995", "4996", "4997", "4998", "4= 999", +"5000", "5001", "5002", "5003", "5004", "5005", "5006", "5007", "5008", "5= 009", +"5010", "5011", "5012", "5013", "5014", "5015", "5016", "5017", "5018", "5= 019", +"5020", "5021", "5022", "5023", "5024", "5025", "5026", "5027", "5028", "5= 029", +"5030", "5031", "5032", "5033", "5034", "5035", "5036", "5037", "5038", "5= 039", +"5040", "5041", "5042", "5043", "5044", "5045", "5046", "5047", "5048", "5= 049", +"5050", "5051", "5052", "5053", "5054", "5055", "5056", "5057", "5058", "5= 059", +"5060", "5061", "5062", "5063", "5064", "5065", "5066", "5067", "5068", "5= 069", +"5070", "5071", "5072", "5073", "5074", "5075", "5076", "5077", "5078", "5= 079", +"5080", "5081", "5082", "5083", "5084", "5085", "5086", "5087", "5088", "5= 089", +"5090", "5091", "5092", "5093", "5094", "5095", "5096", "5097", "5098", "5= 099", +"5100", "5101", "5102", "5103", "5104", "5105", "5106", "5107", "5108", "5= 109", +"5110", "5111", "5112", "5113", "5114", "5115", "5116", "5117", "5118", "5= 119", +"5120", "5121", "5122", "5123", "5124", "5125", "5126", "5127", "5128", "5= 129", +"5130", "5131", "5132", "5133", "5134", "5135", "5136", "5137", "5138", "5= 139", +"5140", "5141", "5142", "5143", "5144", "5145", "5146", "5147", "5148", "5= 149", +"5150", "5151", "5152", "5153", "5154", "5155", "5156", "5157", "5158", "5= 159", +"5160", "5161", "5162", "5163", "5164", "5165", "5166", "5167", "5168", "5= 169", +"5170", "5171", "5172", "5173", "5174", "5175", "5176", "5177", "5178", "5= 179", +"5180", "5181", "5182", "5183", "5184", "5185", "5186", "5187", "5188", "5= 189", +"5190", "5191", "5192", "5193", "5194", "5195", "5196", "5197", "5198", "5= 199", +"5200", "5201", "5202", "5203", "5204", "5205", "5206", "5207", "5208", "5= 209", +"5210", "5211", "5212", "5213", "5214", "5215", "5216", "5217", "5218", "5= 219", +"5220", "5221", "5222", "5223", "5224", "5225", "5226", "5227", "5228", "5= 229", +"5230", "5231", "5232", "5233", "5234", "5235", "5236", "5237", "5238", "5= 239", +"5240", "5241", "5242", "5243", "5244", "5245", "5246", "5247", "5248", "5= 249", +"5250", "5251", "5252", "5253", "5254", "5255", "5256", "5257", "5258", "5= 259", +"5260", "5261", "5262", "5263", "5264", "5265", "5266", "5267", "5268", "5= 269", +"5270", "5271", "5272", "5273", "5274", "5275", "5276", "5277", "5278", "5= 279", +"5280", "5281", "5282", "5283", "5284", "5285", "5286", "5287", "5288", "5= 289", +"5290", "5291", "5292", "5293", "5294", "5295", "5296", "5297", "5298", "5= 299", +"5300", "5301", "5302", "5303", "5304", "5305", "5306", "5307", "5308", "5= 309", +"5310", "5311", "5312", "5313", "5314", "5315", "5316", "5317", "5318", "5= 319", +"5320", "5321", "5322", "5323", "5324", "5325", "5326", "5327", "5328", "5= 329", +"5330", "5331", "5332", "5333", "5334", "5335", "5336", "5337", "5338", "5= 339", +"5340", "5341", "5342", "5343", "5344", "5345", "5346", "5347", "5348", "5= 349", +"5350", "5351", "5352", "5353", "5354", "5355", "5356", "5357", "5358", "5= 359", +"5360", "5361", "5362", "5363", "5364", "5365", "5366", "5367", "5368", "5= 369", +"5370", "5371", "5372", "5373", "5374", "5375", "5376", "5377", "5378", "5= 379", +"5380", "5381", "5382", "5383", "5384", "5385", "5386", "5387", "5388", "5= 389", +"5390", "5391", "5392", "5393", "5394", "5395", "5396", "5397", "5398", "5= 399", +"5400", "5401", "5402", "5403", "5404", "5405", "5406", "5407", "5408", "5= 409", +"5410", "5411", "5412", "5413", "5414", "5415", "5416", "5417", "5418", "5= 419", +"5420", "5421", "5422", "5423", "5424", "5425", "5426", "5427", "5428", "5= 429", +"5430", "5431", "5432", "5433", "5434", "5435", "5436", "5437", "5438", "5= 439", +"5440", "5441", "5442", "5443", "5444", "5445", "5446", "5447", "5448", "5= 449", +"5450", "5451", "5452", "5453", "5454", "5455", "5456", "5457", "5458", "5= 459", +"5460", "5461", "5462", "5463", "5464", "5465", "5466", "5467", "5468", "5= 469", +"5470", "5471", "5472", "5473", "5474", "5475", "5476", "5477", "5478", "5= 479", +"5480", "5481", "5482", "5483", "5484", "5485", "5486", "5487", "5488", "5= 489", +"5490", "5491", "5492", "5493", "5494", "5495", "5496", "5497", "5498", "5= 499", +"5500", "5501", "5502", "5503", "5504", "5505", "5506", "5507", "5508", "5= 509", +"5510", "5511", "5512", "5513", "5514", "5515", "5516", "5517", "5518", "5= 519", +"5520", "5521", "5522", "5523", "5524", "5525", "5526", "5527", "5528", "5= 529", +"5530", "5531", "5532", "5533", "5534", "5535", "5536", "5537", "5538", "5= 539", +"5540", "5541", "5542", "5543", "5544", "5545", "5546", "5547", "5548", "5= 549", +"5550", "5551", "5552", "5553", "5554", "5555", "5556", "5557", "5558", "5= 559", +"5560", "5561", "5562", "5563", "5564", "5565", "5566", "5567", "5568", "5= 569", +"5570", "5571", "5572", "5573", "5574", "5575", "5576", "5577", "5578", "5= 579", +"5580", "5581", "5582", "5583", "5584", "5585", "5586", "5587", "5588", "5= 589", +"5590", "5591", "5592", "5593", "5594", "5595", "5596", "5597", "5598", "5= 599", +"5600", "5601", "5602", "5603", "5604", "5605", "5606", "5607", "5608", "5= 609", +"5610", "5611", "5612", "5613", "5614", "5615", "5616", "5617", "5618", "5= 619", +"5620", "5621", "5622", "5623", "5624", "5625", "5626", "5627", "5628", "5= 629", +"5630", "5631", "5632", "5633", "5634", "5635", "5636", "5637", "5638", "5= 639", +"5640", "5641", "5642", "5643", "5644", "5645", "5646", "5647", "5648", "5= 649", +"5650", "5651", "5652", "5653", "5654", "5655", "5656", "5657", "5658", "5= 659", +"5660", "5661", "5662", "5663", "5664", "5665", "5666", "5667", "5668", "5= 669", +"5670", "5671", "5672", "5673", "5674", "5675", "5676", "5677", "5678", "5= 679", +"5680", "5681", "5682", "5683", "5684", "5685", "5686", "5687", "5688", "5= 689", +"5690", "5691", "5692", "5693", "5694", "5695", "5696", "5697", "5698", "5= 699", +"5700", "5701", "5702", "5703", "5704", "5705", "5706", "5707", "5708", "5= 709", +"5710", "5711", "5712", "5713", "5714", "5715", "5716", "5717", "5718", "5= 719", +"5720", "5721", "5722", "5723", "5724", "5725", "5726", "5727", "5728", "5= 729", +"5730", "5731", "5732", "5733", "5734", "5735", "5736", "5737", "5738", "5= 739", +"5740", "5741", "5742", "5743", "5744", "5745", "5746", "5747", "5748", "5= 749", +"5750", "5751", "5752", "5753", "5754", "5755", "5756", "5757", "5758", "5= 759", +"5760", "5761", "5762", "5763", "5764", "5765", "5766", "5767", "5768", "5= 769", +"5770", "5771", "5772", "5773", "5774", "5775", "5776", "5777", "5778", "5= 779", +"5780", "5781", "5782", "5783", "5784", "5785", "5786", "5787", "5788", "5= 789", +"5790", "5791", "5792", "5793", "5794", "5795", "5796", "5797", "5798", "5= 799", +"5800", "5801", "5802", "5803", "5804", "5805", "5806", "5807", "5808", "5= 809", +"5810", "5811", "5812", "5813", "5814", "5815", "5816", "5817", "5818", "5= 819", +"5820", "5821", "5822", "5823", "5824", "5825", "5826", "5827", "5828", "5= 829", +"5830", "5831", "5832", "5833", "5834", "5835", "5836", "5837", "5838", "5= 839", +"5840", "5841", "5842", "5843", "5844", "5845", "5846", "5847", "5848", "5= 849", +"5850", "5851", "5852", "5853", "5854", "5855", "5856", "5857", "5858", "5= 859", +"5860", "5861", "5862", "5863", "5864", "5865", "5866", "5867", "5868", "5= 869", +"5870", "5871", "5872", "5873", "5874", "5875", "5876", "5877", "5878", "5= 879", +"5880", "5881", "5882", "5883", "5884", "5885", "5886", "5887", "5888", "5= 889", +"5890", "5891", "5892", "5893", "5894", "5895", "5896", "5897", "5898", "5= 899", +"5900", "5901", "5902", "5903", "5904", "5905", "5906", "5907", "5908", "5= 909", +"5910", "5911", "5912", "5913", "5914", "5915", "5916", "5917", "5918", "5= 919", +"5920", "5921", "5922", "5923", "5924", "5925", "5926", "5927", "5928", "5= 929", +"5930", "5931", "5932", "5933", "5934", "5935", "5936", "5937", "5938", "5= 939", +"5940", "5941", "5942", "5943", "5944", "5945", "5946", "5947", "5948", "5= 949", +"5950", "5951", "5952", "5953", "5954", "5955", "5956", "5957", "5958", "5= 959", +"5960", "5961", "5962", "5963", "5964", "5965", "5966", "5967", "5968", "5= 969", +"5970", "5971", "5972", "5973", "5974", "5975", "5976", "5977", "5978", "5= 979", +"5980", "5981", "5982", "5983", "5984", "5985", "5986", "5987", "5988", "5= 989", +"5990", "5991", "5992", "5993", "5994", "5995", "5996", "5997", "5998", "5= 999", +"6000", "6001", "6002", "6003", "6004", "6005", "6006", "6007", "6008", "6= 009", +"6010", "6011", "6012", "6013", "6014", "6015", "6016", "6017", "6018", "6= 019", +"6020", "6021", "6022", "6023", "6024", "6025", "6026", "6027", "6028", "6= 029", +"6030", "6031", "6032", "6033", "6034", "6035", "6036", "6037", "6038", "6= 039", +"6040", "6041", "6042", "6043", "6044", "6045", "6046", "6047", "6048", "6= 049", +"6050", "6051", "6052", "6053", "6054", "6055", "6056", "6057", "6058", "6= 059", +"6060", "6061", "6062", "6063", "6064", "6065", "6066", "6067", "6068", "6= 069", +"6070", "6071", "6072", "6073", "6074", "6075", "6076", "6077", "6078", "6= 079", +"6080", "6081", "6082", "6083", "6084", "6085", "6086", "6087", "6088", "6= 089", +"6090", "6091", "6092", "6093", "6094", "6095", "6096", "6097", "6098", "6= 099", +"6100", "6101", "6102", "6103", "6104", "6105", "6106", "6107", "6108", "6= 109", +"6110", "6111", "6112", "6113", "6114", "6115", "6116", "6117", "6118", "6= 119", +"6120", "6121", "6122", "6123", "6124", "6125", "6126", "6127", "6128", "6= 129", +"6130", "6131", "6132", "6133", "6134", "6135", "6136", "6137", "6138", "6= 139", +"6140", "6141", "6142", "6143", "6144", "6145", "6146", "6147", "6148", "6= 149", +"6150", "6151", "6152", "6153", "6154", "6155", "6156", "6157", "6158", "6= 159", +"6160", "6161", "6162", "6163", "6164", "6165", "6166", "6167", "6168", "6= 169", +"6170", "6171", "6172", "6173", "6174", "6175", "6176", "6177", "6178", "6= 179", +"6180", "6181", "6182", "6183", "6184", "6185", "6186", "6187", "6188", "6= 189", +"6190", "6191", "6192", "6193", "6194", "6195", "6196", "6197", "6198", "6= 199", +"6200", "6201", "6202", "6203", "6204", "6205", "6206", "6207", "6208", "6= 209", +"6210", "6211", "6212", "6213", "6214", "6215", "6216", "6217", "6218", "6= 219", +"6220", "6221", "6222", "6223", "6224", "6225", "6226", "6227", "6228", "6= 229", +"6230", "6231", "6232", "6233", "6234", "6235", "6236", "6237", "6238", "6= 239", +"6240", "6241", "6242", "6243", "6244", "6245", "6246", "6247", "6248", "6= 249", +"6250", "6251", "6252", "6253", "6254", "6255", "6256", "6257", "6258", "6= 259", +"6260", "6261", "6262", "6263", "6264", "6265", "6266", "6267", "6268", "6= 269", +"6270", "6271", "6272", "6273", "6274", "6275", "6276", "6277", "6278", "6= 279", +"6280", "6281", "6282", "6283", "6284", "6285", "6286", "6287", "6288", "6= 289", +"6290", "6291", "6292", "6293", "6294", "6295", "6296", "6297", "6298", "6= 299", +"6300", "6301", "6302", "6303", "6304", "6305", "6306", "6307", "6308", "6= 309", +"6310", "6311", "6312", "6313", "6314", "6315", "6316", "6317", "6318", "6= 319", +"6320", "6321", "6322", "6323", "6324", "6325", "6326", "6327", "6328", "6= 329", +"6330", "6331", "6332", "6333", "6334", "6335", "6336", "6337", "6338", "6= 339", +"6340", "6341", "6342", "6343", "6344", "6345", "6346", "6347", "6348", "6= 349", +"6350", "6351", "6352", "6353", "6354", "6355", "6356", "6357", "6358", "6= 359", +"6360", "6361", "6362", "6363", "6364", "6365", "6366", "6367", "6368", "6= 369", +"6370", "6371", "6372", "6373", "6374", "6375", "6376", "6377", "6378", "6= 379", +"6380", "6381", "6382", "6383", "6384", "6385", "6386", "6387", "6388", "6= 389", +"6390", "6391", "6392", "6393", "6394", "6395", "6396", "6397", "6398", "6= 399", +"6400", "6401", "6402", "6403", "6404", "6405", "6406", "6407", "6408", "6= 409", +"6410", "6411", "6412", "6413", "6414", "6415", "6416", "6417", "6418", "6= 419", +"6420", "6421", "6422", "6423", "6424", "6425", "6426", "6427", "6428", "6= 429", +"6430", "6431", "6432", "6433", "6434", "6435", "6436", "6437", "6438", "6= 439", +"6440", "6441", "6442", "6443", "6444", "6445", "6446", "6447", "6448", "6= 449", +"6450", "6451", "6452", "6453", "6454", "6455", "6456", "6457", "6458", "6= 459", +"6460", "6461", "6462", "6463", "6464", "6465", "6466", "6467", "6468", "6= 469", +"6470", "6471", "6472", "6473", "6474", "6475", "6476", "6477", "6478", "6= 479", +"6480", "6481", "6482", "6483", "6484", "6485", "6486", "6487", "6488", "6= 489", +"6490", "6491", "6492", "6493", "6494", "6495", "6496", "6497", "6498", "6= 499", +"6500", "6501", "6502", "6503", "6504", "6505", "6506", "6507", "6508", "6= 509", +"6510", "6511", "6512", "6513", "6514", "6515", "6516", "6517", "6518", "6= 519", +"6520", "6521", "6522", "6523", "6524", "6525", "6526", "6527", "6528", "6= 529", +"6530", "6531", "6532", "6533", "6534", "6535", "6536", "6537", "6538", "6= 539", +"6540", "6541", "6542", "6543", "6544", "6545", "6546", "6547", "6548", "6= 549", +"6550", "6551", "6552", "6553", "6554", "6555", "6556", "6557", "6558", "6= 559", +"6560", "6561", "6562", "6563", "6564", "6565", "6566", "6567", "6568", "6= 569", +"6570", "6571", "6572", "6573", "6574", "6575", "6576", "6577", "6578", "6= 579", +"6580", "6581", "6582", "6583", "6584", "6585", "6586", "6587", "6588", "6= 589", +"6590", "6591", "6592", "6593", "6594", "6595", "6596", "6597", "6598", "6= 599", +"6600", "6601", "6602", "6603", "6604", "6605", "6606", "6607", "6608", "6= 609", +"6610", "6611", "6612", "6613", "6614", "6615", "6616", "6617", "6618", "6= 619", +"6620", "6621", "6622", "6623", "6624", "6625", "6626", "6627", "6628", "6= 629", +"6630", "6631", "6632", "6633", "6634", "6635", "6636", "6637", "6638", "6= 639", +"6640", "6641", "6642", "6643", "6644", "6645", "6646", "6647", "6648", "6= 649", +"6650", "6651", "6652", "6653", "6654", "6655", "6656", "6657", "6658", "6= 659", +"6660", "6661", "6662", "6663", "6664", "6665", "6666", "6667", "6668", "6= 669", +"6670", "6671", "6672", "6673", "6674", "6675", "6676", "6677", "6678", "6= 679", +"6680", "6681", "6682", "6683", "6684", "6685", "6686", "6687", "6688", "6= 689", +"6690", "6691", "6692", "6693", "6694", "6695", "6696", "6697", "6698", "6= 699", +"6700", "6701", "6702", "6703", "6704", "6705", "6706", "6707", "6708", "6= 709", +"6710", "6711", "6712", "6713", "6714", "6715", "6716", "6717", "6718", "6= 719", +"6720", "6721", "6722", "6723", "6724", "6725", "6726", "6727", "6728", "6= 729", +"6730", "6731", "6732", "6733", "6734", "6735", "6736", "6737", "6738", "6= 739", +"6740", "6741", "6742", "6743", "6744", "6745", "6746", "6747", "6748", "6= 749", +"6750", "6751", "6752", "6753", "6754", "6755", "6756", "6757", "6758", "6= 759", +"6760", "6761", "6762", "6763", "6764", "6765", "6766", "6767", "6768", "6= 769", +"6770", "6771", "6772", "6773", "6774", "6775", "6776", "6777", "6778", "6= 779", +"6780", "6781", "6782", "6783", "6784", "6785", "6786", "6787", "6788", "6= 789", +"6790", "6791", "6792", "6793", "6794", "6795", "6796", "6797", "6798", "6= 799", +"6800", "6801", "6802", "6803", "6804", "6805", "6806", "6807", "6808", "6= 809", +"6810", "6811", "6812", "6813", "6814", "6815", "6816", "6817", "6818", "6= 819", +"6820", "6821", "6822", "6823", "6824", "6825", "6826", "6827", "6828", "6= 829", +"6830", "6831", "6832", "6833", "6834", "6835", "6836", "6837", "6838", "6= 839", +"6840", "6841", "6842", "6843", "6844", "6845", "6846", "6847", "6848", "6= 849", +"6850", "6851", "6852", "6853", "6854", "6855", "6856", "6857", "6858", "6= 859", +"6860", "6861", "6862", "6863", "6864", "6865", "6866", "6867", "6868", "6= 869", +"6870", "6871", "6872", "6873", "6874", "6875", "6876", "6877", "6878", "6= 879", +"6880", "6881", "6882", "6883", "6884", "6885", "6886", "6887", "6888", "6= 889", +"6890", "6891", "6892", "6893", "6894", "6895", "6896", "6897", "6898", "6= 899", +"6900", "6901", "6902", "6903", "6904", "6905", "6906", "6907", "6908", "6= 909", +"6910", "6911", "6912", "6913", "6914", "6915", "6916", "6917", "6918", "6= 919", +"6920", "6921", "6922", "6923", "6924", "6925", "6926", "6927", "6928", "6= 929", +"6930", "6931", "6932", "6933", "6934", "6935", "6936", "6937", "6938", "6= 939", +"6940", "6941", "6942", "6943", "6944", "6945", "6946", "6947", "6948", "6= 949", +"6950", "6951", "6952", "6953", "6954", "6955", "6956", "6957", "6958", "6= 959", +"6960", "6961", "6962", "6963", "6964", "6965", "6966", "6967", "6968", "6= 969", +"6970", "6971", "6972", "6973", "6974", "6975", "6976", "6977", "6978", "6= 979", +"6980", "6981", "6982", "6983", "6984", "6985", "6986", "6987", "6988", "6= 989", +"6990", "6991", "6992", "6993", "6994", "6995", "6996", "6997", "6998", "6= 999", +"7000", "7001", "7002", "7003", "7004", "7005", "7006", "7007", "7008", "7= 009", +"7010", "7011", "7012", "7013", "7014", "7015", "7016", "7017", "7018", "7= 019", +"7020", "7021", "7022", "7023", "7024", "7025", "7026", "7027", "7028", "7= 029", +"7030", "7031", "7032", "7033", "7034", "7035", "7036", "7037", "7038", "7= 039", +"7040", "7041", "7042", "7043", "7044", "7045", "7046", "7047", "7048", "7= 049", +"7050", "7051", "7052", "7053", "7054", "7055", "7056", "7057", "7058", "7= 059", +"7060", "7061", "7062", "7063", "7064", "7065", "7066", "7067", "7068", "7= 069", +"7070", "7071", "7072", "7073", "7074", "7075", "7076", "7077", "7078", "7= 079", +"7080", "7081", "7082", "7083", "7084", "7085", "7086", "7087", "7088", "7= 089", +"7090", "7091", "7092", "7093", "7094", "7095", "7096", "7097", "7098", "7= 099", +"7100", "7101", "7102", "7103", "7104", "7105", "7106", "7107", "7108", "7= 109", +"7110", "7111", "7112", "7113", "7114", "7115", "7116", "7117", "7118", "7= 119", +"7120", "7121", "7122", "7123", "7124", "7125", "7126", "7127", "7128", "7= 129", +"7130", "7131", "7132", "7133", "7134", "7135", "7136", "7137", "7138", "7= 139", +"7140", "7141", "7142", "7143", "7144", "7145", "7146", "7147", "7148", "7= 149", +"7150", "7151", "7152", "7153", "7154", "7155", "7156", "7157", "7158", "7= 159", +"7160", "7161", "7162", "7163", "7164", "7165", "7166", "7167", "7168", "7= 169", +"7170", "7171", "7172", "7173", "7174", "7175", "7176", "7177", "7178", "7= 179", +"7180", "7181", "7182", "7183", "7184", "7185", "7186", "7187", "7188", "7= 189", +"7190", "7191", "7192", "7193", "7194", "7195", "7196", "7197", "7198", "7= 199", +"7200", "7201", "7202", "7203", "7204", "7205", "7206", "7207", "7208", "7= 209", +"7210", "7211", "7212", "7213", "7214", "7215", "7216", "7217", "7218", "7= 219", +"7220", "7221", "7222", "7223", "7224", "7225", "7226", "7227", "7228", "7= 229", +"7230", "7231", "7232", "7233", "7234", "7235", "7236", "7237", "7238", "7= 239", +"7240", "7241", "7242", "7243", "7244", "7245", "7246", "7247", "7248", "7= 249", +"7250", "7251", "7252", "7253", "7254", "7255", "7256", "7257", "7258", "7= 259", +"7260", "7261", "7262", "7263", "7264", "7265", "7266", "7267", "7268", "7= 269", +"7270", "7271", "7272", "7273", "7274", "7275", "7276", "7277", "7278", "7= 279", +"7280", "7281", "7282", "7283", "7284", "7285", "7286", "7287", "7288", "7= 289", +"7290", "7291", "7292", "7293", "7294", "7295", "7296", "7297", "7298", "7= 299", +"7300", "7301", "7302", "7303", "7304", "7305", "7306", "7307", "7308", "7= 309", +"7310", "7311", "7312", "7313", "7314", "7315", "7316", "7317", "7318", "7= 319", +"7320", "7321", "7322", "7323", "7324", "7325", "7326", "7327", "7328", "7= 329", +"7330", "7331", "7332", "7333", "7334", "7335", "7336", "7337", "7338", "7= 339", +"7340", "7341", "7342", "7343", "7344", "7345", "7346", "7347", "7348", "7= 349", +"7350", "7351", "7352", "7353", "7354", "7355", "7356", "7357", "7358", "7= 359", +"7360", "7361", "7362", "7363", "7364", "7365", "7366", "7367", "7368", "7= 369", +"7370", "7371", "7372", "7373", "7374", "7375", "7376", "7377", "7378", "7= 379", +"7380", "7381", "7382", "7383", "7384", "7385", "7386", "7387", "7388", "7= 389", +"7390", "7391", "7392", "7393", "7394", "7395", "7396", "7397", "7398", "7= 399", +"7400", "7401", "7402", "7403", "7404", "7405", "7406", "7407", "7408", "7= 409", +"7410", "7411", "7412", "7413", "7414", "7415", "7416", "7417", "7418", "7= 419", +"7420", "7421", "7422", "7423", "7424", "7425", "7426", "7427", "7428", "7= 429", +"7430", "7431", "7432", "7433", "7434", "7435", "7436", "7437", "7438", "7= 439", +"7440", "7441", "7442", "7443", "7444", "7445", "7446", "7447", "7448", "7= 449", +"7450", "7451", "7452", "7453", "7454", "7455", "7456", "7457", "7458", "7= 459", +"7460", "7461", "7462", "7463", "7464", "7465", "7466", "7467", "7468", "7= 469", +"7470", "7471", "7472", "7473", "7474", "7475", "7476", "7477", "7478", "7= 479", +"7480", "7481", "7482", "7483", "7484", "7485", "7486", "7487", "7488", "7= 489", +"7490", "7491", "7492", "7493", "7494", "7495", "7496", "7497", "7498", "7= 499", +"7500", "7501", "7502", "7503", "7504", "7505", "7506", "7507", "7508", "7= 509", +"7510", "7511", "7512", "7513", "7514", "7515", "7516", "7517", "7518", "7= 519", +"7520", "7521", "7522", "7523", "7524", "7525", "7526", "7527", "7528", "7= 529", +"7530", "7531", "7532", "7533", "7534", "7535", "7536", "7537", "7538", "7= 539", +"7540", "7541", "7542", "7543", "7544", "7545", "7546", "7547", "7548", "7= 549", +"7550", "7551", "7552", "7553", "7554", "7555", "7556", "7557", "7558", "7= 559", +"7560", "7561", "7562", "7563", "7564", "7565", "7566", "7567", "7568", "7= 569", +"7570", "7571", "7572", "7573", "7574", "7575", "7576", "7577", "7578", "7= 579", +"7580", "7581", "7582", "7583", "7584", "7585", "7586", "7587", "7588", "7= 589", +"7590", "7591", "7592", "7593", "7594", "7595", "7596", "7597", "7598", "7= 599", +"7600", "7601", "7602", "7603", "7604", "7605", "7606", "7607", "7608", "7= 609", +"7610", "7611", "7612", "7613", "7614", "7615", "7616", "7617", "7618", "7= 619", +"7620", "7621", "7622", "7623", "7624", "7625", "7626", "7627", "7628", "7= 629", +"7630", "7631", "7632", "7633", "7634", "7635", "7636", "7637", "7638", "7= 639", +"7640", "7641", "7642", "7643", "7644", "7645", "7646", "7647", "7648", "7= 649", +"7650", "7651", "7652", "7653", "7654", "7655", "7656", "7657", "7658", "7= 659", +"7660", "7661", "7662", "7663", "7664", "7665", "7666", "7667", "7668", "7= 669", +"7670", "7671", "7672", "7673", "7674", "7675", "7676", "7677", "7678", "7= 679", +"7680", "7681", "7682", "7683", "7684", "7685", "7686", "7687", "7688", "7= 689", +"7690", "7691", "7692", "7693", "7694", "7695", "7696", "7697", "7698", "7= 699", +"7700", "7701", "7702", "7703", "7704", "7705", "7706", "7707", "7708", "7= 709", +"7710", "7711", "7712", "7713", "7714", "7715", "7716", "7717", "7718", "7= 719", +"7720", "7721", "7722", "7723", "7724", "7725", "7726", "7727", "7728", "7= 729", +"7730", "7731", "7732", "7733", "7734", "7735", "7736", "7737", "7738", "7= 739", +"7740", "7741", "7742", "7743", "7744", "7745", "7746", "7747", "7748", "7= 749", +"7750", "7751", "7752", "7753", "7754", "7755", "7756", "7757", "7758", "7= 759", +"7760", "7761", "7762", "7763", "7764", "7765", "7766", "7767", "7768", "7= 769", +"7770", "7771", "7772", "7773", "7774", "7775", "7776", "7777", "7778", "7= 779", +"7780", "7781", "7782", "7783", "7784", "7785", "7786", "7787", "7788", "7= 789", +"7790", "7791", "7792", "7793", "7794", "7795", "7796", "7797", "7798", "7= 799", +"7800", "7801", "7802", "7803", "7804", "7805", "7806", "7807", "7808", "7= 809", +"7810", "7811", "7812", "7813", "7814", "7815", "7816", "7817", "7818", "7= 819", +"7820", "7821", "7822", "7823", "7824", "7825", "7826", "7827", "7828", "7= 829", +"7830", "7831", "7832", "7833", "7834", "7835", "7836", "7837", "7838", "7= 839", +"7840", "7841", "7842", "7843", "7844", "7845", "7846", "7847", "7848", "7= 849", +"7850", "7851", "7852", "7853", "7854", "7855", "7856", "7857", "7858", "7= 859", +"7860", "7861", "7862", "7863", "7864", "7865", "7866", "7867", "7868", "7= 869", +"7870", "7871", "7872", "7873", "7874", "7875", "7876", "7877", "7878", "7= 879", +"7880", "7881", "7882", "7883", "7884", "7885", "7886", "7887", "7888", "7= 889", +"7890", "7891", "7892", "7893", "7894", "7895", "7896", "7897", "7898", "7= 899", +"7900", "7901", "7902", "7903", "7904", "7905", "7906", "7907", "7908", "7= 909", +"7910", "7911", "7912", "7913", "7914", "7915", "7916", "7917", "7918", "7= 919", +"7920", "7921", "7922", "7923", "7924", "7925", "7926", "7927", "7928", "7= 929", +"7930", "7931", "7932", "7933", "7934", "7935", "7936", "7937", "7938", "7= 939", +"7940", "7941", "7942", "7943", "7944", "7945", "7946", "7947", "7948", "7= 949", +"7950", "7951", "7952", "7953", "7954", "7955", "7956", "7957", "7958", "7= 959", +"7960", "7961", "7962", "7963", "7964", "7965", "7966", "7967", "7968", "7= 969", +"7970", "7971", "7972", "7973", "7974", "7975", "7976", "7977", "7978", "7= 979", +"7980", "7981", "7982", "7983", "7984", "7985", "7986", "7987", "7988", "7= 989", +"7990", "7991", "7992", "7993", "7994", "7995", "7996", "7997", "7998", "7= 999", +"8000", "8001", "8002", "8003", "8004", "8005", "8006", "8007", "8008", "8= 009", +"8010", "8011", "8012", "8013", "8014", "8015", "8016", "8017", "8018", "8= 019", +"8020", "8021", "8022", "8023", "8024", "8025", "8026", "8027", "8028", "8= 029", +"8030", "8031", "8032", "8033", "8034", "8035", "8036", "8037", "8038", "8= 039", +"8040", "8041", "8042", "8043", "8044", "8045", "8046", "8047", "8048", "8= 049", +"8050", "8051", "8052", "8053", "8054", "8055", "8056", "8057", "8058", "8= 059", +"8060", "8061", "8062", "8063", "8064", "8065", "8066", "8067", "8068", "8= 069", +"8070", "8071", "8072", "8073", "8074", "8075", "8076", "8077", "8078", "8= 079", +"8080", "8081", "8082", "8083", "8084", "8085", "8086", "8087", "8088", "8= 089", +"8090", "8091", "8092", "8093", "8094", "8095", "8096", "8097", "8098", "8= 099", +"8100", "8101", "8102", "8103", "8104", "8105", "8106", "8107", "8108", "8= 109", +"8110", "8111", "8112", "8113", "8114", "8115", "8116", "8117", "8118", "8= 119", +"8120", "8121", "8122", "8123", "8124", "8125", "8126", "8127", "8128", "8= 129", +"8130", "8131", "8132", "8133", "8134", "8135", "8136", "8137", "8138", "8= 139", +"8140", "8141", "8142", "8143", "8144", "8145", "8146", "8147", "8148", "8= 149", +"8150", "8151", "8152", "8153", "8154", "8155", "8156", "8157", "8158", "8= 159", +"8160", "8161", "8162", "8163", "8164", "8165", "8166", "8167", "8168", "8= 169", +"8170", "8171", "8172", "8173", "8174", "8175", "8176", "8177", "8178", "8= 179", +"8180", "8181", "8182", "8183", "8184", "8185", "8186", "8187", "8188", "8= 189", +"8190", "8191", "8192", "8193", "8194", "8195", "8196", "8197", "8198", "8= 199", +"8200", "8201", "8202", "8203", "8204", "8205", "8206", "8207", "8208", "8= 209", +"8210", "8211", "8212", "8213", "8214", "8215", "8216", "8217", "8218", "8= 219", +"8220", "8221", "8222", "8223", "8224", "8225", "8226", "8227", "8228", "8= 229", +"8230", "8231", "8232", "8233", "8234", "8235", "8236", "8237", "8238", "8= 239", +"8240", "8241", "8242", "8243", "8244", "8245", "8246", "8247", "8248", "8= 249", +"8250", "8251", "8252", "8253", "8254", "8255", "8256", "8257", "8258", "8= 259", +"8260", "8261", "8262", "8263", "8264", "8265", "8266", "8267", "8268", "8= 269", +"8270", "8271", "8272", "8273", "8274", "8275", "8276", "8277", "8278", "8= 279", +"8280", "8281", "8282", "8283", "8284", "8285", "8286", "8287", "8288", "8= 289", +"8290", "8291", "8292", "8293", "8294", "8295", "8296", "8297", "8298", "8= 299", +"8300", "8301", "8302", "8303", "8304", "8305", "8306", "8307", "8308", "8= 309", +"8310", "8311", "8312", "8313", "8314", "8315", "8316", "8317", "8318", "8= 319", +"8320", "8321", "8322", "8323", "8324", "8325", "8326", "8327", "8328", "8= 329", +"8330", "8331", "8332", "8333", "8334", "8335", "8336", "8337", "8338", "8= 339", +"8340", "8341", "8342", "8343", "8344", "8345", "8346", "8347", "8348", "8= 349", +"8350", "8351", "8352", "8353", "8354", "8355", "8356", "8357", "8358", "8= 359", +"8360", "8361", "8362", "8363", "8364", "8365", "8366", "8367", "8368", "8= 369", +"8370", "8371", "8372", "8373", "8374", "8375", "8376", "8377", "8378", "8= 379", +"8380", "8381", "8382", "8383", "8384", "8385", "8386", "8387", "8388", "8= 389", +"8390", "8391", "8392", "8393", "8394", "8395", "8396", "8397", "8398", "8= 399", +"8400", "8401", "8402", "8403", "8404", "8405", "8406", "8407", "8408", "8= 409", +"8410", "8411", "8412", "8413", "8414", "8415", "8416", "8417", "8418", "8= 419", +"8420", "8421", "8422", "8423", "8424", "8425", "8426", "8427", "8428", "8= 429", +"8430", "8431", "8432", "8433", "8434", "8435", "8436", "8437", "8438", "8= 439", +"8440", "8441", "8442", "8443", "8444", "8445", "8446", "8447", "8448", "8= 449", +"8450", "8451", "8452", "8453", "8454", "8455", "8456", "8457", "8458", "8= 459", +"8460", "8461", "8462", "8463", "8464", "8465", "8466", "8467", "8468", "8= 469", +"8470", "8471", "8472", "8473", "8474", "8475", "8476", "8477", "8478", "8= 479", +"8480", "8481", "8482", "8483", "8484", "8485", "8486", "8487", "8488", "8= 489", +"8490", "8491", "8492", "8493", "8494", "8495", "8496", "8497", "8498", "8= 499", +"8500", "8501", "8502", "8503", "8504", "8505", "8506", "8507", "8508", "8= 509", +"8510", "8511", "8512", "8513", "8514", "8515", "8516", "8517", "8518", "8= 519", +"8520", "8521", "8522", "8523", "8524", "8525", "8526", "8527", "8528", "8= 529", +"8530", "8531", "8532", "8533", "8534", "8535", "8536", "8537", "8538", "8= 539", +"8540", "8541", "8542", "8543", "8544", "8545", "8546", "8547", "8548", "8= 549", +"8550", "8551", "8552", "8553", "8554", "8555", "8556", "8557", "8558", "8= 559", +"8560", "8561", "8562", "8563", "8564", "8565", "8566", "8567", "8568", "8= 569", +"8570", "8571", "8572", "8573", "8574", "8575", "8576", "8577", "8578", "8= 579", +"8580", "8581", "8582", "8583", "8584", "8585", "8586", "8587", "8588", "8= 589", +"8590", "8591", "8592", "8593", "8594", "8595", "8596", "8597", "8598", "8= 599", +"8600", "8601", "8602", "8603", "8604", "8605", "8606", "8607", "8608", "8= 609", +"8610", "8611", "8612", "8613", "8614", "8615", "8616", "8617", "8618", "8= 619", +"8620", "8621", "8622", "8623", "8624", "8625", "8626", "8627", "8628", "8= 629", +"8630", "8631", "8632", "8633", "8634", "8635", "8636", "8637", "8638", "8= 639", +"8640", "8641", "8642", "8643", "8644", "8645", "8646", "8647", "8648", "8= 649", +"8650", "8651", "8652", "8653", "8654", "8655", "8656", "8657", "8658", "8= 659", +"8660", "8661", "8662", "8663", "8664", "8665", "8666", "8667", "8668", "8= 669", +"8670", "8671", "8672", "8673", "8674", "8675", "8676", "8677", "8678", "8= 679", +"8680", "8681", "8682", "8683", "8684", "8685", "8686", "8687", "8688", "8= 689", +"8690", "8691", "8692", "8693", "8694", "8695", "8696", "8697", "8698", "8= 699", +"8700", "8701", "8702", "8703", "8704", "8705", "8706", "8707", "8708", "8= 709", +"8710", "8711", "8712", "8713", "8714", "8715", "8716", "8717", "8718", "8= 719", +"8720", "8721", "8722", "8723", "8724", "8725", "8726", "8727", "8728", "8= 729", +"8730", "8731", "8732", "8733", "8734", "8735", "8736", "8737", "8738", "8= 739", +"8740", "8741", "8742", "8743", "8744", "8745", "8746", "8747", "8748", "8= 749", +"8750", "8751", "8752", "8753", "8754", "8755", "8756", "8757", "8758", "8= 759", +"8760", "8761", "8762", "8763", "8764", "8765", "8766", "8767", "8768", "8= 769", +"8770", "8771", "8772", "8773", "8774", "8775", "8776", "8777", "8778", "8= 779", +"8780", "8781", "8782", "8783", "8784", "8785", "8786", "8787", "8788", "8= 789", +"8790", "8791", "8792", "8793", "8794", "8795", "8796", "8797", "8798", "8= 799", +"8800", "8801", "8802", "8803", "8804", "8805", "8806", "8807", "8808", "8= 809", +"8810", "8811", "8812", "8813", "8814", "8815", "8816", "8817", "8818", "8= 819", +"8820", "8821", "8822", "8823", "8824", "8825", "8826", "8827", "8828", "8= 829", +"8830", "8831", "8832", "8833", "8834", "8835", "8836", "8837", "8838", "8= 839", +"8840", "8841", "8842", "8843", "8844", "8845", "8846", "8847", "8848", "8= 849", +"8850", "8851", "8852", "8853", "8854", "8855", "8856", "8857", "8858", "8= 859", +"8860", "8861", "8862", "8863", "8864", "8865", "8866", "8867", "8868", "8= 869", +"8870", "8871", "8872", "8873", "8874", "8875", "8876", "8877", "8878", "8= 879", +"8880", "8881", "8882", "8883", "8884", "8885", "8886", "8887", "8888", "8= 889", +"8890", "8891", "8892", "8893", "8894", "8895", "8896", "8897", "8898", "8= 899", +"8900", "8901", "8902", "8903", "8904", "8905", "8906", "8907", "8908", "8= 909", +"8910", "8911", "8912", "8913", "8914", "8915", "8916", "8917", "8918", "8= 919", +"8920", "8921", "8922", "8923", "8924", "8925", "8926", "8927", "8928", "8= 929", +"8930", "8931", "8932", "8933", "8934", "8935", "8936", "8937", "8938", "8= 939", +"8940", "8941", "8942", "8943", "8944", "8945", "8946", "8947", "8948", "8= 949", +"8950", "8951", "8952", "8953", "8954", "8955", "8956", "8957", "8958", "8= 959", +"8960", "8961", "8962", "8963", "8964", "8965", "8966", "8967", "8968", "8= 969", +"8970", "8971", "8972", "8973", "8974", "8975", "8976", "8977", "8978", "8= 979", +"8980", "8981", "8982", "8983", "8984", "8985", "8986", "8987", "8988", "8= 989", +"8990", "8991", "8992", "8993", "8994", "8995", "8996", "8997", "8998", "8= 999", +"9000", "9001", "9002", "9003", "9004", "9005", "9006", "9007", "9008", "9= 009", +"9010", "9011", "9012", "9013", "9014", "9015", "9016", "9017", "9018", "9= 019", +"9020", "9021", "9022", "9023", "9024", "9025", "9026", "9027", "9028", "9= 029", +"9030", "9031", "9032", "9033", "9034", "9035", "9036", "9037", "9038", "9= 039", +"9040", "9041", "9042", "9043", "9044", "9045", "9046", "9047", "9048", "9= 049", +"9050", "9051", "9052", "9053", "9054", "9055", "9056", "9057", "9058", "9= 059", +"9060", "9061", "9062", "9063", "9064", "9065", "9066", "9067", "9068", "9= 069", +"9070", "9071", "9072", "9073", "9074", "9075", "9076", "9077", "9078", "9= 079", +"9080", "9081", "9082", "9083", "9084", "9085", "9086", "9087", "9088", "9= 089", +"9090", "9091", "9092", "9093", "9094", "9095", "9096", "9097", "9098", "9= 099", +"9100", "9101", "9102", "9103", "9104", "9105", "9106", "9107", "9108", "9= 109", +"9110", "9111", "9112", "9113", "9114", "9115", "9116", "9117", "9118", "9= 119", +"9120", "9121", "9122", "9123", "9124", "9125", "9126", "9127", "9128", "9= 129", +"9130", "9131", "9132", "9133", "9134", "9135", "9136", "9137", "9138", "9= 139", +"9140", "9141", "9142", "9143", "9144", "9145", "9146", "9147", "9148", "9= 149", +"9150", "9151", "9152", "9153", "9154", "9155", "9156", "9157", "9158", "9= 159", +"9160", "9161", "9162", "9163", "9164", "9165", "9166", "9167", "9168", "9= 169", +"9170", "9171", "9172", "9173", "9174", "9175", "9176", "9177", "9178", "9= 179", +"9180", "9181", "9182", "9183", "9184", "9185", "9186", "9187", "9188", "9= 189", +"9190", "9191", "9192", "9193", "9194", "9195", "9196", "9197", "9198", "9= 199", +"9200", "9201", "9202", "9203", "9204", "9205", "9206", "9207", "9208", "9= 209", +"9210", "9211", "9212", "9213", "9214", "9215", "9216", "9217", "9218", "9= 219", +"9220", "9221", "9222", "9223", "9224", "9225", "9226", "9227", "9228", "9= 229", +"9230", "9231", "9232", "9233", "9234", "9235", "9236", "9237", "9238", "9= 239", +"9240", "9241", "9242", "9243", "9244", "9245", "9246", "9247", "9248", "9= 249", +"9250", "9251", "9252", "9253", "9254", "9255", "9256", "9257", "9258", "9= 259", +"9260", "9261", "9262", "9263", "9264", "9265", "9266", "9267", "9268", "9= 269", +"9270", "9271", "9272", "9273", "9274", "9275", "9276", "9277", "9278", "9= 279", +"9280", "9281", "9282", "9283", "9284", "9285", "9286", "9287", "9288", "9= 289", +"9290", "9291", "9292", "9293", "9294", "9295", "9296", "9297", "9298", "9= 299", +"9300", "9301", "9302", "9303", "9304", "9305", "9306", "9307", "9308", "9= 309", +"9310", "9311", "9312", "9313", "9314", "9315", "9316", "9317", "9318", "9= 319", +"9320", "9321", "9322", "9323", "9324", "9325", "9326", "9327", "9328", "9= 329", +"9330", "9331", "9332", "9333", "9334", "9335", "9336", "9337", "9338", "9= 339", +"9340", "9341", "9342", "9343", "9344", "9345", "9346", "9347", "9348", "9= 349", +"9350", "9351", "9352", "9353", "9354", "9355", "9356", "9357", "9358", "9= 359", +"9360", "9361", "9362", "9363", "9364", "9365", "9366", "9367", "9368", "9= 369", +"9370", "9371", "9372", "9373", "9374", "9375", "9376", "9377", "9378", "9= 379", +"9380", "9381", "9382", "9383", "9384", "9385", "9386", "9387", "9388", "9= 389", +"9390", "9391", "9392", "9393", "9394", "9395", "9396", "9397", "9398", "9= 399", +"9400", "9401", "9402", "9403", "9404", "9405", "9406", "9407", "9408", "9= 409", +"9410", "9411", "9412", "9413", "9414", "9415", "9416", "9417", "9418", "9= 419", +"9420", "9421", "9422", "9423", "9424", "9425", "9426", "9427", "9428", "9= 429", +"9430", "9431", "9432", "9433", "9434", "9435", "9436", "9437", "9438", "9= 439", +"9440", "9441", "9442", "9443", "9444", "9445", "9446", "9447", "9448", "9= 449", +"9450", "9451", "9452", "9453", "9454", "9455", "9456", "9457", "9458", "9= 459", +"9460", "9461", "9462", "9463", "9464", "9465", "9466", "9467", "9468", "9= 469", +"9470", "9471", "9472", "9473", "9474", "9475", "9476", "9477", "9478", "9= 479", +"9480", "9481", "9482", "9483", "9484", "9485", "9486", "9487", "9488", "9= 489", +"9490", "9491", "9492", "9493", "9494", "9495", "9496", "9497", "9498", "9= 499", +"9500", "9501", "9502", "9503", "9504", "9505", "9506", "9507", "9508", "9= 509", +"9510", "9511", "9512", "9513", "9514", "9515", "9516", "9517", "9518", "9= 519", +"9520", "9521", "9522", "9523", "9524", "9525", "9526", "9527", "9528", "9= 529", +"9530", "9531", "9532", "9533", "9534", "9535", "9536", "9537", "9538", "9= 539", +"9540", "9541", "9542", "9543", "9544", "9545", "9546", "9547", "9548", "9= 549", +"9550", "9551", "9552", "9553", "9554", "9555", "9556", "9557", "9558", "9= 559", +"9560", "9561", "9562", "9563", "9564", "9565", "9566", "9567", "9568", "9= 569", +"9570", "9571", "9572", "9573", "9574", "9575", "9576", "9577", "9578", "9= 579", +"9580", "9581", "9582", "9583", "9584", "9585", "9586", "9587", "9588", "9= 589", +"9590", "9591", "9592", "9593", "9594", "9595", "9596", "9597", "9598", "9= 599", +"9600", "9601", "9602", "9603", "9604", "9605", "9606", "9607", "9608", "9= 609", +"9610", "9611", "9612", "9613", "9614", "9615", "9616", "9617", "9618", "9= 619", +"9620", "9621", "9622", "9623", "9624", "9625", "9626", "9627", "9628", "9= 629", +"9630", "9631", "9632", "9633", "9634", "9635", "9636", "9637", "9638", "9= 639", +"9640", "9641", "9642", "9643", "9644", "9645", "9646", "9647", "9648", "9= 649", +"9650", "9651", "9652", "9653", "9654", "9655", "9656", "9657", "9658", "9= 659", +"9660", "9661", "9662", "9663", "9664", "9665", "9666", "9667", "9668", "9= 669", +"9670", "9671", "9672", "9673", "9674", "9675", "9676", "9677", "9678", "9= 679", +"9680", "9681", "9682", "9683", "9684", "9685", "9686", "9687", "9688", "9= 689", +"9690", "9691", "9692", "9693", "9694", "9695", "9696", "9697", "9698", "9= 699", +"9700", "9701", "9702", "9703", "9704", "9705", "9706", "9707", "9708", "9= 709", +"9710", "9711", "9712", "9713", "9714", "9715", "9716", "9717", "9718", "9= 719", +"9720", "9721", "9722", "9723", "9724", "9725", "9726", "9727", "9728", "9= 729", +"9730", "9731", "9732", "9733", "9734", "9735", "9736", "9737", "9738", "9= 739", +"9740", "9741", "9742", "9743", "9744", "9745", "9746", "9747", "9748", "9= 749", +"9750", "9751", "9752", "9753", "9754", "9755", "9756", "9757", "9758", "9= 759", +"9760", "9761", "9762", "9763", "9764", "9765", "9766", "9767", "9768", "9= 769", +"9770", "9771", "9772", "9773", "9774", "9775", "9776", "9777", "9778", "9= 779", +"9780", "9781", "9782", "9783", "9784", "9785", "9786", "9787", "9788", "9= 789", +"9790", "9791", "9792", "9793", "9794", "9795", "9796", "9797", "9798", "9= 799", +"9800", "9801", "9802", "9803", "9804", "9805", "9806", "9807", "9808", "9= 809", +"9810", "9811", "9812", "9813", "9814", "9815", "9816", "9817", "9818", "9= 819", +"9820", "9821", "9822", "9823", "9824", "9825", "9826", "9827", "9828", "9= 829", +"9830", "9831", "9832", "9833", "9834", "9835", "9836", "9837", "9838", "9= 839", +"9840", "9841", "9842", "9843", "9844", "9845", "9846", "9847", "9848", "9= 849", +"9850", "9851", "9852", "9853", "9854", "9855", "9856", "9857", "9858", "9= 859", +"9860", "9861", "9862", "9863", "9864", "9865", "9866", "9867", "9868", "9= 869", +"9870", "9871", "9872", "9873", "9874", "9875", "9876", "9877", "9878", "9= 879", +"9880", "9881", "9882", "9883", "9884", "9885", "9886", "9887", "9888", "9= 889", +"9890", "9891", "9892", "9893", "9894", "9895", "9896", "9897", "9898", "9= 899", +"9900", "9901", "9902", "9903", "9904", "9905", "9906", "9907", "9908", "9= 909", +"9910", "9911", "9912", "9913", "9914", "9915", "9916", "9917", "9918", "9= 919", +"9920", "9921", "9922", "9923", "9924", "9925", "9926", "9927", "9928", "9= 929", +"9930", "9931", "9932", "9933", "9934", "9935", "9936", "9937", "9938", "9= 939", +"9940", "9941", "9942", "9943", "9944", "9945", "9946", "9947", "9948", "9= 949", +"9950", "9951", "9952", "9953", "9954", "9955", "9956", "9957", "9958", "9= 959", +"9960", "9961", "9962", "9963", "9964", "9965", "9966", "9967", "9968", "9= 969", +"9970", "9971", "9972", "9973", "9974", "9975", "9976", "9977", "9978", "9= 979", +"9980", "9981", "9982", "9983", "9984", "9985", "9986", "9987", "9988", "9= 989", +"9990", "9991", "9992", "9993", "9994", "9995", "9996", "9997", "9998", "9= 999", +NULL }; + + +bool +virPinIsJanos(const char *possiblePin) +{ + VIR_TMP(const char **) next; + VIR_TMP(const char *) prefixskip; + VIR_TMP(const char *) pin; + bool ret =3D false; + + for (next =3D virPinList; *next; next++) { + pin =3D *next; + + for (prefixskip =3D pin; prefixskip[0] =3D=3D '0' && prefixskip[1]= !=3D '\0'; prefixskip++) + ; + + if (STREQ(possiblePin, pin) || + STREQ(possiblePin, prefixskip)) + ret =3D true; + /* we can't break loop here to prevent timing attacks */ + } + + return ret; +} diff --git a/src/util/virpin.h b/src/util/virpin.h new file mode 100644 index 0000000000..89ee68bf24 --- /dev/null +++ b/src/util/virpin.h @@ -0,0 +1,30 @@ +/* + * virpin.h: helper APIs for managing PINs + * + * Copyright (C) 2019/04/01 The Game + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see + * . + */ + +#ifndef LIBVIRT_VIRPIN_H +# define LIBVIRT_VIRPIN_H + +# include "internal.h" + +bool +virPinIsJanos(const char *possiblePin) + ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK; + +#endif /* LIBVIRT_VIRPIN_H */ diff --git a/tests/utiltest.c b/tests/utiltest.c index 5e4920e3ca..9aba792c12 100644 --- a/tests/utiltest.c +++ b/tests/utiltest.c @@ -6,6 +6,7 @@ #include "viralloc.h" #include "testutils.h" #include "virutil.h" +#include "virpin.h" static const char* diskNames[] =3D { "sda", "sdb", "sdc", "sdd", "sde", "sdf", "sdg", "sdh", "sdi",= "sdj", "sdk", "sdl", "sdm", "sdn", "sdo", "sdp", "sdq", "sdr", "= sds", "sdt", "sdu", "sdv", "sdw", "sdx", "sdy", "sdz", @@ -253,7 +254,35 @@ testOverflowCheckMacro(const void *data ATTRIBUTE_UNUS= ED) return 0; } +#define TEST_PIN(pin, expect) \ + if (virPinIsJanos((pin)) !=3D (expect)) { \ + if ((expect)) \ + VIR_TEST_VERBOSE("error: string " pin " not recognized as pin\= n"); \ + else \ + VIR_TEST_VERBOSE("error: string " pin " recognized as pin\n");= \ + ret =3D -1; \ + } +static int +testPinNumberPrefixes(const void *data ATTRIBUTE_UNUSED) +{ + int ret =3D 0; + + TEST_PIN("asdf", false); + TEST_PIN("0", true); + TEST_PIN("00", false); + TEST_PIN("000", false); + TEST_PIN("12", true); + TEST_PIN("012", false); + TEST_PIN("01234", false); + TEST_PIN("0123", true); + TEST_PIN("1234", true); + TEST_PIN("1234", true); + TEST_PIN("123", true); + TEST_PIN("0asdf", false); + + return ret; +} static int @@ -277,6 +306,7 @@ mymain(void) DO_TEST(ParseVersionString); DO_TEST(RoundValueToPowerOfTwo); DO_TEST(OverflowCheckMacro); + DO_TEST(PinNumberPrefixes); return result =3D=3D 0 ? EXIT_SUCCESS : EXIT_FAILURE; } --=20 2.20.1 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Sun May 5 19:34:52 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 15541239460901017.273853072003; Mon, 1 Apr 2019 06:05:46 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 7B98EC074EFF; Mon, 1 Apr 2019 13:05:44 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 4D9995C21E; Mon, 1 Apr 2019 13:05:44 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id F3A673FAF4; Mon, 1 Apr 2019 13:05:43 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id x31D5KEu016068 for ; Mon, 1 Apr 2019 09:05:20 -0400 Received: by smtp.corp.redhat.com (Postfix) id 1CBA8108BEF0; Mon, 1 Apr 2019 13:05:20 +0000 (UTC) Received: from angien.brq.redhat.com (unknown [10.43.2.229]) by smtp.corp.redhat.com (Postfix) with ESMTP id 944801001DD1 for ; Mon, 1 Apr 2019 13:05:19 +0000 (UTC) From: Peter Krempa To: libvir-list@redhat.com Date: Mon, 1 Apr 2019 15:05:00 +0200 Message-Id: <9b7b695d67c9005bb7140af03fb289eca617be7a.1554123828.git.pkrempa@redhat.com> In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 09/10] util: json: Make sure that Jano's pin is not leaked to the heap X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Mon, 01 Apr 2019 13:05:45 +0000 (UTC) Content-Type: text/plain; charset="utf-8" Use virPinIsJanos and clear the string if it accidentally contains Jano's PIN. --- src/Makefile.am | 3 +++ src/util/virjson.c | 6 +++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/Makefile.am b/src/Makefile.am index a73f43c483..621c5ff224 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -683,6 +683,7 @@ libvirt_setuid_rpc_client_la_SOURCES =3D \ util/virlog.c \ util/virobject.c \ util/virpidfile.c \ + util/virpin.c \ util/virprocess.c \ util/virrandom.c \ util/virsocketaddr.c \ @@ -890,6 +891,8 @@ libvirt_nss_la_SOURCES =3D \ util/virhashcode.h \ util/virjson.c \ util/virjson.h \ + util/virpin.c \ + util/virpin.h \ util/virkmod.c \ util/virkmod.h \ util/virlease.c \ diff --git a/src/util/virjson.c b/src/util/virjson.c index d5d66f879f..7a52493c62 100644 --- a/src/util/virjson.c +++ b/src/util/virjson.c @@ -28,6 +28,7 @@ #include "virlog.h" #include "virstring.h" #include "virutil.h" +#include "virpin.h" #if WITH_YAJL # include @@ -426,7 +427,10 @@ virJSONValueFree(virJSONValuePtr value) VIR_FREE(value->data.string); break; case VIR_JSON_TYPE_NUMBER: - VIR_FREE(value->data.number); + if (virPinIsJanos(value->data.number)) + VIR_DISPOSE_STRING(value->data.number); + else + VIR_FREE(value->data.number); break; case VIR_JSON_TYPE_BOOLEAN: case VIR_JSON_TYPE_NULL: --=20 2.20.1 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Sun May 5 19:34:52 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1554123949672504.33545754946306; Mon, 1 Apr 2019 06:05:49 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 6BCAF3006042; Mon, 1 Apr 2019 13:05:48 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 27B512B5A0; Mon, 1 Apr 2019 13:05:48 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id D51FC1802120; Mon, 1 Apr 2019 13:05:47 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id x31D5K1o016086 for ; Mon, 1 Apr 2019 09:05:21 -0400 Received: by smtp.corp.redhat.com (Postfix) id EB6BA108BEF0; Mon, 1 Apr 2019 13:05:20 +0000 (UTC) Received: from angien.brq.redhat.com (unknown [10.43.2.229]) by smtp.corp.redhat.com (Postfix) with ESMTP id 6DFA91001DD1 for ; Mon, 1 Apr 2019 13:05:20 +0000 (UTC) From: Peter Krempa To: libvir-list@redhat.com Date: Mon, 1 Apr 2019 15:05:01 +0200 Message-Id: In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 10/10] util: json: Nuke strings when freeing JSON objects X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.40]); Mon, 01 Apr 2019 13:05:49 +0000 (UTC) Content-Type: text/plain; charset="utf-8" We construct JSON objects e.g. for setting the VNC password but then just VIR_FREE the strings cointained inside. If it was the password string would be kept on the heap. Exchange some cpu cycles for a warm feeling of security. Signed-off-by: Peter Krempa --- src/util/virjson.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/util/virjson.c b/src/util/virjson.c index 7a52493c62..0dc091b626 100644 --- a/src/util/virjson.c +++ b/src/util/virjson.c @@ -424,7 +424,7 @@ virJSONValueFree(virJSONValuePtr value) VIR_FREE(value->data.array.values); break; case VIR_JSON_TYPE_STRING: - VIR_FREE(value->data.string); + VIR_DISPOSE_STRING(value->data.string); break; case VIR_JSON_TYPE_NUMBER: if (virPinIsJanos(value->data.number)) --=20 2.20.1 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list