0013150: convert single part file content body to attachment
authorPhilipp Schüle <p.schuele@metaways.de>
Fri, 26 May 2017 11:51:56 +0000 (13:51 +0200)
committerPhilipp Schüle <p.schuele@metaways.de>
Fri, 2 Jun 2017 07:35:40 +0000 (09:35 +0200)
* handle single part messages with base64 content like
 normal attachments

https://forge.tine20.org/view.php?id=13150

Change-Id: I3a68c601688a0d00cac1703537e743733ca9a750
Reviewed-on: http://gerrit.tine20.com/customers/4764
Tested-by: Jenkins CI (http://ci.tine20.com/)
Reviewed-by: Philipp Schüle <p.schuele@metaways.de>
tests/tine20/Felamimail/Controller/MessageTest.php
tests/tine20/Felamimail/files/single_part_pdf.eml [new file with mode: 0644]
tine20/Felamimail/Controller/Message.php

index fbefaf5..cb22bba 100644 (file)
@@ -1673,7 +1673,19 @@ class Felamimail_Controller_MessageTest extends TestCase
         </span><pre><span style="font-family:tahoma;">John Smith
 Photographer', $message->body);
     }
-    
+
+    /**
+     * @see 0013150: convert single part file content body to attachment
+     */
+    public function testSinglePartPdfMail()
+    {
+        $cachedMessage = $this->messageTestHelper('single_part_pdf.eml');
+        $message = $this->_controller->getCompleteMessage($cachedMessage);
+
+        self::assertEquals(1, count($message->attachments));
+        self::assertTrue($message->has_attachment, 'attachments missing!');
+    }
+
     /**
      * @see: 0010150: Jump Labels get converted
      * 
diff --git a/tests/tine20/Felamimail/files/single_part_pdf.eml b/tests/tine20/Felamimail/files/single_part_pdf.eml
new file mode 100644 (file)
index 0000000..c4a2f5b
--- /dev/null
@@ -0,0 +1,133 @@
+Return-Path: <name@example.com>\r
+Received: from host.home.example.net ([unix socket])\r
+    by host.home.example.net (Cyrus v2.2.13-Debian-2.2.13-13ubuntu3) with LMTPA;\r
+    Fri, 16 Mar 2012 17:31:20 +0100\r
+Received: from mx (unknown [33.22.11.2])\r
+   by host.home.example.net (Postfix) with ESMTP id 193CD10131\r
+   for <name@example.net>; Fri, 16 Mar 2012 17:31:20 +0100 (CET)\r
+MIME-Version: 1.0\r
+Importance: Normal\r
+X-Priority: 3 (Normal)\r
+X-Mailer: SAP Web Application Server 7.01\r
+Subject: test\r
+Date: Fri, 16 Mar 2012 17:31:07 +0100\r
+Message-ID: <2F1EC7FC90C31544A3920A6ABA3BBA8F02AD66A1@GSX300B.xx>\r
+Thread-Topic: test\r
+Thread-Index: Ac0DkjA+Rdzj6ieJR4SD5sf7NvA4OQ==\r
+From: "Name" <name@example.com>\r
+To: <name@example.net>\r
+X-OriginalArrivalTime: 16 Mar 2012 16:31:07.0606 (UTC) FILETIME=[306B4F60:01CD0392]\r
+X-Tine20TestMessage: single_part_pdf.eml\r
+Content-Type: application/pdf;\r
+       name="test.PDF"\r
+Content-Transfer-Encoding: base64\r
+Content-Description: test pdf\r
+\r
+JVBERi0xLjQKJeLjz9MKMSAwIG9iaiAKPDwvVHlwZSAvQ2F0YWxvZyAvVmVyc2lvbiAvMS40IC9Q\r
+YWdlcyAyIDAgUiAvTmFtZXMgNyAwIFIgPj4KZW5kb2JqCjIgMCBvYmogCjw8L1R5cGUgL1BhZ2Vz\r
+IC9LaWRzIFszIDAgUiBdIC9Db3VudCAxID4+CmVuZG9iagozIDAgb2JqIAo8PC9UeXBlIC9QYWdl\r
+IC9MYXN0TW9kaWZpZWQgKEQ6MjAxNzA1MzAwODM1MDkrMDAnMDAnKSAvUmVzb3VyY2VzIDw8L1By\r
+b2NTZXQgWy9UZXh0IC9QREYgXSAvRm9udCA8PC9GMSAxMCAwIFIgL0YyIDEzIDAgUiA+PiAvWE9i\r
+amVjdCA8PC9YMSAxMSAwIFIgPj4gPj4gCi9NZWRpYUJveCBbMCAwIDU5NSA4NDIgXSAvQ29udGVu\r
+dHMgWzQgMCBSIF0gL1BhcmVudCAyIDAgUiA+PgplbmRvYmoKNCAwIG9iaiAKPDwvTGVuZ3RoIDI1\r
+ODcgPj4Kc3RyZWFtCi9GMSAxOCBUZgpCVAo1MCA4MDAgVGQKKG5vIHByZWZpeCBMYXJzIG5vIG1p\r
+ZGRsZSBuYW1lIEtuZXNjaGtlIG5vIHN1ZmZpeCkgVGoKRVQKcQoxIDAgMCAxIDE1IDc4MCBjbQoz\r
+MiAwIDAgMzIgMCAwIGNtCi9YMSBEbwpRCi9GMSAxNSBUZgpCVAo1MCA3ODAgVGQKKE1ldGF3YXlz\r
+IEluZm9zeXN0ZW1zIEdtYkgpIFRqCkVUCi9GMSAxMSBUZgpCVAo1MCA3NjUgVGQKKFRhZ3M6ICkg\r
+VGoKRVQKL0YxIDEwIFRmCkJUCjUwIDc0NSBUZAooQmxhIEJsYSBCbGEpIFRqCkVUCi9GMSA4IFRm\r
+CjAuNyBHCi9GMiA4IFRmCkJUCjUwIDY4NCBUZAooQnVzaW5lc3MgQ29udGFjdCBEYXRhKSBUagpF\r
+VAovRjEgOCBUZgovRjEgOCBUZgpCVAo1MCA2NjggVGQKKE9yZ2FuaXNhdGlvbiAvIFVuaXQpIFRq\r
+CkVUCi9GMSA4IFRmCkJUCjIwMCA2NjggVGQKKE1ldGF3YXlzIEluZm9zeXN0ZW1zIEdtYkggLyBU\r
+aW5lIDIuMCkgVGoKRVQKL0YxIDggVGYKQlQKNTAgNjUyIFRkCihCdXNpbmVzcyBBZGRyZXNzKSBU\r
+agpFVAovRjEgOCBUZgpCVAoyMDAgNjUyIFRkCihQaWNraHViZW4gNCkgVGoKRVQKQlQKMjAwIDY0\r
+MiBUZAoobm8gc2Vjb25kIHN0cmVldCkgVGoKRVQKQlQKMjAwIDYzMiBUZAooMjR4eHggSGFtYnVy\r
+ZykgVGoKRVQKQlQKMjAwIDYyMiBUZAooSGFtYnVyZyBHZXJtYW55KSBUagpFVAovRjEgOCBUZgpC\r
+VAo1MCA2MDYgVGQKKEVtYWlsKSBUagpFVAovRjEgOCBUZgpCVAoyMDAgNjA2IFRkCih1bml0dGVz\r
+dHNAdGluZTIwLm9yZykgVGoKRVQKL0YxIDggVGYKQlQKNTAgNTkwIFRkCihUZWxlcGhvbmUgV29y\r
+aykgVGoKRVQKL0YxIDggVGYKQlQKMjAwIDU5MCBUZAooKzQ5VEVMV09SSykgVGoKRVQKL0YxIDgg\r
+VGYKQlQKNTAgNTc0IFRkCihUZWxlcGhvbmUgQ2VsbHBob25lKSBUagpFVAovRjEgOCBUZgpCVAoy\r
+MDAgNTc0IFRkCigrNDlURUxDRUxMKSBUagpFVAovRjEgOCBUZgpCVAo1MCA1NTggVGQKKFRlbGVw\r
+aG9uZSBDYXIpIFRqCkVUCi9GMSA4IFRmCkJUCjIwMCA1NTggVGQKKCs0OVRFTENBUikgVGoKRVQK\r
+L0YxIDggVGYKQlQKNTAgNTQyIFRkCihUZWxlcGhvbmUgRmF4KSBUagpFVAovRjEgOCBUZgpCVAoy\r
+MDAgNTQyIFRkCigrNDlURUxGQVgpIFRqCkVUCi9GMSA4IFRmCkJUCjUwIDUyNiBUZAooVGVsZXBo\r
+b25lIFBhZ2UpIFRqCkVUCi9GMSA4IFRmCkJUCjIwMCA1MjYgVGQKKCs0OVRFTFBBR0VSKSBUagpF\r
+VAovRjEgOCBUZgpCVAo1MCA1MTAgVGQKKFVSTCkgVGoKRVQKL0YxIDggVGYKQlQKMjAwIDUxMCBU\r
+ZAooaHR0cDovL3d3dy50aW5lMjAub3JnKSBUagpFVAovRjEgOCBUZgpCVAo1MCA0OTQgVGQKKFJv\r
+bGUpIFRqCkVUCi9GMSA4IFRmCkJUCjIwMCA0OTQgVGQKKFJvbGUpIFRqCkVUCi9GMSA4IFRmCkJU\r
+CjUwIDQ3OCBUZAooQXNzaXN0YW50KSBUagpFVAovRjEgOCBUZgpCVAoyMDAgNDc4IFRkCihDb3Ju\r
+ZWxpdXMgV2Vp3ykgVGoKRVQKL0YxIDggVGYKQlQKNTAgNDYyIFRkCihBc3Npc3RhbnQgVGVsZXBo\r
+b25lKSBUagpFVAovRjEgOCBUZgpCVAoyMDAgNDYyIFRkCigrNDlURUxBU1NJU1RFTlQpIFRqCkVU\r
+Ci9GMiA4IFRmCkJUCjUwIDQzNiBUZAooUHJpdmF0ZSBDb250YWN0IERhdGEpIFRqCkVUCi9GMSA4\r
+IFRmCi9GMSA4IFRmCkJUCjUwIDQyMCBUZAooUHJpdmF0ZSBBZGRyZXNzKSBUagpFVAovRjEgOCBU\r
+ZgpCVAoyMDAgNDIwIFRkCihQaWNraHViZW4gNCkgVGoKRVQKQlQKMjAwIDQxMCBUZAoobm8gc2Vj\r
+b25kIHN0cmVldDIpIFRqCkVUCkJUCjIwMCA0MDAgVGQKKDI0eHh4IEhhbWJ1cmcpIFRqCkVUCkJU\r
+CjIwMCAzOTAgVGQKKEhhbWJ1cmcgR2VybWFueSkgVGoKRVQKL0YxIDggVGYKQlQKNTAgMzc0IFRk\r
+CihFbWFpbCBIb21lKSBUagpFVAovRjEgOCBUZgpCVAoyMDAgMzc0IFRkCih1bml0dGVzdHNAdGlu\r
+ZTIwLm9yZykgVGoKRVQKL0YxIDggVGYKQlQKNTAgMzU4IFRkCihUZWxlcGhvbmUgSG9tZSkgVGoK\r
+RVQKL0YxIDggVGYKQlQKMjAwIDM1OCBUZAooKzQ5VEVMSE9NRSkgVGoKRVQKL0YxIDggVGYKQlQK\r
+NTAgMzQyIFRkCihUZWxlcGhvbmUgQ2VsbHBob25lIFByaXZhdGUpIFRqCkVUCi9GMSA4IFRmCkJU\r
+CjIwMCAzNDIgVGQKKCs0OVRFTENFTExQUklWQVRFKSBUagpFVAovRjEgOCBUZgpCVAo1MCAzMjYg\r
+VGQKKFRlbGVwaG9uZSBGYXggSG9tZSkgVGoKRVQKL0YxIDggVGYKQlQKMjAwIDMyNiBUZAooKzQ5\r
+VEVMRkFYSE9NRSkgVGoKRVQKL0YxIDggVGYKQlQKNTAgMzEwIFRkCihVUkwgSG9tZSkgVGoKRVQK\r
+L0YxIDggVGYKQlQKMjAwIDMxMCBUZAooaHR0cDovL3d3dy50aW5lMjAuY29tKSBUagpFVAovRjIg\r
+OCBUZgpCVAo1MCAyODQgVGQKKE90aGVyIERhdGEpIFRqCkVUCi9GMSA4IFRmCi9GMSA4IFRmCkJU\r
+CjUwIDI2OCBUZAooQmlydGhkYXkpIFRqCkVUCi9GMSA4IFRmCkJUCjIwMCAyNjggVGQKKEphbiAy\r
+LCAxOTc1KSBUagpFVAovRjEgOCBUZgpCVAo1MCAyNTIgVGQKKEpvYiBUaXRsZSkgVGoKRVQKL0Yx\r
+IDggVGYKQlQKMjAwIDI1MiBUZAooVGl0bGUpIFRqCkVUCi9GMSA3IFRmCjAuNSBnCkJUCjUwIDMw\r
+IFRkCihNYXkgMzAsIDIwMTcgMTA6MzU6MDkgQU0pIFRqCkVUCkJUCjQzMCAzMCBUZAooQ3JlYXRl\r
+ZCBieTogaHR0cDovL3d3dy50aW5lMjAub3JnKSBUagpFVAoKZW5kc3RyZWFtCmVuZG9iago1IDAg\r
+b2JqIApbXQplbmRvYmoKNiAwIG9iaiAKPDwvTmFtZXMgNSAwIFIgPj4KZW5kb2JqCjcgMCBvYmog\r
+Cjw8L0Rlc3RzIDkgMCBSID4+CmVuZG9iago4IDAgb2JqIApbXQplbmRvYmoKOSAwIG9iaiAKPDwv\r
+TmFtZXMgOCAwIFIgPj4KZW5kb2JqCjEwIDAgb2JqIAo8PC9UeXBlIC9Gb250IC9FbmNvZGluZyAv\r
+V2luQW5zaUVuY29kaW5nIC9TdWJ0eXBlIC9UeXBlMSAvQmFzZUZvbnQgL0hlbHZldGljYSA+Pgpl\r
+bmRvYmoKMTEgMCBvYmogCjw8L0xlbmd0aCAxNDI2IC9UeXBlIC9YT2JqZWN0IC9TdWJ0eXBlIC9J\r
+bWFnZSAvU01hc2sgMTIgMCBSIC9XaWR0aCAzMiAvSGVpZ2h0IDMyIC9Db2xvclNwYWNlIC9EZXZp\r
+Y2VSR0IgL0JpdHNQZXJDb21wb25lbnQgOCAvRmlsdGVyIC9GbGF0ZURlY29kZSAKL0RlY29kZVBh\r
+cm1zIDw8L1ByZWRpY3RvciAxNSAvQ29sdW1ucyAzMiAvQ29sb3JzIDMgL0JpdHNQZXJDb21wb25l\r
+bnQgOCA+PiA+PgpzdHJlYW0KeJzlVltsFGUUnv8yl71vr9vCQgsVCtqWKqAYTU25CtSEBx58EAko\r
+kQAxGI0xXmIT44upyAMSoy/2TQ1BoxC5hoAhkUCMoWBNSQu02263u223u93LzPwXz7RkaaC6PMCT\r
+f2YeZvb7z/ed75z/zFLlES/6/ybY0lyKBOPExSRinJ/qij9Mgs2r5mCemUNYUogUI5TQzc2h43/G\r
+HhoBRxbXsUQ4KHl5uPbWwJAUYusz4SOXIsUJjh54ayQWRwj5/AGvL6BqGqXqutfeLwDWrygXClPd\r
+voanVjy98vna+obz5851ftvJGC+ewZEv3h2JRYWUhqZ7/cGyyhAhNJUcO/bVR227P5nGYKL4/P43\r
+d+5ualpBXAGE1XUb22LDwydPnipOkBiOmqapYKxpkjPGLEtRFcFFNp0pYLZsasOYNSxZiqmBdS8Q\r
+SME2bFjb29urXBkqQmBZVkPj4wsW1Xf33IwORlS31+0S6dR4PpctYFa3tGI7jRAGHUjBiiJBQknA\r
+9/orWzu++60IAaa0uWkp9Va0zKvDRIMQktvpxPCvPx0tYAhBPuqCqsJPwnIyE3ZO2jkNi+IW+bwe\r
+8BgRCkVW4CZUkcLj91dWVV47dqihbR9g6lpejZ89JK2soLoiJQCA5vat3g8OdhQh6Pr5INh950FO\r
+3UI4IRRl8WPzzXy+gKxYsy969pBBNc5NAPBcuvPI95IX6yLDF8DcBkXOpTjSIHlFcrDYpWt69byZ\r
+4GgsWiGkJ1gmbKv/Zt/w4IBLFiNY1Lqj79SXCrclyyOqgrcSjBJc2llN10JNbTPBc8M1aVNMDg3C\r
+cSurrqHMouhew2epQXmJ37RMYaY5kk6REQKBPJ+imgM+ceKEYRjz7W6fjrDbX+rToH2gVhMTGV2y\r
+hiee3P/x3kljHjR465q1sxP4V24bvvA1yk+CP5Jq8IZb+dGxsUUb9sZOd1g1VcHquuTVKEIWNAC4\r
+PyVajsejboRSo2Oh8IL6mmUT3WdiZz4PrX179lExkHF5xFhFgGNCpZSJZKp3xIydPUgMP0bQxlSq\r
+LgyZ5VJQJuwOgJRY73XQkk4MRSPR8rrlChxAIxA/f3h2gpUbt12/cPRWYsjMQR4Se0rrl9RhNoxU\r
+XQinjE5nKgLrHglZcgueByODliTSYgM3rja+0AbthFVDCDY7QfSvi9AzMYz6erp9gUBVdZiCVxxL\r
+p1+h5wUiMEYmpbzT0PCmp6fHFFhB5PrlCy/ufE8AsZMdvZegvz9hcmapRLOjnDM4Z4CUiBpzGnFS\r
+lxMRmJe5XE5iTWFT0REBTHI0MZJMSXigat3yVgBwOEwIXqC7BF1/91NMuJRuQ4M9wqhxV6thd7Vm\r
+eALVtS63GwdWMdtimbQJTYZdkunAjogKbhBPya79H+ZNq3Ju2Fj4bDabjSfGmSZi4/wOwZnzXdBq\r
+Ab/b0FWVEmeCIcXjXlgRXljobPAHau72BsEQQhZHBtyEwExxMpAeOG7LdJunLRYfSEwkb167HD1+\r
+OnHpjwMOwe9XbmCMS4NeFZzRnBEkneZDcjruTAfh0Dk1kKpmVITCe944HKowgn6SzfLBaG4smUnE\r
+4pHYRCbzY2EHbW//wYle4gHXvB5jWqmU90aeQYGgKADWDfXTz7Y3N9bOCrtLsH7TMhAOemEP6IMa\r
+At90I/7bAiRcoKIqFPzv6A5B3uQ+H4FoHDpcSMvmunbfQJmx5JR84YwoZ5oXJ7g9mABBNeFyQrBl\r
+2ZCBpjp892+dSkkyJqZzHUmk4CpOsOPllo7Dv1zrjtQtCJWVeL0enZCMMwacD8GUFfD9wk7BQTW8\r
+sW2eyZp9t0dGxzPU1IoTwP3OnpemH77pvGhzkwsGPtjMsRlNCYcDigmmxCESlj0ac7e3ry4a+i5B\r
+Ye3a/twDbnvw9cj//P4Dzy7kxgplbmRzdHJlYW0KZW5kb2JqCjEyIDAgb2JqIAo8PC9MZW5ndGgg\r
+NDI5IC9UeXBlIC9YT2JqZWN0IC9TdWJ0eXBlIC9JbWFnZSAvV2lkdGggMzIgL0hlaWdodCAzMiAv\r
+Q29sb3JTcGFjZSAvRGV2aWNlR3JheSAvQml0c1BlckNvbXBvbmVudCA4IC9EZWNvZGVQYXJtcyA8\r
+PC9QcmVkaWN0b3IgMTUgL0NvbHVtbnMgMzIgL0NvbG9ycyAxIC9CaXRzUGVyQ29tcG9uZW50IDgg\r
+Pj4gCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4nGNhIABYaKOAI1Tnw+YruBUo7lRl\r
+YGip6sSpYAFQnoGp48BJZAWMCYmyL5bM+AtkytlBhEKQFTAuimFgULDwCPwDpKB6hJCtiIkBUz6Z\r
+kxkYxKAKJJAVxEIFY4AKnkHZj5AVwIyVB+LjR2zA7CXICv5DFTCz/WL4X3ocLPQCSYGyLFSBiNIN\r
+BoYTu9xA7v6LpODBV06Igrs3QORtkAIGPiQFf6tnQhTUgUmIP8SR3TA7Ww9EPV/DIOIoZRMIFisz\r
+e7D9HdyRbStA1JxfyX18UOcwuLgwfIreAgvqHWDyjOVsRgYkwLdYFqbg4y82IPk6DkWegUHAHaZA\r
+gBVEivowoAFfiAIml3Kw1kX86AocQQrE0lPkIFx0+f+X2oEKEqdyogp/5WQCyn15eefEjnO/WRi0\r
+ZrKi6ZvWwcn++/v3n39BMcTCkIYuzxBR+Q7BYeEOQ5dnkLU4iqTAURJDAUMwsoKHt1TRAofh7Wkk\r
+DstlY0cXI0UBNmagsv///nx6cungjhfIChi+bN7MyM7Hy8vK9O/Pl8+ffvxDNQ4ckv9//HiF6RIk\r
+BfgAACqRdpoKZW5kc3RyZWFtCmVuZG9iagoxMyAwIG9iaiAKPDwvVHlwZSAvRm9udCAvRW5jb2Rp\r
+bmcgL1dpbkFuc2lFbmNvZGluZyAvU3VidHlwZSAvVHlwZTEgL0Jhc2VGb250IC9IZWx2ZXRpY2Et\r
+Qm9sZCA+PgplbmRvYmoKeHJlZgowIDE0IAowMDAwMDAwMDAwIDY1NTM1IGYgCjAwMDAwMDAwMTUg\r
+MDAwMDAgbiAKMDAwMDAwMDA5MSAwMDAwMCBuIAowMDAwMDAwMTQ5IDAwMDAwIG4gCjAwMDAwMDAz\r
+NzggMDAwMDAgbiAKMDAwMDAwMzAxNyAwMDAwMCBuIAowMDAwMDAzMDM2IDAwMDAwIG4gCjAwMDAw\r
+MDMwNzAgMDAwMDAgbiAKMDAwMDAwMzEwNCAwMDAwMCBuIAowMDAwMDAzMTIzIDAwMDAwIG4gCjAw\r
+MDAwMDMxNTcgMDAwMDAgbiAKMDAwMDAwMzI1NSAwMDAwMCBuIAowMDAwMDA0OTM5IDAwMDAwIG4g\r
+CjAwMDAwMDU2MTIgMDAwMDAgbiAKdHJhaWxlcgo8PC9JRCBbPDMwNjEzNDYzMzM2MzM2MzgzMTMw\r
+MzUzODM1NjI2MzM4PiA8NjIzNTMyMzE2NjYyMzMzMTM3NjYzNjM4NjQ2MTM3NjM+IF0gL1NpemUg\r
+MTQgL1Jvb3QgMSAwIFIgPj4Kc3RhcnR4cmVmCjU3MTUKJSVFT0YK\r
index eb871c9..9b68cd9 100644 (file)
@@ -213,7 +213,14 @@ class Felamimail_Controller_Message extends Tinebase_Controller_Record_Abstract
         
         $headers     = $this->getMessageHeaders($_message, $_partId, true);
         $body        = $this->getMessageBody($_message, $_partId, $mimeType, $_account, true);
-        $attachments = $this->getAttachments($_message, $_partId);
+        $attachments = array();
+        if ($body === '' && $_partId === null && isset($headers['content-transfer-encoding']) && $headers['content-transfer-encoding'] === 'base64') {
+            // maybe we have a single part message that needs to be treated like an attachment
+            $attachments = $this->getAttachments($_message, 1);
+            $_message->has_attachment = true;
+        }
+
+        $attachments = array_merge($attachments, $this->getAttachments($_message, $_partId));
         
         if ($_partId === null) {
             $message = $_message;
@@ -893,6 +900,9 @@ class Felamimail_Controller_Message extends Tinebase_Controller_Record_Abstract
                 && isset($structure['messageStructure']['parts']) && is_array($structure['messageStructure']['parts'])
             ) {
                 $structure = $structure['messageStructure'];
+            } elseif ($_partId === 1) {
+                // handle single part messages with attachment-like content (like a pdf file)
+                $structure['parts'] = array($structure);
             } else {
                 return array();
             }