{"diffoscope-json-version": 1, "source1": "/input1", "source2": "/input2", "unified_diff": null, "details": [{"source1": "zipinfo {}", "source2": "zipinfo {}", "unified_diff": "@@ -1,8 +1,8 @@\n-Zip file size: 30963 bytes, number of entries: 36\n+Zip file size: 31088 bytes, number of entries: 36\n -rw-r--r--  2.0 unx       64 b- defN 20-Apr-01 08:04 META-INF/MANIFEST.MF\n drwxr-xr-x  2.0 unx        0 b- stor 20-Apr-01 08:04 META-INF/\n drwxr-xr-x  2.0 unx        0 b- stor 20-Apr-01 08:04 org/\n drwxr-xr-x  2.0 unx        0 b- stor 20-Apr-01 08:04 org/apache/\n drwxr-xr-x  2.0 unx        0 b- stor 20-Apr-01 08:04 org/apache/dubbo/\n drwxr-xr-x  2.0 unx        0 b- stor 20-Apr-01 08:04 org/apache/dubbo/rpc/\n drwxr-xr-x  2.0 unx        0 b- stor 20-Apr-01 08:04 org/apache/dubbo/rpc/protocol/\n@@ -13,26 +13,26 @@\n drwxr-xr-x  2.0 unx        0 b- stor 20-Apr-01 08:04 META-INF/dubbo/internal/\n drwxr-xr-x  2.0 unx        0 b- stor 20-Apr-01 08:04 META-INF/maven/\n drwxr-xr-x  2.0 unx        0 b- stor 20-Apr-01 08:04 META-INF/maven/org.apache.dubbo/\n drwxr-xr-x  2.0 unx        0 b- stor 20-Apr-01 08:04 META-INF/maven/org.apache.dubbo/dubbo-rpc-thrift/\n -rw-r--r--  2.0 unx     6167 b- defN 20-Apr-01 08:04 META-INF/DEPENDENCIES\n -rw-r--r--  2.0 unx    11358 b- defN 20-Apr-01 08:04 META-INF/LICENSE\n -rw-r--r--  2.0 unx      173 b- defN 20-Apr-01 08:04 META-INF/NOTICE\n--rw-r--r--  2.0 unx     1219 b- defN 20-Apr-01 08:04 org/apache/dubbo/rpc/protocol/thrift/ClassNameGenerator.java\n--rw-r--r--  2.0 unx     1436 b- defN 20-Apr-01 08:04 org/apache/dubbo/rpc/protocol/thrift/DubboClassNameGenerator.java\n+-rw-r--r--  2.0 unx     1250 b- defN 20-Apr-01 08:04 org/apache/dubbo/rpc/protocol/thrift/ClassNameGenerator.java\n+-rw-r--r--  2.0 unx     1472 b- defN 20-Apr-01 08:04 org/apache/dubbo/rpc/protocol/thrift/DubboClassNameGenerator.java\n -rw-r--r--  2.0 unx     1486 b- defN 20-Apr-01 08:04 org/apache/dubbo/rpc/protocol/thrift/ThriftClassNameGenerator.java\n--rw-r--r--  2.0 unx    24656 b- defN 20-Apr-01 08:04 org/apache/dubbo/rpc/protocol/thrift/ThriftCodec.java\n--rw-r--r--  2.0 unx     1320 b- defN 20-Apr-01 08:04 org/apache/dubbo/rpc/protocol/thrift/ThriftConstants.java\n--rw-r--r--  2.0 unx     6104 b- defN 20-Apr-01 08:04 org/apache/dubbo/rpc/protocol/thrift/ThriftInvoker.java\n--rw-r--r--  2.0 unx     3891 b- defN 20-Apr-01 08:04 org/apache/dubbo/rpc/protocol/thrift/ThriftNativeCodec.java\n--rw-r--r--  2.0 unx     9871 b- defN 20-Apr-01 08:04 org/apache/dubbo/rpc/protocol/thrift/ThriftProtocol.java\n--rw-r--r--  2.0 unx     1644 b- defN 20-Apr-01 08:04 org/apache/dubbo/rpc/protocol/thrift/ThriftType.java\n--rw-r--r--  2.0 unx     4218 b- defN 20-Apr-01 08:04 org/apache/dubbo/rpc/protocol/thrift/ThriftUtils.java\n--rw-r--r--  2.0 unx     4158 b- defN 20-Apr-01 08:04 org/apache/dubbo/rpc/protocol/thrift/ext/MultiServiceProcessor.java\n+-rw-r--r--  2.0 unx    25354 b- defN 20-Apr-01 08:04 org/apache/dubbo/rpc/protocol/thrift/ThriftCodec.java\n+-rw-r--r--  2.0 unx     1352 b- defN 20-Apr-01 08:04 org/apache/dubbo/rpc/protocol/thrift/ThriftConstants.java\n+-rw-r--r--  2.0 unx     6275 b- defN 20-Apr-01 08:04 org/apache/dubbo/rpc/protocol/thrift/ThriftInvoker.java\n+-rw-r--r--  2.0 unx     3987 b- defN 20-Apr-01 08:04 org/apache/dubbo/rpc/protocol/thrift/ThriftNativeCodec.java\n+-rw-r--r--  2.0 unx    10143 b- defN 20-Apr-01 08:04 org/apache/dubbo/rpc/protocol/thrift/ThriftProtocol.java\n+-rw-r--r--  2.0 unx     1695 b- defN 20-Apr-01 08:04 org/apache/dubbo/rpc/protocol/thrift/ThriftType.java\n+-rw-r--r--  2.0 unx     4353 b- defN 20-Apr-01 08:04 org/apache/dubbo/rpc/protocol/thrift/ThriftUtils.java\n+-rw-r--r--  2.0 unx     4279 b- defN 20-Apr-01 08:04 org/apache/dubbo/rpc/protocol/thrift/ext/MultiServiceProcessor.java\n -rw-r--r--  2.0 unx     2385 b- defN 20-Apr-01 08:04 org/apache/dubbo/rpc/protocol/thrift/io/InputStreamWrapper.java\n--rw-r--r--  2.0 unx     3057 b- defN 20-Apr-01 08:04 org/apache/dubbo/rpc/protocol/thrift/io/RandomAccessByteArrayOutputStream.java\n+-rw-r--r--  2.0 unx     3174 b- defN 20-Apr-01 08:04 org/apache/dubbo/rpc/protocol/thrift/io/RandomAccessByteArrayOutputStream.java\n -rw-r--r--  2.0 unx       55 b- defN 20-Apr-01 08:04 META-INF/dubbo/internal/org.apache.dubbo.remoting.Codec2\n -rw-r--r--  2.0 unx       58 b- defN 20-Apr-01 08:04 META-INF/dubbo/internal/org.apache.dubbo.rpc.Protocol\n -rw-r--r--  2.0 unx      136 b- defN 20-Apr-01 08:04 META-INF/dubbo/internal/org.apache.dubbo.rpc.protocol.thrift.ClassNameGenerator\n--rw-r--r--  2.0 unx     3202 b- defN 20-Apr-01 08:04 META-INF/maven/org.apache.dubbo/dubbo-rpc-thrift/pom.xml\n+-rw-r--r--  2.0 unx     3119 b- defN 20-Apr-01 08:04 META-INF/maven/org.apache.dubbo/dubbo-rpc-thrift/pom.xml\n -rw-r--r--  2.0 unx       71 b- defN 20-Apr-01 08:04 META-INF/maven/org.apache.dubbo/dubbo-rpc-thrift/pom.properties\n-36 files, 86729 bytes uncompressed, 25189 bytes compressed:  71.0%\n+36 files, 88406 bytes uncompressed, 25314 bytes compressed:  71.4%\n"}, {"source1": "zipdetails --redact --scan --utc {}", "source2": "zipdetails --redact --scan --utc {}", "unified_diff": "@@ -335,1486 +335,1486 @@\n 189F Extract Zip Spec      14 (20) '2.0'\n 18A0 Extract OS            00 (0) 'MS-DOS'\n 18A1 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n 18A3 Compression Method    0008 (8) 'Deflated'\n 18A5 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-18A9 CRC                   338329BB (864233915)\n-18AD Compressed Size       0000028D (653)\n-18B1 Uncompressed Size     000004C3 (1219)\n+18A9 CRC                   63A56C0E (1671785486)\n+18AD Compressed Size       00000294 (660)\n+18B1 Uncompressed Size     000004E2 (1250)\n 18B5 Filename Length       003C (60)\n 18B7 Extra Length          0000 (0)\n 18B9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n # WARNING: Offset 0x18B9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n 18F5 PAYLOAD\n \n-1B82 LOCAL HEADER #20      04034B50 (67324752)\n-1B86 Extract Zip Spec      14 (20) '2.0'\n-1B87 Extract OS            00 (0) 'MS-DOS'\n-1B88 General Purpose Flag  0800 (2048)\n+1B89 LOCAL HEADER #20      04034B50 (67324752)\n+1B8D Extract Zip Spec      14 (20) '2.0'\n+1B8E Extract OS            00 (0) 'MS-DOS'\n+1B8F General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-1B8A Compression Method    0008 (8) 'Deflated'\n-1B8C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1B90 CRC                   3B13030C (991101708)\n-1B94 Compressed Size       000002B3 (691)\n-1B98 Uncompressed Size     0000059C (1436)\n-1B9C Filename Length       0041 (65)\n-1B9E Extra Length          0000 (0)\n-1BA0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1B91 Compression Method    0008 (8) 'Deflated'\n+1B93 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1B97 CRC                   E0FB0689 (3774547593)\n+1B9B Compressed Size       000002BC (700)\n+1B9F Uncompressed Size     000005C0 (1472)\n+1BA3 Filename Length       0041 (65)\n+1BA5 Extra Length          0000 (0)\n+1BA7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1BA0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1BA7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1BE1 PAYLOAD\n+1BE8 PAYLOAD\n \n-1E94 LOCAL HEADER #21      04034B50 (67324752)\n-1E98 Extract Zip Spec      14 (20) '2.0'\n-1E99 Extract OS            00 (0) 'MS-DOS'\n-1E9A General Purpose Flag  0800 (2048)\n+1EA4 LOCAL HEADER #21      04034B50 (67324752)\n+1EA8 Extract Zip Spec      14 (20) '2.0'\n+1EA9 Extract OS            00 (0) 'MS-DOS'\n+1EAA General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-1E9C Compression Method    0008 (8) 'Deflated'\n-1E9E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1EA2 CRC                   45D210E4 (1171394788)\n-1EA6 Compressed Size       000002BA (698)\n-1EAA Uncompressed Size     000005CE (1486)\n-1EAE Filename Length       0042 (66)\n-1EB0 Extra Length          0000 (0)\n-1EB2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1EAC Compression Method    0008 (8) 'Deflated'\n+1EAE Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1EB2 CRC                   45D210E4 (1171394788)\n+1EB6 Compressed Size       000002BA (698)\n+1EBA Uncompressed Size     000005CE (1486)\n+1EBE Filename Length       0042 (66)\n+1EC0 Extra Length          0000 (0)\n+1EC2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1EB2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1EC2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1EF4 PAYLOAD\n+1F04 PAYLOAD\n \n-21AE LOCAL HEADER #22      04034B50 (67324752)\n-21B2 Extract Zip Spec      14 (20) '2.0'\n-21B3 Extract OS            00 (0) 'MS-DOS'\n-21B4 General Purpose Flag  0800 (2048)\n+21BE LOCAL HEADER #22      04034B50 (67324752)\n+21C2 Extract Zip Spec      14 (20) '2.0'\n+21C3 Extract OS            00 (0) 'MS-DOS'\n+21C4 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-21B6 Compression Method    0008 (8) 'Deflated'\n-21B8 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-21BC CRC                   FCFC2855 (4244383829)\n-21C0 Compressed Size       000011DF (4575)\n-21C4 Uncompressed Size     00006050 (24656)\n-21C8 Filename Length       0035 (53)\n-21CA Extra Length          0000 (0)\n-21CC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+21C6 Compression Method    0008 (8) 'Deflated'\n+21C8 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+21CC CRC                   F30965C2 (4077479362)\n+21D0 Compressed Size       000011F9 (4601)\n+21D4 Uncompressed Size     0000630A (25354)\n+21D8 Filename Length       0035 (53)\n+21DA Extra Length          0000 (0)\n+21DC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x21CC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x21DC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-2201 PAYLOAD\n+2211 PAYLOAD\n \n-33E0 LOCAL HEADER #23      04034B50 (67324752)\n-33E4 Extract Zip Spec      14 (20) '2.0'\n-33E5 Extract OS            00 (0) 'MS-DOS'\n-33E6 General Purpose Flag  0800 (2048)\n+340A LOCAL HEADER #23      04034B50 (67324752)\n+340E Extract Zip Spec      14 (20) '2.0'\n+340F Extract OS            00 (0) 'MS-DOS'\n+3410 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-33E8 Compression Method    0008 (8) 'Deflated'\n-33EA Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-33EE CRC                   F36E07A4 (4084074404)\n-33F2 Compressed Size       000002B5 (693)\n-33F6 Uncompressed Size     00000528 (1320)\n-33FA Filename Length       0039 (57)\n-33FC Extra Length          0000 (0)\n-33FE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+3412 Compression Method    0008 (8) 'Deflated'\n+3414 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+3418 CRC                   046733D7 (73872343)\n+341C Compressed Size       000002BD (701)\n+3420 Uncompressed Size     00000548 (1352)\n+3424 Filename Length       0039 (57)\n+3426 Extra Length          0000 (0)\n+3428 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x33FE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3428: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-3437 PAYLOAD\n+3461 PAYLOAD\n \n-36EC LOCAL HEADER #24      04034B50 (67324752)\n-36F0 Extract Zip Spec      14 (20) '2.0'\n-36F1 Extract OS            00 (0) 'MS-DOS'\n-36F2 General Purpose Flag  0800 (2048)\n+371E LOCAL HEADER #24      04034B50 (67324752)\n+3722 Extract Zip Spec      14 (20) '2.0'\n+3723 Extract OS            00 (0) 'MS-DOS'\n+3724 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-36F4 Compression Method    0008 (8) 'Deflated'\n-36F6 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-36FA CRC                   4E01C35D (1308738397)\n-36FE Compressed Size       000007FF (2047)\n-3702 Uncompressed Size     000017D8 (6104)\n-3706 Filename Length       0037 (55)\n-3708 Extra Length          0000 (0)\n-370A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+3726 Compression Method    0008 (8) 'Deflated'\n+3728 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+372C CRC                   0C743F4B (208944971)\n+3730 Compressed Size       0000080E (2062)\n+3734 Uncompressed Size     00001883 (6275)\n+3738 Filename Length       0037 (55)\n+373A Extra Length          0000 (0)\n+373C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x370A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x373C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-3741 PAYLOAD\n+3773 PAYLOAD\n \n-3F40 LOCAL HEADER #25      04034B50 (67324752)\n-3F44 Extract Zip Spec      14 (20) '2.0'\n-3F45 Extract OS            00 (0) 'MS-DOS'\n-3F46 General Purpose Flag  0800 (2048)\n+3F81 LOCAL HEADER #25      04034B50 (67324752)\n+3F85 Extract Zip Spec      14 (20) '2.0'\n+3F86 Extract OS            00 (0) 'MS-DOS'\n+3F87 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-3F48 Compression Method    0008 (8) 'Deflated'\n-3F4A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3F4E CRC                   CCF50709 (3438610185)\n-3F52 Compressed Size       00000555 (1365)\n-3F56 Uncompressed Size     00000F33 (3891)\n-3F5A Filename Length       003B (59)\n-3F5C Extra Length          0000 (0)\n-3F5E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+3F89 Compression Method    0008 (8) 'Deflated'\n+3F8B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+3F8F CRC                   ADE79375 (2917634933)\n+3F93 Compressed Size       0000055E (1374)\n+3F97 Uncompressed Size     00000F93 (3987)\n+3F9B Filename Length       003B (59)\n+3F9D Extra Length          0000 (0)\n+3F9F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3F5E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3F9F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-3F99 PAYLOAD\n+3FDA PAYLOAD\n \n-44EE LOCAL HEADER #26      04034B50 (67324752)\n-44F2 Extract Zip Spec      14 (20) '2.0'\n-44F3 Extract OS            00 (0) 'MS-DOS'\n-44F4 General Purpose Flag  0800 (2048)\n+4538 LOCAL HEADER #26      04034B50 (67324752)\n+453C Extract Zip Spec      14 (20) '2.0'\n+453D Extract OS            00 (0) 'MS-DOS'\n+453E General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-44F6 Compression Method    0008 (8) 'Deflated'\n-44F8 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-44FC CRC                   8C523252 (2354197074)\n-4500 Compressed Size       00000AA5 (2725)\n-4504 Uncompressed Size     0000268F (9871)\n-4508 Filename Length       0038 (56)\n-450A Extra Length          0000 (0)\n-450C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+4540 Compression Method    0008 (8) 'Deflated'\n+4542 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+4546 CRC                   95A966C5 (2510907077)\n+454A Compressed Size       00000ABB (2747)\n+454E Uncompressed Size     0000279F (10143)\n+4552 Filename Length       0038 (56)\n+4554 Extra Length          0000 (0)\n+4556 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x450C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4556: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-4544 PAYLOAD\n+458E PAYLOAD\n \n-4FE9 LOCAL HEADER #27      04034B50 (67324752)\n-4FED Extract Zip Spec      14 (20) '2.0'\n-4FEE Extract OS            00 (0) 'MS-DOS'\n-4FEF General Purpose Flag  0800 (2048)\n+5049 LOCAL HEADER #27      04034B50 (67324752)\n+504D Extract Zip Spec      14 (20) '2.0'\n+504E Extract OS            00 (0) 'MS-DOS'\n+504F General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-4FF1 Compression Method    0008 (8) 'Deflated'\n-4FF3 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-4FF7 CRC                   CBF7FEA9 (3422027433)\n-4FFB Compressed Size       0000033C (828)\n-4FFF Uncompressed Size     0000066C (1644)\n-5003 Filename Length       0034 (52)\n-5005 Extra Length          0000 (0)\n-5007 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+5051 Compression Method    0008 (8) 'Deflated'\n+5053 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+5057 CRC                   FBA20F3E (4221701950)\n+505B Compressed Size       00000341 (833)\n+505F Uncompressed Size     0000069F (1695)\n+5063 Filename Length       0034 (52)\n+5065 Extra Length          0000 (0)\n+5067 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x5007: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5067: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-503B PAYLOAD\n+509B PAYLOAD\n \n-5377 LOCAL HEADER #28      04034B50 (67324752)\n-537B Extract Zip Spec      14 (20) '2.0'\n-537C Extract OS            00 (0) 'MS-DOS'\n-537D General Purpose Flag  0800 (2048)\n+53DC LOCAL HEADER #28      04034B50 (67324752)\n+53E0 Extract Zip Spec      14 (20) '2.0'\n+53E1 Extract OS            00 (0) 'MS-DOS'\n+53E2 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-537F Compression Method    0008 (8) 'Deflated'\n-5381 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-5385 CRC                   FD7FF5E7 (4253021671)\n-5389 Compressed Size       000003F1 (1009)\n-538D Uncompressed Size     0000107A (4218)\n-5391 Filename Length       0035 (53)\n-5393 Extra Length          0000 (0)\n-5395 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+53E4 Compression Method    0008 (8) 'Deflated'\n+53E6 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+53EA CRC                   6BB5A87E (1807067262)\n+53EE Compressed Size       000003F9 (1017)\n+53F2 Uncompressed Size     00001101 (4353)\n+53F6 Filename Length       0035 (53)\n+53F8 Extra Length          0000 (0)\n+53FA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x5395: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x53FA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-53CA PAYLOAD\n+542F PAYLOAD\n \n-57BB LOCAL HEADER #29      04034B50 (67324752)\n-57BF Extract Zip Spec      14 (20) '2.0'\n-57C0 Extract OS            00 (0) 'MS-DOS'\n-57C1 General Purpose Flag  0800 (2048)\n+5828 LOCAL HEADER #29      04034B50 (67324752)\n+582C Extract Zip Spec      14 (20) '2.0'\n+582D Extract OS            00 (0) 'MS-DOS'\n+582E General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-57C3 Compression Method    0008 (8) 'Deflated'\n-57C5 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-57C9 CRC                   6A1A9325 (1780126501)\n-57CD Compressed Size       00000585 (1413)\n-57D1 Uncompressed Size     0000103E (4158)\n-57D5 Filename Length       0043 (67)\n-57D7 Extra Length          0000 (0)\n-57D9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+5830 Compression Method    0008 (8) 'Deflated'\n+5832 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+5836 CRC                   B641845C (3057747036)\n+583A Compressed Size       00000592 (1426)\n+583E Uncompressed Size     000010B7 (4279)\n+5842 Filename Length       0043 (67)\n+5844 Extra Length          0000 (0)\n+5846 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x57D9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5846: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-581C PAYLOAD\n+5889 PAYLOAD\n \n-5DA1 LOCAL HEADER #30      04034B50 (67324752)\n-5DA5 Extract Zip Spec      14 (20) '2.0'\n-5DA6 Extract OS            00 (0) 'MS-DOS'\n-5DA7 General Purpose Flag  0800 (2048)\n+5E1B LOCAL HEADER #30      04034B50 (67324752)\n+5E1F Extract Zip Spec      14 (20) '2.0'\n+5E20 Extract OS            00 (0) 'MS-DOS'\n+5E21 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-5DA9 Compression Method    0008 (8) 'Deflated'\n-5DAB Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-5DAF CRC                   021D9C13 (35494931)\n-5DB3 Compressed Size       0000034D (845)\n-5DB7 Uncompressed Size     00000951 (2385)\n-5DBB Filename Length       003F (63)\n-5DBD Extra Length          0000 (0)\n-5DBF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+5E23 Compression Method    0008 (8) 'Deflated'\n+5E25 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+5E29 CRC                   021D9C13 (35494931)\n+5E2D Compressed Size       0000034D (845)\n+5E31 Uncompressed Size     00000951 (2385)\n+5E35 Filename Length       003F (63)\n+5E37 Extra Length          0000 (0)\n+5E39 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x5DBF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5E39: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-5DFE PAYLOAD\n+5E78 PAYLOAD\n \n-614B LOCAL HEADER #31      04034B50 (67324752)\n-614F Extract Zip Spec      14 (20) '2.0'\n-6150 Extract OS            00 (0) 'MS-DOS'\n-6151 General Purpose Flag  0800 (2048)\n+61C5 LOCAL HEADER #31      04034B50 (67324752)\n+61C9 Extract Zip Spec      14 (20) '2.0'\n+61CA Extract OS            00 (0) 'MS-DOS'\n+61CB General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-6153 Compression Method    0008 (8) 'Deflated'\n-6155 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6159 CRC                   48F808F8 (1224214776)\n-615D Compressed Size       00000443 (1091)\n-6161 Uncompressed Size     00000BF1 (3057)\n-6165 Filename Length       004E (78)\n-6167 Extra Length          0000 (0)\n-6169 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+61CD Compression Method    0008 (8) 'Deflated'\n+61CF Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+61D3 CRC                   C419897B (3290007931)\n+61D7 Compressed Size       0000044E (1102)\n+61DB Uncompressed Size     00000C66 (3174)\n+61DF Filename Length       004E (78)\n+61E1 Extra Length          0000 (0)\n+61E3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6169: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x61E3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-61B7 PAYLOAD\n+6231 PAYLOAD\n \n-65FA LOCAL HEADER #32      04034B50 (67324752)\n-65FE Extract Zip Spec      14 (20) '2.0'\n-65FF Extract OS            00 (0) 'MS-DOS'\n-6600 General Purpose Flag  0800 (2048)\n+667F LOCAL HEADER #32      04034B50 (67324752)\n+6683 Extract Zip Spec      14 (20) '2.0'\n+6684 Extract OS            00 (0) 'MS-DOS'\n+6685 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-6602 Compression Method    0008 (8) 'Deflated'\n-6604 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6608 CRC                   A41E0996 (2753431958)\n-660C Compressed Size       00000032 (50)\n-6610 Uncompressed Size     00000037 (55)\n-6614 Filename Length       0038 (56)\n-6616 Extra Length          0000 (0)\n-6618 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+6687 Compression Method    0008 (8) 'Deflated'\n+6689 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+668D CRC                   A41E0996 (2753431958)\n+6691 Compressed Size       00000032 (50)\n+6695 Uncompressed Size     00000037 (55)\n+6699 Filename Length       0038 (56)\n+669B Extra Length          0000 (0)\n+669D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6618: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x669D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-6650 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+66D5 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n \n-6682 LOCAL HEADER #33      04034B50 (67324752)\n-6686 Extract Zip Spec      14 (20) '2.0'\n-6687 Extract OS            00 (0) 'MS-DOS'\n-6688 General Purpose Flag  0800 (2048)\n+6707 LOCAL HEADER #33      04034B50 (67324752)\n+670B Extract Zip Spec      14 (20) '2.0'\n+670C Extract OS            00 (0) 'MS-DOS'\n+670D General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-668A Compression Method    0008 (8) 'Deflated'\n-668C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6690 CRC                   484E8E33 (1213107763)\n-6694 Compressed Size       00000030 (48)\n-6698 Uncompressed Size     0000003A (58)\n-669C Filename Length       0035 (53)\n-669E Extra Length          0000 (0)\n-66A0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+670F Compression Method    0008 (8) 'Deflated'\n+6711 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+6715 CRC                   484E8E33 (1213107763)\n+6719 Compressed Size       00000030 (48)\n+671D Uncompressed Size     0000003A (58)\n+6721 Filename Length       0035 (53)\n+6723 Extra Length          0000 (0)\n+6725 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x66A0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6725: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-66D5 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+675A PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n \n-6705 LOCAL HEADER #34      04034B50 (67324752)\n-6709 Extract Zip Spec      14 (20) '2.0'\n-670A Extract OS            00 (0) 'MS-DOS'\n-670B General Purpose Flag  0800 (2048)\n+678A LOCAL HEADER #34      04034B50 (67324752)\n+678E Extract Zip Spec      14 (20) '2.0'\n+678F Extract OS            00 (0) 'MS-DOS'\n+6790 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-670D Compression Method    0008 (8) 'Deflated'\n-670F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6713 CRC                   78C43CAA (2026126506)\n-6717 Compressed Size       0000004B (75)\n-671B Uncompressed Size     00000088 (136)\n-671F Filename Length       004F (79)\n-6721 Extra Length          0000 (0)\n-6723 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+6792 Compression Method    0008 (8) 'Deflated'\n+6794 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+6798 CRC                   78C43CAA (2026126506)\n+679C Compressed Size       0000004B (75)\n+67A0 Uncompressed Size     00000088 (136)\n+67A4 Filename Length       004F (79)\n+67A6 Extra Length          0000 (0)\n+67A8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6723: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x67A8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-6772 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+67F7 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n \n-67BD LOCAL HEADER #35      04034B50 (67324752)\n-67C1 Extract Zip Spec      14 (20) '2.0'\n-67C2 Extract OS            00 (0) 'MS-DOS'\n-67C3 General Purpose Flag  0800 (2048)\n+6842 LOCAL HEADER #35      04034B50 (67324752)\n+6846 Extract Zip Spec      14 (20) '2.0'\n+6847 Extract OS            00 (0) 'MS-DOS'\n+6848 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-67C5 Compression Method    0008 (8) 'Deflated'\n-67C7 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-67CB CRC                   2B7AF38C (729478028)\n-67CF Compressed Size       000003CC (972)\n-67D3 Uncompressed Size     00000C82 (3202)\n-67D7 Filename Length       0038 (56)\n-67D9 Extra Length          0000 (0)\n-67DB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+684A Compression Method    0008 (8) 'Deflated'\n+684C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+6850 CRC                   FBA32B90 (4221774736)\n+6854 Compressed Size       000003C4 (964)\n+6858 Uncompressed Size     00000C2F (3119)\n+685C Filename Length       0038 (56)\n+685E Extra Length          0000 (0)\n+6860 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x67DB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6860: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-6813 PAYLOAD\n+6898 PAYLOAD\n \n-6BDF LOCAL HEADER #36      04034B50 (67324752)\n-6BE3 Extract Zip Spec      14 (20) '2.0'\n-6BE4 Extract OS            00 (0) 'MS-DOS'\n-6BE5 General Purpose Flag  0800 (2048)\n+6C5C LOCAL HEADER #36      04034B50 (67324752)\n+6C60 Extract Zip Spec      14 (20) '2.0'\n+6C61 Extract OS            00 (0) 'MS-DOS'\n+6C62 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-6BE7 Compression Method    0008 (8) 'Deflated'\n-6BE9 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6BED CRC                   2A331345 (707990341)\n-6BF1 Compressed Size       00000045 (69)\n-6BF5 Uncompressed Size     00000047 (71)\n-6BF9 Filename Length       003F (63)\n-6BFB Extra Length          0000 (0)\n-6BFD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+6C64 Compression Method    0008 (8) 'Deflated'\n+6C66 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+6C6A CRC                   2A331345 (707990341)\n+6C6E Compressed Size       00000045 (69)\n+6C72 Uncompressed Size     00000047 (71)\n+6C76 Filename Length       003F (63)\n+6C78 Extra Length          0000 (0)\n+6C7A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6BFD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6C7A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-6C3C PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+6CB9 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n \n-6C81 CENTRAL HEADER #1     02014B50 (33639248)\n-6C85 Created Zip Spec      14 (20) '2.0'\n-6C86 Created OS            03 (3) 'Unix'\n-6C87 Extract Zip Spec      14 (20) '2.0'\n-6C88 Extract OS            00 (0) 'MS-DOS'\n-6C89 General Purpose Flag  0800 (2048)\n+6CFE CENTRAL HEADER #1     02014B50 (33639248)\n+6D02 Created Zip Spec      14 (20) '2.0'\n+6D03 Created OS            03 (3) 'Unix'\n+6D04 Extract Zip Spec      14 (20) '2.0'\n+6D05 Extract OS            00 (0) 'MS-DOS'\n+6D06 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-6C8B Compression Method    0008 (8) 'Deflated'\n-6C8D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6C91 CRC                   A689EB18 (2794056472)\n-6C95 Compressed Size       00000042 (66)\n-6C99 Uncompressed Size     00000040 (64)\n-6C9D Filename Length       0014 (20)\n-6C9F Extra Length          0000 (0)\n-6CA1 Comment Length        0000 (0)\n-6CA3 Disk Start            0000 (0)\n-6CA5 Int File Attributes   0000 (0)\n+6D08 Compression Method    0008 (8) 'Deflated'\n+6D0A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+6D0E CRC                   A689EB18 (2794056472)\n+6D12 Compressed Size       00000042 (66)\n+6D16 Uncompressed Size     00000040 (64)\n+6D1A Filename Length       0014 (20)\n+6D1C Extra Length          0000 (0)\n+6D1E Comment Length        0000 (0)\n+6D20 Disk Start            0000 (0)\n+6D22 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-6CA7 Ext File Attributes   81A40000 (2175008768)\n+6D24 Ext File Attributes   81A40000 (2175008768)\n      [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n      [Bits 28-31]          08 (8) 'Regular File'\n-6CAB Local Header Offset   00000000 (0)\n-6CAF Filename              'XXXXXXXXXXXXXXXXXXXX'\n+6D28 Local Header Offset   00000000 (0)\n+6D2C Filename              'XXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6CAF: Filename 'XXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6D2C: Filename 'XXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-6CC3 CENTRAL HEADER #2     02014B50 (33639248)\n-6CC7 Created Zip Spec      14 (20) '2.0'\n-6CC8 Created OS            03 (3) 'Unix'\n-6CC9 Extract Zip Spec      0A (10) '1.0'\n-6CCA Extract OS            00 (0) 'MS-DOS'\n-6CCB General Purpose Flag  0800 (2048)\n+6D40 CENTRAL HEADER #2     02014B50 (33639248)\n+6D44 Created Zip Spec      14 (20) '2.0'\n+6D45 Created OS            03 (3) 'Unix'\n+6D46 Extract Zip Spec      0A (10) '1.0'\n+6D47 Extract OS            00 (0) 'MS-DOS'\n+6D48 General Purpose Flag  0800 (2048)\n      [Bit 11]              1 'Language Encoding'\n-6CCD Compression Method    0000 (0) 'Stored'\n-6CCF Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6CD3 CRC                   00000000 (0)\n-6CD7 Compressed Size       00000000 (0)\n-6CDB Uncompressed Size     00000000 (0)\n-6CDF Filename Length       0009 (9)\n-6CE1 Extra Length          0000 (0)\n-6CE3 Comment Length        0000 (0)\n-6CE5 Disk Start            0000 (0)\n-6CE7 Int File Attributes   0000 (0)\n+6D4A Compression Method    0000 (0) 'Stored'\n+6D4C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+6D50 CRC                   00000000 (0)\n+6D54 Compressed Size       00000000 (0)\n+6D58 Uncompressed Size     00000000 (0)\n+6D5C Filename Length       0009 (9)\n+6D5E Extra Length          0000 (0)\n+6D60 Comment Length        0000 (0)\n+6D62 Disk Start            0000 (0)\n+6D64 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-6CE9 Ext File Attributes   41ED0010 (1106051088)\n+6D66 Ext File Attributes   41ED0010 (1106051088)\n      [Bit 4]               Directory\n      [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n      [Bits 28-31]          04 (4) 'Directory'\n-6CED Local Header Offset   00000074 (116)\n-6CF1 Filename              'XXXXXXXXX'\n+6D6A Local Header Offset   00000074 (116)\n+6D6E Filename              'XXXXXXXXX'\n #\n-# WARNING: Offset 0x6CF1: Filename 'XXXXXXXXX'\n+# WARNING: Offset 0x6D6E: Filename 'XXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x6CF1: Directory 'XXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x6D6E: Directory 'XXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x6CC9: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXX'\n+# WARNING: Offset 0x6D46: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXX'\n #\n \n-6CFA CENTRAL HEADER #3     02014B50 (33639248)\n-6CFE Created Zip Spec      14 (20) '2.0'\n-6CFF Created OS            03 (3) 'Unix'\n-6D00 Extract Zip Spec      0A (10) '1.0'\n-6D01 Extract OS            00 (0) 'MS-DOS'\n-6D02 General Purpose Flag  0800 (2048)\n-     [Bit 11]              1 'Language Encoding'\n-6D04 Compression Method    0000 (0) 'Stored'\n-6D06 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6D0A CRC                   00000000 (0)\n-6D0E Compressed Size       00000000 (0)\n-6D12 Uncompressed Size     00000000 (0)\n-6D16 Filename Length       0004 (4)\n-6D18 Extra Length          0000 (0)\n-6D1A Comment Length        0000 (0)\n-6D1C Disk Start            0000 (0)\n-6D1E Int File Attributes   0000 (0)\n+6D77 CENTRAL HEADER #3     02014B50 (33639248)\n+6D7B Created Zip Spec      14 (20) '2.0'\n+6D7C Created OS            03 (3) 'Unix'\n+6D7D Extract Zip Spec      0A (10) '1.0'\n+6D7E Extract OS            00 (0) 'MS-DOS'\n+6D7F General Purpose Flag  0800 (2048)\n+     [Bit 11]              1 'Language Encoding'\n+6D81 Compression Method    0000 (0) 'Stored'\n+6D83 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+6D87 CRC                   00000000 (0)\n+6D8B Compressed Size       00000000 (0)\n+6D8F Uncompressed Size     00000000 (0)\n+6D93 Filename Length       0004 (4)\n+6D95 Extra Length          0000 (0)\n+6D97 Comment Length        0000 (0)\n+6D99 Disk Start            0000 (0)\n+6D9B Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-6D20 Ext File Attributes   41ED0010 (1106051088)\n+6D9D Ext File Attributes   41ED0010 (1106051088)\n      [Bit 4]               Directory\n      [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n      [Bits 28-31]          04 (4) 'Directory'\n-6D24 Local Header Offset   0000009B (155)\n-6D28 Filename              'XXXX'\n+6DA1 Local Header Offset   0000009B (155)\n+6DA5 Filename              'XXXX'\n #\n-# WARNING: Offset 0x6D28: Filename 'XXXX'\n+# WARNING: Offset 0x6DA5: Filename 'XXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x6D28: Directory 'XXXX' must end in a '/'\n+# ERROR: Offset 0x6DA5: Directory 'XXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x6D00: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXX'\n+# WARNING: Offset 0x6D7D: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXX'\n #\n \n-6D2C CENTRAL HEADER #4     02014B50 (33639248)\n-6D30 Created Zip Spec      14 (20) '2.0'\n-6D31 Created OS            03 (3) 'Unix'\n-6D32 Extract Zip Spec      0A (10) '1.0'\n-6D33 Extract OS            00 (0) 'MS-DOS'\n-6D34 General Purpose Flag  0800 (2048)\n-     [Bit 11]              1 'Language Encoding'\n-6D36 Compression Method    0000 (0) 'Stored'\n-6D38 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6D3C CRC                   00000000 (0)\n-6D40 Compressed Size       00000000 (0)\n-6D44 Uncompressed Size     00000000 (0)\n-6D48 Filename Length       000B (11)\n-6D4A Extra Length          0000 (0)\n-6D4C Comment Length        0000 (0)\n-6D4E Disk Start            0000 (0)\n-6D50 Int File Attributes   0000 (0)\n+6DA9 CENTRAL HEADER #4     02014B50 (33639248)\n+6DAD Created Zip Spec      14 (20) '2.0'\n+6DAE Created OS            03 (3) 'Unix'\n+6DAF Extract Zip Spec      0A (10) '1.0'\n+6DB0 Extract OS            00 (0) 'MS-DOS'\n+6DB1 General Purpose Flag  0800 (2048)\n+     [Bit 11]              1 'Language Encoding'\n+6DB3 Compression Method    0000 (0) 'Stored'\n+6DB5 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+6DB9 CRC                   00000000 (0)\n+6DBD Compressed Size       00000000 (0)\n+6DC1 Uncompressed Size     00000000 (0)\n+6DC5 Filename Length       000B (11)\n+6DC7 Extra Length          0000 (0)\n+6DC9 Comment Length        0000 (0)\n+6DCB Disk Start            0000 (0)\n+6DCD Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-6D52 Ext File Attributes   41ED0010 (1106051088)\n+6DCF Ext File Attributes   41ED0010 (1106051088)\n      [Bit 4]               Directory\n      [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n      [Bits 28-31]          04 (4) 'Directory'\n-6D56 Local Header Offset   000000BD (189)\n-6D5A Filename              'XXXXXXXXXXX'\n+6DD3 Local Header Offset   000000BD (189)\n+6DD7 Filename              'XXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6D5A: Filename 'XXXXXXXXXXX'\n+# WARNING: Offset 0x6DD7: Filename 'XXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x6D5A: Directory 'XXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x6DD7: Directory 'XXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x6D32: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXX'\n+# WARNING: Offset 0x6DAF: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXX'\n #\n \n-6D65 CENTRAL HEADER #5     02014B50 (33639248)\n-6D69 Created Zip Spec      14 (20) '2.0'\n-6D6A Created OS            03 (3) 'Unix'\n-6D6B Extract Zip Spec      0A (10) '1.0'\n-6D6C Extract OS            00 (0) 'MS-DOS'\n-6D6D General Purpose Flag  0800 (2048)\n-     [Bit 11]              1 'Language Encoding'\n-6D6F Compression Method    0000 (0) 'Stored'\n-6D71 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6D75 CRC                   00000000 (0)\n-6D79 Compressed Size       00000000 (0)\n-6D7D Uncompressed Size     00000000 (0)\n-6D81 Filename Length       0011 (17)\n-6D83 Extra Length          0000 (0)\n-6D85 Comment Length        0000 (0)\n-6D87 Disk Start            0000 (0)\n-6D89 Int File Attributes   0000 (0)\n+6DE2 CENTRAL HEADER #5     02014B50 (33639248)\n+6DE6 Created Zip Spec      14 (20) '2.0'\n+6DE7 Created OS            03 (3) 'Unix'\n+6DE8 Extract Zip Spec      0A (10) '1.0'\n+6DE9 Extract OS            00 (0) 'MS-DOS'\n+6DEA General Purpose Flag  0800 (2048)\n+     [Bit 11]              1 'Language Encoding'\n+6DEC Compression Method    0000 (0) 'Stored'\n+6DEE Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+6DF2 CRC                   00000000 (0)\n+6DF6 Compressed Size       00000000 (0)\n+6DFA Uncompressed Size     00000000 (0)\n+6DFE Filename Length       0011 (17)\n+6E00 Extra Length          0000 (0)\n+6E02 Comment Length        0000 (0)\n+6E04 Disk Start            0000 (0)\n+6E06 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-6D8B Ext File Attributes   41ED0010 (1106051088)\n+6E08 Ext File Attributes   41ED0010 (1106051088)\n      [Bit 4]               Directory\n      [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n      [Bits 28-31]          04 (4) 'Directory'\n-6D8F Local Header Offset   000000E6 (230)\n-6D93 Filename              'XXXXXXXXXXXXXXXXX'\n+6E0C Local Header Offset   000000E6 (230)\n+6E10 Filename              'XXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6D93: Filename 'XXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6E10: Filename 'XXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x6D93: Directory 'XXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x6E10: Directory 'XXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x6D6B: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6DE8: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXX'\n #\n \n-6DA4 CENTRAL HEADER #6     02014B50 (33639248)\n-6DA8 Created Zip Spec      14 (20) '2.0'\n-6DA9 Created OS            03 (3) 'Unix'\n-6DAA Extract Zip Spec      0A (10) '1.0'\n-6DAB Extract OS            00 (0) 'MS-DOS'\n-6DAC General Purpose Flag  0800 (2048)\n-     [Bit 11]              1 'Language Encoding'\n-6DAE Compression Method    0000 (0) 'Stored'\n-6DB0 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6DB4 CRC                   00000000 (0)\n-6DB8 Compressed Size       00000000 (0)\n-6DBC Uncompressed Size     00000000 (0)\n-6DC0 Filename Length       0015 (21)\n-6DC2 Extra Length          0000 (0)\n-6DC4 Comment Length        0000 (0)\n-6DC6 Disk Start            0000 (0)\n-6DC8 Int File Attributes   0000 (0)\n+6E21 CENTRAL HEADER #6     02014B50 (33639248)\n+6E25 Created Zip Spec      14 (20) '2.0'\n+6E26 Created OS            03 (3) 'Unix'\n+6E27 Extract Zip Spec      0A (10) '1.0'\n+6E28 Extract OS            00 (0) 'MS-DOS'\n+6E29 General Purpose Flag  0800 (2048)\n+     [Bit 11]              1 'Language Encoding'\n+6E2B Compression Method    0000 (0) 'Stored'\n+6E2D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+6E31 CRC                   00000000 (0)\n+6E35 Compressed Size       00000000 (0)\n+6E39 Uncompressed Size     00000000 (0)\n+6E3D Filename Length       0015 (21)\n+6E3F Extra Length          0000 (0)\n+6E41 Comment Length        0000 (0)\n+6E43 Disk Start            0000 (0)\n+6E45 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-6DCA Ext File Attributes   41ED0010 (1106051088)\n+6E47 Ext File Attributes   41ED0010 (1106051088)\n      [Bit 4]               Directory\n      [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n      [Bits 28-31]          04 (4) 'Directory'\n-6DCE Local Header Offset   00000115 (277)\n-6DD2 Filename              'XXXXXXXXXXXXXXXXXXXXX'\n+6E4B Local Header Offset   00000115 (277)\n+6E4F Filename              'XXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6DD2: Filename 'XXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6E4F: Filename 'XXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x6DD2: Directory 'XXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x6E4F: Directory 'XXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x6DAA: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6E27: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXX'\n #\n \n-6DE7 CENTRAL HEADER #7     02014B50 (33639248)\n-6DEB Created Zip Spec      14 (20) '2.0'\n-6DEC Created OS            03 (3) 'Unix'\n-6DED Extract Zip Spec      0A (10) '1.0'\n-6DEE Extract OS            00 (0) 'MS-DOS'\n-6DEF General Purpose Flag  0800 (2048)\n-     [Bit 11]              1 'Language Encoding'\n-6DF1 Compression Method    0000 (0) 'Stored'\n-6DF3 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6DF7 CRC                   00000000 (0)\n-6DFB Compressed Size       00000000 (0)\n-6DFF Uncompressed Size     00000000 (0)\n-6E03 Filename Length       001E (30)\n-6E05 Extra Length          0000 (0)\n-6E07 Comment Length        0000 (0)\n-6E09 Disk Start            0000 (0)\n-6E0B Int File Attributes   0000 (0)\n+6E64 CENTRAL HEADER #7     02014B50 (33639248)\n+6E68 Created Zip Spec      14 (20) '2.0'\n+6E69 Created OS            03 (3) 'Unix'\n+6E6A Extract Zip Spec      0A (10) '1.0'\n+6E6B Extract OS            00 (0) 'MS-DOS'\n+6E6C General Purpose Flag  0800 (2048)\n+     [Bit 11]              1 'Language Encoding'\n+6E6E Compression Method    0000 (0) 'Stored'\n+6E70 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+6E74 CRC                   00000000 (0)\n+6E78 Compressed Size       00000000 (0)\n+6E7C Uncompressed Size     00000000 (0)\n+6E80 Filename Length       001E (30)\n+6E82 Extra Length          0000 (0)\n+6E84 Comment Length        0000 (0)\n+6E86 Disk Start            0000 (0)\n+6E88 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-6E0D Ext File Attributes   41ED0010 (1106051088)\n+6E8A Ext File Attributes   41ED0010 (1106051088)\n      [Bit 4]               Directory\n      [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n      [Bits 28-31]          04 (4) 'Directory'\n-6E11 Local Header Offset   00000148 (328)\n-6E15 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+6E8E Local Header Offset   00000148 (328)\n+6E92 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6E15: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6E92: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x6E15: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x6E92: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x6DED: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6E6A: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-6E33 CENTRAL HEADER #8     02014B50 (33639248)\n-6E37 Created Zip Spec      14 (20) '2.0'\n-6E38 Created OS            03 (3) 'Unix'\n-6E39 Extract Zip Spec      0A (10) '1.0'\n-6E3A Extract OS            00 (0) 'MS-DOS'\n-6E3B General Purpose Flag  0800 (2048)\n-     [Bit 11]              1 'Language Encoding'\n-6E3D Compression Method    0000 (0) 'Stored'\n-6E3F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6E43 CRC                   00000000 (0)\n-6E47 Compressed Size       00000000 (0)\n-6E4B Uncompressed Size     00000000 (0)\n-6E4F Filename Length       0025 (37)\n-6E51 Extra Length          0000 (0)\n-6E53 Comment Length        0000 (0)\n-6E55 Disk Start            0000 (0)\n-6E57 Int File Attributes   0000 (0)\n+6EB0 CENTRAL HEADER #8     02014B50 (33639248)\n+6EB4 Created Zip Spec      14 (20) '2.0'\n+6EB5 Created OS            03 (3) 'Unix'\n+6EB6 Extract Zip Spec      0A (10) '1.0'\n+6EB7 Extract OS            00 (0) 'MS-DOS'\n+6EB8 General Purpose Flag  0800 (2048)\n+     [Bit 11]              1 'Language Encoding'\n+6EBA Compression Method    0000 (0) 'Stored'\n+6EBC Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+6EC0 CRC                   00000000 (0)\n+6EC4 Compressed Size       00000000 (0)\n+6EC8 Uncompressed Size     00000000 (0)\n+6ECC Filename Length       0025 (37)\n+6ECE Extra Length          0000 (0)\n+6ED0 Comment Length        0000 (0)\n+6ED2 Disk Start            0000 (0)\n+6ED4 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-6E59 Ext File Attributes   41ED0010 (1106051088)\n+6ED6 Ext File Attributes   41ED0010 (1106051088)\n      [Bit 4]               Directory\n      [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n      [Bits 28-31]          04 (4) 'Directory'\n-6E5D Local Header Offset   00000184 (388)\n-6E61 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+6EDA Local Header Offset   00000184 (388)\n+6EDE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6E61: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6EDE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x6E61: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x6EDE: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x6E39: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6EB6: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-6E86 CENTRAL HEADER #9     02014B50 (33639248)\n-6E8A Created Zip Spec      14 (20) '2.0'\n-6E8B Created OS            03 (3) 'Unix'\n-6E8C Extract Zip Spec      0A (10) '1.0'\n-6E8D Extract OS            00 (0) 'MS-DOS'\n-6E8E General Purpose Flag  0800 (2048)\n-     [Bit 11]              1 'Language Encoding'\n-6E90 Compression Method    0000 (0) 'Stored'\n-6E92 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6E96 CRC                   00000000 (0)\n-6E9A Compressed Size       00000000 (0)\n-6E9E Uncompressed Size     00000000 (0)\n-6EA2 Filename Length       0029 (41)\n-6EA4 Extra Length          0000 (0)\n-6EA6 Comment Length        0000 (0)\n-6EA8 Disk Start            0000 (0)\n-6EAA Int File Attributes   0000 (0)\n+6F03 CENTRAL HEADER #9     02014B50 (33639248)\n+6F07 Created Zip Spec      14 (20) '2.0'\n+6F08 Created OS            03 (3) 'Unix'\n+6F09 Extract Zip Spec      0A (10) '1.0'\n+6F0A Extract OS            00 (0) 'MS-DOS'\n+6F0B General Purpose Flag  0800 (2048)\n+     [Bit 11]              1 'Language Encoding'\n+6F0D Compression Method    0000 (0) 'Stored'\n+6F0F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+6F13 CRC                   00000000 (0)\n+6F17 Compressed Size       00000000 (0)\n+6F1B Uncompressed Size     00000000 (0)\n+6F1F Filename Length       0029 (41)\n+6F21 Extra Length          0000 (0)\n+6F23 Comment Length        0000 (0)\n+6F25 Disk Start            0000 (0)\n+6F27 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-6EAC Ext File Attributes   41ED0010 (1106051088)\n+6F29 Ext File Attributes   41ED0010 (1106051088)\n      [Bit 4]               Directory\n      [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n      [Bits 28-31]          04 (4) 'Directory'\n-6EB0 Local Header Offset   000001C7 (455)\n-6EB4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+6F2D Local Header Offset   000001C7 (455)\n+6F31 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6EB4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6F31: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x6EB4: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x6F31: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x6E8C: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6F09: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-6EDD CENTRAL HEADER #10    02014B50 (33639248)\n-6EE1 Created Zip Spec      14 (20) '2.0'\n-6EE2 Created OS            03 (3) 'Unix'\n-6EE3 Extract Zip Spec      0A (10) '1.0'\n-6EE4 Extract OS            00 (0) 'MS-DOS'\n-6EE5 General Purpose Flag  0800 (2048)\n-     [Bit 11]              1 'Language Encoding'\n-6EE7 Compression Method    0000 (0) 'Stored'\n-6EE9 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6EED CRC                   00000000 (0)\n-6EF1 Compressed Size       00000000 (0)\n-6EF5 Uncompressed Size     00000000 (0)\n-6EF9 Filename Length       0028 (40)\n-6EFB Extra Length          0000 (0)\n-6EFD Comment Length        0000 (0)\n-6EFF Disk Start            0000 (0)\n-6F01 Int File Attributes   0000 (0)\n+6F5A CENTRAL HEADER #10    02014B50 (33639248)\n+6F5E Created Zip Spec      14 (20) '2.0'\n+6F5F Created OS            03 (3) 'Unix'\n+6F60 Extract Zip Spec      0A (10) '1.0'\n+6F61 Extract OS            00 (0) 'MS-DOS'\n+6F62 General Purpose Flag  0800 (2048)\n+     [Bit 11]              1 'Language Encoding'\n+6F64 Compression Method    0000 (0) 'Stored'\n+6F66 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+6F6A CRC                   00000000 (0)\n+6F6E Compressed Size       00000000 (0)\n+6F72 Uncompressed Size     00000000 (0)\n+6F76 Filename Length       0028 (40)\n+6F78 Extra Length          0000 (0)\n+6F7A Comment Length        0000 (0)\n+6F7C Disk Start            0000 (0)\n+6F7E Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-6F03 Ext File Attributes   41ED0010 (1106051088)\n+6F80 Ext File Attributes   41ED0010 (1106051088)\n      [Bit 4]               Directory\n      [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n      [Bits 28-31]          04 (4) 'Directory'\n-6F07 Local Header Offset   0000020E (526)\n-6F0B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+6F84 Local Header Offset   0000020E (526)\n+6F88 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6F0B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6F88: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x6F0B: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x6F88: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x6EE3: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6F60: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-6F33 CENTRAL HEADER #11    02014B50 (33639248)\n-6F37 Created Zip Spec      14 (20) '2.0'\n-6F38 Created OS            03 (3) 'Unix'\n-6F39 Extract Zip Spec      0A (10) '1.0'\n-6F3A Extract OS            00 (0) 'MS-DOS'\n-6F3B General Purpose Flag  0800 (2048)\n-     [Bit 11]              1 'Language Encoding'\n-6F3D Compression Method    0000 (0) 'Stored'\n-6F3F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6F43 CRC                   00000000 (0)\n-6F47 Compressed Size       00000000 (0)\n-6F4B Uncompressed Size     00000000 (0)\n-6F4F Filename Length       000F (15)\n-6F51 Extra Length          0000 (0)\n-6F53 Comment Length        0000 (0)\n-6F55 Disk Start            0000 (0)\n-6F57 Int File Attributes   0000 (0)\n+6FB0 CENTRAL HEADER #11    02014B50 (33639248)\n+6FB4 Created Zip Spec      14 (20) '2.0'\n+6FB5 Created OS            03 (3) 'Unix'\n+6FB6 Extract Zip Spec      0A (10) '1.0'\n+6FB7 Extract OS            00 (0) 'MS-DOS'\n+6FB8 General Purpose Flag  0800 (2048)\n+     [Bit 11]              1 'Language Encoding'\n+6FBA Compression Method    0000 (0) 'Stored'\n+6FBC Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+6FC0 CRC                   00000000 (0)\n+6FC4 Compressed Size       00000000 (0)\n+6FC8 Uncompressed Size     00000000 (0)\n+6FCC Filename Length       000F (15)\n+6FCE Extra Length          0000 (0)\n+6FD0 Comment Length        0000 (0)\n+6FD2 Disk Start            0000 (0)\n+6FD4 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-6F59 Ext File Attributes   41ED0010 (1106051088)\n+6FD6 Ext File Attributes   41ED0010 (1106051088)\n      [Bit 4]               Directory\n      [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n      [Bits 28-31]          04 (4) 'Directory'\n-6F5D Local Header Offset   00000254 (596)\n-6F61 Filename              'XXXXXXXXXXXXXXX'\n+6FDA Local Header Offset   00000254 (596)\n+6FDE Filename              'XXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6F61: Filename 'XXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6FDE: Filename 'XXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x6F61: Directory 'XXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x6FDE: Directory 'XXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x6F39: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6FB6: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXX'\n #\n \n-6F70 CENTRAL HEADER #12    02014B50 (33639248)\n-6F74 Created Zip Spec      14 (20) '2.0'\n-6F75 Created OS            03 (3) 'Unix'\n-6F76 Extract Zip Spec      0A (10) '1.0'\n-6F77 Extract OS            00 (0) 'MS-DOS'\n-6F78 General Purpose Flag  0800 (2048)\n-     [Bit 11]              1 'Language Encoding'\n-6F7A Compression Method    0000 (0) 'Stored'\n-6F7C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6F80 CRC                   00000000 (0)\n-6F84 Compressed Size       00000000 (0)\n-6F88 Uncompressed Size     00000000 (0)\n-6F8C Filename Length       0018 (24)\n-6F8E Extra Length          0000 (0)\n-6F90 Comment Length        0000 (0)\n-6F92 Disk Start            0000 (0)\n-6F94 Int File Attributes   0000 (0)\n+6FED CENTRAL HEADER #12    02014B50 (33639248)\n+6FF1 Created Zip Spec      14 (20) '2.0'\n+6FF2 Created OS            03 (3) 'Unix'\n+6FF3 Extract Zip Spec      0A (10) '1.0'\n+6FF4 Extract OS            00 (0) 'MS-DOS'\n+6FF5 General Purpose Flag  0800 (2048)\n+     [Bit 11]              1 'Language Encoding'\n+6FF7 Compression Method    0000 (0) 'Stored'\n+6FF9 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+6FFD CRC                   00000000 (0)\n+7001 Compressed Size       00000000 (0)\n+7005 Uncompressed Size     00000000 (0)\n+7009 Filename Length       0018 (24)\n+700B Extra Length          0000 (0)\n+700D Comment Length        0000 (0)\n+700F Disk Start            0000 (0)\n+7011 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-6F96 Ext File Attributes   41ED0010 (1106051088)\n+7013 Ext File Attributes   41ED0010 (1106051088)\n      [Bit 4]               Directory\n      [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n      [Bits 28-31]          04 (4) 'Directory'\n-6F9A Local Header Offset   00000281 (641)\n-6F9E Filename              'XXXXXXXXXXXXXXXXXXXXXXXX'\n+7017 Local Header Offset   00000281 (641)\n+701B Filename              'XXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6F9E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x701B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x6F9E: Directory 'XXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x701B: Directory 'XXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x6F76: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6FF3: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-6FB6 CENTRAL HEADER #13    02014B50 (33639248)\n-6FBA Created Zip Spec      14 (20) '2.0'\n-6FBB Created OS            03 (3) 'Unix'\n-6FBC Extract Zip Spec      0A (10) '1.0'\n-6FBD Extract OS            00 (0) 'MS-DOS'\n-6FBE General Purpose Flag  0800 (2048)\n-     [Bit 11]              1 'Language Encoding'\n-6FC0 Compression Method    0000 (0) 'Stored'\n-6FC2 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-6FC6 CRC                   00000000 (0)\n-6FCA Compressed Size       00000000 (0)\n-6FCE Uncompressed Size     00000000 (0)\n-6FD2 Filename Length       000F (15)\n-6FD4 Extra Length          0000 (0)\n-6FD6 Comment Length        0000 (0)\n-6FD8 Disk Start            0000 (0)\n-6FDA Int File Attributes   0000 (0)\n+7033 CENTRAL HEADER #13    02014B50 (33639248)\n+7037 Created Zip Spec      14 (20) '2.0'\n+7038 Created OS            03 (3) 'Unix'\n+7039 Extract Zip Spec      0A (10) '1.0'\n+703A Extract OS            00 (0) 'MS-DOS'\n+703B General Purpose Flag  0800 (2048)\n+     [Bit 11]              1 'Language Encoding'\n+703D Compression Method    0000 (0) 'Stored'\n+703F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+7043 CRC                   00000000 (0)\n+7047 Compressed Size       00000000 (0)\n+704B Uncompressed Size     00000000 (0)\n+704F Filename Length       000F (15)\n+7051 Extra Length          0000 (0)\n+7053 Comment Length        0000 (0)\n+7055 Disk Start            0000 (0)\n+7057 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-6FDC Ext File Attributes   41ED0010 (1106051088)\n+7059 Ext File Attributes   41ED0010 (1106051088)\n      [Bit 4]               Directory\n      [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n      [Bits 28-31]          04 (4) 'Directory'\n-6FE0 Local Header Offset   000002B7 (695)\n-6FE4 Filename              'XXXXXXXXXXXXXXX'\n+705D Local Header Offset   000002B7 (695)\n+7061 Filename              'XXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6FE4: Filename 'XXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7061: Filename 'XXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x6FE4: Directory 'XXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x7061: Directory 'XXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x6FBC: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7039: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXX'\n #\n \n-6FF3 CENTRAL HEADER #14    02014B50 (33639248)\n-6FF7 Created Zip Spec      14 (20) '2.0'\n-6FF8 Created OS            03 (3) 'Unix'\n-6FF9 Extract Zip Spec      0A (10) '1.0'\n-6FFA Extract OS            00 (0) 'MS-DOS'\n-6FFB General Purpose Flag  0800 (2048)\n-     [Bit 11]              1 'Language Encoding'\n-6FFD Compression Method    0000 (0) 'Stored'\n-6FFF Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-7003 CRC                   00000000 (0)\n-7007 Compressed Size       00000000 (0)\n-700B Uncompressed Size     00000000 (0)\n-700F Filename Length       0020 (32)\n-7011 Extra Length          0000 (0)\n-7013 Comment Length        0000 (0)\n-7015 Disk Start            0000 (0)\n-7017 Int File Attributes   0000 (0)\n+7070 CENTRAL HEADER #14    02014B50 (33639248)\n+7074 Created Zip Spec      14 (20) '2.0'\n+7075 Created OS            03 (3) 'Unix'\n+7076 Extract Zip Spec      0A (10) '1.0'\n+7077 Extract OS            00 (0) 'MS-DOS'\n+7078 General Purpose Flag  0800 (2048)\n+     [Bit 11]              1 'Language Encoding'\n+707A Compression Method    0000 (0) 'Stored'\n+707C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+7080 CRC                   00000000 (0)\n+7084 Compressed Size       00000000 (0)\n+7088 Uncompressed Size     00000000 (0)\n+708C Filename Length       0020 (32)\n+708E Extra Length          0000 (0)\n+7090 Comment Length        0000 (0)\n+7092 Disk Start            0000 (0)\n+7094 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-7019 Ext File Attributes   41ED0010 (1106051088)\n+7096 Ext File Attributes   41ED0010 (1106051088)\n      [Bit 4]               Directory\n      [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n      [Bits 28-31]          04 (4) 'Directory'\n-701D Local Header Offset   000002E4 (740)\n-7021 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+709A Local Header Offset   000002E4 (740)\n+709E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x7021: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x709E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x7021: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x709E: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x6FF9: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7076: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-7041 CENTRAL HEADER #15    02014B50 (33639248)\n-7045 Created Zip Spec      14 (20) '2.0'\n-7046 Created OS            03 (3) 'Unix'\n-7047 Extract Zip Spec      0A (10) '1.0'\n-7048 Extract OS            00 (0) 'MS-DOS'\n-7049 General Purpose Flag  0800 (2048)\n-     [Bit 11]              1 'Language Encoding'\n-704B Compression Method    0000 (0) 'Stored'\n-704D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-7051 CRC                   00000000 (0)\n-7055 Compressed Size       00000000 (0)\n-7059 Uncompressed Size     00000000 (0)\n-705D Filename Length       0031 (49)\n-705F Extra Length          0000 (0)\n-7061 Comment Length        0000 (0)\n-7063 Disk Start            0000 (0)\n-7065 Int File Attributes   0000 (0)\n+70BE CENTRAL HEADER #15    02014B50 (33639248)\n+70C2 Created Zip Spec      14 (20) '2.0'\n+70C3 Created OS            03 (3) 'Unix'\n+70C4 Extract Zip Spec      0A (10) '1.0'\n+70C5 Extract OS            00 (0) 'MS-DOS'\n+70C6 General Purpose Flag  0800 (2048)\n+     [Bit 11]              1 'Language Encoding'\n+70C8 Compression Method    0000 (0) 'Stored'\n+70CA Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+70CE CRC                   00000000 (0)\n+70D2 Compressed Size       00000000 (0)\n+70D6 Uncompressed Size     00000000 (0)\n+70DA Filename Length       0031 (49)\n+70DC Extra Length          0000 (0)\n+70DE Comment Length        0000 (0)\n+70E0 Disk Start            0000 (0)\n+70E2 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-7067 Ext File Attributes   41ED0010 (1106051088)\n+70E4 Ext File Attributes   41ED0010 (1106051088)\n      [Bit 4]               Directory\n      [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n      [Bits 28-31]          04 (4) 'Directory'\n-706B Local Header Offset   00000322 (802)\n-706F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+70E8 Local Header Offset   00000322 (802)\n+70EC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x706F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x70EC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x706F: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x70EC: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x7047: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x70C4: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-70A0 CENTRAL HEADER #16    02014B50 (33639248)\n-70A4 Created Zip Spec      14 (20) '2.0'\n-70A5 Created OS            03 (3) 'Unix'\n-70A6 Extract Zip Spec      14 (20) '2.0'\n-70A7 Extract OS            00 (0) 'MS-DOS'\n-70A8 General Purpose Flag  0800 (2048)\n+711D CENTRAL HEADER #16    02014B50 (33639248)\n+7121 Created Zip Spec      14 (20) '2.0'\n+7122 Created OS            03 (3) 'Unix'\n+7123 Extract Zip Spec      14 (20) '2.0'\n+7124 Extract OS            00 (0) 'MS-DOS'\n+7125 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-70AA Compression Method    0008 (8) 'Deflated'\n-70AC Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-70B0 CRC                   A6C67FA0 (2798026656)\n-70B4 Compressed Size       000004B1 (1201)\n-70B8 Uncompressed Size     00001817 (6167)\n-70BC Filename Length       0015 (21)\n-70BE Extra Length          0000 (0)\n-70C0 Comment Length        0000 (0)\n-70C2 Disk Start            0000 (0)\n-70C4 Int File Attributes   0000 (0)\n+7127 Compression Method    0008 (8) 'Deflated'\n+7129 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+712D CRC                   A6C67FA0 (2798026656)\n+7131 Compressed Size       000004B1 (1201)\n+7135 Uncompressed Size     00001817 (6167)\n+7139 Filename Length       0015 (21)\n+713B Extra Length          0000 (0)\n+713D Comment Length        0000 (0)\n+713F Disk Start            0000 (0)\n+7141 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-70C6 Ext File Attributes   81A40000 (2175008768)\n+7143 Ext File Attributes   81A40000 (2175008768)\n      [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n      [Bits 28-31]          08 (8) 'Regular File'\n-70CA Local Header Offset   00000371 (881)\n-70CE Filename              'XXXXXXXXXXXXXXXXXXXXX'\n+7147 Local Header Offset   00000371 (881)\n+714B Filename              'XXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x70CE: Filename 'XXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x714B: Filename 'XXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-70E3 CENTRAL HEADER #17    02014B50 (33639248)\n-70E7 Created Zip Spec      14 (20) '2.0'\n-70E8 Created OS            03 (3) 'Unix'\n-70E9 Extract Zip Spec      14 (20) '2.0'\n-70EA Extract OS            00 (0) 'MS-DOS'\n-70EB General Purpose Flag  0800 (2048)\n+7160 CENTRAL HEADER #17    02014B50 (33639248)\n+7164 Created Zip Spec      14 (20) '2.0'\n+7165 Created OS            03 (3) 'Unix'\n+7166 Extract Zip Spec      14 (20) '2.0'\n+7167 Extract OS            00 (0) 'MS-DOS'\n+7168 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-70ED Compression Method    0008 (8) 'Deflated'\n-70EF Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-70F3 CRC                   86E2B4B4 (2263004340)\n-70F7 Compressed Size       00000F6D (3949)\n-70FB Uncompressed Size     00002C5E (11358)\n-70FF Filename Length       0010 (16)\n-7101 Extra Length          0000 (0)\n-7103 Comment Length        0000 (0)\n-7105 Disk Start            0000 (0)\n-7107 Int File Attributes   0000 (0)\n+716A Compression Method    0008 (8) 'Deflated'\n+716C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+7170 CRC                   86E2B4B4 (2263004340)\n+7174 Compressed Size       00000F6D (3949)\n+7178 Uncompressed Size     00002C5E (11358)\n+717C Filename Length       0010 (16)\n+717E Extra Length          0000 (0)\n+7180 Comment Length        0000 (0)\n+7182 Disk Start            0000 (0)\n+7184 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-7109 Ext File Attributes   81A40000 (2175008768)\n+7186 Ext File Attributes   81A40000 (2175008768)\n      [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n      [Bits 28-31]          08 (8) 'Regular File'\n-710D Local Header Offset   00000855 (2133)\n-7111 Filename              'XXXXXXXXXXXXXXXX'\n+718A Local Header Offset   00000855 (2133)\n+718E Filename              'XXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x7111: Filename 'XXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x718E: Filename 'XXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-7121 CENTRAL HEADER #18    02014B50 (33639248)\n-7125 Created Zip Spec      14 (20) '2.0'\n-7126 Created OS            03 (3) 'Unix'\n-7127 Extract Zip Spec      14 (20) '2.0'\n-7128 Extract OS            00 (0) 'MS-DOS'\n-7129 General Purpose Flag  0800 (2048)\n+719E CENTRAL HEADER #18    02014B50 (33639248)\n+71A2 Created Zip Spec      14 (20) '2.0'\n+71A3 Created OS            03 (3) 'Unix'\n+71A4 Extract Zip Spec      14 (20) '2.0'\n+71A5 Extract OS            00 (0) 'MS-DOS'\n+71A6 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-712B Compression Method    0008 (8) 'Deflated'\n-712D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-7131 CRC                   75A33247 (1973629511)\n-7135 Compressed Size       0000007E (126)\n-7139 Uncompressed Size     000000AD (173)\n-713D Filename Length       000F (15)\n-713F Extra Length          0000 (0)\n-7141 Comment Length        0000 (0)\n-7143 Disk Start            0000 (0)\n-7145 Int File Attributes   0000 (0)\n+71A8 Compression Method    0008 (8) 'Deflated'\n+71AA Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+71AE CRC                   75A33247 (1973629511)\n+71B2 Compressed Size       0000007E (126)\n+71B6 Uncompressed Size     000000AD (173)\n+71BA Filename Length       000F (15)\n+71BC Extra Length          0000 (0)\n+71BE Comment Length        0000 (0)\n+71C0 Disk Start            0000 (0)\n+71C2 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-7147 Ext File Attributes   81A40000 (2175008768)\n+71C4 Ext File Attributes   81A40000 (2175008768)\n      [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n      [Bits 28-31]          08 (8) 'Regular File'\n-714B Local Header Offset   000017F0 (6128)\n-714F Filename              'XXXXXXXXXXXXXXX'\n+71C8 Local Header Offset   000017F0 (6128)\n+71CC Filename              'XXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x714F: Filename 'XXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x71CC: Filename 'XXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-715E CENTRAL HEADER #19    02014B50 (33639248)\n-7162 Created Zip Spec      14 (20) '2.0'\n-7163 Created OS            03 (3) 'Unix'\n-7164 Extract Zip Spec      14 (20) '2.0'\n-7165 Extract OS            00 (0) 'MS-DOS'\n-7166 General Purpose Flag  0800 (2048)\n+71DB CENTRAL HEADER #19    02014B50 (33639248)\n+71DF Created Zip Spec      14 (20) '2.0'\n+71E0 Created OS            03 (3) 'Unix'\n+71E1 Extract Zip Spec      14 (20) '2.0'\n+71E2 Extract OS            00 (0) 'MS-DOS'\n+71E3 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-7168 Compression Method    0008 (8) 'Deflated'\n-716A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-716E CRC                   338329BB (864233915)\n-7172 Compressed Size       0000028D (653)\n-7176 Uncompressed Size     000004C3 (1219)\n-717A Filename Length       003C (60)\n-717C Extra Length          0000 (0)\n-717E Comment Length        0000 (0)\n-7180 Disk Start            0000 (0)\n-7182 Int File Attributes   0000 (0)\n+71E5 Compression Method    0008 (8) 'Deflated'\n+71E7 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+71EB CRC                   63A56C0E (1671785486)\n+71EF Compressed Size       00000294 (660)\n+71F3 Uncompressed Size     000004E2 (1250)\n+71F7 Filename Length       003C (60)\n+71F9 Extra Length          0000 (0)\n+71FB Comment Length        0000 (0)\n+71FD Disk Start            0000 (0)\n+71FF Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-7184 Ext File Attributes   81A40000 (2175008768)\n+7201 Ext File Attributes   81A40000 (2175008768)\n      [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n      [Bits 28-31]          08 (8) 'Regular File'\n-7188 Local Header Offset   0000189B (6299)\n-718C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7205 Local Header Offset   0000189B (6299)\n+7209 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x718C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7209: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-71C8 CENTRAL HEADER #20    02014B50 (33639248)\n-71CC Created Zip Spec      14 (20) '2.0'\n-71CD Created OS            03 (3) 'Unix'\n-71CE Extract Zip Spec      14 (20) '2.0'\n-71CF Extract OS            00 (0) 'MS-DOS'\n-71D0 General Purpose Flag  0800 (2048)\n+7245 CENTRAL HEADER #20    02014B50 (33639248)\n+7249 Created Zip Spec      14 (20) '2.0'\n+724A Created OS            03 (3) 'Unix'\n+724B Extract Zip Spec      14 (20) '2.0'\n+724C Extract OS            00 (0) 'MS-DOS'\n+724D General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-71D2 Compression Method    0008 (8) 'Deflated'\n-71D4 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-71D8 CRC                   3B13030C (991101708)\n-71DC Compressed Size       000002B3 (691)\n-71E0 Uncompressed Size     0000059C (1436)\n-71E4 Filename Length       0041 (65)\n-71E6 Extra Length          0000 (0)\n-71E8 Comment Length        0000 (0)\n-71EA Disk Start            0000 (0)\n-71EC Int File Attributes   0000 (0)\n+724F Compression Method    0008 (8) 'Deflated'\n+7251 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+7255 CRC                   E0FB0689 (3774547593)\n+7259 Compressed Size       000002BC (700)\n+725D Uncompressed Size     000005C0 (1472)\n+7261 Filename Length       0041 (65)\n+7263 Extra Length          0000 (0)\n+7265 Comment Length        0000 (0)\n+7267 Disk Start            0000 (0)\n+7269 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-71EE Ext File Attributes   81A40000 (2175008768)\n+726B Ext File Attributes   81A40000 (2175008768)\n      [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n      [Bits 28-31]          08 (8) 'Regular File'\n-71F2 Local Header Offset   00001B82 (7042)\n-71F6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+726F Local Header Offset   00001B89 (7049)\n+7273 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x71F6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7273: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-7237 CENTRAL HEADER #21    02014B50 (33639248)\n-723B Created Zip Spec      14 (20) '2.0'\n-723C Created OS            03 (3) 'Unix'\n-723D Extract Zip Spec      14 (20) '2.0'\n-723E Extract OS            00 (0) 'MS-DOS'\n-723F General Purpose Flag  0800 (2048)\n+72B4 CENTRAL HEADER #21    02014B50 (33639248)\n+72B8 Created Zip Spec      14 (20) '2.0'\n+72B9 Created OS            03 (3) 'Unix'\n+72BA Extract Zip Spec      14 (20) '2.0'\n+72BB Extract OS            00 (0) 'MS-DOS'\n+72BC General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-7241 Compression Method    0008 (8) 'Deflated'\n-7243 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-7247 CRC                   45D210E4 (1171394788)\n-724B Compressed Size       000002BA (698)\n-724F Uncompressed Size     000005CE (1486)\n-7253 Filename Length       0042 (66)\n-7255 Extra Length          0000 (0)\n-7257 Comment Length        0000 (0)\n-7259 Disk Start            0000 (0)\n-725B Int File Attributes   0000 (0)\n+72BE Compression Method    0008 (8) 'Deflated'\n+72C0 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+72C4 CRC                   45D210E4 (1171394788)\n+72C8 Compressed Size       000002BA (698)\n+72CC Uncompressed Size     000005CE (1486)\n+72D0 Filename Length       0042 (66)\n+72D2 Extra Length          0000 (0)\n+72D4 Comment Length        0000 (0)\n+72D6 Disk Start            0000 (0)\n+72D8 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-725D Ext File Attributes   81A40000 (2175008768)\n+72DA Ext File Attributes   81A40000 (2175008768)\n      [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n      [Bits 28-31]          08 (8) 'Regular File'\n-7261 Local Header Offset   00001E94 (7828)\n-7265 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+72DE Local Header Offset   00001EA4 (7844)\n+72E2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x7265: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x72E2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-72A7 CENTRAL HEADER #22    02014B50 (33639248)\n-72AB Created Zip Spec      14 (20) '2.0'\n-72AC Created OS            03 (3) 'Unix'\n-72AD Extract Zip Spec      14 (20) '2.0'\n-72AE Extract OS            00 (0) 'MS-DOS'\n-72AF General Purpose Flag  0800 (2048)\n+7324 CENTRAL HEADER #22    02014B50 (33639248)\n+7328 Created Zip Spec      14 (20) '2.0'\n+7329 Created OS            03 (3) 'Unix'\n+732A Extract Zip Spec      14 (20) '2.0'\n+732B Extract OS            00 (0) 'MS-DOS'\n+732C General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-72B1 Compression Method    0008 (8) 'Deflated'\n-72B3 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-72B7 CRC                   FCFC2855 (4244383829)\n-72BB Compressed Size       000011DF (4575)\n-72BF Uncompressed Size     00006050 (24656)\n-72C3 Filename Length       0035 (53)\n-72C5 Extra Length          0000 (0)\n-72C7 Comment Length        0000 (0)\n-72C9 Disk Start            0000 (0)\n-72CB Int File Attributes   0000 (0)\n+732E Compression Method    0008 (8) 'Deflated'\n+7330 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+7334 CRC                   F30965C2 (4077479362)\n+7338 Compressed Size       000011F9 (4601)\n+733C Uncompressed Size     0000630A (25354)\n+7340 Filename Length       0035 (53)\n+7342 Extra Length          0000 (0)\n+7344 Comment Length        0000 (0)\n+7346 Disk Start            0000 (0)\n+7348 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-72CD Ext File Attributes   81A40000 (2175008768)\n+734A Ext File Attributes   81A40000 (2175008768)\n      [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n      [Bits 28-31]          08 (8) 'Regular File'\n-72D1 Local Header Offset   000021AE (8622)\n-72D5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+734E Local Header Offset   000021BE (8638)\n+7352 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x72D5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7352: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-730A CENTRAL HEADER #23    02014B50 (33639248)\n-730E Created Zip Spec      14 (20) '2.0'\n-730F Created OS            03 (3) 'Unix'\n-7310 Extract Zip Spec      14 (20) '2.0'\n-7311 Extract OS            00 (0) 'MS-DOS'\n-7312 General Purpose Flag  0800 (2048)\n+7387 CENTRAL HEADER #23    02014B50 (33639248)\n+738B Created Zip Spec      14 (20) '2.0'\n+738C Created OS            03 (3) 'Unix'\n+738D Extract Zip Spec      14 (20) '2.0'\n+738E Extract OS            00 (0) 'MS-DOS'\n+738F General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-7314 Compression Method    0008 (8) 'Deflated'\n-7316 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-731A CRC                   F36E07A4 (4084074404)\n-731E Compressed Size       000002B5 (693)\n-7322 Uncompressed Size     00000528 (1320)\n-7326 Filename Length       0039 (57)\n-7328 Extra Length          0000 (0)\n-732A Comment Length        0000 (0)\n-732C Disk Start            0000 (0)\n-732E Int File Attributes   0000 (0)\n+7391 Compression Method    0008 (8) 'Deflated'\n+7393 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+7397 CRC                   046733D7 (73872343)\n+739B Compressed Size       000002BD (701)\n+739F Uncompressed Size     00000548 (1352)\n+73A3 Filename Length       0039 (57)\n+73A5 Extra Length          0000 (0)\n+73A7 Comment Length        0000 (0)\n+73A9 Disk Start            0000 (0)\n+73AB Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-7330 Ext File Attributes   81A40000 (2175008768)\n+73AD Ext File Attributes   81A40000 (2175008768)\n      [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n      [Bits 28-31]          08 (8) 'Regular File'\n-7334 Local Header Offset   000033E0 (13280)\n-7338 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+73B1 Local Header Offset   0000340A (13322)\n+73B5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x7338: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x73B5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-7371 CENTRAL HEADER #24    02014B50 (33639248)\n-7375 Created Zip Spec      14 (20) '2.0'\n-7376 Created OS            03 (3) 'Unix'\n-7377 Extract Zip Spec      14 (20) '2.0'\n-7378 Extract OS            00 (0) 'MS-DOS'\n-7379 General Purpose Flag  0800 (2048)\n+73EE CENTRAL HEADER #24    02014B50 (33639248)\n+73F2 Created Zip Spec      14 (20) '2.0'\n+73F3 Created OS            03 (3) 'Unix'\n+73F4 Extract Zip Spec      14 (20) '2.0'\n+73F5 Extract OS            00 (0) 'MS-DOS'\n+73F6 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-737B Compression Method    0008 (8) 'Deflated'\n-737D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-7381 CRC                   4E01C35D (1308738397)\n-7385 Compressed Size       000007FF (2047)\n-7389 Uncompressed Size     000017D8 (6104)\n-738D Filename Length       0037 (55)\n-738F Extra Length          0000 (0)\n-7391 Comment Length        0000 (0)\n-7393 Disk Start            0000 (0)\n-7395 Int File Attributes   0000 (0)\n+73F8 Compression Method    0008 (8) 'Deflated'\n+73FA Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+73FE CRC                   0C743F4B (208944971)\n+7402 Compressed Size       0000080E (2062)\n+7406 Uncompressed Size     00001883 (6275)\n+740A Filename Length       0037 (55)\n+740C Extra Length          0000 (0)\n+740E Comment Length        0000 (0)\n+7410 Disk Start            0000 (0)\n+7412 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-7397 Ext File Attributes   81A40000 (2175008768)\n+7414 Ext File Attributes   81A40000 (2175008768)\n      [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n      [Bits 28-31]          08 (8) 'Regular File'\n-739B Local Header Offset   000036EC (14060)\n-739F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7418 Local Header Offset   0000371E (14110)\n+741C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x739F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x741C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-73D6 CENTRAL HEADER #25    02014B50 (33639248)\n-73DA Created Zip Spec      14 (20) '2.0'\n-73DB Created OS            03 (3) 'Unix'\n-73DC Extract Zip Spec      14 (20) '2.0'\n-73DD Extract OS            00 (0) 'MS-DOS'\n-73DE General Purpose Flag  0800 (2048)\n+7453 CENTRAL HEADER #25    02014B50 (33639248)\n+7457 Created Zip Spec      14 (20) '2.0'\n+7458 Created OS            03 (3) 'Unix'\n+7459 Extract Zip Spec      14 (20) '2.0'\n+745A Extract OS            00 (0) 'MS-DOS'\n+745B General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-73E0 Compression Method    0008 (8) 'Deflated'\n-73E2 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-73E6 CRC                   CCF50709 (3438610185)\n-73EA Compressed Size       00000555 (1365)\n-73EE Uncompressed Size     00000F33 (3891)\n-73F2 Filename Length       003B (59)\n-73F4 Extra Length          0000 (0)\n-73F6 Comment Length        0000 (0)\n-73F8 Disk Start            0000 (0)\n-73FA Int File Attributes   0000 (0)\n+745D Compression Method    0008 (8) 'Deflated'\n+745F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+7463 CRC                   ADE79375 (2917634933)\n+7467 Compressed Size       0000055E (1374)\n+746B Uncompressed Size     00000F93 (3987)\n+746F Filename Length       003B (59)\n+7471 Extra Length          0000 (0)\n+7473 Comment Length        0000 (0)\n+7475 Disk Start            0000 (0)\n+7477 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-73FC Ext File Attributes   81A40000 (2175008768)\n+7479 Ext File Attributes   81A40000 (2175008768)\n      [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n      [Bits 28-31]          08 (8) 'Regular File'\n-7400 Local Header Offset   00003F40 (16192)\n-7404 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+747D Local Header Offset   00003F81 (16257)\n+7481 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x7404: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7481: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-743F CENTRAL HEADER #26    02014B50 (33639248)\n-7443 Created Zip Spec      14 (20) '2.0'\n-7444 Created OS            03 (3) 'Unix'\n-7445 Extract Zip Spec      14 (20) '2.0'\n-7446 Extract OS            00 (0) 'MS-DOS'\n-7447 General Purpose Flag  0800 (2048)\n+74BC CENTRAL HEADER #26    02014B50 (33639248)\n+74C0 Created Zip Spec      14 (20) '2.0'\n+74C1 Created OS            03 (3) 'Unix'\n+74C2 Extract Zip Spec      14 (20) '2.0'\n+74C3 Extract OS            00 (0) 'MS-DOS'\n+74C4 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-7449 Compression Method    0008 (8) 'Deflated'\n-744B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-744F CRC                   8C523252 (2354197074)\n-7453 Compressed Size       00000AA5 (2725)\n-7457 Uncompressed Size     0000268F (9871)\n-745B Filename Length       0038 (56)\n-745D Extra Length          0000 (0)\n-745F Comment Length        0000 (0)\n-7461 Disk Start            0000 (0)\n-7463 Int File Attributes   0000 (0)\n+74C6 Compression Method    0008 (8) 'Deflated'\n+74C8 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+74CC CRC                   95A966C5 (2510907077)\n+74D0 Compressed Size       00000ABB (2747)\n+74D4 Uncompressed Size     0000279F (10143)\n+74D8 Filename Length       0038 (56)\n+74DA Extra Length          0000 (0)\n+74DC Comment Length        0000 (0)\n+74DE Disk Start            0000 (0)\n+74E0 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-7465 Ext File Attributes   81A40000 (2175008768)\n+74E2 Ext File Attributes   81A40000 (2175008768)\n      [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n      [Bits 28-31]          08 (8) 'Regular File'\n-7469 Local Header Offset   000044EE (17646)\n-746D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+74E6 Local Header Offset   00004538 (17720)\n+74EA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x746D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x74EA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-74A5 CENTRAL HEADER #27    02014B50 (33639248)\n-74A9 Created Zip Spec      14 (20) '2.0'\n-74AA Created OS            03 (3) 'Unix'\n-74AB Extract Zip Spec      14 (20) '2.0'\n-74AC Extract OS            00 (0) 'MS-DOS'\n-74AD General Purpose Flag  0800 (2048)\n+7522 CENTRAL HEADER #27    02014B50 (33639248)\n+7526 Created Zip Spec      14 (20) '2.0'\n+7527 Created OS            03 (3) 'Unix'\n+7528 Extract Zip Spec      14 (20) '2.0'\n+7529 Extract OS            00 (0) 'MS-DOS'\n+752A General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-74AF Compression Method    0008 (8) 'Deflated'\n-74B1 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-74B5 CRC                   CBF7FEA9 (3422027433)\n-74B9 Compressed Size       0000033C (828)\n-74BD Uncompressed Size     0000066C (1644)\n-74C1 Filename Length       0034 (52)\n-74C3 Extra Length          0000 (0)\n-74C5 Comment Length        0000 (0)\n-74C7 Disk Start            0000 (0)\n-74C9 Int File Attributes   0000 (0)\n+752C Compression Method    0008 (8) 'Deflated'\n+752E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+7532 CRC                   FBA20F3E (4221701950)\n+7536 Compressed Size       00000341 (833)\n+753A Uncompressed Size     0000069F (1695)\n+753E Filename Length       0034 (52)\n+7540 Extra Length          0000 (0)\n+7542 Comment Length        0000 (0)\n+7544 Disk Start            0000 (0)\n+7546 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-74CB Ext File Attributes   81A40000 (2175008768)\n+7548 Ext File Attributes   81A40000 (2175008768)\n      [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n      [Bits 28-31]          08 (8) 'Regular File'\n-74CF Local Header Offset   00004FE9 (20457)\n-74D3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+754C Local Header Offset   00005049 (20553)\n+7550 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x74D3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7550: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-7507 CENTRAL HEADER #28    02014B50 (33639248)\n-750B Created Zip Spec      14 (20) '2.0'\n-750C Created OS            03 (3) 'Unix'\n-750D Extract Zip Spec      14 (20) '2.0'\n-750E Extract OS            00 (0) 'MS-DOS'\n-750F General Purpose Flag  0800 (2048)\n+7584 CENTRAL HEADER #28    02014B50 (33639248)\n+7588 Created Zip Spec      14 (20) '2.0'\n+7589 Created OS            03 (3) 'Unix'\n+758A Extract Zip Spec      14 (20) '2.0'\n+758B Extract OS            00 (0) 'MS-DOS'\n+758C General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-7511 Compression Method    0008 (8) 'Deflated'\n-7513 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-7517 CRC                   FD7FF5E7 (4253021671)\n-751B Compressed Size       000003F1 (1009)\n-751F Uncompressed Size     0000107A (4218)\n-7523 Filename Length       0035 (53)\n-7525 Extra Length          0000 (0)\n-7527 Comment Length        0000 (0)\n-7529 Disk Start            0000 (0)\n-752B Int File Attributes   0000 (0)\n+758E Compression Method    0008 (8) 'Deflated'\n+7590 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+7594 CRC                   6BB5A87E (1807067262)\n+7598 Compressed Size       000003F9 (1017)\n+759C Uncompressed Size     00001101 (4353)\n+75A0 Filename Length       0035 (53)\n+75A2 Extra Length          0000 (0)\n+75A4 Comment Length        0000 (0)\n+75A6 Disk Start            0000 (0)\n+75A8 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-752D Ext File Attributes   81A40000 (2175008768)\n+75AA Ext File Attributes   81A40000 (2175008768)\n      [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n      [Bits 28-31]          08 (8) 'Regular File'\n-7531 Local Header Offset   00005377 (21367)\n-7535 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+75AE Local Header Offset   000053DC (21468)\n+75B2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x7535: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x75B2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-756A CENTRAL HEADER #29    02014B50 (33639248)\n-756E Created Zip Spec      14 (20) '2.0'\n-756F Created OS            03 (3) 'Unix'\n-7570 Extract Zip Spec      14 (20) '2.0'\n-7571 Extract OS            00 (0) 'MS-DOS'\n-7572 General Purpose Flag  0800 (2048)\n+75E7 CENTRAL HEADER #29    02014B50 (33639248)\n+75EB Created Zip Spec      14 (20) '2.0'\n+75EC Created OS            03 (3) 'Unix'\n+75ED Extract Zip Spec      14 (20) '2.0'\n+75EE Extract OS            00 (0) 'MS-DOS'\n+75EF General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-7574 Compression Method    0008 (8) 'Deflated'\n-7576 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-757A CRC                   6A1A9325 (1780126501)\n-757E Compressed Size       00000585 (1413)\n-7582 Uncompressed Size     0000103E (4158)\n-7586 Filename Length       0043 (67)\n-7588 Extra Length          0000 (0)\n-758A Comment Length        0000 (0)\n-758C Disk Start            0000 (0)\n-758E Int File Attributes   0000 (0)\n+75F1 Compression Method    0008 (8) 'Deflated'\n+75F3 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+75F7 CRC                   B641845C (3057747036)\n+75FB Compressed Size       00000592 (1426)\n+75FF Uncompressed Size     000010B7 (4279)\n+7603 Filename Length       0043 (67)\n+7605 Extra Length          0000 (0)\n+7607 Comment Length        0000 (0)\n+7609 Disk Start            0000 (0)\n+760B Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-7590 Ext File Attributes   81A40000 (2175008768)\n+760D Ext File Attributes   81A40000 (2175008768)\n      [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n      [Bits 28-31]          08 (8) 'Regular File'\n-7594 Local Header Offset   000057BB (22459)\n-7598 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7611 Local Header Offset   00005828 (22568)\n+7615 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x7598: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7615: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-75DB CENTRAL HEADER #30    02014B50 (33639248)\n-75DF Created Zip Spec      14 (20) '2.0'\n-75E0 Created OS            03 (3) 'Unix'\n-75E1 Extract Zip Spec      14 (20) '2.0'\n-75E2 Extract OS            00 (0) 'MS-DOS'\n-75E3 General Purpose Flag  0800 (2048)\n+7658 CENTRAL HEADER #30    02014B50 (33639248)\n+765C Created Zip Spec      14 (20) '2.0'\n+765D Created OS            03 (3) 'Unix'\n+765E Extract Zip Spec      14 (20) '2.0'\n+765F Extract OS            00 (0) 'MS-DOS'\n+7660 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-75E5 Compression Method    0008 (8) 'Deflated'\n-75E7 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-75EB CRC                   021D9C13 (35494931)\n-75EF Compressed Size       0000034D (845)\n-75F3 Uncompressed Size     00000951 (2385)\n-75F7 Filename Length       003F (63)\n-75F9 Extra Length          0000 (0)\n-75FB Comment Length        0000 (0)\n-75FD Disk Start            0000 (0)\n-75FF Int File Attributes   0000 (0)\n+7662 Compression Method    0008 (8) 'Deflated'\n+7664 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+7668 CRC                   021D9C13 (35494931)\n+766C Compressed Size       0000034D (845)\n+7670 Uncompressed Size     00000951 (2385)\n+7674 Filename Length       003F (63)\n+7676 Extra Length          0000 (0)\n+7678 Comment Length        0000 (0)\n+767A Disk Start            0000 (0)\n+767C Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-7601 Ext File Attributes   81A40000 (2175008768)\n+767E Ext File Attributes   81A40000 (2175008768)\n      [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n      [Bits 28-31]          08 (8) 'Regular File'\n-7605 Local Header Offset   00005DA1 (23969)\n-7609 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7682 Local Header Offset   00005E1B (24091)\n+7686 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x7609: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7686: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-7648 CENTRAL HEADER #31    02014B50 (33639248)\n-764C Created Zip Spec      14 (20) '2.0'\n-764D Created OS            03 (3) 'Unix'\n-764E Extract Zip Spec      14 (20) '2.0'\n-764F Extract OS            00 (0) 'MS-DOS'\n-7650 General Purpose Flag  0800 (2048)\n+76C5 CENTRAL HEADER #31    02014B50 (33639248)\n+76C9 Created Zip Spec      14 (20) '2.0'\n+76CA Created OS            03 (3) 'Unix'\n+76CB Extract Zip Spec      14 (20) '2.0'\n+76CC Extract OS            00 (0) 'MS-DOS'\n+76CD General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-7652 Compression Method    0008 (8) 'Deflated'\n-7654 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-7658 CRC                   48F808F8 (1224214776)\n-765C Compressed Size       00000443 (1091)\n-7660 Uncompressed Size     00000BF1 (3057)\n-7664 Filename Length       004E (78)\n-7666 Extra Length          0000 (0)\n-7668 Comment Length        0000 (0)\n-766A Disk Start            0000 (0)\n-766C Int File Attributes   0000 (0)\n+76CF Compression Method    0008 (8) 'Deflated'\n+76D1 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+76D5 CRC                   C419897B (3290007931)\n+76D9 Compressed Size       0000044E (1102)\n+76DD Uncompressed Size     00000C66 (3174)\n+76E1 Filename Length       004E (78)\n+76E3 Extra Length          0000 (0)\n+76E5 Comment Length        0000 (0)\n+76E7 Disk Start            0000 (0)\n+76E9 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-766E Ext File Attributes   81A40000 (2175008768)\n+76EB Ext File Attributes   81A40000 (2175008768)\n      [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n      [Bits 28-31]          08 (8) 'Regular File'\n-7672 Local Header Offset   0000614B (24907)\n-7676 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+76EF Local Header Offset   000061C5 (25029)\n+76F3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x7676: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x76F3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-76C4 CENTRAL HEADER #32    02014B50 (33639248)\n-76C8 Created Zip Spec      14 (20) '2.0'\n-76C9 Created OS            03 (3) 'Unix'\n-76CA Extract Zip Spec      14 (20) '2.0'\n-76CB Extract OS            00 (0) 'MS-DOS'\n-76CC General Purpose Flag  0800 (2048)\n+7741 CENTRAL HEADER #32    02014B50 (33639248)\n+7745 Created Zip Spec      14 (20) '2.0'\n+7746 Created OS            03 (3) 'Unix'\n+7747 Extract Zip Spec      14 (20) '2.0'\n+7748 Extract OS            00 (0) 'MS-DOS'\n+7749 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-76CE Compression Method    0008 (8) 'Deflated'\n-76D0 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-76D4 CRC                   A41E0996 (2753431958)\n-76D8 Compressed Size       00000032 (50)\n-76DC Uncompressed Size     00000037 (55)\n-76E0 Filename Length       0038 (56)\n-76E2 Extra Length          0000 (0)\n-76E4 Comment Length        0000 (0)\n-76E6 Disk Start            0000 (0)\n-76E8 Int File Attributes   0000 (0)\n+774B Compression Method    0008 (8) 'Deflated'\n+774D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+7751 CRC                   A41E0996 (2753431958)\n+7755 Compressed Size       00000032 (50)\n+7759 Uncompressed Size     00000037 (55)\n+775D Filename Length       0038 (56)\n+775F Extra Length          0000 (0)\n+7761 Comment Length        0000 (0)\n+7763 Disk Start            0000 (0)\n+7765 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-76EA Ext File Attributes   81A40000 (2175008768)\n+7767 Ext File Attributes   81A40000 (2175008768)\n      [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n      [Bits 28-31]          08 (8) 'Regular File'\n-76EE Local Header Offset   000065FA (26106)\n-76F2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+776B Local Header Offset   0000667F (26239)\n+776F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x76F2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x776F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-772A CENTRAL HEADER #33    02014B50 (33639248)\n-772E Created Zip Spec      14 (20) '2.0'\n-772F Created OS            03 (3) 'Unix'\n-7730 Extract Zip Spec      14 (20) '2.0'\n-7731 Extract OS            00 (0) 'MS-DOS'\n-7732 General Purpose Flag  0800 (2048)\n+77A7 CENTRAL HEADER #33    02014B50 (33639248)\n+77AB Created Zip Spec      14 (20) '2.0'\n+77AC Created OS            03 (3) 'Unix'\n+77AD Extract Zip Spec      14 (20) '2.0'\n+77AE Extract OS            00 (0) 'MS-DOS'\n+77AF General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-7734 Compression Method    0008 (8) 'Deflated'\n-7736 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-773A CRC                   484E8E33 (1213107763)\n-773E Compressed Size       00000030 (48)\n-7742 Uncompressed Size     0000003A (58)\n-7746 Filename Length       0035 (53)\n-7748 Extra Length          0000 (0)\n-774A Comment Length        0000 (0)\n-774C Disk Start            0000 (0)\n-774E Int File Attributes   0000 (0)\n+77B1 Compression Method    0008 (8) 'Deflated'\n+77B3 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+77B7 CRC                   484E8E33 (1213107763)\n+77BB Compressed Size       00000030 (48)\n+77BF Uncompressed Size     0000003A (58)\n+77C3 Filename Length       0035 (53)\n+77C5 Extra Length          0000 (0)\n+77C7 Comment Length        0000 (0)\n+77C9 Disk Start            0000 (0)\n+77CB Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-7750 Ext File Attributes   81A40000 (2175008768)\n+77CD Ext File Attributes   81A40000 (2175008768)\n      [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n      [Bits 28-31]          08 (8) 'Regular File'\n-7754 Local Header Offset   00006682 (26242)\n-7758 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+77D1 Local Header Offset   00006707 (26375)\n+77D5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x7758: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x77D5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-778D CENTRAL HEADER #34    02014B50 (33639248)\n-7791 Created Zip Spec      14 (20) '2.0'\n-7792 Created OS            03 (3) 'Unix'\n-7793 Extract Zip Spec      14 (20) '2.0'\n-7794 Extract OS            00 (0) 'MS-DOS'\n-7795 General Purpose Flag  0800 (2048)\n-     [Bits 1-2]            0 'Normal Compression'\n-     [Bit 11]              1 'Language Encoding'\n-7797 Compression Method    0008 (8) 'Deflated'\n-7799 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-779D CRC                   78C43CAA (2026126506)\n-77A1 Compressed Size       0000004B (75)\n-77A5 Uncompressed Size     00000088 (136)\n-77A9 Filename Length       004F (79)\n-77AB Extra Length          0000 (0)\n-77AD Comment Length        0000 (0)\n-77AF Disk Start            0000 (0)\n-77B1 Int File Attributes   0000 (0)\n-     [Bit 0]               0 'Binary Data'\n-77B3 Ext File Attributes   81A40000 (2175008768)\n-     [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n-     [Bits 28-31]          08 (8) 'Regular File'\n-77B7 Local Header Offset   00006705 (26373)\n-77BB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x77BB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-\n-780A CENTRAL HEADER #35    02014B50 (33639248)\n+780A CENTRAL HEADER #34    02014B50 (33639248)\n 780E Created Zip Spec      14 (20) '2.0'\n 780F Created OS            03 (3) 'Unix'\n 7810 Extract Zip Spec      14 (20) '2.0'\n 7811 Extract OS            00 (0) 'MS-DOS'\n 7812 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n 7814 Compression Method    0008 (8) 'Deflated'\n 7816 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-781A CRC                   2B7AF38C (729478028)\n-781E Compressed Size       000003CC (972)\n-7822 Uncompressed Size     00000C82 (3202)\n-7826 Filename Length       0038 (56)\n+781A CRC                   78C43CAA (2026126506)\n+781E Compressed Size       0000004B (75)\n+7822 Uncompressed Size     00000088 (136)\n+7826 Filename Length       004F (79)\n 7828 Extra Length          0000 (0)\n 782A Comment Length        0000 (0)\n 782C Disk Start            0000 (0)\n 782E Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n 7830 Ext File Attributes   81A40000 (2175008768)\n      [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n      [Bits 28-31]          08 (8) 'Regular File'\n-7834 Local Header Offset   000067BD (26557)\n-7838 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7834 Local Header Offset   0000678A (26506)\n+7838 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x7838: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+\n+7887 CENTRAL HEADER #35    02014B50 (33639248)\n+788B Created Zip Spec      14 (20) '2.0'\n+788C Created OS            03 (3) 'Unix'\n+788D Extract Zip Spec      14 (20) '2.0'\n+788E Extract OS            00 (0) 'MS-DOS'\n+788F General Purpose Flag  0800 (2048)\n+     [Bits 1-2]            0 'Normal Compression'\n+     [Bit 11]              1 'Language Encoding'\n+7891 Compression Method    0008 (8) 'Deflated'\n+7893 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+7897 CRC                   FBA32B90 (4221774736)\n+789B Compressed Size       000003C4 (964)\n+789F Uncompressed Size     00000C2F (3119)\n+78A3 Filename Length       0038 (56)\n+78A5 Extra Length          0000 (0)\n+78A7 Comment Length        0000 (0)\n+78A9 Disk Start            0000 (0)\n+78AB Int File Attributes   0000 (0)\n+     [Bit 0]               0 'Binary Data'\n+78AD Ext File Attributes   81A40000 (2175008768)\n+     [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n+     [Bits 28-31]          08 (8) 'Regular File'\n+78B1 Local Header Offset   00006842 (26690)\n+78B5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x7838: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x78B5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-7870 CENTRAL HEADER #36    02014B50 (33639248)\n-7874 Created Zip Spec      14 (20) '2.0'\n-7875 Created OS            03 (3) 'Unix'\n-7876 Extract Zip Spec      14 (20) '2.0'\n-7877 Extract OS            00 (0) 'MS-DOS'\n-7878 General Purpose Flag  0800 (2048)\n+78ED CENTRAL HEADER #36    02014B50 (33639248)\n+78F1 Created Zip Spec      14 (20) '2.0'\n+78F2 Created OS            03 (3) 'Unix'\n+78F3 Extract Zip Spec      14 (20) '2.0'\n+78F4 Extract OS            00 (0) 'MS-DOS'\n+78F5 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-787A Compression Method    0008 (8) 'Deflated'\n-787C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-7880 CRC                   2A331345 (707990341)\n-7884 Compressed Size       00000045 (69)\n-7888 Uncompressed Size     00000047 (71)\n-788C Filename Length       003F (63)\n-788E Extra Length          0000 (0)\n-7890 Comment Length        0000 (0)\n-7892 Disk Start            0000 (0)\n-7894 Int File Attributes   0000 (0)\n+78F7 Compression Method    0008 (8) 'Deflated'\n+78F9 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+78FD CRC                   2A331345 (707990341)\n+7901 Compressed Size       00000045 (69)\n+7905 Uncompressed Size     00000047 (71)\n+7909 Filename Length       003F (63)\n+790B Extra Length          0000 (0)\n+790D Comment Length        0000 (0)\n+790F Disk Start            0000 (0)\n+7911 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-7896 Ext File Attributes   81A40000 (2175008768)\n+7913 Ext File Attributes   81A40000 (2175008768)\n      [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n      [Bits 28-31]          08 (8) 'Regular File'\n-789A Local Header Offset   00006BDF (27615)\n-789E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+7917 Local Header Offset   00006C5C (27740)\n+791B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x789E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x791B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-78DD END CENTRAL HEADER    06054B50 (101010256)\n-78E1 Number of this disk   0000 (0)\n-78E3 Central Dir Disk no   0000 (0)\n-78E5 Entries in this disk  0024 (36)\n-78E7 Total Entries         0024 (36)\n-78E9 Size of Central Dir   00000C5C (3164)\n-78ED Offset to Central Dir 00006C81 (27777)\n-78F1 Comment Length        0000 (0)\n+795A END CENTRAL HEADER    06054B50 (101010256)\n+795E Number of this disk   0000 (0)\n+7960 Central Dir Disk no   0000 (0)\n+7962 Entries in this disk  0024 (36)\n+7964 Total Entries         0024 (36)\n+7966 Size of Central Dir   00000C5C (3164)\n+796A Offset to Central Dir 00006CFE (27902)\n+796E Comment Length        0000 (0)\n #\n # Error Count: 14\n # Warning Count: 86\n #\n # Done\n"}, {"source1": "org/apache/dubbo/rpc/protocol/thrift/ClassNameGenerator.java", "source2": "org/apache/dubbo/rpc/protocol/thrift/ClassNameGenerator.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,31 +1,31 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.rpc.protocol.thrift;\n-\n-import org.apache.dubbo.common.extension.SPI;\n-/**\n- * @since 2.7.0, use https://github.com/dubbo/dubbo-rpc-native-thrift instead\n- */\n-@Deprecated\n-@SPI(DubboClassNameGenerator.NAME)\n-public interface ClassNameGenerator {\n-\n-    String generateArgsClassName(String serviceName, String methodName);\n-\n-    String generateResultClassName(String serviceName, String methodName);\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.rpc.protocol.thrift;\r\n+\r\n+import org.apache.dubbo.common.extension.SPI;\r\n+/**\r\n+ * @since 2.7.0, use https://github.com/dubbo/dubbo-rpc-native-thrift instead\r\n+ */\r\n+@Deprecated\r\n+@SPI(DubboClassNameGenerator.NAME)\r\n+public interface ClassNameGenerator {\r\n+\r\n+    String generateArgsClassName(String serviceName, String methodName);\r\n+\r\n+    String generateResultClassName(String serviceName, String methodName);\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/rpc/protocol/thrift/DubboClassNameGenerator.java", "source2": "org/apache/dubbo/rpc/protocol/thrift/DubboClassNameGenerator.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,36 +1,36 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.rpc.protocol.thrift;\n-/**\n- * @since 2.7.0, use https://github.com/dubbo/dubbo-rpc-native-thrift instead\n- */\n-@Deprecated\n-public class DubboClassNameGenerator implements ClassNameGenerator {\n-\n-    public static final String NAME = \"dubbo\";\n-\n-    @Override\n-    public String generateArgsClassName(String serviceName, String methodName) {\n-        return ThriftUtils.generateMethodArgsClassName(serviceName, methodName);\n-    }\n-\n-    @Override\n-    public String generateResultClassName(String serviceName, String methodName) {\n-        return ThriftUtils.generateMethodResultClassName(serviceName, methodName);\n-    }\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.rpc.protocol.thrift;\r\n+/**\r\n+ * @since 2.7.0, use https://github.com/dubbo/dubbo-rpc-native-thrift instead\r\n+ */\r\n+@Deprecated\r\n+public class DubboClassNameGenerator implements ClassNameGenerator {\r\n+\r\n+    public static final String NAME = \"dubbo\";\r\n+\r\n+    @Override\r\n+    public String generateArgsClassName(String serviceName, String methodName) {\r\n+        return ThriftUtils.generateMethodArgsClassName(serviceName, methodName);\r\n+    }\r\n+\r\n+    @Override\r\n+    public String generateResultClassName(String serviceName, String methodName) {\r\n+        return ThriftUtils.generateMethodResultClassName(serviceName, methodName);\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/rpc/protocol/thrift/ThriftCodec.java", "source2": "org/apache/dubbo/rpc/protocol/thrift/ThriftCodec.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,698 +1,698 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.rpc.protocol.thrift;\n-\n-import org.apache.dubbo.common.extension.ExtensionLoader;\n-import org.apache.dubbo.common.utils.ClassUtils;\n-import org.apache.dubbo.common.utils.ReflectUtils;\n-import org.apache.dubbo.common.utils.StringUtils;\n-import org.apache.dubbo.remoting.Channel;\n-import org.apache.dubbo.remoting.Codec2;\n-import org.apache.dubbo.remoting.buffer.ChannelBuffer;\n-import org.apache.dubbo.remoting.buffer.ChannelBufferInputStream;\n-import org.apache.dubbo.remoting.exchange.Request;\n-import org.apache.dubbo.remoting.exchange.Response;\n-import org.apache.dubbo.rpc.AppResponse;\n-import org.apache.dubbo.rpc.RpcException;\n-import org.apache.dubbo.rpc.RpcInvocation;\n-import org.apache.dubbo.rpc.protocol.thrift.io.RandomAccessByteArrayOutputStream;\n-\n-import org.apache.thrift.TApplicationException;\n-import org.apache.thrift.TBase;\n-import org.apache.thrift.TException;\n-import org.apache.thrift.TFieldIdEnum;\n-import org.apache.thrift.protocol.TBinaryProtocol;\n-import org.apache.thrift.protocol.TMessage;\n-import org.apache.thrift.protocol.TMessageType;\n-import org.apache.thrift.protocol.TProtocol;\n-import org.apache.thrift.transport.TFramedTransport;\n-import org.apache.thrift.transport.TIOStreamTransport;\n-\n-import java.io.IOException;\n-import java.lang.reflect.Field;\n-import java.lang.reflect.InvocationTargetException;\n-import java.lang.reflect.Method;\n-import java.util.ArrayList;\n-import java.util.List;\n-import java.util.concurrent.ConcurrentHashMap;\n-import java.util.concurrent.ConcurrentMap;\n-import java.util.concurrent.atomic.AtomicInteger;\n-\n-import static org.apache.dubbo.common.constants.CommonConstants.INTERFACE_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.PATH_KEY;\n-\n-/**\n- * Thrift framed protocol codec.\n- *\n- * <pre>\n- * |<-                                  message header                                  ->|<- message body ->|\n- * +----------------+----------------------+------------------+---------------------------+------------------+\n- * | magic (2 bytes)|message size (4 bytes)|head size(2 bytes)| version (1 byte) | header |   message body   |\n- * +----------------+----------------------+------------------+---------------------------+------------------+\n- * |<-                                               message size                                          ->|\n- * </pre>\n- *\n- * <p>\n- * <b>header fields in version 1</b>\n- * <ol>\n- * <li>string - service name</li>\n- * <li>long   - dubbo request id</li>\n- * </ol>\n- * </p>\n- */\n-\n-/**\n- * @since 2.7.0, use https://github.com/dubbo/dubbo-rpc-native-thrift instead\n- */\n-@Deprecated\n-public class ThriftCodec implements Codec2 {\n-\n-    public static final int MESSAGE_LENGTH_INDEX = 2;\n-    public static final int MESSAGE_HEADER_LENGTH_INDEX = 6;\n-    public static final int MESSAGE_SHORTEST_LENGTH = 10;\n-    public static final String NAME = \"thrift\";\n-    public static final String PARAMETER_CLASS_NAME_GENERATOR = \"class.name.generator\";\n-    public static final byte VERSION = (byte) 1;\n-    public static final short MAGIC = (short) 0xdabc;\n-    static final ConcurrentMap<Long, RequestData> CACHED_REQUEST =\n-            new ConcurrentHashMap<>();\n-    private static final AtomicInteger THRIFT_SEQ_ID = new AtomicInteger(0);\n-    private static final ConcurrentMap<String, Class<?>> CACHED_CLASS =\n-            new ConcurrentHashMap<>();\n-\n-    private static int nextSeqId() {\n-        return THRIFT_SEQ_ID.incrementAndGet();\n-    }\n-\n-    // just for test\n-    static int getSeqId() {\n-        return THRIFT_SEQ_ID.get();\n-    }\n-\n-    @Override\n-    public void encode(Channel channel, ChannelBuffer buffer, Object message)\n-            throws IOException {\n-\n-        if (message instanceof Request) {\n-            encodeRequest(channel, buffer, (Request) message);\n-        } else if (message instanceof Response) {\n-            encodeResponse(channel, buffer, (Response) message);\n-        } else {\n-            throw new UnsupportedOperationException(\"Thrift codec only support encode \"\n-                    + Request.class.getName() + \" and \" + Response.class.getName());\n-        }\n-\n-    }\n-\n-    @Override\n-    public Object decode(Channel channel, ChannelBuffer buffer) throws IOException {\n-\n-        int available = buffer.readableBytes();\n-\n-        if (available < MESSAGE_SHORTEST_LENGTH) {\n-\n-            return DecodeResult.NEED_MORE_INPUT;\n-\n-        } else {\n-\n-            TIOStreamTransport transport = new TIOStreamTransport(new ChannelBufferInputStream(buffer));\n-\n-            TBinaryProtocol protocol = new TBinaryProtocol(transport);\n-\n-            short magic;\n-            int messageLength;\n-\n-            try {\n-//                protocol.readI32(); // skip the first message length\n-                byte[] bytes = new byte[4];\n-                transport.read(bytes, 0, 4);\n-                magic = protocol.readI16();\n-                messageLength = protocol.readI32();\n-\n-            } catch (TException e) {\n-                throw new IOException(e.getMessage(), e);\n-            }\n-\n-            if (MAGIC != magic) {\n-                throw new IOException(\"Unknown magic code \" + magic);\n-            }\n-\n-            if (available < messageLength) {\n-                return DecodeResult.NEED_MORE_INPUT;\n-            }\n-\n-            return decode(protocol);\n-\n-        }\n-\n-    }\n-\n-    private Object decode(TProtocol protocol)\n-            throws IOException {\n-\n-        // version\n-        String serviceName;\n-        String path;\n-        long id;\n-\n-        TMessage message;\n-\n-        try {\n-            protocol.readI16();\n-            protocol.readByte();\n-            serviceName = protocol.readString();\n-            path = protocol.readString();\n-            id = protocol.readI64();\n-            message = protocol.readMessageBegin();\n-        } catch (TException e) {\n-            throw new IOException(e.getMessage(), e);\n-        }\n-\n-        if (message.type == TMessageType.CALL) {\n-\n-            RpcInvocation result = new RpcInvocation();\n-            result.setAttachment(INTERFACE_KEY, serviceName);\n-            result.setAttachment(PATH_KEY, path);\n-            result.setMethodName(message.name);\n-\n-            String argsClassName = ExtensionLoader.getExtensionLoader(ClassNameGenerator.class)\n-                    .getExtension(ThriftClassNameGenerator.NAME).generateArgsClassName(serviceName, message.name);\n-\n-            if (StringUtils.isEmpty(argsClassName)) {\n-                throw new RpcException(RpcException.SERIALIZATION_EXCEPTION,\n-                        \"The specified interface name incorrect.\");\n-            }\n-\n-            Class clazz = CACHED_CLASS.get(argsClassName);\n-\n-            if (clazz == null) {\n-                try {\n-\n-                    clazz = ClassUtils.forNameWithThreadContextClassLoader(argsClassName);\n-\n-                    CACHED_CLASS.putIfAbsent(argsClassName, clazz);\n-\n-                } catch (ClassNotFoundException e) {\n-                    throw new RpcException(RpcException.SERIALIZATION_EXCEPTION, e.getMessage(), e);\n-                }\n-            }\n-\n-            TBase args;\n-\n-            try {\n-                args = (TBase) clazz.newInstance();\n-            } catch (InstantiationException | IllegalAccessException e) {\n-                throw new RpcException(RpcException.SERIALIZATION_EXCEPTION, e.getMessage(), e);\n-            }\n-\n-            try {\n-                args.read(protocol);\n-                protocol.readMessageEnd();\n-            } catch (TException e) {\n-                throw new RpcException(RpcException.SERIALIZATION_EXCEPTION, e.getMessage(), e);\n-            }\n-\n-            List<Object> parameters = new ArrayList<>();\n-            List<Class<?>> parameterTypes = new ArrayList<>();\n-            int index = 1;\n-\n-            while (true) {\n-\n-                TFieldIdEnum fieldIdEnum = args.fieldForId(index++);\n-\n-                if (fieldIdEnum == null) {\n-                    break;\n-                }\n-\n-                String fieldName = fieldIdEnum.getFieldName();\n-\n-                String getMethodName = ThriftUtils.generateGetMethodName(fieldName);\n-\n-                Method getMethod;\n-\n-                try {\n-                    getMethod = clazz.getMethod(getMethodName);\n-                } catch (NoSuchMethodException e) {\n-                    throw new RpcException(\n-                            RpcException.SERIALIZATION_EXCEPTION, e.getMessage(), e);\n-                }\n-\n-                parameterTypes.add(getMethod.getReturnType());\n-                try {\n-                    parameters.add(getMethod.invoke(args));\n-                } catch (IllegalAccessException | InvocationTargetException e) {\n-                    throw new RpcException(\n-                            RpcException.SERIALIZATION_EXCEPTION, e.getMessage(), e);\n-                }\n-\n-            }\n-\n-            result.setArguments(parameters.toArray());\n-            result.setParameterTypes(parameterTypes.toArray(new Class[0]));\n-\n-            Request request = new Request(id);\n-            request.setData(result);\n-\n-            CACHED_REQUEST.putIfAbsent(id,\n-                    RequestData.create(message.seqid, serviceName, message.name));\n-\n-            return request;\n-\n-        } else if (message.type == TMessageType.EXCEPTION) {\n-\n-            TApplicationException exception;\n-\n-            try {\n-                exception = TApplicationException.readFrom(protocol);\n-                protocol.readMessageEnd();\n-            } catch (TException e) {\n-                throw new IOException(e.getMessage(), e);\n-            }\n-\n-            AppResponse result = new AppResponse();\n-\n-            result.setException(new RpcException(exception.getMessage()));\n-\n-            Response response = new Response();\n-\n-            response.setResult(result);\n-\n-            response.setId(id);\n-\n-            return response;\n-\n-        } else if (message.type == TMessageType.REPLY) {\n-\n-            String resultClassName = ExtensionLoader.getExtensionLoader(ClassNameGenerator.class)\n-                    .getExtension(ThriftClassNameGenerator.NAME).generateResultClassName(serviceName, message.name);\n-\n-            if (StringUtils.isEmpty(resultClassName)) {\n-                throw new IllegalArgumentException(\"Could not infer service result class name from service name \"\n-                        + serviceName + \", the service name you specified may not generated by thrift idl compiler\");\n-            }\n-\n-            Class<?> clazz = CACHED_CLASS.get(resultClassName);\n-\n-            if (clazz == null) {\n-\n-                try {\n-\n-                    clazz = ClassUtils.forNameWithThreadContextClassLoader(resultClassName);\n-\n-                    CACHED_CLASS.putIfAbsent(resultClassName, clazz);\n-\n-                } catch (ClassNotFoundException e) {\n-                    throw new RpcException(RpcException.SERIALIZATION_EXCEPTION, e.getMessage(), e);\n-                }\n-\n-            }\n-\n-            TBase<?, ? extends TFieldIdEnum> result;\n-            try {\n-                result = (TBase<?, ?>) clazz.newInstance();\n-            } catch (InstantiationException | IllegalAccessException e) {\n-                throw new RpcException(RpcException.SERIALIZATION_EXCEPTION, e.getMessage(), e);\n-            }\n-\n-            try {\n-                result.read(protocol);\n-                protocol.readMessageEnd();\n-            } catch (TException e) {\n-                throw new RpcException(RpcException.SERIALIZATION_EXCEPTION, e.getMessage(), e);\n-            }\n-\n-            Object realResult = null;\n-\n-            int index = 0;\n-\n-            while (true) {\n-\n-                TFieldIdEnum fieldIdEnum = result.fieldForId(index++);\n-\n-                if (fieldIdEnum == null) {\n-                    break;\n-                }\n-\n-                Field field;\n-\n-                try {\n-                    field = clazz.getDeclaredField(fieldIdEnum.getFieldName());\n-                    ReflectUtils.makeAccessible(field);\n-                } catch (NoSuchFieldException e) {\n-                    throw new RpcException(RpcException.SERIALIZATION_EXCEPTION, e.getMessage(), e);\n-                }\n-\n-                try {\n-                    realResult = field.get(result);\n-                } catch (IllegalAccessException e) {\n-                    throw new RpcException(RpcException.SERIALIZATION_EXCEPTION, e.getMessage(), e);\n-                }\n-\n-                if (realResult != null) {\n-                    break;\n-                }\n-\n-            }\n-\n-            Response response = new Response();\n-\n-            response.setId(id);\n-\n-            AppResponse appResponse = new AppResponse();\n-\n-            if (realResult instanceof Throwable) {\n-                appResponse.setException((Throwable) realResult);\n-            } else {\n-                appResponse.setValue(realResult);\n-            }\n-\n-            response.setResult(appResponse);\n-\n-            return response;\n-\n-        } else {\n-            // Impossible\n-            throw new IOException();\n-        }\n-\n-    }\n-\n-    private void encodeRequest(Channel channel, ChannelBuffer buffer, Request request)\n-            throws IOException {\n-\n-        RpcInvocation inv = (RpcInvocation) request.getData();\n-\n-        int seqId = nextSeqId();\n-\n-        String serviceName = inv.getAttachment(INTERFACE_KEY);\n-\n-        if (StringUtils.isEmpty(serviceName)) {\n-            throw new IllegalArgumentException(\"Could not find service name in attachment with key \"\n-                    + INTERFACE_KEY);\n-        }\n-\n-        TMessage message = new TMessage(\n-                inv.getMethodName(),\n-                TMessageType.CALL,\n-                seqId);\n-\n-        String methodArgs = ExtensionLoader.getExtensionLoader(ClassNameGenerator.class)\n-                .getExtension(channel.getUrl().getParameter(ThriftConstants.CLASS_NAME_GENERATOR_KEY, ThriftClassNameGenerator.NAME))\n-                .generateArgsClassName(serviceName, inv.getMethodName());\n-\n-        if (StringUtils.isEmpty(methodArgs)) {\n-            throw new RpcException(RpcException.SERIALIZATION_EXCEPTION,\n-                    \"Could not encode request, the specified interface may be incorrect.\");\n-        }\n-\n-        Class<?> clazz = CACHED_CLASS.get(methodArgs);\n-\n-        if (clazz == null) {\n-\n-            try {\n-\n-                clazz = ClassUtils.forNameWithThreadContextClassLoader(methodArgs);\n-\n-                CACHED_CLASS.putIfAbsent(methodArgs, clazz);\n-\n-            } catch (ClassNotFoundException e) {\n-                throw new RpcException(RpcException.SERIALIZATION_EXCEPTION, e.getMessage(), e);\n-            }\n-\n-        }\n-\n-        TBase args;\n-\n-        try {\n-            args = (TBase) clazz.newInstance();\n-        } catch (InstantiationException | IllegalAccessException e) {\n-            throw new RpcException(RpcException.SERIALIZATION_EXCEPTION, e.getMessage(), e);\n-        }\n-\n-        for (int i = 0; i < inv.getArguments().length; i++) {\n-\n-            Object obj = inv.getArguments()[i];\n-\n-            if (obj == null) {\n-                continue;\n-            }\n-\n-            TFieldIdEnum field = args.fieldForId(i + 1);\n-\n-            String setMethodName = ThriftUtils.generateSetMethodName(field.getFieldName());\n-\n-            Method method;\n-\n-            try {\n-                method = clazz.getMethod(setMethodName, inv.getParameterTypes()[i]);\n-            } catch (NoSuchMethodException e) {\n-                throw new RpcException(RpcException.SERIALIZATION_EXCEPTION, e.getMessage(), e);\n-            }\n-\n-            try {\n-                method.invoke(args, obj);\n-            } catch (IllegalAccessException | InvocationTargetException e) {\n-                throw new RpcException(RpcException.SERIALIZATION_EXCEPTION, e.getMessage(), e);\n-            }\n-\n-        }\n-\n-        RandomAccessByteArrayOutputStream bos = new RandomAccessByteArrayOutputStream(1024);\n-\n-        TIOStreamTransport transport = new TIOStreamTransport(bos);\n-\n-        TBinaryProtocol protocol = new TBinaryProtocol(transport);\n-\n-        int headerLength, messageLength;\n-\n-        byte[] bytes = new byte[4];\n-        try {\n-            // magic\n-            protocol.writeI16(MAGIC);\n-            // message length placeholder\n-            protocol.writeI32(Integer.MAX_VALUE);\n-            // message header length placeholder\n-            protocol.writeI16(Short.MAX_VALUE);\n-            // version\n-            protocol.writeByte(VERSION);\n-            // service name\n-            protocol.writeString(serviceName);\n-            // path\n-            protocol.writeString(inv.getAttachment(PATH_KEY));\n-            // dubbo request id\n-            protocol.writeI64(request.getId());\n-            protocol.getTransport().flush();\n-            // header size\n-            headerLength = bos.size();\n-\n-            // message body\n-            protocol.writeMessageBegin(message);\n-            args.write(protocol);\n-            protocol.writeMessageEnd();\n-            protocol.getTransport().flush();\n-            int oldIndex = messageLength = bos.size();\n-\n-            // fill in message length and header length\n-            try {\n-                TFramedTransport.encodeFrameSize(messageLength, bytes);\n-                bos.setWriteIndex(MESSAGE_LENGTH_INDEX);\n-                protocol.writeI32(messageLength);\n-                bos.setWriteIndex(MESSAGE_HEADER_LENGTH_INDEX);\n-                protocol.writeI16((short) (0xffff & headerLength));\n-            } finally {\n-                bos.setWriteIndex(oldIndex);\n-            }\n-\n-        } catch (TException e) {\n-            throw new RpcException(RpcException.SERIALIZATION_EXCEPTION, e.getMessage(), e);\n-        }\n-\n-        buffer.writeBytes(bytes);\n-        buffer.writeBytes(bos.toByteArray());\n-\n-    }\n-\n-    private void encodeResponse(Channel channel, ChannelBuffer buffer, Response response)\n-            throws IOException {\n-\n-        AppResponse result = (AppResponse) response.getResult();\n-\n-        RequestData rd = CACHED_REQUEST.get(response.getId());\n-\n-        String resultClassName = ExtensionLoader.getExtensionLoader(ClassNameGenerator.class).getExtension(\n-                channel.getUrl().getParameter(ThriftConstants.CLASS_NAME_GENERATOR_KEY, ThriftClassNameGenerator.NAME))\n-                .generateResultClassName(rd.serviceName, rd.methodName);\n-\n-        if (StringUtils.isEmpty(resultClassName)) {\n-            throw new RpcException(RpcException.SERIALIZATION_EXCEPTION,\n-                    \"Could not encode response, the specified interface may be incorrect.\");\n-        }\n-\n-        Class clazz = CACHED_CLASS.get(resultClassName);\n-\n-        if (clazz == null) {\n-\n-            try {\n-                clazz = ClassUtils.forNameWithThreadContextClassLoader(resultClassName);\n-                CACHED_CLASS.putIfAbsent(resultClassName, clazz);\n-            } catch (ClassNotFoundException e) {\n-                throw new RpcException(RpcException.SERIALIZATION_EXCEPTION, e.getMessage(), e);\n-            }\n-\n-        }\n-\n-        TBase resultObj;\n-\n-        try {\n-            resultObj = (TBase) clazz.newInstance();\n-        } catch (InstantiationException | IllegalAccessException e) {\n-            throw new RpcException(RpcException.SERIALIZATION_EXCEPTION, e.getMessage(), e);\n-        }\n-\n-        TApplicationException applicationException = null;\n-        TMessage message;\n-\n-        if (result.hasException()) {\n-            Throwable throwable = result.getException();\n-            int index = 1;\n-            boolean found = false;\n-            while (true) {\n-                TFieldIdEnum fieldIdEnum = resultObj.fieldForId(index++);\n-                if (fieldIdEnum == null) {\n-                    break;\n-                }\n-                String fieldName = fieldIdEnum.getFieldName();\n-                String getMethodName = ThriftUtils.generateGetMethodName(fieldName);\n-                String setMethodName = ThriftUtils.generateSetMethodName(fieldName);\n-                Method getMethod;\n-                Method setMethod;\n-                try {\n-                    getMethod = clazz.getMethod(getMethodName);\n-                    if (getMethod.getReturnType().equals(throwable.getClass())) {\n-                        found = true;\n-                        setMethod = clazz.getMethod(setMethodName, throwable.getClass());\n-                        setMethod.invoke(resultObj, throwable);\n-                    }\n-                } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {\n-                    throw new RpcException(RpcException.SERIALIZATION_EXCEPTION, e.getMessage(), e);\n-                }\n-            }\n-\n-            if (!found) {\n-                applicationException = new TApplicationException(throwable.getMessage());\n-            }\n-\n-        } else {\n-            Object realResult = result.getValue();\n-            // result field id is 0\n-            String fieldName = resultObj.fieldForId(0).getFieldName();\n-            String setMethodName = ThriftUtils.generateSetMethodName(fieldName);\n-            String getMethodName = ThriftUtils.generateGetMethodName(fieldName);\n-            Method getMethod;\n-            Method setMethod;\n-            try {\n-                getMethod = clazz.getMethod(getMethodName);\n-                setMethod = clazz.getMethod(setMethodName, getMethod.getReturnType());\n-                setMethod.invoke(resultObj, realResult);\n-            } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {\n-                throw new RpcException(RpcException.SERIALIZATION_EXCEPTION, e.getMessage(), e);\n-            }\n-\n-        }\n-\n-        if (applicationException != null) {\n-            message = new TMessage(rd.methodName, TMessageType.EXCEPTION, rd.id);\n-        } else {\n-            message = new TMessage(rd.methodName, TMessageType.REPLY, rd.id);\n-        }\n-\n-        RandomAccessByteArrayOutputStream bos = new RandomAccessByteArrayOutputStream(1024);\n-\n-        TIOStreamTransport transport = new TIOStreamTransport(bos);\n-\n-        TBinaryProtocol protocol = new TBinaryProtocol(transport);\n-\n-        int messageLength;\n-        int headerLength;\n-\n-        byte[] bytes = new byte[4];\n-        try {\n-            // magic\n-            protocol.writeI16(MAGIC);\n-            // message length\n-            protocol.writeI32(Integer.MAX_VALUE);\n-            // message header length\n-            protocol.writeI16(Short.MAX_VALUE);\n-            // version\n-            protocol.writeByte(VERSION);\n-            // service name\n-            protocol.writeString(rd.serviceName);\n-            // id\n-            protocol.writeI64(response.getId());\n-            protocol.getTransport().flush();\n-            headerLength = bos.size();\n-\n-            // message\n-            protocol.writeMessageBegin(message);\n-            switch (message.type) {\n-                case TMessageType.EXCEPTION:\n-                    applicationException.write(protocol);\n-                    break;\n-                case TMessageType.REPLY:\n-                    resultObj.write(protocol);\n-                    break;\n-                default:\n-            }\n-            protocol.writeMessageEnd();\n-            protocol.getTransport().flush();\n-            int oldIndex = messageLength = bos.size();\n-\n-            try {\n-                TFramedTransport.encodeFrameSize(messageLength, bytes);\n-                bos.setWriteIndex(MESSAGE_LENGTH_INDEX);\n-                protocol.writeI32(messageLength);\n-                bos.setWriteIndex(MESSAGE_HEADER_LENGTH_INDEX);\n-                protocol.writeI16((short) (0xffff & headerLength));\n-            } finally {\n-                bos.setWriteIndex(oldIndex);\n-            }\n-\n-        } catch (TException e) {\n-            throw new RpcException(RpcException.SERIALIZATION_EXCEPTION, e.getMessage(), e);\n-        }\n-\n-        buffer.writeBytes(bytes);\n-        buffer.writeBytes(bos.toByteArray());\n-\n-    }\n-\n-    static class RequestData {\n-        int id;\n-        String serviceName;\n-        String methodName;\n-\n-        static RequestData create(int id, String sn, String mn) {\n-            RequestData result = new RequestData();\n-            result.id = id;\n-            result.serviceName = sn;\n-            result.methodName = mn;\n-            return result;\n-        }\n-\n-    }\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.rpc.protocol.thrift;\r\n+\r\n+import org.apache.dubbo.common.extension.ExtensionLoader;\r\n+import org.apache.dubbo.common.utils.ClassUtils;\r\n+import org.apache.dubbo.common.utils.ReflectUtils;\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+import org.apache.dubbo.remoting.Channel;\r\n+import org.apache.dubbo.remoting.Codec2;\r\n+import org.apache.dubbo.remoting.buffer.ChannelBuffer;\r\n+import org.apache.dubbo.remoting.buffer.ChannelBufferInputStream;\r\n+import org.apache.dubbo.remoting.exchange.Request;\r\n+import org.apache.dubbo.remoting.exchange.Response;\r\n+import org.apache.dubbo.rpc.AppResponse;\r\n+import org.apache.dubbo.rpc.RpcException;\r\n+import org.apache.dubbo.rpc.RpcInvocation;\r\n+import org.apache.dubbo.rpc.protocol.thrift.io.RandomAccessByteArrayOutputStream;\r\n+\r\n+import org.apache.thrift.TApplicationException;\r\n+import org.apache.thrift.TBase;\r\n+import org.apache.thrift.TException;\r\n+import org.apache.thrift.TFieldIdEnum;\r\n+import org.apache.thrift.protocol.TBinaryProtocol;\r\n+import org.apache.thrift.protocol.TMessage;\r\n+import org.apache.thrift.protocol.TMessageType;\r\n+import org.apache.thrift.protocol.TProtocol;\r\n+import org.apache.thrift.transport.TFramedTransport;\r\n+import org.apache.thrift.transport.TIOStreamTransport;\r\n+\r\n+import java.io.IOException;\r\n+import java.lang.reflect.Field;\r\n+import java.lang.reflect.InvocationTargetException;\r\n+import java.lang.reflect.Method;\r\n+import java.util.ArrayList;\r\n+import java.util.List;\r\n+import java.util.concurrent.ConcurrentHashMap;\r\n+import java.util.concurrent.ConcurrentMap;\r\n+import java.util.concurrent.atomic.AtomicInteger;\r\n+\r\n+import static org.apache.dubbo.common.constants.CommonConstants.INTERFACE_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.PATH_KEY;\r\n+\r\n+/**\r\n+ * Thrift framed protocol codec.\r\n+ *\r\n+ * <pre>\r\n+ * |<-                                  message header                                  ->|<- message body ->|\r\n+ * +----------------+----------------------+------------------+---------------------------+------------------+\r\n+ * | magic (2 bytes)|message size (4 bytes)|head size(2 bytes)| version (1 byte) | header |   message body   |\r\n+ * +----------------+----------------------+------------------+---------------------------+------------------+\r\n+ * |<-                                               message size                                          ->|\r\n+ * </pre>\r\n+ *\r\n+ * <p>\r\n+ * <b>header fields in version 1</b>\r\n+ * <ol>\r\n+ * <li>string - service name</li>\r\n+ * <li>long   - dubbo request id</li>\r\n+ * </ol>\r\n+ * </p>\r\n+ */\r\n+\r\n+/**\r\n+ * @since 2.7.0, use https://github.com/dubbo/dubbo-rpc-native-thrift instead\r\n+ */\r\n+@Deprecated\r\n+public class ThriftCodec implements Codec2 {\r\n+\r\n+    public static final int MESSAGE_LENGTH_INDEX = 2;\r\n+    public static final int MESSAGE_HEADER_LENGTH_INDEX = 6;\r\n+    public static final int MESSAGE_SHORTEST_LENGTH = 10;\r\n+    public static final String NAME = \"thrift\";\r\n+    public static final String PARAMETER_CLASS_NAME_GENERATOR = \"class.name.generator\";\r\n+    public static final byte VERSION = (byte) 1;\r\n+    public static final short MAGIC = (short) 0xdabc;\r\n+    static final ConcurrentMap<Long, RequestData> CACHED_REQUEST =\r\n+            new ConcurrentHashMap<>();\r\n+    private static final AtomicInteger THRIFT_SEQ_ID = new AtomicInteger(0);\r\n+    private static final ConcurrentMap<String, Class<?>> CACHED_CLASS =\r\n+            new ConcurrentHashMap<>();\r\n+\r\n+    private static int nextSeqId() {\r\n+        return THRIFT_SEQ_ID.incrementAndGet();\r\n+    }\r\n+\r\n+    // just for test\r\n+    static int getSeqId() {\r\n+        return THRIFT_SEQ_ID.get();\r\n+    }\r\n+\r\n+    @Override\r\n+    public void encode(Channel channel, ChannelBuffer buffer, Object message)\r\n+            throws IOException {\r\n+\r\n+        if (message instanceof Request) {\r\n+            encodeRequest(channel, buffer, (Request) message);\r\n+        } else if (message instanceof Response) {\r\n+            encodeResponse(channel, buffer, (Response) message);\r\n+        } else {\r\n+            throw new UnsupportedOperationException(\"Thrift codec only support encode \"\r\n+                    + Request.class.getName() + \" and \" + Response.class.getName());\r\n+        }\r\n+\r\n+    }\r\n+\r\n+    @Override\r\n+    public Object decode(Channel channel, ChannelBuffer buffer) throws IOException {\r\n+\r\n+        int available = buffer.readableBytes();\r\n+\r\n+        if (available < MESSAGE_SHORTEST_LENGTH) {\r\n+\r\n+            return DecodeResult.NEED_MORE_INPUT;\r\n+\r\n+        } else {\r\n+\r\n+            TIOStreamTransport transport = new TIOStreamTransport(new ChannelBufferInputStream(buffer));\r\n+\r\n+            TBinaryProtocol protocol = new TBinaryProtocol(transport);\r\n+\r\n+            short magic;\r\n+            int messageLength;\r\n+\r\n+            try {\r\n+//                protocol.readI32(); // skip the first message length\r\n+                byte[] bytes = new byte[4];\r\n+                transport.read(bytes, 0, 4);\r\n+                magic = protocol.readI16();\r\n+                messageLength = protocol.readI32();\r\n+\r\n+            } catch (TException e) {\r\n+                throw new IOException(e.getMessage(), e);\r\n+            }\r\n+\r\n+            if (MAGIC != magic) {\r\n+                throw new IOException(\"Unknown magic code \" + magic);\r\n+            }\r\n+\r\n+            if (available < messageLength) {\r\n+                return DecodeResult.NEED_MORE_INPUT;\r\n+            }\r\n+\r\n+            return decode(protocol);\r\n+\r\n+        }\r\n+\r\n+    }\r\n+\r\n+    private Object decode(TProtocol protocol)\r\n+            throws IOException {\r\n+\r\n+        // version\r\n+        String serviceName;\r\n+        String path;\r\n+        long id;\r\n+\r\n+        TMessage message;\r\n+\r\n+        try {\r\n+            protocol.readI16();\r\n+            protocol.readByte();\r\n+            serviceName = protocol.readString();\r\n+            path = protocol.readString();\r\n+            id = protocol.readI64();\r\n+            message = protocol.readMessageBegin();\r\n+        } catch (TException e) {\r\n+            throw new IOException(e.getMessage(), e);\r\n+        }\r\n+\r\n+        if (message.type == TMessageType.CALL) {\r\n+\r\n+            RpcInvocation result = new RpcInvocation();\r\n+            result.setAttachment(INTERFACE_KEY, serviceName);\r\n+            result.setAttachment(PATH_KEY, path);\r\n+            result.setMethodName(message.name);\r\n+\r\n+            String argsClassName = ExtensionLoader.getExtensionLoader(ClassNameGenerator.class)\r\n+                    .getExtension(ThriftClassNameGenerator.NAME).generateArgsClassName(serviceName, message.name);\r\n+\r\n+            if (StringUtils.isEmpty(argsClassName)) {\r\n+                throw new RpcException(RpcException.SERIALIZATION_EXCEPTION,\r\n+                        \"The specified interface name incorrect.\");\r\n+            }\r\n+\r\n+            Class clazz = CACHED_CLASS.get(argsClassName);\r\n+\r\n+            if (clazz == null) {\r\n+                try {\r\n+\r\n+                    clazz = ClassUtils.forNameWithThreadContextClassLoader(argsClassName);\r\n+\r\n+                    CACHED_CLASS.putIfAbsent(argsClassName, clazz);\r\n+\r\n+                } catch (ClassNotFoundException e) {\r\n+                    throw new RpcException(RpcException.SERIALIZATION_EXCEPTION, e.getMessage(), e);\r\n+                }\r\n+            }\r\n+\r\n+            TBase args;\r\n+\r\n+            try {\r\n+                args = (TBase) clazz.newInstance();\r\n+            } catch (InstantiationException | IllegalAccessException e) {\r\n+                throw new RpcException(RpcException.SERIALIZATION_EXCEPTION, e.getMessage(), e);\r\n+            }\r\n+\r\n+            try {\r\n+                args.read(protocol);\r\n+                protocol.readMessageEnd();\r\n+            } catch (TException e) {\r\n+                throw new RpcException(RpcException.SERIALIZATION_EXCEPTION, e.getMessage(), e);\r\n+            }\r\n+\r\n+            List<Object> parameters = new ArrayList<>();\r\n+            List<Class<?>> parameterTypes = new ArrayList<>();\r\n+            int index = 1;\r\n+\r\n+            while (true) {\r\n+\r\n+                TFieldIdEnum fieldIdEnum = args.fieldForId(index++);\r\n+\r\n+                if (fieldIdEnum == null) {\r\n+                    break;\r\n+                }\r\n+\r\n+                String fieldName = fieldIdEnum.getFieldName();\r\n+\r\n+                String getMethodName = ThriftUtils.generateGetMethodName(fieldName);\r\n+\r\n+                Method getMethod;\r\n+\r\n+                try {\r\n+                    getMethod = clazz.getMethod(getMethodName);\r\n+                } catch (NoSuchMethodException e) {\r\n+                    throw new RpcException(\r\n+                            RpcException.SERIALIZATION_EXCEPTION, e.getMessage(), e);\r\n+                }\r\n+\r\n+                parameterTypes.add(getMethod.getReturnType());\r\n+                try {\r\n+                    parameters.add(getMethod.invoke(args));\r\n+                } catch (IllegalAccessException | InvocationTargetException e) {\r\n+                    throw new RpcException(\r\n+                            RpcException.SERIALIZATION_EXCEPTION, e.getMessage(), e);\r\n+                }\r\n+\r\n+            }\r\n+\r\n+            result.setArguments(parameters.toArray());\r\n+            result.setParameterTypes(parameterTypes.toArray(new Class[0]));\r\n+\r\n+            Request request = new Request(id);\r\n+            request.setData(result);\r\n+\r\n+            CACHED_REQUEST.putIfAbsent(id,\r\n+                    RequestData.create(message.seqid, serviceName, message.name));\r\n+\r\n+            return request;\r\n+\r\n+        } else if (message.type == TMessageType.EXCEPTION) {\r\n+\r\n+            TApplicationException exception;\r\n+\r\n+            try {\r\n+                exception = TApplicationException.readFrom(protocol);\r\n+                protocol.readMessageEnd();\r\n+            } catch (TException e) {\r\n+                throw new IOException(e.getMessage(), e);\r\n+            }\r\n+\r\n+            AppResponse result = new AppResponse();\r\n+\r\n+            result.setException(new RpcException(exception.getMessage()));\r\n+\r\n+            Response response = new Response();\r\n+\r\n+            response.setResult(result);\r\n+\r\n+            response.setId(id);\r\n+\r\n+            return response;\r\n+\r\n+        } else if (message.type == TMessageType.REPLY) {\r\n+\r\n+            String resultClassName = ExtensionLoader.getExtensionLoader(ClassNameGenerator.class)\r\n+                    .getExtension(ThriftClassNameGenerator.NAME).generateResultClassName(serviceName, message.name);\r\n+\r\n+            if (StringUtils.isEmpty(resultClassName)) {\r\n+                throw new IllegalArgumentException(\"Could not infer service result class name from service name \"\r\n+                        + serviceName + \", the service name you specified may not generated by thrift idl compiler\");\r\n+            }\r\n+\r\n+            Class<?> clazz = CACHED_CLASS.get(resultClassName);\r\n+\r\n+            if (clazz == null) {\r\n+\r\n+                try {\r\n+\r\n+                    clazz = ClassUtils.forNameWithThreadContextClassLoader(resultClassName);\r\n+\r\n+                    CACHED_CLASS.putIfAbsent(resultClassName, clazz);\r\n+\r\n+                } catch (ClassNotFoundException e) {\r\n+                    throw new RpcException(RpcException.SERIALIZATION_EXCEPTION, e.getMessage(), e);\r\n+                }\r\n+\r\n+            }\r\n+\r\n+            TBase<?, ? extends TFieldIdEnum> result;\r\n+            try {\r\n+                result = (TBase<?, ?>) clazz.newInstance();\r\n+            } catch (InstantiationException | IllegalAccessException e) {\r\n+                throw new RpcException(RpcException.SERIALIZATION_EXCEPTION, e.getMessage(), e);\r\n+            }\r\n+\r\n+            try {\r\n+                result.read(protocol);\r\n+                protocol.readMessageEnd();\r\n+            } catch (TException e) {\r\n+                throw new RpcException(RpcException.SERIALIZATION_EXCEPTION, e.getMessage(), e);\r\n+            }\r\n+\r\n+            Object realResult = null;\r\n+\r\n+            int index = 0;\r\n+\r\n+            while (true) {\r\n+\r\n+                TFieldIdEnum fieldIdEnum = result.fieldForId(index++);\r\n+\r\n+                if (fieldIdEnum == null) {\r\n+                    break;\r\n+                }\r\n+\r\n+                Field field;\r\n+\r\n+                try {\r\n+                    field = clazz.getDeclaredField(fieldIdEnum.getFieldName());\r\n+                    ReflectUtils.makeAccessible(field);\r\n+                } catch (NoSuchFieldException e) {\r\n+                    throw new RpcException(RpcException.SERIALIZATION_EXCEPTION, e.getMessage(), e);\r\n+                }\r\n+\r\n+                try {\r\n+                    realResult = field.get(result);\r\n+                } catch (IllegalAccessException e) {\r\n+                    throw new RpcException(RpcException.SERIALIZATION_EXCEPTION, e.getMessage(), e);\r\n+                }\r\n+\r\n+                if (realResult != null) {\r\n+                    break;\r\n+                }\r\n+\r\n+            }\r\n+\r\n+            Response response = new Response();\r\n+\r\n+            response.setId(id);\r\n+\r\n+            AppResponse appResponse = new AppResponse();\r\n+\r\n+            if (realResult instanceof Throwable) {\r\n+                appResponse.setException((Throwable) realResult);\r\n+            } else {\r\n+                appResponse.setValue(realResult);\r\n+            }\r\n+\r\n+            response.setResult(appResponse);\r\n+\r\n+            return response;\r\n+\r\n+        } else {\r\n+            // Impossible\r\n+            throw new IOException();\r\n+        }\r\n+\r\n+    }\r\n+\r\n+    private void encodeRequest(Channel channel, ChannelBuffer buffer, Request request)\r\n+            throws IOException {\r\n+\r\n+        RpcInvocation inv = (RpcInvocation) request.getData();\r\n+\r\n+        int seqId = nextSeqId();\r\n+\r\n+        String serviceName = inv.getAttachment(INTERFACE_KEY);\r\n+\r\n+        if (StringUtils.isEmpty(serviceName)) {\r\n+            throw new IllegalArgumentException(\"Could not find service name in attachment with key \"\r\n+                    + INTERFACE_KEY);\r\n+        }\r\n+\r\n+        TMessage message = new TMessage(\r\n+                inv.getMethodName(),\r\n+                TMessageType.CALL,\r\n+                seqId);\r\n+\r\n+        String methodArgs = ExtensionLoader.getExtensionLoader(ClassNameGenerator.class)\r\n+                .getExtension(channel.getUrl().getParameter(ThriftConstants.CLASS_NAME_GENERATOR_KEY, ThriftClassNameGenerator.NAME))\r\n+                .generateArgsClassName(serviceName, inv.getMethodName());\r\n+\r\n+        if (StringUtils.isEmpty(methodArgs)) {\r\n+            throw new RpcException(RpcException.SERIALIZATION_EXCEPTION,\r\n+                    \"Could not encode request, the specified interface may be incorrect.\");\r\n+        }\r\n+\r\n+        Class<?> clazz = CACHED_CLASS.get(methodArgs);\r\n+\r\n+        if (clazz == null) {\r\n+\r\n+            try {\r\n+\r\n+                clazz = ClassUtils.forNameWithThreadContextClassLoader(methodArgs);\r\n+\r\n+                CACHED_CLASS.putIfAbsent(methodArgs, clazz);\r\n+\r\n+            } catch (ClassNotFoundException e) {\r\n+                throw new RpcException(RpcException.SERIALIZATION_EXCEPTION, e.getMessage(), e);\r\n+            }\r\n+\r\n+        }\r\n+\r\n+        TBase args;\r\n+\r\n+        try {\r\n+            args = (TBase) clazz.newInstance();\r\n+        } catch (InstantiationException | IllegalAccessException e) {\r\n+            throw new RpcException(RpcException.SERIALIZATION_EXCEPTION, e.getMessage(), e);\r\n+        }\r\n+\r\n+        for (int i = 0; i < inv.getArguments().length; i++) {\r\n+\r\n+            Object obj = inv.getArguments()[i];\r\n+\r\n+            if (obj == null) {\r\n+                continue;\r\n+            }\r\n+\r\n+            TFieldIdEnum field = args.fieldForId(i + 1);\r\n+\r\n+            String setMethodName = ThriftUtils.generateSetMethodName(field.getFieldName());\r\n+\r\n+            Method method;\r\n+\r\n+            try {\r\n+                method = clazz.getMethod(setMethodName, inv.getParameterTypes()[i]);\r\n+            } catch (NoSuchMethodException e) {\r\n+                throw new RpcException(RpcException.SERIALIZATION_EXCEPTION, e.getMessage(), e);\r\n+            }\r\n+\r\n+            try {\r\n+                method.invoke(args, obj);\r\n+            } catch (IllegalAccessException | InvocationTargetException e) {\r\n+                throw new RpcException(RpcException.SERIALIZATION_EXCEPTION, e.getMessage(), e);\r\n+            }\r\n+\r\n+        }\r\n+\r\n+        RandomAccessByteArrayOutputStream bos = new RandomAccessByteArrayOutputStream(1024);\r\n+\r\n+        TIOStreamTransport transport = new TIOStreamTransport(bos);\r\n+\r\n+        TBinaryProtocol protocol = new TBinaryProtocol(transport);\r\n+\r\n+        int headerLength, messageLength;\r\n+\r\n+        byte[] bytes = new byte[4];\r\n+        try {\r\n+            // magic\r\n+            protocol.writeI16(MAGIC);\r\n+            // message length placeholder\r\n+            protocol.writeI32(Integer.MAX_VALUE);\r\n+            // message header length placeholder\r\n+            protocol.writeI16(Short.MAX_VALUE);\r\n+            // version\r\n+            protocol.writeByte(VERSION);\r\n+            // service name\r\n+            protocol.writeString(serviceName);\r\n+            // path\r\n+            protocol.writeString(inv.getAttachment(PATH_KEY));\r\n+            // dubbo request id\r\n+            protocol.writeI64(request.getId());\r\n+            protocol.getTransport().flush();\r\n+            // header size\r\n+            headerLength = bos.size();\r\n+\r\n+            // message body\r\n+            protocol.writeMessageBegin(message);\r\n+            args.write(protocol);\r\n+            protocol.writeMessageEnd();\r\n+            protocol.getTransport().flush();\r\n+            int oldIndex = messageLength = bos.size();\r\n+\r\n+            // fill in message length and header length\r\n+            try {\r\n+                TFramedTransport.encodeFrameSize(messageLength, bytes);\r\n+                bos.setWriteIndex(MESSAGE_LENGTH_INDEX);\r\n+                protocol.writeI32(messageLength);\r\n+                bos.setWriteIndex(MESSAGE_HEADER_LENGTH_INDEX);\r\n+                protocol.writeI16((short) (0xffff & headerLength));\r\n+            } finally {\r\n+                bos.setWriteIndex(oldIndex);\r\n+            }\r\n+\r\n+        } catch (TException e) {\r\n+            throw new RpcException(RpcException.SERIALIZATION_EXCEPTION, e.getMessage(), e);\r\n+        }\r\n+\r\n+        buffer.writeBytes(bytes);\r\n+        buffer.writeBytes(bos.toByteArray());\r\n+\r\n+    }\r\n+\r\n+    private void encodeResponse(Channel channel, ChannelBuffer buffer, Response response)\r\n+            throws IOException {\r\n+\r\n+        AppResponse result = (AppResponse) response.getResult();\r\n+\r\n+        RequestData rd = CACHED_REQUEST.get(response.getId());\r\n+\r\n+        String resultClassName = ExtensionLoader.getExtensionLoader(ClassNameGenerator.class).getExtension(\r\n+                channel.getUrl().getParameter(ThriftConstants.CLASS_NAME_GENERATOR_KEY, ThriftClassNameGenerator.NAME))\r\n+                .generateResultClassName(rd.serviceName, rd.methodName);\r\n+\r\n+        if (StringUtils.isEmpty(resultClassName)) {\r\n+            throw new RpcException(RpcException.SERIALIZATION_EXCEPTION,\r\n+                    \"Could not encode response, the specified interface may be incorrect.\");\r\n+        }\r\n+\r\n+        Class clazz = CACHED_CLASS.get(resultClassName);\r\n+\r\n+        if (clazz == null) {\r\n+\r\n+            try {\r\n+                clazz = ClassUtils.forNameWithThreadContextClassLoader(resultClassName);\r\n+                CACHED_CLASS.putIfAbsent(resultClassName, clazz);\r\n+            } catch (ClassNotFoundException e) {\r\n+                throw new RpcException(RpcException.SERIALIZATION_EXCEPTION, e.getMessage(), e);\r\n+            }\r\n+\r\n+        }\r\n+\r\n+        TBase resultObj;\r\n+\r\n+        try {\r\n+            resultObj = (TBase) clazz.newInstance();\r\n+        } catch (InstantiationException | IllegalAccessException e) {\r\n+            throw new RpcException(RpcException.SERIALIZATION_EXCEPTION, e.getMessage(), e);\r\n+        }\r\n+\r\n+        TApplicationException applicationException = null;\r\n+        TMessage message;\r\n+\r\n+        if (result.hasException()) {\r\n+            Throwable throwable = result.getException();\r\n+            int index = 1;\r\n+            boolean found = false;\r\n+            while (true) {\r\n+                TFieldIdEnum fieldIdEnum = resultObj.fieldForId(index++);\r\n+                if (fieldIdEnum == null) {\r\n+                    break;\r\n+                }\r\n+                String fieldName = fieldIdEnum.getFieldName();\r\n+                String getMethodName = ThriftUtils.generateGetMethodName(fieldName);\r\n+                String setMethodName = ThriftUtils.generateSetMethodName(fieldName);\r\n+                Method getMethod;\r\n+                Method setMethod;\r\n+                try {\r\n+                    getMethod = clazz.getMethod(getMethodName);\r\n+                    if (getMethod.getReturnType().equals(throwable.getClass())) {\r\n+                        found = true;\r\n+                        setMethod = clazz.getMethod(setMethodName, throwable.getClass());\r\n+                        setMethod.invoke(resultObj, throwable);\r\n+                    }\r\n+                } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {\r\n+                    throw new RpcException(RpcException.SERIALIZATION_EXCEPTION, e.getMessage(), e);\r\n+                }\r\n+            }\r\n+\r\n+            if (!found) {\r\n+                applicationException = new TApplicationException(throwable.getMessage());\r\n+            }\r\n+\r\n+        } else {\r\n+            Object realResult = result.getValue();\r\n+            // result field id is 0\r\n+            String fieldName = resultObj.fieldForId(0).getFieldName();\r\n+            String setMethodName = ThriftUtils.generateSetMethodName(fieldName);\r\n+            String getMethodName = ThriftUtils.generateGetMethodName(fieldName);\r\n+            Method getMethod;\r\n+            Method setMethod;\r\n+            try {\r\n+                getMethod = clazz.getMethod(getMethodName);\r\n+                setMethod = clazz.getMethod(setMethodName, getMethod.getReturnType());\r\n+                setMethod.invoke(resultObj, realResult);\r\n+            } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {\r\n+                throw new RpcException(RpcException.SERIALIZATION_EXCEPTION, e.getMessage(), e);\r\n+            }\r\n+\r\n+        }\r\n+\r\n+        if (applicationException != null) {\r\n+            message = new TMessage(rd.methodName, TMessageType.EXCEPTION, rd.id);\r\n+        } else {\r\n+            message = new TMessage(rd.methodName, TMessageType.REPLY, rd.id);\r\n+        }\r\n+\r\n+        RandomAccessByteArrayOutputStream bos = new RandomAccessByteArrayOutputStream(1024);\r\n+\r\n+        TIOStreamTransport transport = new TIOStreamTransport(bos);\r\n+\r\n+        TBinaryProtocol protocol = new TBinaryProtocol(transport);\r\n+\r\n+        int messageLength;\r\n+        int headerLength;\r\n+\r\n+        byte[] bytes = new byte[4];\r\n+        try {\r\n+            // magic\r\n+            protocol.writeI16(MAGIC);\r\n+            // message length\r\n+            protocol.writeI32(Integer.MAX_VALUE);\r\n+            // message header length\r\n+            protocol.writeI16(Short.MAX_VALUE);\r\n+            // version\r\n+            protocol.writeByte(VERSION);\r\n+            // service name\r\n+            protocol.writeString(rd.serviceName);\r\n+            // id\r\n+            protocol.writeI64(response.getId());\r\n+            protocol.getTransport().flush();\r\n+            headerLength = bos.size();\r\n+\r\n+            // message\r\n+            protocol.writeMessageBegin(message);\r\n+            switch (message.type) {\r\n+                case TMessageType.EXCEPTION:\r\n+                    applicationException.write(protocol);\r\n+                    break;\r\n+                case TMessageType.REPLY:\r\n+                    resultObj.write(protocol);\r\n+                    break;\r\n+                default:\r\n+            }\r\n+            protocol.writeMessageEnd();\r\n+            protocol.getTransport().flush();\r\n+            int oldIndex = messageLength = bos.size();\r\n+\r\n+            try {\r\n+                TFramedTransport.encodeFrameSize(messageLength, bytes);\r\n+                bos.setWriteIndex(MESSAGE_LENGTH_INDEX);\r\n+                protocol.writeI32(messageLength);\r\n+                bos.setWriteIndex(MESSAGE_HEADER_LENGTH_INDEX);\r\n+                protocol.writeI16((short) (0xffff & headerLength));\r\n+            } finally {\r\n+                bos.setWriteIndex(oldIndex);\r\n+            }\r\n+\r\n+        } catch (TException e) {\r\n+            throw new RpcException(RpcException.SERIALIZATION_EXCEPTION, e.getMessage(), e);\r\n+        }\r\n+\r\n+        buffer.writeBytes(bytes);\r\n+        buffer.writeBytes(bos.toByteArray());\r\n+\r\n+    }\r\n+\r\n+    static class RequestData {\r\n+        int id;\r\n+        String serviceName;\r\n+        String methodName;\r\n+\r\n+        static RequestData create(int id, String sn, String mn) {\r\n+            RequestData result = new RequestData();\r\n+            result.id = id;\r\n+            result.serviceName = sn;\r\n+            result.methodName = mn;\r\n+            return result;\r\n+        }\r\n+\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/rpc/protocol/thrift/ThriftConstants.java", "source2": "org/apache/dubbo/rpc/protocol/thrift/ThriftConstants.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,32 +1,32 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.rpc.protocol.thrift;\n-/**\n- * @since 2.7.0, use https://github.com/dubbo/dubbo-rpc-native-thrift instead\n- */\n-@Deprecated\n-public final class ThriftConstants {\n-\n-    public static final String THRIFT_PROTOCOL_KEY = \"thrift.protocol\";\n-    public static final String BINARY_THRIFT_PROTOCOL = \"binary\";\n-    public static final String CLASS_NAME_GENERATOR_KEY = \"class.name.generator\";\n-    public static final String DEFAULT_PROTOCOL = BINARY_THRIFT_PROTOCOL;\n-\n-    private ThriftConstants() {\n-    }\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.rpc.protocol.thrift;\r\n+/**\r\n+ * @since 2.7.0, use https://github.com/dubbo/dubbo-rpc-native-thrift instead\r\n+ */\r\n+@Deprecated\r\n+public final class ThriftConstants {\r\n+\r\n+    public static final String THRIFT_PROTOCOL_KEY = \"thrift.protocol\";\r\n+    public static final String BINARY_THRIFT_PROTOCOL = \"binary\";\r\n+    public static final String CLASS_NAME_GENERATOR_KEY = \"class.name.generator\";\r\n+    public static final String DEFAULT_PROTOCOL = BINARY_THRIFT_PROTOCOL;\r\n+\r\n+    private ThriftConstants() {\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/rpc/protocol/thrift/ThriftInvoker.java", "source2": "org/apache/dubbo/rpc/protocol/thrift/ThriftInvoker.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,171 +1,171 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.rpc.protocol.thrift;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.utils.AtomicPositiveInteger;\n-import org.apache.dubbo.remoting.RemotingException;\n-import org.apache.dubbo.remoting.TimeoutException;\n-import org.apache.dubbo.remoting.exchange.ExchangeClient;\n-import org.apache.dubbo.rpc.AppResponse;\n-import org.apache.dubbo.rpc.AsyncRpcResult;\n-import org.apache.dubbo.rpc.FutureContext;\n-import org.apache.dubbo.rpc.Invocation;\n-import org.apache.dubbo.rpc.Invoker;\n-import org.apache.dubbo.rpc.Result;\n-import org.apache.dubbo.rpc.RpcException;\n-import org.apache.dubbo.rpc.RpcInvocation;\n-import org.apache.dubbo.rpc.protocol.AbstractInvoker;\n-\n-import java.util.Set;\n-import java.util.concurrent.CompletableFuture;\n-import java.util.concurrent.ExecutorService;\n-import java.util.concurrent.locks.ReentrantLock;\n-\n-import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_TIMEOUT;\n-import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.INTERFACE_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.PATH_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.TIMEOUT_KEY;\n-import static org.apache.dubbo.remoting.Constants.CHANNEL_ATTRIBUTE_READONLY_KEY;\n-import static org.apache.dubbo.rpc.Constants.TOKEN_KEY;\n-\n-\n-/**\n- * @since 2.7.0, use https://github.com/dubbo/dubbo-rpc-native-thrift instead\n- */\n-@Deprecated\n-public class ThriftInvoker<T> extends AbstractInvoker<T> {\n-\n-    private final ExchangeClient[] clients;\n-\n-    private final AtomicPositiveInteger index = new AtomicPositiveInteger();\n-\n-    private final ReentrantLock destroyLock = new ReentrantLock();\n-\n-    private final Set<Invoker<?>> invokers;\n-\n-    public ThriftInvoker(Class<T> service, URL url, ExchangeClient[] clients) {\n-        this(service, url, clients, null);\n-    }\n-\n-    public ThriftInvoker(Class<T> type, URL url, ExchangeClient[] clients, Set<Invoker<?>> invokers) {\n-        super(type, url, new String[]{INTERFACE_KEY, GROUP_KEY, TOKEN_KEY});\n-        this.clients = clients;\n-        this.invokers = invokers;\n-    }\n-\n-    @Override\n-    protected Result doInvoke(Invocation invocation) throws Throwable {\n-\n-        RpcInvocation inv = (RpcInvocation) invocation;\n-\n-        final String methodName;\n-\n-        methodName = invocation.getMethodName();\n-\n-        inv.setAttachment(PATH_KEY, getUrl().getPath());\n-\n-        // for thrift codec\n-        inv.setAttachment(ThriftCodec.PARAMETER_CLASS_NAME_GENERATOR, getUrl().getParameter(\n-                ThriftCodec.PARAMETER_CLASS_NAME_GENERATOR, DubboClassNameGenerator.NAME));\n-\n-        ExchangeClient currentClient;\n-\n-        if (clients.length == 1) {\n-            currentClient = clients[0];\n-        } else {\n-            currentClient = clients[index.getAndIncrement() % clients.length];\n-        }\n-\n-        try {\n-            int timeout = getUrl().getMethodParameter(methodName, TIMEOUT_KEY, DEFAULT_TIMEOUT);\n-\n-            ExecutorService executor = getCallbackExecutor(getUrl(), inv);\n-            CompletableFuture<AppResponse> appResponseFuture = currentClient.request(inv, timeout, executor).thenApply(obj -> (AppResponse) obj);\n-            // save for 2.6.x compatibility, for example, TraceFilter in Zipkin uses com.alibaba.xxx.FutureAdapter\n-            FutureContext.getContext().setCompatibleFuture(appResponseFuture);\n-            AsyncRpcResult result = new AsyncRpcResult(appResponseFuture, invocation);\n-            result.setExecutor(executor);\n-            return result;\n-        } catch (TimeoutException e) {\n-            throw new RpcException(RpcException.TIMEOUT_EXCEPTION, e.getMessage(), e);\n-        } catch (RemotingException e) {\n-            throw new RpcException(RpcException.NETWORK_EXCEPTION, e.getMessage(), e);\n-        }\n-\n-    }\n-\n-    @Override\n-    public boolean isAvailable() {\n-\n-        if (!super.isAvailable()) {\n-            return false;\n-        }\n-\n-        for (ExchangeClient client : clients) {\n-            if (client.isConnected()\n-                    && !client.hasAttribute(CHANNEL_ATTRIBUTE_READONLY_KEY)) {\n-                //cannot write == not Available ?\n-                return true;\n-            }\n-        }\n-        return false;\n-    }\n-\n-    @Override\n-    public void destroy() {\n-        // in order to avoid closing a client multiple times, a counter is used in case of connection per jvm, every\n-        // time when client.close() is called, counter counts down once, and when counter reaches zero, client will be\n-        // closed.\n-        if (super.isDestroyed()) {\n-            return;\n-        } else {\n-            // double check to avoid dup close\n-            destroyLock.lock();\n-\n-            try {\n-\n-                if (super.isDestroyed()) {\n-                    return;\n-                }\n-\n-                super.destroy();\n-\n-                if (invokers != null) {\n-                    invokers.remove(this);\n-                }\n-\n-                for (ExchangeClient client : clients) {\n-\n-                    try {\n-                        client.close();\n-                    } catch (Throwable t) {\n-                        logger.warn(t.getMessage(), t);\n-                    }\n-\n-                }\n-\n-            } finally {\n-                destroyLock.unlock();\n-            }\n-\n-        }\n-\n-    }\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.rpc.protocol.thrift;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.utils.AtomicPositiveInteger;\r\n+import org.apache.dubbo.remoting.RemotingException;\r\n+import org.apache.dubbo.remoting.TimeoutException;\r\n+import org.apache.dubbo.remoting.exchange.ExchangeClient;\r\n+import org.apache.dubbo.rpc.AppResponse;\r\n+import org.apache.dubbo.rpc.AsyncRpcResult;\r\n+import org.apache.dubbo.rpc.FutureContext;\r\n+import org.apache.dubbo.rpc.Invocation;\r\n+import org.apache.dubbo.rpc.Invoker;\r\n+import org.apache.dubbo.rpc.Result;\r\n+import org.apache.dubbo.rpc.RpcException;\r\n+import org.apache.dubbo.rpc.RpcInvocation;\r\n+import org.apache.dubbo.rpc.protocol.AbstractInvoker;\r\n+\r\n+import java.util.Set;\r\n+import java.util.concurrent.CompletableFuture;\r\n+import java.util.concurrent.ExecutorService;\r\n+import java.util.concurrent.locks.ReentrantLock;\r\n+\r\n+import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_TIMEOUT;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.INTERFACE_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.PATH_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.TIMEOUT_KEY;\r\n+import static org.apache.dubbo.remoting.Constants.CHANNEL_ATTRIBUTE_READONLY_KEY;\r\n+import static org.apache.dubbo.rpc.Constants.TOKEN_KEY;\r\n+\r\n+\r\n+/**\r\n+ * @since 2.7.0, use https://github.com/dubbo/dubbo-rpc-native-thrift instead\r\n+ */\r\n+@Deprecated\r\n+public class ThriftInvoker<T> extends AbstractInvoker<T> {\r\n+\r\n+    private final ExchangeClient[] clients;\r\n+\r\n+    private final AtomicPositiveInteger index = new AtomicPositiveInteger();\r\n+\r\n+    private final ReentrantLock destroyLock = new ReentrantLock();\r\n+\r\n+    private final Set<Invoker<?>> invokers;\r\n+\r\n+    public ThriftInvoker(Class<T> service, URL url, ExchangeClient[] clients) {\r\n+        this(service, url, clients, null);\r\n+    }\r\n+\r\n+    public ThriftInvoker(Class<T> type, URL url, ExchangeClient[] clients, Set<Invoker<?>> invokers) {\r\n+        super(type, url, new String[]{INTERFACE_KEY, GROUP_KEY, TOKEN_KEY});\r\n+        this.clients = clients;\r\n+        this.invokers = invokers;\r\n+    }\r\n+\r\n+    @Override\r\n+    protected Result doInvoke(Invocation invocation) throws Throwable {\r\n+\r\n+        RpcInvocation inv = (RpcInvocation) invocation;\r\n+\r\n+        final String methodName;\r\n+\r\n+        methodName = invocation.getMethodName();\r\n+\r\n+        inv.setAttachment(PATH_KEY, getUrl().getPath());\r\n+\r\n+        // for thrift codec\r\n+        inv.setAttachment(ThriftCodec.PARAMETER_CLASS_NAME_GENERATOR, getUrl().getParameter(\r\n+                ThriftCodec.PARAMETER_CLASS_NAME_GENERATOR, DubboClassNameGenerator.NAME));\r\n+\r\n+        ExchangeClient currentClient;\r\n+\r\n+        if (clients.length == 1) {\r\n+            currentClient = clients[0];\r\n+        } else {\r\n+            currentClient = clients[index.getAndIncrement() % clients.length];\r\n+        }\r\n+\r\n+        try {\r\n+            int timeout = getUrl().getMethodParameter(methodName, TIMEOUT_KEY, DEFAULT_TIMEOUT);\r\n+\r\n+            ExecutorService executor = getCallbackExecutor(getUrl(), inv);\r\n+            CompletableFuture<AppResponse> appResponseFuture = currentClient.request(inv, timeout, executor).thenApply(obj -> (AppResponse) obj);\r\n+            // save for 2.6.x compatibility, for example, TraceFilter in Zipkin uses com.alibaba.xxx.FutureAdapter\r\n+            FutureContext.getContext().setCompatibleFuture(appResponseFuture);\r\n+            AsyncRpcResult result = new AsyncRpcResult(appResponseFuture, invocation);\r\n+            result.setExecutor(executor);\r\n+            return result;\r\n+        } catch (TimeoutException e) {\r\n+            throw new RpcException(RpcException.TIMEOUT_EXCEPTION, e.getMessage(), e);\r\n+        } catch (RemotingException e) {\r\n+            throw new RpcException(RpcException.NETWORK_EXCEPTION, e.getMessage(), e);\r\n+        }\r\n+\r\n+    }\r\n+\r\n+    @Override\r\n+    public boolean isAvailable() {\r\n+\r\n+        if (!super.isAvailable()) {\r\n+            return false;\r\n+        }\r\n+\r\n+        for (ExchangeClient client : clients) {\r\n+            if (client.isConnected()\r\n+                    && !client.hasAttribute(CHANNEL_ATTRIBUTE_READONLY_KEY)) {\r\n+                //cannot write == not Available ?\r\n+                return true;\r\n+            }\r\n+        }\r\n+        return false;\r\n+    }\r\n+\r\n+    @Override\r\n+    public void destroy() {\r\n+        // in order to avoid closing a client multiple times, a counter is used in case of connection per jvm, every\r\n+        // time when client.close() is called, counter counts down once, and when counter reaches zero, client will be\r\n+        // closed.\r\n+        if (super.isDestroyed()) {\r\n+            return;\r\n+        } else {\r\n+            // double check to avoid dup close\r\n+            destroyLock.lock();\r\n+\r\n+            try {\r\n+\r\n+                if (super.isDestroyed()) {\r\n+                    return;\r\n+                }\r\n+\r\n+                super.destroy();\r\n+\r\n+                if (invokers != null) {\r\n+                    invokers.remove(this);\r\n+                }\r\n+\r\n+                for (ExchangeClient client : clients) {\r\n+\r\n+                    try {\r\n+                        client.close();\r\n+                    } catch (Throwable t) {\r\n+                        logger.warn(t.getMessage(), t);\r\n+                    }\r\n+\r\n+                }\r\n+\r\n+            } finally {\r\n+                destroyLock.unlock();\r\n+            }\r\n+\r\n+        }\r\n+\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/rpc/protocol/thrift/ThriftNativeCodec.java", "source2": "org/apache/dubbo/rpc/protocol/thrift/ThriftNativeCodec.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,96 +1,96 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.rpc.protocol.thrift;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.remoting.Channel;\n-import org.apache.dubbo.remoting.Codec2;\n-import org.apache.dubbo.remoting.buffer.ChannelBuffer;\n-import org.apache.dubbo.remoting.buffer.ChannelBufferOutputStream;\n-import org.apache.dubbo.remoting.exchange.Request;\n-import org.apache.dubbo.remoting.exchange.Response;\n-import org.apache.dubbo.rpc.Invocation;\n-import org.apache.thrift.TException;\n-import org.apache.thrift.protocol.TBinaryProtocol;\n-import org.apache.thrift.protocol.TMessage;\n-import org.apache.thrift.protocol.TMessageType;\n-import org.apache.thrift.protocol.TProtocol;\n-import org.apache.thrift.protocol.TStruct;\n-import org.apache.thrift.transport.TIOStreamTransport;\n-\n-import java.io.IOException;\n-import java.util.concurrent.atomic.AtomicInteger;\n-/**\n- * @since 2.7.0, use https://github.com/dubbo/dubbo-rpc-native-thrift instead\n- */\n-@Deprecated\n-public class ThriftNativeCodec implements Codec2 {\n-\n-    private final AtomicInteger thriftSeq = new AtomicInteger(0);\n-\n-    protected static TProtocol newProtocol(URL url, ChannelBuffer buffer) throws IOException {\n-        String protocol = url.getParameter(ThriftConstants.THRIFT_PROTOCOL_KEY,\n-                ThriftConstants.DEFAULT_PROTOCOL);\n-        if (ThriftConstants.BINARY_THRIFT_PROTOCOL.equals(protocol)) {\n-            return new TBinaryProtocol(new TIOStreamTransport(new ChannelBufferOutputStream(buffer)));\n-        }\n-        throw new IOException(\"Unsupported protocol type \" + protocol);\n-    }\n-\n-    @Override\n-    public void encode(Channel channel, ChannelBuffer buffer, Object message)\n-            throws IOException {\n-        if (message instanceof Request) {\n-            encodeRequest(channel, buffer, (Request) message);\n-        } else if (message instanceof Response) {\n-            encodeResponse(channel, buffer, (Response) message);\n-        } else {\n-            throw new IOException(\"Unsupported message type \"\n-                    + message.getClass().getName());\n-        }\n-    }\n-\n-    protected void encodeRequest(Channel channel, ChannelBuffer buffer, Request request)\n-            throws IOException {\n-        Invocation invocation = (Invocation) request.getData();\n-        TProtocol protocol = newProtocol(channel.getUrl(), buffer);\n-        try {\n-            protocol.writeMessageBegin(new TMessage(\n-                    invocation.getMethodName(), TMessageType.CALL,\n-                    thriftSeq.getAndIncrement()));\n-            protocol.writeStructBegin(new TStruct(invocation.getMethodName() + \"_args\"));\n-            for (int i = 0; i < invocation.getParameterTypes().length; i++) {\n-                Class<?> type = invocation.getParameterTypes()[i];\n-\n-            }\n-        } catch (TException e) {\n-            throw new IOException(e.getMessage(), e);\n-        }\n-\n-    }\n-\n-    protected void encodeResponse(Channel channel, ChannelBuffer buffer, Response response)\n-            throws IOException {\n-\n-    }\n-\n-    @Override\n-    public Object decode(Channel channel, ChannelBuffer buffer) throws IOException {\n-        return null;\n-    }\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.rpc.protocol.thrift;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.remoting.Channel;\r\n+import org.apache.dubbo.remoting.Codec2;\r\n+import org.apache.dubbo.remoting.buffer.ChannelBuffer;\r\n+import org.apache.dubbo.remoting.buffer.ChannelBufferOutputStream;\r\n+import org.apache.dubbo.remoting.exchange.Request;\r\n+import org.apache.dubbo.remoting.exchange.Response;\r\n+import org.apache.dubbo.rpc.Invocation;\r\n+import org.apache.thrift.TException;\r\n+import org.apache.thrift.protocol.TBinaryProtocol;\r\n+import org.apache.thrift.protocol.TMessage;\r\n+import org.apache.thrift.protocol.TMessageType;\r\n+import org.apache.thrift.protocol.TProtocol;\r\n+import org.apache.thrift.protocol.TStruct;\r\n+import org.apache.thrift.transport.TIOStreamTransport;\r\n+\r\n+import java.io.IOException;\r\n+import java.util.concurrent.atomic.AtomicInteger;\r\n+/**\r\n+ * @since 2.7.0, use https://github.com/dubbo/dubbo-rpc-native-thrift instead\r\n+ */\r\n+@Deprecated\r\n+public class ThriftNativeCodec implements Codec2 {\r\n+\r\n+    private final AtomicInteger thriftSeq = new AtomicInteger(0);\r\n+\r\n+    protected static TProtocol newProtocol(URL url, ChannelBuffer buffer) throws IOException {\r\n+        String protocol = url.getParameter(ThriftConstants.THRIFT_PROTOCOL_KEY,\r\n+                ThriftConstants.DEFAULT_PROTOCOL);\r\n+        if (ThriftConstants.BINARY_THRIFT_PROTOCOL.equals(protocol)) {\r\n+            return new TBinaryProtocol(new TIOStreamTransport(new ChannelBufferOutputStream(buffer)));\r\n+        }\r\n+        throw new IOException(\"Unsupported protocol type \" + protocol);\r\n+    }\r\n+\r\n+    @Override\r\n+    public void encode(Channel channel, ChannelBuffer buffer, Object message)\r\n+            throws IOException {\r\n+        if (message instanceof Request) {\r\n+            encodeRequest(channel, buffer, (Request) message);\r\n+        } else if (message instanceof Response) {\r\n+            encodeResponse(channel, buffer, (Response) message);\r\n+        } else {\r\n+            throw new IOException(\"Unsupported message type \"\r\n+                    + message.getClass().getName());\r\n+        }\r\n+    }\r\n+\r\n+    protected void encodeRequest(Channel channel, ChannelBuffer buffer, Request request)\r\n+            throws IOException {\r\n+        Invocation invocation = (Invocation) request.getData();\r\n+        TProtocol protocol = newProtocol(channel.getUrl(), buffer);\r\n+        try {\r\n+            protocol.writeMessageBegin(new TMessage(\r\n+                    invocation.getMethodName(), TMessageType.CALL,\r\n+                    thriftSeq.getAndIncrement()));\r\n+            protocol.writeStructBegin(new TStruct(invocation.getMethodName() + \"_args\"));\r\n+            for (int i = 0; i < invocation.getParameterTypes().length; i++) {\r\n+                Class<?> type = invocation.getParameterTypes()[i];\r\n+\r\n+            }\r\n+        } catch (TException e) {\r\n+            throw new IOException(e.getMessage(), e);\r\n+        }\r\n+\r\n+    }\r\n+\r\n+    protected void encodeResponse(Channel channel, ChannelBuffer buffer, Response response)\r\n+            throws IOException {\r\n+\r\n+    }\r\n+\r\n+    @Override\r\n+    public Object decode(Channel channel, ChannelBuffer buffer) throws IOException {\r\n+        return null;\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/rpc/protocol/thrift/ThriftProtocol.java", "source2": "org/apache/dubbo/rpc/protocol/thrift/ThriftProtocol.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,272 +1,272 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.rpc.protocol.thrift;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.config.ConfigurationUtils;\n-import org.apache.dubbo.common.extension.ExtensionLoader;\n-import org.apache.dubbo.common.utils.StringUtils;\n-import org.apache.dubbo.remoting.Channel;\n-import org.apache.dubbo.remoting.RemotingException;\n-import org.apache.dubbo.remoting.RemotingServer;\n-import org.apache.dubbo.remoting.Transporter;\n-import org.apache.dubbo.remoting.exchange.ExchangeChannel;\n-import org.apache.dubbo.remoting.exchange.ExchangeClient;\n-import org.apache.dubbo.remoting.exchange.ExchangeHandler;\n-import org.apache.dubbo.remoting.exchange.ExchangeServer;\n-import org.apache.dubbo.remoting.exchange.Exchangers;\n-import org.apache.dubbo.remoting.exchange.support.ExchangeHandlerAdapter;\n-import org.apache.dubbo.rpc.Exporter;\n-import org.apache.dubbo.rpc.Invocation;\n-import org.apache.dubbo.rpc.Invoker;\n-import org.apache.dubbo.rpc.ProtocolServer;\n-import org.apache.dubbo.rpc.Result;\n-import org.apache.dubbo.rpc.RpcContext;\n-import org.apache.dubbo.rpc.RpcException;\n-import org.apache.dubbo.rpc.protocol.AbstractProtocol;\n-import org.apache.dubbo.rpc.protocol.dubbo.DubboExporter;\n-\n-import java.util.ArrayList;\n-import java.util.Set;\n-import java.util.concurrent.CompletableFuture;\n-import java.util.function.Function;\n-\n-import static org.apache.dubbo.common.constants.CommonConstants.PATH_KEY;\n-import static org.apache.dubbo.remoting.Constants.CHANNEL_READONLYEVENT_SENT_KEY;\n-import static org.apache.dubbo.remoting.Constants.CLIENT_KEY;\n-import static org.apache.dubbo.remoting.Constants.CODEC_KEY;\n-import static org.apache.dubbo.remoting.Constants.CONNECTIONS_KEY;\n-import static org.apache.dubbo.remoting.Constants.SERVER_KEY;\n-import static org.apache.dubbo.rpc.Constants.IS_SERVER_KEY;\n-\n-/**\n- * @since 2.7.0, use https://github.com/dubbo/dubbo-rpc-native-thrift instead\n- */\n-@Deprecated\n-public class ThriftProtocol extends AbstractProtocol {\n-\n-    public static final int DEFAULT_PORT = 40880;\n-\n-    public static final String NAME = \"thrift\";\n-\n-    private ExchangeHandler handler = new ExchangeHandlerAdapter() {\n-\n-        @Override\n-        public CompletableFuture<Object> reply(ExchangeChannel channel, Object msg) throws RemotingException {\n-\n-            if (msg instanceof Invocation) {\n-                Invocation inv = (Invocation) msg;\n-                String path = (String) inv.getObjectAttachments().get(PATH_KEY);\n-                String serviceKey = serviceKey(channel.getLocalAddress().getPort(),\n-                        path, null, null);\n-                DubboExporter<?> exporter = (DubboExporter<?>) exporterMap.get(serviceKey);\n-                if (exporter == null) {\n-                    throw new RemotingException(channel,\n-                            \"Not found exported service: \"\n-                                    + serviceKey\n-                                    + \" in \"\n-                                    + exporterMap.keySet()\n-                                    + \", may be version or group mismatch \"\n-                                    + \", channel: consumer: \"\n-                                    + channel.getRemoteAddress()\n-                                    + \" --> provider: \"\n-                                    + channel.getLocalAddress()\n-                                    + \", message:\" + msg);\n-                }\n-\n-                RpcContext.getContext().setRemoteAddress(channel.getRemoteAddress());\n-\n-                Result result = exporter.getInvoker().invoke(inv);\n-                return result.thenApply(Function.identity());\n-            }\n-\n-            throw new RemotingException(channel,\n-                    \"Unsupported request: \"\n-                            + (msg.getClass().getName() + \": \" + msg)\n-                            + \", channel: consumer: \"\n-                            + channel.getRemoteAddress()\n-                            + \" --> provider: \"\n-                            + channel.getLocalAddress());\n-        }\n-\n-        @Override\n-        public void received(Channel channel, Object message) throws RemotingException {\n-            if (message instanceof Invocation) {\n-                reply((ExchangeChannel) channel, message);\n-            } else {\n-                super.received(channel, message);\n-            }\n-        }\n-\n-    };\n-\n-    @Override\n-    public int getDefaultPort() {\n-        return DEFAULT_PORT;\n-    }\n-\n-    @Override\n-    public <T> Exporter<T> export(Invoker<T> invoker) throws RpcException {\n-\n-        // can use thrift codec only\n-        URL url = invoker.getUrl().addParameter(CODEC_KEY, ThriftCodec.NAME);\n-        // find server.\n-        String key = url.getAddress();\n-        // client can expose a service for server to invoke only.\n-        boolean isServer = url.getParameter(IS_SERVER_KEY, true);\n-        if (isServer && !serverMap.containsKey(key)) {\n-            serverMap.put(key, getServer(url));\n-        }\n-        // export service.\n-        key = serviceKey(url);\n-        DubboExporter<T> exporter = new DubboExporter<T>(invoker, key, exporterMap);\n-        exporterMap.put(key, exporter);\n-\n-        return exporter;\n-    }\n-\n-    @Override\n-    public void destroy() {\n-\n-        super.destroy();\n-\n-        for (String key : new ArrayList<String>(serverMap.keySet())) {\n-\n-            ProtocolServer protocolServer = serverMap.remove(key);\n-\n-            if (protocolServer != null) {\n-                RemotingServer server = protocolServer.getRemotingServer();\n-                try {\n-                    if (logger.isInfoEnabled()) {\n-                        logger.info(\"Close dubbo server: \" + server.getLocalAddress());\n-                    }\n-                    server.close(ConfigurationUtils.getServerShutdownTimeout());\n-                } catch (Throwable t) {\n-                    logger.warn(t.getMessage(), t);\n-                }\n-            } // ~ end of if ( server != null )\n-\n-        } // ~ end of loop serverMap\n-\n-    } // ~ end of method destroy\n-\n-    @Override\n-    protected <T> Invoker<T> protocolBindingRefer(Class<T> type, URL url) throws RpcException {\n-\n-        ThriftInvoker<T> invoker = new ThriftInvoker<T>(type, url, getClients(url), invokers);\n-\n-        invokers.add(invoker);\n-\n-        return invoker;\n-\n-    }\n-\n-    private ExchangeClient[] getClients(URL url) {\n-\n-        int connections = url.getParameter(CONNECTIONS_KEY, 1);\n-\n-        ExchangeClient[] clients = new ExchangeClient[connections];\n-\n-        for (int i = 0; i < clients.length; i++) {\n-            clients[i] = initClient(url);\n-        }\n-        return clients;\n-    }\n-\n-    private ExchangeClient initClient(URL url) {\n-\n-        ExchangeClient client;\n-\n-//        url = url.addParameter(CODEC_KEY, ThriftCodec.NAME);\n-\n-        try {\n-            client = Exchangers.connect(url);\n-        } catch (RemotingException e) {\n-            throw new RpcException(\"Fail to create remoting client for service(\" + url\n-                    + \"): \" + e.getMessage(), e);\n-        }\n-\n-        return client;\n-\n-    }\n-\n-    private ProtocolServer getServer(URL url) {\n-        // enable sending readonly event when server closes by default\n-        url = url.addParameterIfAbsent(CHANNEL_READONLYEVENT_SENT_KEY, Boolean.TRUE.toString());\n-        String str = url.getParameter(SERVER_KEY, org.apache.dubbo.rpc.Constants.DEFAULT_REMOTING_SERVER);\n-\n-        if (str != null && str.length() > 0 && !ExtensionLoader.getExtensionLoader(Transporter.class).hasExtension(str)) {\n-            throw new RpcException(\"Unsupported server type: \" + str + \", url: \" + url);\n-        }\n-\n-        ExchangeServer server;\n-        try {\n-            server = Exchangers.bind(url, handler);\n-        } catch (RemotingException e) {\n-            throw new RpcException(\"Fail to start server(url: \" + url + \") \" + e.getMessage(), e);\n-        }\n-        str = url.getParameter(CLIENT_KEY);\n-        if (str != null && str.length() > 0) {\n-            Set<String> supportedTypes = ExtensionLoader.getExtensionLoader(Transporter.class).getSupportedExtensions();\n-            if (!supportedTypes.contains(str)) {\n-                throw new RpcException(\"Unsupported client type: \" + str);\n-            }\n-        }\n-        return new ThriftProtocolServer(server);\n-    }\n-\n-    private class ThriftProtocolServer implements ProtocolServer {\n-\n-        private ExchangeServer server;\n-        private String address;\n-\n-        public ThriftProtocolServer(ExchangeServer server) {\n-            this.server = server;\n-        }\n-\n-        @Override\n-        public RemotingServer getRemotingServer() {\n-            return server;\n-        }\n-\n-        @Override\n-        public String getAddress() {\n-            return StringUtils.isNotEmpty(address) ? address : server.getUrl().getAddress();\n-        }\n-\n-        @Override\n-        public void setAddress(String address) {\n-            this.address = address;\n-        }\n-\n-        @Override\n-        public URL getUrl() {\n-            return server.getUrl();\n-        }\n-\n-        @Override\n-        public void reset(URL url) {\n-            server.reset(url);\n-        }\n-\n-        @Override\n-        public void close() {\n-            server.close();\n-        }\n-    }\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.rpc.protocol.thrift;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.config.ConfigurationUtils;\r\n+import org.apache.dubbo.common.extension.ExtensionLoader;\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+import org.apache.dubbo.remoting.Channel;\r\n+import org.apache.dubbo.remoting.RemotingException;\r\n+import org.apache.dubbo.remoting.RemotingServer;\r\n+import org.apache.dubbo.remoting.Transporter;\r\n+import org.apache.dubbo.remoting.exchange.ExchangeChannel;\r\n+import org.apache.dubbo.remoting.exchange.ExchangeClient;\r\n+import org.apache.dubbo.remoting.exchange.ExchangeHandler;\r\n+import org.apache.dubbo.remoting.exchange.ExchangeServer;\r\n+import org.apache.dubbo.remoting.exchange.Exchangers;\r\n+import org.apache.dubbo.remoting.exchange.support.ExchangeHandlerAdapter;\r\n+import org.apache.dubbo.rpc.Exporter;\r\n+import org.apache.dubbo.rpc.Invocation;\r\n+import org.apache.dubbo.rpc.Invoker;\r\n+import org.apache.dubbo.rpc.ProtocolServer;\r\n+import org.apache.dubbo.rpc.Result;\r\n+import org.apache.dubbo.rpc.RpcContext;\r\n+import org.apache.dubbo.rpc.RpcException;\r\n+import org.apache.dubbo.rpc.protocol.AbstractProtocol;\r\n+import org.apache.dubbo.rpc.protocol.dubbo.DubboExporter;\r\n+\r\n+import java.util.ArrayList;\r\n+import java.util.Set;\r\n+import java.util.concurrent.CompletableFuture;\r\n+import java.util.function.Function;\r\n+\r\n+import static org.apache.dubbo.common.constants.CommonConstants.PATH_KEY;\r\n+import static org.apache.dubbo.remoting.Constants.CHANNEL_READONLYEVENT_SENT_KEY;\r\n+import static org.apache.dubbo.remoting.Constants.CLIENT_KEY;\r\n+import static org.apache.dubbo.remoting.Constants.CODEC_KEY;\r\n+import static org.apache.dubbo.remoting.Constants.CONNECTIONS_KEY;\r\n+import static org.apache.dubbo.remoting.Constants.SERVER_KEY;\r\n+import static org.apache.dubbo.rpc.Constants.IS_SERVER_KEY;\r\n+\r\n+/**\r\n+ * @since 2.7.0, use https://github.com/dubbo/dubbo-rpc-native-thrift instead\r\n+ */\r\n+@Deprecated\r\n+public class ThriftProtocol extends AbstractProtocol {\r\n+\r\n+    public static final int DEFAULT_PORT = 40880;\r\n+\r\n+    public static final String NAME = \"thrift\";\r\n+\r\n+    private ExchangeHandler handler = new ExchangeHandlerAdapter() {\r\n+\r\n+        @Override\r\n+        public CompletableFuture<Object> reply(ExchangeChannel channel, Object msg) throws RemotingException {\r\n+\r\n+            if (msg instanceof Invocation) {\r\n+                Invocation inv = (Invocation) msg;\r\n+                String path = (String) inv.getObjectAttachments().get(PATH_KEY);\r\n+                String serviceKey = serviceKey(channel.getLocalAddress().getPort(),\r\n+                        path, null, null);\r\n+                DubboExporter<?> exporter = (DubboExporter<?>) exporterMap.get(serviceKey);\r\n+                if (exporter == null) {\r\n+                    throw new RemotingException(channel,\r\n+                            \"Not found exported service: \"\r\n+                                    + serviceKey\r\n+                                    + \" in \"\r\n+                                    + exporterMap.keySet()\r\n+                                    + \", may be version or group mismatch \"\r\n+                                    + \", channel: consumer: \"\r\n+                                    + channel.getRemoteAddress()\r\n+                                    + \" --> provider: \"\r\n+                                    + channel.getLocalAddress()\r\n+                                    + \", message:\" + msg);\r\n+                }\r\n+\r\n+                RpcContext.getContext().setRemoteAddress(channel.getRemoteAddress());\r\n+\r\n+                Result result = exporter.getInvoker().invoke(inv);\r\n+                return result.thenApply(Function.identity());\r\n+            }\r\n+\r\n+            throw new RemotingException(channel,\r\n+                    \"Unsupported request: \"\r\n+                            + (msg.getClass().getName() + \": \" + msg)\r\n+                            + \", channel: consumer: \"\r\n+                            + channel.getRemoteAddress()\r\n+                            + \" --> provider: \"\r\n+                            + channel.getLocalAddress());\r\n+        }\r\n+\r\n+        @Override\r\n+        public void received(Channel channel, Object message) throws RemotingException {\r\n+            if (message instanceof Invocation) {\r\n+                reply((ExchangeChannel) channel, message);\r\n+            } else {\r\n+                super.received(channel, message);\r\n+            }\r\n+        }\r\n+\r\n+    };\r\n+\r\n+    @Override\r\n+    public int getDefaultPort() {\r\n+        return DEFAULT_PORT;\r\n+    }\r\n+\r\n+    @Override\r\n+    public <T> Exporter<T> export(Invoker<T> invoker) throws RpcException {\r\n+\r\n+        // can use thrift codec only\r\n+        URL url = invoker.getUrl().addParameter(CODEC_KEY, ThriftCodec.NAME);\r\n+        // find server.\r\n+        String key = url.getAddress();\r\n+        // client can expose a service for server to invoke only.\r\n+        boolean isServer = url.getParameter(IS_SERVER_KEY, true);\r\n+        if (isServer && !serverMap.containsKey(key)) {\r\n+            serverMap.put(key, getServer(url));\r\n+        }\r\n+        // export service.\r\n+        key = serviceKey(url);\r\n+        DubboExporter<T> exporter = new DubboExporter<T>(invoker, key, exporterMap);\r\n+        exporterMap.put(key, exporter);\r\n+\r\n+        return exporter;\r\n+    }\r\n+\r\n+    @Override\r\n+    public void destroy() {\r\n+\r\n+        super.destroy();\r\n+\r\n+        for (String key : new ArrayList<String>(serverMap.keySet())) {\r\n+\r\n+            ProtocolServer protocolServer = serverMap.remove(key);\r\n+\r\n+            if (protocolServer != null) {\r\n+                RemotingServer server = protocolServer.getRemotingServer();\r\n+                try {\r\n+                    if (logger.isInfoEnabled()) {\r\n+                        logger.info(\"Close dubbo server: \" + server.getLocalAddress());\r\n+                    }\r\n+                    server.close(ConfigurationUtils.getServerShutdownTimeout());\r\n+                } catch (Throwable t) {\r\n+                    logger.warn(t.getMessage(), t);\r\n+                }\r\n+            } // ~ end of if ( server != null )\r\n+\r\n+        } // ~ end of loop serverMap\r\n+\r\n+    } // ~ end of method destroy\r\n+\r\n+    @Override\r\n+    protected <T> Invoker<T> protocolBindingRefer(Class<T> type, URL url) throws RpcException {\r\n+\r\n+        ThriftInvoker<T> invoker = new ThriftInvoker<T>(type, url, getClients(url), invokers);\r\n+\r\n+        invokers.add(invoker);\r\n+\r\n+        return invoker;\r\n+\r\n+    }\r\n+\r\n+    private ExchangeClient[] getClients(URL url) {\r\n+\r\n+        int connections = url.getParameter(CONNECTIONS_KEY, 1);\r\n+\r\n+        ExchangeClient[] clients = new ExchangeClient[connections];\r\n+\r\n+        for (int i = 0; i < clients.length; i++) {\r\n+            clients[i] = initClient(url);\r\n+        }\r\n+        return clients;\r\n+    }\r\n+\r\n+    private ExchangeClient initClient(URL url) {\r\n+\r\n+        ExchangeClient client;\r\n+\r\n+//        url = url.addParameter(CODEC_KEY, ThriftCodec.NAME);\r\n+\r\n+        try {\r\n+            client = Exchangers.connect(url);\r\n+        } catch (RemotingException e) {\r\n+            throw new RpcException(\"Fail to create remoting client for service(\" + url\r\n+                    + \"): \" + e.getMessage(), e);\r\n+        }\r\n+\r\n+        return client;\r\n+\r\n+    }\r\n+\r\n+    private ProtocolServer getServer(URL url) {\r\n+        // enable sending readonly event when server closes by default\r\n+        url = url.addParameterIfAbsent(CHANNEL_READONLYEVENT_SENT_KEY, Boolean.TRUE.toString());\r\n+        String str = url.getParameter(SERVER_KEY, org.apache.dubbo.rpc.Constants.DEFAULT_REMOTING_SERVER);\r\n+\r\n+        if (str != null && str.length() > 0 && !ExtensionLoader.getExtensionLoader(Transporter.class).hasExtension(str)) {\r\n+            throw new RpcException(\"Unsupported server type: \" + str + \", url: \" + url);\r\n+        }\r\n+\r\n+        ExchangeServer server;\r\n+        try {\r\n+            server = Exchangers.bind(url, handler);\r\n+        } catch (RemotingException e) {\r\n+            throw new RpcException(\"Fail to start server(url: \" + url + \") \" + e.getMessage(), e);\r\n+        }\r\n+        str = url.getParameter(CLIENT_KEY);\r\n+        if (str != null && str.length() > 0) {\r\n+            Set<String> supportedTypes = ExtensionLoader.getExtensionLoader(Transporter.class).getSupportedExtensions();\r\n+            if (!supportedTypes.contains(str)) {\r\n+                throw new RpcException(\"Unsupported client type: \" + str);\r\n+            }\r\n+        }\r\n+        return new ThriftProtocolServer(server);\r\n+    }\r\n+\r\n+    private class ThriftProtocolServer implements ProtocolServer {\r\n+\r\n+        private ExchangeServer server;\r\n+        private String address;\r\n+\r\n+        public ThriftProtocolServer(ExchangeServer server) {\r\n+            this.server = server;\r\n+        }\r\n+\r\n+        @Override\r\n+        public RemotingServer getRemotingServer() {\r\n+            return server;\r\n+        }\r\n+\r\n+        @Override\r\n+        public String getAddress() {\r\n+            return StringUtils.isNotEmpty(address) ? address : server.getUrl().getAddress();\r\n+        }\r\n+\r\n+        @Override\r\n+        public void setAddress(String address) {\r\n+            this.address = address;\r\n+        }\r\n+\r\n+        @Override\r\n+        public URL getUrl() {\r\n+            return server.getUrl();\r\n+        }\r\n+\r\n+        @Override\r\n+        public void reset(URL url) {\r\n+            server.reset(url);\r\n+        }\r\n+\r\n+        @Override\r\n+        public void close() {\r\n+            server.close();\r\n+        }\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/rpc/protocol/thrift/ThriftType.java", "source2": "org/apache/dubbo/rpc/protocol/thrift/ThriftType.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,51 +1,51 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.rpc.protocol.thrift;\n-\n-import java.util.HashMap;\n-import java.util.Map;\n-/**\n- * @since 2.7.0, use https://github.com/dubbo/dubbo-rpc-native-thrift instead\n- */\n-@Deprecated\n-public enum ThriftType {\n-\n-    BOOL, BYTE, I16, I32, I64, DOUBLE, STRING;\n-\n-    private static final Map<Class<?>, ThriftType> TYPES =\n-            new HashMap<Class<?>, ThriftType>();\n-\n-    static {\n-        put(boolean.class, BOOL);\n-        put(Boolean.class, BOOL);\n-        put(byte.class, BYTE);\n-        put(Byte.class, BYTE);\n-        put(short.class, I16);\n-    }\n-\n-    public static ThriftType get(Class<?> key) {\n-        if (key != null) {\n-            return TYPES.get(key);\n-        }\n-        throw new NullPointerException(\"key == null\");\n-    }\n-\n-    private static void put(Class<?> key, ThriftType value) {\n-        TYPES.put(key, value);\n-    }\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.rpc.protocol.thrift;\r\n+\r\n+import java.util.HashMap;\r\n+import java.util.Map;\r\n+/**\r\n+ * @since 2.7.0, use https://github.com/dubbo/dubbo-rpc-native-thrift instead\r\n+ */\r\n+@Deprecated\r\n+public enum ThriftType {\r\n+\r\n+    BOOL, BYTE, I16, I32, I64, DOUBLE, STRING;\r\n+\r\n+    private static final Map<Class<?>, ThriftType> TYPES =\r\n+            new HashMap<Class<?>, ThriftType>();\r\n+\r\n+    static {\r\n+        put(boolean.class, BOOL);\r\n+        put(Boolean.class, BOOL);\r\n+        put(byte.class, BYTE);\r\n+        put(Byte.class, BYTE);\r\n+        put(short.class, I16);\r\n+    }\r\n+\r\n+    public static ThriftType get(Class<?> key) {\r\n+        if (key != null) {\r\n+            return TYPES.get(key);\r\n+        }\r\n+        throw new NullPointerException(\"key == null\");\r\n+    }\r\n+\r\n+    private static void put(Class<?> key, ThriftType value) {\r\n+        TYPES.put(key, value);\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/rpc/protocol/thrift/ThriftUtils.java", "source2": "org/apache/dubbo/rpc/protocol/thrift/ThriftUtils.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,135 +1,135 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.rpc.protocol.thrift;\n-/**\n- * @since 2.7.0, use https://github.com/dubbo/dubbo-rpc-native-thrift instead\n- */\n-@Deprecated\n-public class ThriftUtils {\n-\n-    /**\n-     * Generate class name which represents service arguments.\n-     *\n-     * @param serviceName service name\n-     * @param methodName method name\n-     * @return method args class name or null\n-     */\n-    public static String generateMethodArgsClassName(String serviceName, String methodName) {\n-\n-        int index = serviceName.lastIndexOf(\".\");\n-\n-        if (index > 0) {\n-\n-            return new StringBuilder(32)\n-                    .append(serviceName, 0, index + 1)\n-                    .append(\"$__\")\n-                    .append(serviceName.substring(index + 1))\n-                    .append(\"Stub$\")\n-                    .append(methodName)\n-                    .append(\"_args\")\n-                    .toString();\n-\n-        } else {\n-            return new StringBuffer(32)\n-                    .append(\"$__\")\n-                    .append(serviceName)\n-                    .append(\"Stub$\")\n-                    .append(methodName)\n-                    .append(\"_args\")\n-                    .toString();\n-        }\n-\n-    }\n-\n-    public static String generateMethodResultClassName(String serviceName, String method) {\n-\n-        int index = serviceName.lastIndexOf(\".\");\n-\n-        if (index > 0) {\n-\n-            return new StringBuilder(32)\n-                    .append(serviceName, 0, index + 1)\n-                    .append(\"$__\")\n-                    .append(serviceName.substring(index + 1))\n-                    .append(\"Stub$\")\n-                    .append(method)\n-                    .append(\"_result\")\n-                    .toString();\n-\n-        } else {\n-            return new StringBuilder(32)\n-                    .append(\"$__\")\n-                    .append(serviceName)\n-                    .append(\"Stub$\")\n-                    .append(method)\n-                    .append(\"_result\")\n-                    .toString();\n-        }\n-\n-    }\n-\n-    public static String generateSetMethodName(String fieldName) {\n-\n-        return new StringBuilder(16)\n-                .append(\"set\")\n-                .append(Character.toUpperCase(fieldName.charAt(0)))\n-                .append(fieldName.substring(1))\n-                .toString();\n-\n-    }\n-\n-    public static String generateGetMethodName(String fieldName) {\n-        return new StringBuffer(16)\n-                .append(\"get\")\n-                .append(Character.toUpperCase(fieldName.charAt(0)))\n-                .append(fieldName.substring(1))\n-                .toString();\n-    }\n-\n-    public static String generateMethodArgsClassNameThrift(String serviceName, String methodName) {\n-\n-        int index = serviceName.indexOf(\"$\");\n-\n-        if (index > 0) {\n-            return new StringBuilder(32)\n-                    .append(serviceName, 0, index + 1)\n-                    .append(methodName)\n-                    .append(\"_args\")\n-                    .toString();\n-        }\n-\n-        return null;\n-\n-    }\n-\n-    public static String generateMethodResultClassNameThrift(String serviceName, String methodName) {\n-\n-        int index = serviceName.indexOf(\"$\");\n-\n-        if (index > 0) {\n-            return new StringBuilder(32)\n-                    .append(serviceName, 0, index + 1)\n-                    .append(methodName)\n-                    .append(\"_result\")\n-                    .toString();\n-        }\n-\n-        return null;\n-\n-    }\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.rpc.protocol.thrift;\r\n+/**\r\n+ * @since 2.7.0, use https://github.com/dubbo/dubbo-rpc-native-thrift instead\r\n+ */\r\n+@Deprecated\r\n+public class ThriftUtils {\r\n+\r\n+    /**\r\n+     * Generate class name which represents service arguments.\r\n+     *\r\n+     * @param serviceName service name\r\n+     * @param methodName method name\r\n+     * @return method args class name or null\r\n+     */\r\n+    public static String generateMethodArgsClassName(String serviceName, String methodName) {\r\n+\r\n+        int index = serviceName.lastIndexOf(\".\");\r\n+\r\n+        if (index > 0) {\r\n+\r\n+            return new StringBuilder(32)\r\n+                    .append(serviceName, 0, index + 1)\r\n+                    .append(\"$__\")\r\n+                    .append(serviceName.substring(index + 1))\r\n+                    .append(\"Stub$\")\r\n+                    .append(methodName)\r\n+                    .append(\"_args\")\r\n+                    .toString();\r\n+\r\n+        } else {\r\n+            return new StringBuffer(32)\r\n+                    .append(\"$__\")\r\n+                    .append(serviceName)\r\n+                    .append(\"Stub$\")\r\n+                    .append(methodName)\r\n+                    .append(\"_args\")\r\n+                    .toString();\r\n+        }\r\n+\r\n+    }\r\n+\r\n+    public static String generateMethodResultClassName(String serviceName, String method) {\r\n+\r\n+        int index = serviceName.lastIndexOf(\".\");\r\n+\r\n+        if (index > 0) {\r\n+\r\n+            return new StringBuilder(32)\r\n+                    .append(serviceName, 0, index + 1)\r\n+                    .append(\"$__\")\r\n+                    .append(serviceName.substring(index + 1))\r\n+                    .append(\"Stub$\")\r\n+                    .append(method)\r\n+                    .append(\"_result\")\r\n+                    .toString();\r\n+\r\n+        } else {\r\n+            return new StringBuilder(32)\r\n+                    .append(\"$__\")\r\n+                    .append(serviceName)\r\n+                    .append(\"Stub$\")\r\n+                    .append(method)\r\n+                    .append(\"_result\")\r\n+                    .toString();\r\n+        }\r\n+\r\n+    }\r\n+\r\n+    public static String generateSetMethodName(String fieldName) {\r\n+\r\n+        return new StringBuilder(16)\r\n+                .append(\"set\")\r\n+                .append(Character.toUpperCase(fieldName.charAt(0)))\r\n+                .append(fieldName.substring(1))\r\n+                .toString();\r\n+\r\n+    }\r\n+\r\n+    public static String generateGetMethodName(String fieldName) {\r\n+        return new StringBuffer(16)\r\n+                .append(\"get\")\r\n+                .append(Character.toUpperCase(fieldName.charAt(0)))\r\n+                .append(fieldName.substring(1))\r\n+                .toString();\r\n+    }\r\n+\r\n+    public static String generateMethodArgsClassNameThrift(String serviceName, String methodName) {\r\n+\r\n+        int index = serviceName.indexOf(\"$\");\r\n+\r\n+        if (index > 0) {\r\n+            return new StringBuilder(32)\r\n+                    .append(serviceName, 0, index + 1)\r\n+                    .append(methodName)\r\n+                    .append(\"_args\")\r\n+                    .toString();\r\n+        }\r\n+\r\n+        return null;\r\n+\r\n+    }\r\n+\r\n+    public static String generateMethodResultClassNameThrift(String serviceName, String methodName) {\r\n+\r\n+        int index = serviceName.indexOf(\"$\");\r\n+\r\n+        if (index > 0) {\r\n+            return new StringBuilder(32)\r\n+                    .append(serviceName, 0, index + 1)\r\n+                    .append(methodName)\r\n+                    .append(\"_result\")\r\n+                    .toString();\r\n+        }\r\n+\r\n+        return null;\r\n+\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/rpc/protocol/thrift/ext/MultiServiceProcessor.java", "source2": "org/apache/dubbo/rpc/protocol/thrift/ext/MultiServiceProcessor.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,121 +1,121 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.rpc.protocol.thrift.ext;\n-\n-import org.apache.dubbo.common.logger.Logger;\n-import org.apache.dubbo.common.logger.LoggerFactory;\n-import org.apache.dubbo.rpc.protocol.thrift.ThriftCodec;\n-import org.apache.thrift.TException;\n-import org.apache.thrift.TProcessor;\n-import org.apache.thrift.protocol.TBinaryProtocol;\n-import org.apache.thrift.protocol.TProtocol;\n-import org.apache.thrift.protocol.TProtocolFactory;\n-import org.apache.thrift.transport.TIOStreamTransport;\n-\n-import java.io.ByteArrayOutputStream;\n-import java.util.concurrent.ConcurrentHashMap;\n-import java.util.concurrent.ConcurrentMap;\n-\n-/**\n- * @since 2.7.0, use https://github.com/dubbo/dubbo-rpc-native-thrift to instead of this module\n- */\n-@Deprecated\n-public class MultiServiceProcessor implements TProcessor {\n-\n-    private static final Logger logger = LoggerFactory.getLogger(MultiServiceProcessor.class);\n-\n-    private ConcurrentMap<String, TProcessor> processorMap = new ConcurrentHashMap<String, TProcessor>();\n-\n-    private TProtocolFactory protocolFactory = new TBinaryProtocol.Factory();\n-\n-    public MultiServiceProcessor() {\n-    }\n-\n-    @Override\n-    public boolean process(TProtocol in, TProtocol out) throws TException {\n-\n-        short magic = in.readI16();\n-\n-        if (magic != ThriftCodec.MAGIC) {\n-            logger.error(\"Unsupported magic \" + magic);\n-            return false;\n-        }\n-\n-        in.readI32();\n-        in.readI16();\n-        byte version = in.readByte();\n-        String serviceName = in.readString();\n-        long id = in.readI64();\n-\n-        ByteArrayOutputStream bos = new ByteArrayOutputStream(1024);\n-\n-        TIOStreamTransport transport = new TIOStreamTransport(bos);\n-\n-        TProtocol protocol = protocolFactory.getProtocol(transport);\n-\n-        TProcessor processor = processorMap.get(serviceName);\n-\n-        if (processor == null) {\n-            logger.error(\"Could not find processor for service \" + serviceName);\n-            return false;\n-        }\n-\n-        // todo if exception\n-        boolean result = processor.process(in, protocol);\n-\n-        ByteArrayOutputStream header = new ByteArrayOutputStream(512);\n-\n-        TIOStreamTransport headerTransport = new TIOStreamTransport(header);\n-\n-        TProtocol headerProtocol = protocolFactory.getProtocol(headerTransport);\n-\n-        headerProtocol.writeI16(magic);\n-        headerProtocol.writeI32(Integer.MAX_VALUE);\n-        headerProtocol.writeI16(Short.MAX_VALUE);\n-        headerProtocol.writeByte(version);\n-        headerProtocol.writeString(serviceName);\n-        headerProtocol.writeI64(id);\n-        headerProtocol.getTransport().flush();\n-\n-        out.writeI16(magic);\n-        out.writeI32(bos.size() + header.size());\n-        out.writeI16((short) (0xffff & header.size()));\n-        out.writeByte(version);\n-        out.writeString(serviceName);\n-        out.writeI64(id);\n-\n-        out.getTransport().write(bos.toByteArray());\n-        out.getTransport().flush();\n-\n-        return result;\n-\n-    }\n-\n-    public TProcessor addProcessor(Class service, TProcessor processor) {\n-        if (service != null && processor != null) {\n-            return processorMap.putIfAbsent(service.getName(), processor);\n-        }\n-        return processor;\n-    }\n-\n-    public void setProtocolFactory(TProtocolFactory factory) {\n-        if (factory != null) {\n-            this.protocolFactory = factory;\n-        }\n-    }\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.rpc.protocol.thrift.ext;\r\n+\r\n+import org.apache.dubbo.common.logger.Logger;\r\n+import org.apache.dubbo.common.logger.LoggerFactory;\r\n+import org.apache.dubbo.rpc.protocol.thrift.ThriftCodec;\r\n+import org.apache.thrift.TException;\r\n+import org.apache.thrift.TProcessor;\r\n+import org.apache.thrift.protocol.TBinaryProtocol;\r\n+import org.apache.thrift.protocol.TProtocol;\r\n+import org.apache.thrift.protocol.TProtocolFactory;\r\n+import org.apache.thrift.transport.TIOStreamTransport;\r\n+\r\n+import java.io.ByteArrayOutputStream;\r\n+import java.util.concurrent.ConcurrentHashMap;\r\n+import java.util.concurrent.ConcurrentMap;\r\n+\r\n+/**\r\n+ * @since 2.7.0, use https://github.com/dubbo/dubbo-rpc-native-thrift to instead of this module\r\n+ */\r\n+@Deprecated\r\n+public class MultiServiceProcessor implements TProcessor {\r\n+\r\n+    private static final Logger logger = LoggerFactory.getLogger(MultiServiceProcessor.class);\r\n+\r\n+    private ConcurrentMap<String, TProcessor> processorMap = new ConcurrentHashMap<String, TProcessor>();\r\n+\r\n+    private TProtocolFactory protocolFactory = new TBinaryProtocol.Factory();\r\n+\r\n+    public MultiServiceProcessor() {\r\n+    }\r\n+\r\n+    @Override\r\n+    public boolean process(TProtocol in, TProtocol out) throws TException {\r\n+\r\n+        short magic = in.readI16();\r\n+\r\n+        if (magic != ThriftCodec.MAGIC) {\r\n+            logger.error(\"Unsupported magic \" + magic);\r\n+            return false;\r\n+        }\r\n+\r\n+        in.readI32();\r\n+        in.readI16();\r\n+        byte version = in.readByte();\r\n+        String serviceName = in.readString();\r\n+        long id = in.readI64();\r\n+\r\n+        ByteArrayOutputStream bos = new ByteArrayOutputStream(1024);\r\n+\r\n+        TIOStreamTransport transport = new TIOStreamTransport(bos);\r\n+\r\n+        TProtocol protocol = protocolFactory.getProtocol(transport);\r\n+\r\n+        TProcessor processor = processorMap.get(serviceName);\r\n+\r\n+        if (processor == null) {\r\n+            logger.error(\"Could not find processor for service \" + serviceName);\r\n+            return false;\r\n+        }\r\n+\r\n+        // todo if exception\r\n+        boolean result = processor.process(in, protocol);\r\n+\r\n+        ByteArrayOutputStream header = new ByteArrayOutputStream(512);\r\n+\r\n+        TIOStreamTransport headerTransport = new TIOStreamTransport(header);\r\n+\r\n+        TProtocol headerProtocol = protocolFactory.getProtocol(headerTransport);\r\n+\r\n+        headerProtocol.writeI16(magic);\r\n+        headerProtocol.writeI32(Integer.MAX_VALUE);\r\n+        headerProtocol.writeI16(Short.MAX_VALUE);\r\n+        headerProtocol.writeByte(version);\r\n+        headerProtocol.writeString(serviceName);\r\n+        headerProtocol.writeI64(id);\r\n+        headerProtocol.getTransport().flush();\r\n+\r\n+        out.writeI16(magic);\r\n+        out.writeI32(bos.size() + header.size());\r\n+        out.writeI16((short) (0xffff & header.size()));\r\n+        out.writeByte(version);\r\n+        out.writeString(serviceName);\r\n+        out.writeI64(id);\r\n+\r\n+        out.getTransport().write(bos.toByteArray());\r\n+        out.getTransport().flush();\r\n+\r\n+        return result;\r\n+\r\n+    }\r\n+\r\n+    public TProcessor addProcessor(Class service, TProcessor processor) {\r\n+        if (service != null && processor != null) {\r\n+            return processorMap.putIfAbsent(service.getName(), processor);\r\n+        }\r\n+        return processor;\r\n+    }\r\n+\r\n+    public void setProtocolFactory(TProtocolFactory factory) {\r\n+        if (factory != null) {\r\n+            this.protocolFactory = factory;\r\n+        }\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/rpc/protocol/thrift/io/RandomAccessByteArrayOutputStream.java", "source2": "org/apache/dubbo/rpc/protocol/thrift/io/RandomAccessByteArrayOutputStream.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,117 +1,117 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.rpc.protocol.thrift.io;\n-\n-import org.apache.dubbo.common.io.Bytes;\n-\n-import java.io.IOException;\n-import java.io.OutputStream;\n-import java.io.UnsupportedEncodingException;\n-import java.nio.ByteBuffer;\n-@Deprecated\n-public class RandomAccessByteArrayOutputStream extends OutputStream {\n-\n-    protected byte[] buffer;\n-\n-    protected int count;\n-\n-    public RandomAccessByteArrayOutputStream() {\n-\n-        this(32);\n-    }\n-\n-    public RandomAccessByteArrayOutputStream(int size) {\n-\n-        if (size < 0) {\n-            throw new IllegalArgumentException(\"Negative initial size: \" + size);\n-        }\n-        buffer = new byte[size];\n-    }\n-\n-    @Override\n-    public void write(int b) {\n-\n-        int newcount = count + 1;\n-        if (newcount > buffer.length) {\n-            buffer = Bytes.copyOf(buffer, Math.max(buffer.length << 1, newcount));\n-        }\n-        buffer[count] = (byte) b;\n-        count = newcount;\n-    }\n-\n-    @Override\n-    public void write(byte[] b, int off, int len) {\n-\n-        if ((off < 0) || (off > b.length) || (len < 0) || ((off + len) > b.length) || ((off + len) < 0)) {\n-            throw new IndexOutOfBoundsException();\n-        }\n-        if (len == 0) {\n-            return;\n-        }\n-        int newcount = count + len;\n-        if (newcount > buffer.length) {\n-            buffer = Bytes.copyOf(buffer, Math.max(buffer.length << 1, newcount));\n-        }\n-        System.arraycopy(b, off, buffer, count, len);\n-        count = newcount;\n-    }\n-\n-    public int size() {\n-\n-        return count;\n-    }\n-\n-    public void setWriteIndex(int index) {\n-        count = index;\n-    }\n-\n-    public void reset() {\n-\n-        count = 0;\n-    }\n-\n-    public byte[] toByteArray() {\n-\n-        return Bytes.copyOf(buffer, count);\n-    }\n-\n-    public ByteBuffer toByteBuffer() {\n-\n-        return ByteBuffer.wrap(buffer, 0, count);\n-    }\n-\n-    public void writeTo(OutputStream out) throws IOException {\n-\n-        out.write(buffer, 0, count);\n-    }\n-\n-    @Override\n-    public String toString() {\n-\n-        return new String(buffer, 0, count);\n-    }\n-\n-    public String toString(String charset) throws UnsupportedEncodingException {\n-\n-        return new String(buffer, 0, count, charset);\n-    }\n-\n-    @Override\n-    public void close() throws IOException {\n-    }\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.rpc.protocol.thrift.io;\r\n+\r\n+import org.apache.dubbo.common.io.Bytes;\r\n+\r\n+import java.io.IOException;\r\n+import java.io.OutputStream;\r\n+import java.io.UnsupportedEncodingException;\r\n+import java.nio.ByteBuffer;\r\n+@Deprecated\r\n+public class RandomAccessByteArrayOutputStream extends OutputStream {\r\n+\r\n+    protected byte[] buffer;\r\n+\r\n+    protected int count;\r\n+\r\n+    public RandomAccessByteArrayOutputStream() {\r\n+\r\n+        this(32);\r\n+    }\r\n+\r\n+    public RandomAccessByteArrayOutputStream(int size) {\r\n+\r\n+        if (size < 0) {\r\n+            throw new IllegalArgumentException(\"Negative initial size: \" + size);\r\n+        }\r\n+        buffer = new byte[size];\r\n+    }\r\n+\r\n+    @Override\r\n+    public void write(int b) {\r\n+\r\n+        int newcount = count + 1;\r\n+        if (newcount > buffer.length) {\r\n+            buffer = Bytes.copyOf(buffer, Math.max(buffer.length << 1, newcount));\r\n+        }\r\n+        buffer[count] = (byte) b;\r\n+        count = newcount;\r\n+    }\r\n+\r\n+    @Override\r\n+    public void write(byte[] b, int off, int len) {\r\n+\r\n+        if ((off < 0) || (off > b.length) || (len < 0) || ((off + len) > b.length) || ((off + len) < 0)) {\r\n+            throw new IndexOutOfBoundsException();\r\n+        }\r\n+        if (len == 0) {\r\n+            return;\r\n+        }\r\n+        int newcount = count + len;\r\n+        if (newcount > buffer.length) {\r\n+            buffer = Bytes.copyOf(buffer, Math.max(buffer.length << 1, newcount));\r\n+        }\r\n+        System.arraycopy(b, off, buffer, count, len);\r\n+        count = newcount;\r\n+    }\r\n+\r\n+    public int size() {\r\n+\r\n+        return count;\r\n+    }\r\n+\r\n+    public void setWriteIndex(int index) {\r\n+        count = index;\r\n+    }\r\n+\r\n+    public void reset() {\r\n+\r\n+        count = 0;\r\n+    }\r\n+\r\n+    public byte[] toByteArray() {\r\n+\r\n+        return Bytes.copyOf(buffer, count);\r\n+    }\r\n+\r\n+    public ByteBuffer toByteBuffer() {\r\n+\r\n+        return ByteBuffer.wrap(buffer, 0, count);\r\n+    }\r\n+\r\n+    public void writeTo(OutputStream out) throws IOException {\r\n+\r\n+        out.write(buffer, 0, count);\r\n+    }\r\n+\r\n+    @Override\r\n+    public String toString() {\r\n+\r\n+        return new String(buffer, 0, count);\r\n+    }\r\n+\r\n+    public String toString(String charset) throws UnsupportedEncodingException {\r\n+\r\n+        return new String(buffer, 0, count, charset);\r\n+    }\r\n+\r\n+    @Override\r\n+    public void close() throws IOException {\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "META-INF/maven/org.apache.dubbo/dubbo-rpc-thrift/pom.xml", "source2": "META-INF/maven/org.apache.dubbo/dubbo-rpc-thrift/pom.xml", "comments": ["Format-specific differences are supported for XML files but no file-specific differences were detected; falling back to a binary diff. file(1) reports: XML 1.0 document, ASCII text, with CRLF line terminators"], "has_internal_linenos": true, "unified_diff": "@@ -1,201 +1,195 @@\n 00000000: 3c3f 786d 6c20 7665 7273 696f 6e3d 2231  <?xml version=\"1\n 00000010: 2e30 2220 656e 636f 6469 6e67 3d22 5554  .0\" encoding=\"UT\n-00000020: 462d 3822 3f3e 0d0a 3c21 2d2d 0d0a 2020  F-8\"?>..<!--..  \n-00000030: 4c69 6365 6e73 6564 2074 6f20 7468 6520  Licensed to the \n-00000040: 4170 6163 6865 2053 6f66 7477 6172 6520  Apache Software \n-00000050: 466f 756e 6461 7469 6f6e 2028 4153 4629  Foundation (ASF)\n-00000060: 2075 6e64 6572 206f 6e65 206f 7220 6d6f   under one or mo\n-00000070: 7265 0d0a 2020 636f 6e74 7269 6275 746f  re..  contributo\n-00000080: 7220 6c69 6365 6e73 6520 6167 7265 656d  r license agreem\n-00000090: 656e 7473 2e20 2053 6565 2074 6865 204e  ents.  See the N\n-000000a0: 4f54 4943 4520 6669 6c65 2064 6973 7472  OTICE file distr\n-000000b0: 6962 7574 6564 2077 6974 680d 0a20 2074  ibuted with..  t\n-000000c0: 6869 7320 776f 726b 2066 6f72 2061 6464  his work for add\n-000000d0: 6974 696f 6e61 6c20 696e 666f 726d 6174  itional informat\n-000000e0: 696f 6e20 7265 6761 7264 696e 6720 636f  ion regarding co\n-000000f0: 7079 7269 6768 7420 6f77 6e65 7273 6869  pyright ownershi\n-00000100: 702e 0d0a 2020 5468 6520 4153 4620 6c69  p...  The ASF li\n-00000110: 6365 6e73 6573 2074 6869 7320 6669 6c65  censes this file\n-00000120: 2074 6f20 596f 7520 756e 6465 7220 7468   to You under th\n-00000130: 6520 4170 6163 6865 204c 6963 656e 7365  e Apache License\n-00000140: 2c20 5665 7273 696f 6e20 322e 300d 0a20  , Version 2.0.. \n-00000150: 2028 7468 6520 224c 6963 656e 7365 2229   (the \"License\")\n-00000160: 3b20 796f 7520 6d61 7920 6e6f 7420 7573  ; you may not us\n-00000170: 6520 7468 6973 2066 696c 6520 6578 6365  e this file exce\n-00000180: 7074 2069 6e20 636f 6d70 6c69 616e 6365  pt in compliance\n-00000190: 2077 6974 680d 0a20 2074 6865 204c 6963   with..  the Lic\n-000001a0: 656e 7365 2e20 2059 6f75 206d 6179 206f  ense.  You may o\n-000001b0: 6274 6169 6e20 6120 636f 7079 206f 6620  btain a copy of \n-000001c0: 7468 6520 4c69 6365 6e73 6520 6174 0d0a  the License at..\n-000001d0: 0d0a 2020 2020 2020 6874 7470 3a2f 2f77  ..      http://w\n-000001e0: 7777 2e61 7061 6368 652e 6f72 672f 6c69  ww.apache.org/li\n-000001f0: 6365 6e73 6573 2f4c 4943 454e 5345 2d32  censes/LICENSE-2\n-00000200: 2e30 0d0a 0d0a 2020 556e 6c65 7373 2072  .0....  Unless r\n-00000210: 6571 7569 7265 6420 6279 2061 7070 6c69  equired by appli\n-00000220: 6361 626c 6520 6c61 7720 6f72 2061 6772  cable law or agr\n-00000230: 6565 6420 746f 2069 6e20 7772 6974 696e  eed to in writin\n-00000240: 672c 2073 6f66 7477 6172 650d 0a20 2064  g, software..  d\n-00000250: 6973 7472 6962 7574 6564 2075 6e64 6572  istributed under\n-00000260: 2074 6865 204c 6963 656e 7365 2069 7320   the License is \n-00000270: 6469 7374 7269 6275 7465 6420 6f6e 2061  distributed on a\n-00000280: 6e20 2241 5320 4953 2220 4241 5349 532c  n \"AS IS\" BASIS,\n-00000290: 0d0a 2020 5749 5448 4f55 5420 5741 5252  ..  WITHOUT WARR\n-000002a0: 414e 5449 4553 204f 5220 434f 4e44 4954  ANTIES OR CONDIT\n-000002b0: 494f 4e53 204f 4620 414e 5920 4b49 4e44  IONS OF ANY KIND\n-000002c0: 2c20 6569 7468 6572 2065 7870 7265 7373  , either express\n-000002d0: 206f 7220 696d 706c 6965 642e 0d0a 2020   or implied...  \n-000002e0: 5365 6520 7468 6520 4c69 6365 6e73 6520  See the License \n-000002f0: 666f 7220 7468 6520 7370 6563 6966 6963  for the specific\n-00000300: 206c 616e 6775 6167 6520 676f 7665 726e   language govern\n-00000310: 696e 6720 7065 726d 6973 7369 6f6e 7320  ing permissions \n-00000320: 616e 640d 0a20 206c 696d 6974 6174 696f  and..  limitatio\n-00000330: 6e73 2075 6e64 6572 2074 6865 204c 6963  ns under the Lic\n-00000340: 656e 7365 2e0d 0a20 202d 2d3e 0d0a 3c70  ense...  -->..<p\n-00000350: 726f 6a65 6374 2078 7369 3a73 6368 656d  roject xsi:schem\n-00000360: 614c 6f63 6174 696f 6e3d 2268 7474 703a  aLocation=\"http:\n-00000370: 2f2f 6d61 7665 6e2e 6170 6163 6865 2e6f  //maven.apache.o\n-00000380: 7267 2f50 4f4d 2f34 2e30 2e30 2068 7474  rg/POM/4.0.0 htt\n-00000390: 7073 3a2f 2f6d 6176 656e 2e61 7061 6368  ps://maven.apach\n-000003a0: 652e 6f72 672f 7873 642f 6d61 7665 6e2d  e.org/xsd/maven-\n-000003b0: 342e 302e 302e 7873 6422 2078 6d6c 6e73  4.0.0.xsd\" xmlns\n-000003c0: 3d22 6874 7470 3a2f 2f6d 6176 656e 2e61  =\"http://maven.a\n-000003d0: 7061 6368 652e 6f72 672f 504f 4d2f 342e  pache.org/POM/4.\n-000003e0: 302e 3022 0d0a 2020 2020 786d 6c6e 733a  0.0\"..    xmlns:\n-000003f0: 7873 693d 2268 7474 703a 2f2f 7777 772e  xsi=\"http://www.\n-00000400: 7733 2e6f 7267 2f32 3030 312f 584d 4c53  w3.org/2001/XMLS\n-00000410: 6368 656d 612d 696e 7374 616e 6365 223e  chema-instance\">\n-00000420: 0d0a 2020 3c6d 6f64 656c 5665 7273 696f  ..  <modelVersio\n-00000430: 6e3e 342e 302e 303c 2f6d 6f64 656c 5665  n>4.0.0</modelVe\n-00000440: 7273 696f 6e3e 0d0a 2020 3c70 6172 656e  rsion>..  <paren\n-00000450: 743e 0d0a 2020 2020 3c67 726f 7570 4964  t>..    <groupId\n-00000460: 3e6f 7267 2e61 7061 6368 652e 6475 6262  >org.apache.dubb\n-00000470: 6f3c 2f67 726f 7570 4964 3e0d 0a20 2020  o</groupId>..   \n-00000480: 203c 6172 7469 6661 6374 4964 3e64 7562   <artifactId>dub\n-00000490: 626f 2d72 7063 3c2f 6172 7469 6661 6374  bo-rpc</artifact\n-000004a0: 4964 3e0d 0a20 2020 203c 7665 7273 696f  Id>..    <versio\n-000004b0: 6e3e 322e 372e 3130 3c2f 7665 7273 696f  n>2.7.10</versio\n-000004c0: 6e3e 0d0a 2020 3c2f 7061 7265 6e74 3e0d  n>..  </parent>.\n-000004d0: 0a20 203c 6772 6f75 7049 643e 6f72 672e  .  <groupId>org.\n-000004e0: 6170 6163 6865 2e64 7562 626f 3c2f 6772  apache.dubbo</gr\n-000004f0: 6f75 7049 643e 0d0a 2020 3c61 7274 6966  oupId>..  <artif\n-00000500: 6163 7449 643e 6475 6262 6f2d 7270 632d  actId>dubbo-rpc-\n-00000510: 7468 7269 6674 3c2f 6172 7469 6661 6374  thrift</artifact\n-00000520: 4964 3e0d 0a20 203c 7665 7273 696f 6e3e  Id>..  <version>\n-00000530: 322e 372e 3130 3c2f 7665 7273 696f 6e3e  2.7.10</version>\n-00000540: 0d0a 2020 3c6e 616d 653e 247b 7072 6f6a  ..  <name>${proj\n-00000550: 6563 742e 6172 7469 6661 6374 4964 7d3c  ect.artifactId}<\n-00000560: 2f6e 616d 653e 0d0a 2020 3c64 6573 6372  /name>..  <descr\n-00000570: 6970 7469 6f6e 3e54 6865 2074 6872 6966  iption>The thrif\n-00000580: 7420 7270 6320 6d6f 6475 6c65 206f 6620  t rpc module of \n-00000590: 6475 6262 6f20 7072 6f6a 6563 743c 2f64  dubbo project</d\n-000005a0: 6573 6372 6970 7469 6f6e 3e0d 0a20 203c  escription>..  <\n-000005b0: 6c69 6365 6e73 6573 3e0d 0a20 2020 203c  licenses>..    <\n-000005c0: 6c69 6365 6e73 653e 0d0a 2020 2020 2020  license>..      \n-000005d0: 3c6e 616d 653e 4170 6163 6865 204c 6963  <name>Apache Lic\n-000005e0: 656e 7365 2c20 5665 7273 696f 6e20 322e  ense, Version 2.\n-000005f0: 303c 2f6e 616d 653e 0d0a 2020 2020 2020  0</name>..      \n-00000600: 3c75 726c 3e68 7474 703a 2f2f 7777 772e  <url>http://www.\n-00000610: 6170 6163 6865 2e6f 7267 2f6c 6963 656e  apache.org/licen\n-00000620: 7365 732f 4c49 4345 4e53 452d 322e 303c  ses/LICENSE-2.0<\n-00000630: 2f75 726c 3e0d 0a20 2020 2020 203c 6469  /url>..      <di\n-00000640: 7374 7269 6275 7469 6f6e 3e72 6570 6f3c  stribution>repo<\n-00000650: 2f64 6973 7472 6962 7574 696f 6e3e 0d0a  /distribution>..\n-00000660: 2020 2020 3c2f 6c69 6365 6e73 653e 0d0a      </license>..\n-00000670: 2020 3c2f 6c69 6365 6e73 6573 3e0d 0a20    </licenses>.. \n-00000680: 203c 7072 6f70 6572 7469 6573 3e0d 0a20   <properties>.. \n-00000690: 2020 203c 736b 6970 5f6d 6176 656e 5f64     <skip_maven_d\n-000006a0: 6570 6c6f 793e 6661 6c73 653c 2f73 6b69  eploy>false</ski\n-000006b0: 705f 6d61 7665 6e5f 6465 706c 6f79 3e0d  p_maven_deploy>.\n-000006c0: 0a20 203c 2f70 726f 7065 7274 6965 733e  .  </properties>\n-000006d0: 0d0a 2020 3c64 6570 656e 6465 6e63 6965  ..  <dependencie\n-000006e0: 733e 0d0a 2020 2020 3c64 6570 656e 6465  s>..    <depende\n-000006f0: 6e63 793e 0d0a 2020 2020 2020 3c67 726f  ncy>..      <gro\n-00000700: 7570 4964 3e6f 7267 2e61 7061 6368 652e  upId>org.apache.\n-00000710: 6475 6262 6f3c 2f67 726f 7570 4964 3e0d  dubbo</groupId>.\n-00000720: 0a20 2020 2020 203c 6172 7469 6661 6374  .      <artifact\n-00000730: 4964 3e64 7562 626f 2d72 7063 2d61 7069  Id>dubbo-rpc-api\n-00000740: 3c2f 6172 7469 6661 6374 4964 3e0d 0a20  </artifactId>.. \n-00000750: 2020 2020 203c 7665 7273 696f 6e3e 247b       <version>${\n-00000760: 7072 6f6a 6563 742e 7061 7265 6e74 2e76  project.parent.v\n-00000770: 6572 7369 6f6e 7d3c 2f76 6572 7369 6f6e  ersion}</version\n-00000780: 3e0d 0a20 2020 203c 2f64 6570 656e 6465  >..    </depende\n-00000790: 6e63 793e 0d0a 2020 2020 3c64 6570 656e  ncy>..    <depen\n-000007a0: 6465 6e63 793e 0d0a 2020 2020 2020 3c67  dency>..      <g\n-000007b0: 726f 7570 4964 3e6f 7267 2e61 7061 6368  roupId>org.apach\n-000007c0: 652e 6475 6262 6f3c 2f67 726f 7570 4964  e.dubbo</groupId\n-000007d0: 3e0d 0a20 2020 2020 203c 6172 7469 6661  >..      <artifa\n-000007e0: 6374 4964 3e64 7562 626f 2d72 7063 2d64  ctId>dubbo-rpc-d\n-000007f0: 7562 626f 3c2f 6172 7469 6661 6374 4964  ubbo</artifactId\n-00000800: 3e0d 0a20 2020 2020 203c 7665 7273 696f  >..      <versio\n-00000810: 6e3e 247b 7072 6f6a 6563 742e 7061 7265  n>${project.pare\n-00000820: 6e74 2e76 6572 7369 6f6e 7d3c 2f76 6572  nt.version}</ver\n-00000830: 7369 6f6e 3e0d 0a20 2020 203c 2f64 6570  sion>..    </dep\n-00000840: 656e 6465 6e63 793e 0d0a 2020 2020 3c64  endency>..    <d\n-00000850: 6570 656e 6465 6e63 793e 0d0a 2020 2020  ependency>..    \n-00000860: 2020 3c67 726f 7570 4964 3e6f 7267 2e61    <groupId>org.a\n-00000870: 7061 6368 652e 6475 6262 6f3c 2f67 726f  pache.dubbo</gro\n-00000880: 7570 4964 3e0d 0a20 2020 2020 203c 6172  upId>..      <ar\n-00000890: 7469 6661 6374 4964 3e64 7562 626f 2d72  tifactId>dubbo-r\n-000008a0: 656d 6f74 696e 672d 6170 693c 2f61 7274  emoting-api</art\n-000008b0: 6966 6163 7449 643e 0d0a 2020 2020 2020  ifactId>..      \n-000008c0: 3c76 6572 7369 6f6e 3e24 7b70 726f 6a65  <version>${proje\n-000008d0: 6374 2e70 6172 656e 742e 7665 7273 696f  ct.parent.versio\n-000008e0: 6e7d 3c2f 7665 7273 696f 6e3e 0d0a 2020  n}</version>..  \n-000008f0: 2020 3c2f 6465 7065 6e64 656e 6379 3e0d    </dependency>.\n-00000900: 0a20 2020 203c 6465 7065 6e64 656e 6379  .    <dependency\n-00000910: 3e0d 0a20 2020 2020 203c 6772 6f75 7049  >..      <groupI\n-00000920: 643e 6f72 672e 6170 6163 6865 2e64 7562  d>org.apache.dub\n-00000930: 626f 3c2f 6772 6f75 7049 643e 0d0a 2020  bo</groupId>..  \n-00000940: 2020 2020 3c61 7274 6966 6163 7449 643e      <artifactId>\n-00000950: 6475 6262 6f2d 7265 6d6f 7469 6e67 2d6e  dubbo-remoting-n\n-00000960: 6574 7479 343c 2f61 7274 6966 6163 7449  etty4</artifactI\n-00000970: 643e 0d0a 2020 2020 2020 3c76 6572 7369  d>..      <versi\n-00000980: 6f6e 3e24 7b70 726f 6a65 6374 2e70 6172  on>${project.par\n-00000990: 656e 742e 7665 7273 696f 6e7d 3c2f 7665  ent.version}</ve\n-000009a0: 7273 696f 6e3e 0d0a 2020 2020 3c2f 6465  rsion>..    </de\n-000009b0: 7065 6e64 656e 6379 3e0d 0a20 2020 203c  pendency>..    <\n-000009c0: 6465 7065 6e64 656e 6379 3e0d 0a20 2020  dependency>..   \n-000009d0: 2020 203c 6772 6f75 7049 643e 6f72 672e     <groupId>org.\n-000009e0: 6170 6163 6865 2e74 6872 6966 743c 2f67  apache.thrift</g\n-000009f0: 726f 7570 4964 3e0d 0a20 2020 2020 203c  roupId>..      <\n-00000a00: 6172 7469 6661 6374 4964 3e6c 6962 7468  artifactId>libth\n-00000a10: 7269 6674 3c2f 6172 7469 6661 6374 4964  rift</artifactId\n-00000a20: 3e0d 0a20 2020 203c 2f64 6570 656e 6465  >..    </depende\n-00000a30: 6e63 793e 0d0a 2020 2020 3c64 6570 656e  ncy>..    <depen\n-00000a40: 6465 6e63 793e 0d0a 2020 2020 2020 3c67  dency>..      <g\n-00000a50: 726f 7570 4964 3e6f 7267 2e73 7072 696e  roupId>org.sprin\n-00000a60: 6766 7261 6d65 776f 726b 3c2f 6772 6f75  gframework</grou\n-00000a70: 7049 643e 0d0a 2020 2020 2020 3c61 7274  pId>..      <art\n-00000a80: 6966 6163 7449 643e 7370 7269 6e67 2d63  ifactId>spring-c\n-00000a90: 6f6e 7465 7874 3c2f 6172 7469 6661 6374  ontext</artifact\n-00000aa0: 4964 3e0d 0a20 2020 203c 2f64 6570 656e  Id>..    </depen\n-00000ab0: 6465 6e63 793e 0d0a 2020 2020 3c64 6570  dency>..    <dep\n-00000ac0: 656e 6465 6e63 793e 0d0a 2020 2020 2020  endency>..      \n-00000ad0: 3c67 726f 7570 4964 3e6f 7267 2e61 7061  <groupId>org.apa\n-00000ae0: 6368 652e 6475 6262 6f3c 2f67 726f 7570  che.dubbo</group\n-00000af0: 4964 3e0d 0a20 2020 2020 203c 6172 7469  Id>..      <arti\n-00000b00: 6661 6374 4964 3e64 7562 626f 2d63 6f6e  factId>dubbo-con\n-00000b10: 6669 672d 7370 7269 6e67 3c2f 6172 7469  fig-spring</arti\n-00000b20: 6661 6374 4964 3e0d 0a20 2020 2020 203c  factId>..      <\n-00000b30: 7665 7273 696f 6e3e 247b 7072 6f6a 6563  version>${projec\n-00000b40: 742e 7061 7265 6e74 2e76 6572 7369 6f6e  t.parent.version\n-00000b50: 7d3c 2f76 6572 7369 6f6e 3e0d 0a20 2020  }</version>..   \n-00000b60: 2020 203c 7363 6f70 653e 7465 7374 3c2f     <scope>test</\n-00000b70: 7363 6f70 653e 0d0a 2020 2020 3c2f 6465  scope>..    </de\n-00000b80: 7065 6e64 656e 6379 3e0d 0a20 2020 203c  pendency>..    <\n-00000b90: 6465 7065 6e64 656e 6379 3e0d 0a20 2020  dependency>..   \n-00000ba0: 2020 203c 6772 6f75 7049 643e 6f72 672e     <groupId>org.\n-00000bb0: 6170 6163 6865 2e64 7562 626f 3c2f 6772  apache.dubbo</gr\n-00000bc0: 6f75 7049 643e 0d0a 2020 2020 2020 3c61  oupId>..      <a\n-00000bd0: 7274 6966 6163 7449 643e 6475 6262 6f2d  rtifactId>dubbo-\n-00000be0: 7265 6769 7374 7279 2d6d 756c 7469 6361  registry-multica\n-00000bf0: 7374 3c2f 6172 7469 6661 6374 4964 3e0d  st</artifactId>.\n-00000c00: 0a20 2020 2020 203c 7665 7273 696f 6e3e  .      <version>\n-00000c10: 247b 7072 6f6a 6563 742e 7061 7265 6e74  ${project.parent\n-00000c20: 2e76 6572 7369 6f6e 7d3c 2f76 6572 7369  .version}</versi\n-00000c30: 6f6e 3e0d 0a20 2020 2020 203c 7363 6f70  on>..      <scop\n-00000c40: 653e 7465 7374 3c2f 7363 6f70 653e 0d0a  e>test</scope>..\n-00000c50: 2020 2020 3c2f 6465 7065 6e64 656e 6379      </dependency\n-00000c60: 3e0d 0a20 203c 2f64 6570 656e 6465 6e63  >..  </dependenc\n-00000c70: 6965 733e 0d0a 3c2f 7072 6f6a 6563 743e  ies>..</project>\n-00000c80: 0d0a                                     ..\n+00000020: 462d 3822 3f3e 0a3c 212d 2d0a 2020 4c69  F-8\"?>.<!--.  Li\n+00000030: 6365 6e73 6564 2074 6f20 7468 6520 4170  censed to the Ap\n+00000040: 6163 6865 2053 6f66 7477 6172 6520 466f  ache Software Fo\n+00000050: 756e 6461 7469 6f6e 2028 4153 4629 2075  undation (ASF) u\n+00000060: 6e64 6572 206f 6e65 206f 7220 6d6f 7265  nder one or more\n+00000070: 0a20 2063 6f6e 7472 6962 7574 6f72 206c  .  contributor l\n+00000080: 6963 656e 7365 2061 6772 6565 6d65 6e74  icense agreement\n+00000090: 732e 2020 5365 6520 7468 6520 4e4f 5449  s.  See the NOTI\n+000000a0: 4345 2066 696c 6520 6469 7374 7269 6275  CE file distribu\n+000000b0: 7465 6420 7769 7468 0a20 2074 6869 7320  ted with.  this \n+000000c0: 776f 726b 2066 6f72 2061 6464 6974 696f  work for additio\n+000000d0: 6e61 6c20 696e 666f 726d 6174 696f 6e20  nal information \n+000000e0: 7265 6761 7264 696e 6720 636f 7079 7269  regarding copyri\n+000000f0: 6768 7420 6f77 6e65 7273 6869 702e 0a20  ght ownership.. \n+00000100: 2054 6865 2041 5346 206c 6963 656e 7365   The ASF license\n+00000110: 7320 7468 6973 2066 696c 6520 746f 2059  s this file to Y\n+00000120: 6f75 2075 6e64 6572 2074 6865 2041 7061  ou under the Apa\n+00000130: 6368 6520 4c69 6365 6e73 652c 2056 6572  che License, Ver\n+00000140: 7369 6f6e 2032 2e30 0a20 2028 7468 6520  sion 2.0.  (the \n+00000150: 224c 6963 656e 7365 2229 3b20 796f 7520  \"License\"); you \n+00000160: 6d61 7920 6e6f 7420 7573 6520 7468 6973  may not use this\n+00000170: 2066 696c 6520 6578 6365 7074 2069 6e20   file except in \n+00000180: 636f 6d70 6c69 616e 6365 2077 6974 680a  compliance with.\n+00000190: 2020 7468 6520 4c69 6365 6e73 652e 2020    the License.  \n+000001a0: 596f 7520 6d61 7920 6f62 7461 696e 2061  You may obtain a\n+000001b0: 2063 6f70 7920 6f66 2074 6865 204c 6963   copy of the Lic\n+000001c0: 656e 7365 2061 740a 0a20 2020 2020 2068  ense at..      h\n+000001d0: 7474 703a 2f2f 7777 772e 6170 6163 6865  ttp://www.apache\n+000001e0: 2e6f 7267 2f6c 6963 656e 7365 732f 4c49  .org/licenses/LI\n+000001f0: 4345 4e53 452d 322e 300a 0a20 2055 6e6c  CENSE-2.0..  Unl\n+00000200: 6573 7320 7265 7175 6972 6564 2062 7920  ess required by \n+00000210: 6170 706c 6963 6162 6c65 206c 6177 206f  applicable law o\n+00000220: 7220 6167 7265 6564 2074 6f20 696e 2077  r agreed to in w\n+00000230: 7269 7469 6e67 2c20 736f 6674 7761 7265  riting, software\n+00000240: 0a20 2064 6973 7472 6962 7574 6564 2075  .  distributed u\n+00000250: 6e64 6572 2074 6865 204c 6963 656e 7365  nder the License\n+00000260: 2069 7320 6469 7374 7269 6275 7465 6420   is distributed \n+00000270: 6f6e 2061 6e20 2241 5320 4953 2220 4241  on an \"AS IS\" BA\n+00000280: 5349 532c 0a20 2057 4954 484f 5554 2057  SIS,.  WITHOUT W\n+00000290: 4152 5241 4e54 4945 5320 4f52 2043 4f4e  ARRANTIES OR CON\n+000002a0: 4449 5449 4f4e 5320 4f46 2041 4e59 204b  DITIONS OF ANY K\n+000002b0: 494e 442c 2065 6974 6865 7220 6578 7072  IND, either expr\n+000002c0: 6573 7320 6f72 2069 6d70 6c69 6564 2e0a  ess or implied..\n+000002d0: 2020 5365 6520 7468 6520 4c69 6365 6e73    See the Licens\n+000002e0: 6520 666f 7220 7468 6520 7370 6563 6966  e for the specif\n+000002f0: 6963 206c 616e 6775 6167 6520 676f 7665  ic language gove\n+00000300: 726e 696e 6720 7065 726d 6973 7369 6f6e  rning permission\n+00000310: 7320 616e 640a 2020 6c69 6d69 7461 7469  s and.  limitati\n+00000320: 6f6e 7320 756e 6465 7220 7468 6520 4c69  ons under the Li\n+00000330: 6365 6e73 652e 0a20 202d 2d3e 0a3c 7072  cense..  -->.<pr\n+00000340: 6f6a 6563 7420 7873 693a 7363 6865 6d61  oject xsi:schema\n+00000350: 4c6f 6361 7469 6f6e 3d22 6874 7470 3a2f  Location=\"http:/\n+00000360: 2f6d 6176 656e 2e61 7061 6368 652e 6f72  /maven.apache.or\n+00000370: 672f 504f 4d2f 342e 302e 3020 6874 7470  g/POM/4.0.0 http\n+00000380: 733a 2f2f 6d61 7665 6e2e 6170 6163 6865  s://maven.apache\n+00000390: 2e6f 7267 2f78 7364 2f6d 6176 656e 2d34  .org/xsd/maven-4\n+000003a0: 2e30 2e30 2e78 7364 2220 786d 6c6e 733d  .0.0.xsd\" xmlns=\n+000003b0: 2268 7474 703a 2f2f 6d61 7665 6e2e 6170  \"http://maven.ap\n+000003c0: 6163 6865 2e6f 7267 2f50 4f4d 2f34 2e30  ache.org/POM/4.0\n+000003d0: 2e30 220a 2020 2020 786d 6c6e 733a 7873  .0\".    xmlns:xs\n+000003e0: 693d 2268 7474 703a 2f2f 7777 772e 7733  i=\"http://www.w3\n+000003f0: 2e6f 7267 2f32 3030 312f 584d 4c53 6368  .org/2001/XMLSch\n+00000400: 656d 612d 696e 7374 616e 6365 223e 0a20  ema-instance\">. \n+00000410: 203c 6d6f 6465 6c56 6572 7369 6f6e 3e34   <modelVersion>4\n+00000420: 2e30 2e30 3c2f 6d6f 6465 6c56 6572 7369  .0.0</modelVersi\n+00000430: 6f6e 3e0a 2020 3c70 6172 656e 743e 0a20  on>.  <parent>. \n+00000440: 2020 203c 6772 6f75 7049 643e 6f72 672e     <groupId>org.\n+00000450: 6170 6163 6865 2e64 7562 626f 3c2f 6772  apache.dubbo</gr\n+00000460: 6f75 7049 643e 0a20 2020 203c 6172 7469  oupId>.    <arti\n+00000470: 6661 6374 4964 3e64 7562 626f 2d72 7063  factId>dubbo-rpc\n+00000480: 3c2f 6172 7469 6661 6374 4964 3e0a 2020  </artifactId>.  \n+00000490: 2020 3c76 6572 7369 6f6e 3e32 2e37 2e31    <version>2.7.1\n+000004a0: 303c 2f76 6572 7369 6f6e 3e0a 2020 3c2f  0</version>.  </\n+000004b0: 7061 7265 6e74 3e0a 2020 3c67 726f 7570  parent>.  <group\n+000004c0: 4964 3e6f 7267 2e61 7061 6368 652e 6475  Id>org.apache.du\n+000004d0: 6262 6f3c 2f67 726f 7570 4964 3e0a 2020  bbo</groupId>.  \n+000004e0: 3c61 7274 6966 6163 7449 643e 6475 6262  <artifactId>dubb\n+000004f0: 6f2d 7270 632d 7468 7269 6674 3c2f 6172  o-rpc-thrift</ar\n+00000500: 7469 6661 6374 4964 3e0a 2020 3c76 6572  tifactId>.  <ver\n+00000510: 7369 6f6e 3e32 2e37 2e31 303c 2f76 6572  sion>2.7.10</ver\n+00000520: 7369 6f6e 3e0a 2020 3c6e 616d 653e 247b  sion>.  <name>${\n+00000530: 7072 6f6a 6563 742e 6172 7469 6661 6374  project.artifact\n+00000540: 4964 7d3c 2f6e 616d 653e 0a20 203c 6465  Id}</name>.  <de\n+00000550: 7363 7269 7074 696f 6e3e 5468 6520 7468  scription>The th\n+00000560: 7269 6674 2072 7063 206d 6f64 756c 6520  rift rpc module \n+00000570: 6f66 2064 7562 626f 2070 726f 6a65 6374  of dubbo project\n+00000580: 3c2f 6465 7363 7269 7074 696f 6e3e 0a20  </description>. \n+00000590: 203c 6c69 6365 6e73 6573 3e0a 2020 2020   <licenses>.    \n+000005a0: 3c6c 6963 656e 7365 3e0a 2020 2020 2020  <license>.      \n+000005b0: 3c6e 616d 653e 4170 6163 6865 204c 6963  <name>Apache Lic\n+000005c0: 656e 7365 2c20 5665 7273 696f 6e20 322e  ense, Version 2.\n+000005d0: 303c 2f6e 616d 653e 0a20 2020 2020 203c  0</name>.      <\n+000005e0: 7572 6c3e 6874 7470 3a2f 2f77 7777 2e61  url>http://www.a\n+000005f0: 7061 6368 652e 6f72 672f 6c69 6365 6e73  pache.org/licens\n+00000600: 6573 2f4c 4943 454e 5345 2d32 2e30 3c2f  es/LICENSE-2.0</\n+00000610: 7572 6c3e 0a20 2020 2020 203c 6469 7374  url>.      <dist\n+00000620: 7269 6275 7469 6f6e 3e72 6570 6f3c 2f64  ribution>repo</d\n+00000630: 6973 7472 6962 7574 696f 6e3e 0a20 2020  istribution>.   \n+00000640: 203c 2f6c 6963 656e 7365 3e0a 2020 3c2f   </license>.  </\n+00000650: 6c69 6365 6e73 6573 3e0a 2020 3c70 726f  licenses>.  <pro\n+00000660: 7065 7274 6965 733e 0a20 2020 203c 736b  perties>.    <sk\n+00000670: 6970 5f6d 6176 656e 5f64 6570 6c6f 793e  ip_maven_deploy>\n+00000680: 6661 6c73 653c 2f73 6b69 705f 6d61 7665  false</skip_mave\n+00000690: 6e5f 6465 706c 6f79 3e0a 2020 3c2f 7072  n_deploy>.  </pr\n+000006a0: 6f70 6572 7469 6573 3e0a 2020 3c64 6570  operties>.  <dep\n+000006b0: 656e 6465 6e63 6965 733e 0a20 2020 203c  endencies>.    <\n+000006c0: 6465 7065 6e64 656e 6379 3e0a 2020 2020  dependency>.    \n+000006d0: 2020 3c67 726f 7570 4964 3e6f 7267 2e61    <groupId>org.a\n+000006e0: 7061 6368 652e 6475 6262 6f3c 2f67 726f  pache.dubbo</gro\n+000006f0: 7570 4964 3e0a 2020 2020 2020 3c61 7274  upId>.      <art\n+00000700: 6966 6163 7449 643e 6475 6262 6f2d 7270  ifactId>dubbo-rp\n+00000710: 632d 6170 693c 2f61 7274 6966 6163 7449  c-api</artifactI\n+00000720: 643e 0a20 2020 2020 203c 7665 7273 696f  d>.      <versio\n+00000730: 6e3e 247b 7072 6f6a 6563 742e 7061 7265  n>${project.pare\n+00000740: 6e74 2e76 6572 7369 6f6e 7d3c 2f76 6572  nt.version}</ver\n+00000750: 7369 6f6e 3e0a 2020 2020 3c2f 6465 7065  sion>.    </depe\n+00000760: 6e64 656e 6379 3e0a 2020 2020 3c64 6570  ndency>.    <dep\n+00000770: 656e 6465 6e63 793e 0a20 2020 2020 203c  endency>.      <\n+00000780: 6772 6f75 7049 643e 6f72 672e 6170 6163  groupId>org.apac\n+00000790: 6865 2e64 7562 626f 3c2f 6772 6f75 7049  he.dubbo</groupI\n+000007a0: 643e 0a20 2020 2020 203c 6172 7469 6661  d>.      <artifa\n+000007b0: 6374 4964 3e64 7562 626f 2d72 7063 2d64  ctId>dubbo-rpc-d\n+000007c0: 7562 626f 3c2f 6172 7469 6661 6374 4964  ubbo</artifactId\n+000007d0: 3e0a 2020 2020 2020 3c76 6572 7369 6f6e  >.      <version\n+000007e0: 3e24 7b70 726f 6a65 6374 2e70 6172 656e  >${project.paren\n+000007f0: 742e 7665 7273 696f 6e7d 3c2f 7665 7273  t.version}</vers\n+00000800: 696f 6e3e 0a20 2020 203c 2f64 6570 656e  ion>.    </depen\n+00000810: 6465 6e63 793e 0a20 2020 203c 6465 7065  dency>.    <depe\n+00000820: 6e64 656e 6379 3e0a 2020 2020 2020 3c67  ndency>.      <g\n+00000830: 726f 7570 4964 3e6f 7267 2e61 7061 6368  roupId>org.apach\n+00000840: 652e 6475 6262 6f3c 2f67 726f 7570 4964  e.dubbo</groupId\n+00000850: 3e0a 2020 2020 2020 3c61 7274 6966 6163  >.      <artifac\n+00000860: 7449 643e 6475 6262 6f2d 7265 6d6f 7469  tId>dubbo-remoti\n+00000870: 6e67 2d61 7069 3c2f 6172 7469 6661 6374  ng-api</artifact\n+00000880: 4964 3e0a 2020 2020 2020 3c76 6572 7369  Id>.      <versi\n+00000890: 6f6e 3e24 7b70 726f 6a65 6374 2e70 6172  on>${project.par\n+000008a0: 656e 742e 7665 7273 696f 6e7d 3c2f 7665  ent.version}</ve\n+000008b0: 7273 696f 6e3e 0a20 2020 203c 2f64 6570  rsion>.    </dep\n+000008c0: 656e 6465 6e63 793e 0a20 2020 203c 6465  endency>.    <de\n+000008d0: 7065 6e64 656e 6379 3e0a 2020 2020 2020  pendency>.      \n+000008e0: 3c67 726f 7570 4964 3e6f 7267 2e61 7061  <groupId>org.apa\n+000008f0: 6368 652e 6475 6262 6f3c 2f67 726f 7570  che.dubbo</group\n+00000900: 4964 3e0a 2020 2020 2020 3c61 7274 6966  Id>.      <artif\n+00000910: 6163 7449 643e 6475 6262 6f2d 7265 6d6f  actId>dubbo-remo\n+00000920: 7469 6e67 2d6e 6574 7479 343c 2f61 7274  ting-netty4</art\n+00000930: 6966 6163 7449 643e 0a20 2020 2020 203c  ifactId>.      <\n+00000940: 7665 7273 696f 6e3e 247b 7072 6f6a 6563  version>${projec\n+00000950: 742e 7061 7265 6e74 2e76 6572 7369 6f6e  t.parent.version\n+00000960: 7d3c 2f76 6572 7369 6f6e 3e0a 2020 2020  }</version>.    \n+00000970: 3c2f 6465 7065 6e64 656e 6379 3e0a 2020  </dependency>.  \n+00000980: 2020 3c64 6570 656e 6465 6e63 793e 0a20    <dependency>. \n+00000990: 2020 2020 203c 6772 6f75 7049 643e 6f72       <groupId>or\n+000009a0: 672e 6170 6163 6865 2e74 6872 6966 743c  g.apache.thrift<\n+000009b0: 2f67 726f 7570 4964 3e0a 2020 2020 2020  /groupId>.      \n+000009c0: 3c61 7274 6966 6163 7449 643e 6c69 6274  <artifactId>libt\n+000009d0: 6872 6966 743c 2f61 7274 6966 6163 7449  hrift</artifactI\n+000009e0: 643e 0a20 2020 203c 2f64 6570 656e 6465  d>.    </depende\n+000009f0: 6e63 793e 0a20 2020 203c 6465 7065 6e64  ncy>.    <depend\n+00000a00: 656e 6379 3e0a 2020 2020 2020 3c67 726f  ency>.      <gro\n+00000a10: 7570 4964 3e6f 7267 2e73 7072 696e 6766  upId>org.springf\n+00000a20: 7261 6d65 776f 726b 3c2f 6772 6f75 7049  ramework</groupI\n+00000a30: 643e 0a20 2020 2020 203c 6172 7469 6661  d>.      <artifa\n+00000a40: 6374 4964 3e73 7072 696e 672d 636f 6e74  ctId>spring-cont\n+00000a50: 6578 743c 2f61 7274 6966 6163 7449 643e  ext</artifactId>\n+00000a60: 0a20 2020 203c 2f64 6570 656e 6465 6e63  .    </dependenc\n+00000a70: 793e 0a20 2020 203c 6465 7065 6e64 656e  y>.    <dependen\n+00000a80: 6379 3e0a 2020 2020 2020 3c67 726f 7570  cy>.      <group\n+00000a90: 4964 3e6f 7267 2e61 7061 6368 652e 6475  Id>org.apache.du\n+00000aa0: 6262 6f3c 2f67 726f 7570 4964 3e0a 2020  bbo</groupId>.  \n+00000ab0: 2020 2020 3c61 7274 6966 6163 7449 643e      <artifactId>\n+00000ac0: 6475 6262 6f2d 636f 6e66 6967 2d73 7072  dubbo-config-spr\n+00000ad0: 696e 673c 2f61 7274 6966 6163 7449 643e  ing</artifactId>\n+00000ae0: 0a20 2020 2020 203c 7665 7273 696f 6e3e  .      <version>\n+00000af0: 247b 7072 6f6a 6563 742e 7061 7265 6e74  ${project.parent\n+00000b00: 2e76 6572 7369 6f6e 7d3c 2f76 6572 7369  .version}</versi\n+00000b10: 6f6e 3e0a 2020 2020 2020 3c73 636f 7065  on>.      <scope\n+00000b20: 3e74 6573 743c 2f73 636f 7065 3e0a 2020  >test</scope>.  \n+00000b30: 2020 3c2f 6465 7065 6e64 656e 6379 3e0a    </dependency>.\n+00000b40: 2020 2020 3c64 6570 656e 6465 6e63 793e      <dependency>\n+00000b50: 0a20 2020 2020 203c 6772 6f75 7049 643e  .      <groupId>\n+00000b60: 6f72 672e 6170 6163 6865 2e64 7562 626f  org.apache.dubbo\n+00000b70: 3c2f 6772 6f75 7049 643e 0a20 2020 2020  </groupId>.     \n+00000b80: 203c 6172 7469 6661 6374 4964 3e64 7562   <artifactId>dub\n+00000b90: 626f 2d72 6567 6973 7472 792d 6d75 6c74  bo-registry-mult\n+00000ba0: 6963 6173 743c 2f61 7274 6966 6163 7449  icast</artifactI\n+00000bb0: 643e 0a20 2020 2020 203c 7665 7273 696f  d>.      <versio\n+00000bc0: 6e3e 247b 7072 6f6a 6563 742e 7061 7265  n>${project.pare\n+00000bd0: 6e74 2e76 6572 7369 6f6e 7d3c 2f76 6572  nt.version}</ver\n+00000be0: 7369 6f6e 3e0a 2020 2020 2020 3c73 636f  sion>.      <sco\n+00000bf0: 7065 3e74 6573 743c 2f73 636f 7065 3e0a  pe>test</scope>.\n+00000c00: 2020 2020 3c2f 6465 7065 6e64 656e 6379      </dependency\n+00000c10: 3e0a 2020 3c2f 6465 7065 6e64 656e 6369  >.  </dependenci\n+00000c20: 6573 3e0a 3c2f 7072 6f6a 6563 743e 0a    es>.</project>.\n"}]}
