{"diffoscope-json-version": 1, "source1": "/input1", "source2": "/input2", "unified_diff": null, "details": [{"source1": "zipinfo {}", "source2": "zipinfo {}", "unified_diff": "@@ -1,67 +1,67 @@\n-Zip file size: 314077 bytes, number of entries: 65\n+Zip file size: 322014 bytes, number of entries: 65\n -rw----     2.0 fat        0 bx stor 70-Jan-01 00:00 META-INF/\n -rw----     2.0 fat     5324 bX stor 70-Jan-01 00:00 META-INF/DEPENDENCIES\n -rw----     2.0 fat    11358 bX stor 70-Jan-01 00:00 META-INF/LICENSE\n -rw----     2.0 fat       25 bX stor 70-Jan-01 00:00 META-INF/MANIFEST.MF\n -rw----     2.0 fat      173 bX stor 70-Jan-01 00:00 META-INF/NOTICE\n -rw----     2.0 fat        0 bx stor 70-Jan-01 00:00 META-INF/dubbo/\n -rw----     2.0 fat        0 bx stor 70-Jan-01 00:00 META-INF/dubbo/internal/\n--rw----     2.0 fat       75 bX stor 70-Jan-01 00:00 META-INF/dubbo/internal/org.apache.dubbo.event.EventListener\n--rw----     2.0 fat       91 bX stor 70-Jan-01 00:00 META-INF/dubbo/internal/org.apache.dubbo.metadata.MetadataServiceExporter\n+-rw----     2.0 fat       76 bX stor 70-Jan-01 00:00 META-INF/dubbo/internal/org.apache.dubbo.event.EventListener\n+-rw----     2.0 fat       93 bX stor 70-Jan-01 00:00 META-INF/dubbo/internal/org.apache.dubbo.metadata.MetadataServiceExporter\n -rw----     2.0 fat       67 bX stor 70-Jan-01 00:00 META-INF/dubbo/internal/org.apache.dubbo.registry.client.ServiceInstanceCustomizer\n -rw----     2.0 fat        0 bx stor 70-Jan-01 00:00 META-INF/maven/\n -rw----     2.0 fat        0 bx stor 70-Jan-01 00:00 META-INF/maven/org.apache.dubbo/\n -rw----     2.0 fat        0 bx stor 70-Jan-01 00:00 META-INF/maven/org.apache.dubbo/dubbo-config-api/\n -rw----     2.0 fat        0 bX stor 70-Jan-01 00:00 META-INF/maven/org.apache.dubbo/dubbo-config-api/pom.properties\n--rw----     2.0 fat     8066 bX stor 70-Jan-01 00:00 META-INF/maven/org.apache.dubbo/dubbo-config-api/pom.xml\n+-rw----     2.0 fat     7844 bX stor 70-Jan-01 00:00 META-INF/maven/org.apache.dubbo/dubbo-config-api/pom.xml\n -rw----     2.0 fat        0 bx stor 70-Jan-01 00:00 org/\n -rw----     2.0 fat        0 bx stor 70-Jan-01 00:00 org/apache/\n -rw----     2.0 fat        0 bx stor 70-Jan-01 00:00 org/apache/dubbo/\n -rw----     2.0 fat        0 bx stor 70-Jan-01 00:00 org/apache/dubbo/config/\n--rw----     2.0 fat     1137 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/ConfigInitializer.java\n--rw----     2.0 fat     1116 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/ConfigPostProcessor.java\n--rw----     2.0 fat     4895 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/DubboShutdownHook.java\n--rw----     2.0 fat    24129 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/ReferenceConfig.java\n--rw----     2.0 fat    32215 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/ServiceConfig.java\n+-rw----     2.0 fat     1173 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/ConfigInitializer.java\n+-rw----     2.0 fat     1151 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/ConfigPostProcessor.java\n+-rw----     2.0 fat     5044 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/DubboShutdownHook.java\n+-rw----     2.0 fat    24683 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/ReferenceConfig.java\n+-rw----     2.0 fat    32942 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/ServiceConfig.java\n -rw----     2.0 fat        0 bx stor 70-Jan-01 00:00 org/apache/dubbo/config/bootstrap/\n--rw----     2.0 fat    52396 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/bootstrap/DubboBootstrap.java\n--rw----     2.0 fat     1132 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/bootstrap/DubboBootstrapStartStopListener.java\n+-rw----     2.0 fat    53805 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/bootstrap/DubboBootstrap.java\n+-rw----     2.0 fat     1166 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/bootstrap/DubboBootstrapStartStopListener.java\n -rw----     2.0 fat        0 bx stor 70-Jan-01 00:00 org/apache/dubbo/config/bootstrap/builders/\n--rw----     2.0 fat     2533 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/bootstrap/builders/AbstractBuilder.java\n--rw----     2.0 fat     9212 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/bootstrap/builders/AbstractInterfaceBuilder.java\n--rw----     2.0 fat     5506 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/bootstrap/builders/AbstractMethodBuilder.java\n--rw----     2.0 fat     4105 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/bootstrap/builders/AbstractReferenceBuilder.java\n--rw----     2.0 fat     6787 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/bootstrap/builders/AbstractServiceBuilder.java\n--rw----     2.0 fat     6767 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/bootstrap/builders/ApplicationBuilder.java\n--rw----     2.0 fat     1865 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/bootstrap/builders/ArgumentBuilder.java\n--rw----     2.0 fat     4350 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/bootstrap/builders/ConfigCenterBuilder.java\n--rw----     2.0 fat     3389 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/bootstrap/builders/ConsumerBuilder.java\n--rw----     2.0 fat     4303 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/bootstrap/builders/MetadataReportBuilder.java\n--rw----     2.0 fat     6115 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/bootstrap/builders/MethodBuilder.java\n--rw----     2.0 fat     3460 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/bootstrap/builders/ModuleBuilder.java\n--rw----     2.0 fat     3748 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/bootstrap/builders/MonitorBuilder.java\n--rw----     2.0 fat    10054 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/bootstrap/builders/ProtocolBuilder.java\n--rw----     2.0 fat     6786 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/bootstrap/builders/ProviderBuilder.java\n--rw----     2.0 fat     4644 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/bootstrap/builders/ReferenceBuilder.java\n--rw----     2.0 fat     9666 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/bootstrap/builders/RegistryBuilder.java\n--rw----     2.0 fat     4440 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/bootstrap/builders/ServiceBuilder.java\n--rw----     2.0 fat     1034 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/bootstrap/builders/package-info.java\n+-rw----     2.0 fat     2615 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/bootstrap/builders/AbstractBuilder.java\n+-rw----     2.0 fat     9557 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/bootstrap/builders/AbstractInterfaceBuilder.java\n+-rw----     2.0 fat     5719 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/bootstrap/builders/AbstractMethodBuilder.java\n+-rw----     2.0 fat     4266 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/bootstrap/builders/AbstractReferenceBuilder.java\n+-rw----     2.0 fat     7059 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/bootstrap/builders/AbstractServiceBuilder.java\n+-rw----     2.0 fat     6981 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/bootstrap/builders/ApplicationBuilder.java\n+-rw----     2.0 fat     1928 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/bootstrap/builders/ArgumentBuilder.java\n+-rw----     2.0 fat     4491 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/bootstrap/builders/ConfigCenterBuilder.java\n+-rw----     2.0 fat     3507 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/bootstrap/builders/ConsumerBuilder.java\n+-rw----     2.0 fat     4447 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/bootstrap/builders/MetadataReportBuilder.java\n+-rw----     2.0 fat     6352 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/bootstrap/builders/MethodBuilder.java\n+-rw----     2.0 fat     3592 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/bootstrap/builders/ModuleBuilder.java\n+-rw----     2.0 fat     3885 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/bootstrap/builders/MonitorBuilder.java\n+-rw----     2.0 fat    10481 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/bootstrap/builders/ProtocolBuilder.java\n+-rw----     2.0 fat     7079 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/bootstrap/builders/ProviderBuilder.java\n+-rw----     2.0 fat     4809 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/bootstrap/builders/ReferenceBuilder.java\n+-rw----     2.0 fat    10049 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/bootstrap/builders/RegistryBuilder.java\n+-rw----     2.0 fat     4601 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/bootstrap/builders/ServiceBuilder.java\n+-rw----     2.0 fat     1054 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/bootstrap/builders/package-info.java\n -rw----     2.0 fat        0 bx stor 70-Jan-01 00:00 org/apache/dubbo/config/event/\n--rw----     2.0 fat     1145 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/event/DubboServiceDestroyedEvent.java\n--rw----     2.0 fat     1680 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/event/DubboShutdownHookRegisteredEvent.java\n--rw----     2.0 fat     1688 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/event/DubboShutdownHookUnregisteredEvent.java\n--rw----     2.0 fat     1444 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/event/ReferenceConfigDestroyedEvent.java\n--rw----     2.0 fat     1642 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/event/ReferenceConfigInitializedEvent.java\n--rw----     2.0 fat     1274 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/event/ServiceConfigExportedEvent.java\n--rw----     2.0 fat     1282 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/event/ServiceConfigUnexportedEvent.java\n+-rw----     2.0 fat     1177 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/event/DubboServiceDestroyedEvent.java\n+-rw----     2.0 fat     1726 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/event/DubboShutdownHookRegisteredEvent.java\n+-rw----     2.0 fat     1733 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/event/DubboShutdownHookUnregisteredEvent.java\n+-rw----     2.0 fat     1484 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/event/ReferenceConfigDestroyedEvent.java\n+-rw----     2.0 fat     1690 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/event/ReferenceConfigInitializedEvent.java\n+-rw----     2.0 fat     1310 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/event/ServiceConfigExportedEvent.java\n+-rw----     2.0 fat     1318 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/event/ServiceConfigUnexportedEvent.java\n -rw----     2.0 fat        0 bx stor 70-Jan-01 00:00 org/apache/dubbo/config/event/listener/\n--rw----     2.0 fat     1857 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/event/listener/LoggingEventListener.java\n+-rw----     2.0 fat     1908 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/event/listener/LoggingEventListener.java\n -rw----     2.0 fat        0 bx stor 70-Jan-01 00:00 org/apache/dubbo/config/invoker/\n--rw----     2.0 fat     2045 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/invoker/DelegateProviderMetaDataInvoker.java\n+-rw----     2.0 fat     2112 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/invoker/DelegateProviderMetaDataInvoker.java\n -rw----     2.0 fat        0 bx stor 70-Jan-01 00:00 org/apache/dubbo/config/metadata/\n--rw----     2.0 fat     4697 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/metadata/ConfigurableMetadataServiceExporter.java\n--rw----     2.0 fat     2579 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/metadata/ServiceInstancePortCustomizer.java\n+-rw----     2.0 fat     4826 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/metadata/ConfigurableMetadataServiceExporter.java\n+-rw----     2.0 fat     2643 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/metadata/ServiceInstancePortCustomizer.java\n -rw----     2.0 fat        0 bx stor 70-Jan-01 00:00 org/apache/dubbo/config/utils/\n--rw----     2.0 fat    29526 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/utils/ConfigValidationUtils.java\n--rw----     2.0 fat     8829 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/utils/ReferenceConfigCache.java\n-65 files, 300651 bytes uncompressed, 300651 bytes compressed:  0.0%\n+-rw----     2.0 fat    30184 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/utils/ConfigValidationUtils.java\n+-rw----     2.0 fat     9081 bX stor 70-Jan-01 00:00 org/apache/dubbo/config/utils/ReferenceConfigCache.java\n+65 files, 308588 bytes uncompressed, 308588 bytes compressed:  0.0%\n"}, {"source1": "zipdetails --redact --scan --utc {}", "source2": "zipdetails --redact --scan --utc {}", "unified_diff": "@@ -192,3456 +192,3456 @@\n # WARNING: Offset 0x43D7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n 04413 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n 04415   Length              0005 (5)\n 04417   Flags               01 (1) 'Modification'\n 04418   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-0441C PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+0441C PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n \n-04467 DATA DESCRIPTOR       08074B50 (134695760)\n-0446B CRC                   2E6A10BD (778703037)\n-0446F Compressed Size       0000004B (75)\n-04473 Uncompressed Size     0000004B (75)\n-\n-04477 LOCAL HEADER #9       04034B50 (67324752)\n-0447B Extract Zip Spec      14 (20) '2.0'\n-0447C Extract OS            00 (0) 'MS-DOS'\n-0447D General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-0447F Compression Method    0000 (0) 'Stored'\n-04481 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-04485 CRC                   00000000 (0)\n-04489 Compressed Size       00000000 (0)\n-0448D Uncompressed Size     00000000 (0)\n-04491 Filename Length       0049 (73)\n-04493 Extra Length          0009 (9)\n-04495 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4495: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-044DE Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-044E0   Length              0005 (5)\n-044E2   Flags               01 (1) 'Modification'\n-044E3   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-044E7 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n-\n-04542 DATA DESCRIPTOR       08074B50 (134695760)\n-04546 CRC                   175EE5B1 (392095153)\n-0454A Compressed Size       0000005B (91)\n-0454E Uncompressed Size     0000005B (91)\n-\n-04552 LOCAL HEADER #10      04034B50 (67324752)\n-04556 Extract Zip Spec      14 (20) '2.0'\n-04557 Extract OS            00 (0) 'MS-DOS'\n-04558 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-0455A Compression Method    0000 (0) 'Stored'\n-0455C Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-04560 CRC                   00000000 (0)\n-04564 Compressed Size       00000000 (0)\n-04568 Uncompressed Size     00000000 (0)\n-0456C Filename Length       0052 (82)\n-0456E Extra Length          0009 (9)\n-04570 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4570: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-045C2 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-045C4   Length              0005 (5)\n-045C6   Flags               01 (1) 'Modification'\n-045C7   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-045CB PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n-\n-0460E DATA DESCRIPTOR       08074B50 (134695760)\n-04612 CRC                   02CBA695 (46900885)\n-04616 Compressed Size       00000043 (67)\n-0461A Uncompressed Size     00000043 (67)\n-\n-0461E LOCAL HEADER #11      04034B50 (67324752)\n-04622 Extract Zip Spec      14 (20) '2.0'\n-04623 Extract OS            00 (0) 'MS-DOS'\n-04624 General Purpose Flag  0000 (0)\n-04626 Compression Method    0000 (0) 'Stored'\n-04628 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-0462C CRC                   00000000 (0)\n-04630 Compressed Size       00000000 (0)\n-04634 Uncompressed Size     00000000 (0)\n-04638 Filename Length       000F (15)\n-0463A Extra Length          0009 (9)\n-0463C Filename              'XXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x463C: Filename 'XXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-0464B Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-0464D   Length              0005 (5)\n-0464F   Flags               01 (1) 'Modification'\n-04650   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-04654 LOCAL HEADER #12      04034B50 (67324752)\n-04658 Extract Zip Spec      14 (20) '2.0'\n-04659 Extract OS            00 (0) 'MS-DOS'\n-0465A General Purpose Flag  0000 (0)\n-0465C Compression Method    0000 (0) 'Stored'\n-0465E Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-04662 CRC                   00000000 (0)\n-04666 Compressed Size       00000000 (0)\n-0466A Uncompressed Size     00000000 (0)\n-0466E Filename Length       0020 (32)\n-04670 Extra Length          0009 (9)\n-04672 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4672: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-04692 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-04694   Length              0005 (5)\n-04696   Flags               01 (1) 'Modification'\n-04697   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-0469B LOCAL HEADER #13      04034B50 (67324752)\n-0469F Extract Zip Spec      14 (20) '2.0'\n-046A0 Extract OS            00 (0) 'MS-DOS'\n-046A1 General Purpose Flag  0000 (0)\n-046A3 Compression Method    0000 (0) 'Stored'\n-046A5 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-046A9 CRC                   00000000 (0)\n-046AD Compressed Size       00000000 (0)\n-046B1 Uncompressed Size     00000000 (0)\n-046B5 Filename Length       0031 (49)\n-046B7 Extra Length          0009 (9)\n-046B9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x46B9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-046EA Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-046EC   Length              0005 (5)\n-046EE   Flags               01 (1) 'Modification'\n-046EF   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-046F3 LOCAL HEADER #14      04034B50 (67324752)\n-046F7 Extract Zip Spec      14 (20) '2.0'\n-046F8 Extract OS            00 (0) 'MS-DOS'\n-046F9 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-046FB Compression Method    0000 (0) 'Stored'\n-046FD Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-04701 CRC                   00000000 (0)\n-04705 Compressed Size       00000000 (0)\n-04709 Uncompressed Size     00000000 (0)\n-0470D Filename Length       003F (63)\n-0470F Extra Length          0009 (9)\n-04711 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4711: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-04750 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-04752   Length              0005 (5)\n-04754   Flags               01 (1) 'Modification'\n-04755   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-04759 DATA DESCRIPTOR       08074B50 (134695760)\n-0475D CRC                   00000000 (0)\n-04761 Compressed Size       00000000 (0)\n-04765 Uncompressed Size     00000000 (0)\n-\n-04769 LOCAL HEADER #15      04034B50 (67324752)\n-0476D Extract Zip Spec      14 (20) '2.0'\n-0476E Extract OS            00 (0) 'MS-DOS'\n-0476F General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-04771 Compression Method    0000 (0) 'Stored'\n-04773 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-04777 CRC                   00000000 (0)\n-0477B Compressed Size       00000000 (0)\n-0477F Uncompressed Size     00000000 (0)\n-04783 Filename Length       0038 (56)\n-04785 Extra Length          0009 (9)\n-04787 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4787: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-047BF Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-047C1   Length              0005 (5)\n-047C3   Flags               01 (1) 'Modification'\n-047C4   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-047C8 PAYLOAD\n-\n-0674A DATA DESCRIPTOR       08074B50 (134695760)\n-0674E CRC                   48945B27 (1217682215)\n-06752 Compressed Size       00001F82 (8066)\n-06756 Uncompressed Size     00001F82 (8066)\n-\n-0675A LOCAL HEADER #16      04034B50 (67324752)\n-0675E Extract Zip Spec      14 (20) '2.0'\n-0675F Extract OS            00 (0) 'MS-DOS'\n-06760 General Purpose Flag  0000 (0)\n-06762 Compression Method    0000 (0) 'Stored'\n-06764 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-06768 CRC                   00000000 (0)\n-0676C Compressed Size       00000000 (0)\n-06770 Uncompressed Size     00000000 (0)\n-06774 Filename Length       0004 (4)\n-06776 Extra Length          0009 (9)\n-06778 Filename              'XXXX'\n-#\n-# WARNING: Offset 0x6778: Filename 'XXXX'\n-#          Zero length filename\n-#\n-0677C Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-0677E   Length              0005 (5)\n-06780   Flags               01 (1) 'Modification'\n-06781   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-06785 LOCAL HEADER #17      04034B50 (67324752)\n-06789 Extract Zip Spec      14 (20) '2.0'\n-0678A Extract OS            00 (0) 'MS-DOS'\n-0678B General Purpose Flag  0000 (0)\n-0678D Compression Method    0000 (0) 'Stored'\n-0678F Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-06793 CRC                   00000000 (0)\n-06797 Compressed Size       00000000 (0)\n-0679B Uncompressed Size     00000000 (0)\n-0679F Filename Length       000B (11)\n-067A1 Extra Length          0009 (9)\n-067A3 Filename              'XXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x67A3: Filename 'XXXXXXXXXXX'\n-#          Zero length filename\n-#\n-067AE Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-067B0   Length              0005 (5)\n-067B2   Flags               01 (1) 'Modification'\n-067B3   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-067B7 LOCAL HEADER #18      04034B50 (67324752)\n-067BB Extract Zip Spec      14 (20) '2.0'\n-067BC Extract OS            00 (0) 'MS-DOS'\n-067BD General Purpose Flag  0000 (0)\n-067BF Compression Method    0000 (0) 'Stored'\n-067C1 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-067C5 CRC                   00000000 (0)\n-067C9 Compressed Size       00000000 (0)\n-067CD Uncompressed Size     00000000 (0)\n-067D1 Filename Length       0011 (17)\n-067D3 Extra Length          0009 (9)\n-067D5 Filename              'XXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x67D5: Filename 'XXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-067E6 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-067E8   Length              0005 (5)\n-067EA   Flags               01 (1) 'Modification'\n-067EB   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-067EF LOCAL HEADER #19      04034B50 (67324752)\n-067F3 Extract Zip Spec      14 (20) '2.0'\n-067F4 Extract OS            00 (0) 'MS-DOS'\n-067F5 General Purpose Flag  0000 (0)\n-067F7 Compression Method    0000 (0) 'Stored'\n-067F9 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-067FD CRC                   00000000 (0)\n-06801 Compressed Size       00000000 (0)\n-06805 Uncompressed Size     00000000 (0)\n-06809 Filename Length       0018 (24)\n-0680B Extra Length          0009 (9)\n-0680D Filename              'XXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x680D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-06825 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-06827   Length              0005 (5)\n-06829   Flags               01 (1) 'Modification'\n-0682A   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-0682E LOCAL HEADER #20      04034B50 (67324752)\n-06832 Extract Zip Spec      14 (20) '2.0'\n-06833 Extract OS            00 (0) 'MS-DOS'\n-06834 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-06836 Compression Method    0000 (0) 'Stored'\n-06838 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-0683C CRC                   00000000 (0)\n-06840 Compressed Size       00000000 (0)\n-06844 Uncompressed Size     00000000 (0)\n-06848 Filename Length       002E (46)\n-0684A Extra Length          0009 (9)\n-0684C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x684C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-0687A Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-0687C   Length              0005 (5)\n-0687E   Flags               01 (1) 'Modification'\n-0687F   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-06883 PAYLOAD\n-\n-06CF4 DATA DESCRIPTOR       08074B50 (134695760)\n-06CF8 CRC                   44C14167 (1153515879)\n-06CFC Compressed Size       00000471 (1137)\n-06D00 Uncompressed Size     00000471 (1137)\n-\n-06D04 LOCAL HEADER #21      04034B50 (67324752)\n-06D08 Extract Zip Spec      14 (20) '2.0'\n-06D09 Extract OS            00 (0) 'MS-DOS'\n-06D0A General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-06D0C Compression Method    0000 (0) 'Stored'\n-06D0E Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-06D12 CRC                   00000000 (0)\n-06D16 Compressed Size       00000000 (0)\n-06D1A Uncompressed Size     00000000 (0)\n-06D1E Filename Length       0030 (48)\n-06D20 Extra Length          0009 (9)\n-06D22 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x6D22: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-06D52 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-06D54   Length              0005 (5)\n-06D56   Flags               01 (1) 'Modification'\n-06D57   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-06D5B PAYLOAD\n-\n-071B7 DATA DESCRIPTOR       08074B50 (134695760)\n-071BB CRC                   F5917ED9 (4119953113)\n-071BF Compressed Size       0000045C (1116)\n-071C3 Uncompressed Size     0000045C (1116)\n-\n-071C7 LOCAL HEADER #22      04034B50 (67324752)\n-071CB Extract Zip Spec      14 (20) '2.0'\n-071CC Extract OS            00 (0) 'MS-DOS'\n-071CD General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-071CF Compression Method    0000 (0) 'Stored'\n-071D1 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-071D5 CRC                   00000000 (0)\n-071D9 Compressed Size       00000000 (0)\n-071DD Uncompressed Size     00000000 (0)\n-071E1 Filename Length       002E (46)\n-071E3 Extra Length          0009 (9)\n-071E5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x71E5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-07213 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-07215   Length              0005 (5)\n-07217   Flags               01 (1) 'Modification'\n-07218   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-0721C PAYLOAD\n-\n-0853B DATA DESCRIPTOR       08074B50 (134695760)\n-0853F CRC                   7CE2D61E (2095240734)\n-08543 Compressed Size       0000131F (4895)\n-08547 Uncompressed Size     0000131F (4895)\n-\n-0854B LOCAL HEADER #23      04034B50 (67324752)\n-0854F Extract Zip Spec      14 (20) '2.0'\n-08550 Extract OS            00 (0) 'MS-DOS'\n-08551 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-08553 Compression Method    0000 (0) 'Stored'\n-08555 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-08559 CRC                   00000000 (0)\n-0855D Compressed Size       00000000 (0)\n-08561 Uncompressed Size     00000000 (0)\n-08565 Filename Length       002C (44)\n-08567 Extra Length          0009 (9)\n-08569 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x8569: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-08595 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-08597   Length              0005 (5)\n-08599   Flags               01 (1) 'Modification'\n-0859A   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-0859E PAYLOAD\n-\n-0E3DF DATA DESCRIPTOR       08074B50 (134695760)\n-0E3E3 CRC                   5F946D70 (1603562864)\n-0E3E7 Compressed Size       00005E41 (24129)\n-0E3EB Uncompressed Size     00005E41 (24129)\n-\n-0E3EF LOCAL HEADER #24      04034B50 (67324752)\n-0E3F3 Extract Zip Spec      14 (20) '2.0'\n-0E3F4 Extract OS            00 (0) 'MS-DOS'\n-0E3F5 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-0E3F7 Compression Method    0000 (0) 'Stored'\n-0E3F9 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-0E3FD CRC                   00000000 (0)\n-0E401 Compressed Size       00000000 (0)\n-0E405 Uncompressed Size     00000000 (0)\n-0E409 Filename Length       002A (42)\n-0E40B Extra Length          0009 (9)\n-0E40D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0xE40D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-0E437 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-0E439   Length              0005 (5)\n-0E43B   Flags               01 (1) 'Modification'\n-0E43C   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-0E440 PAYLOAD\n-\n-16217 DATA DESCRIPTOR       08074B50 (134695760)\n-1621B CRC                   CBF03B71 (3421518705)\n-1621F Compressed Size       00007DD7 (32215)\n-16223 Uncompressed Size     00007DD7 (32215)\n-\n-16227 LOCAL HEADER #25      04034B50 (67324752)\n-1622B Extract Zip Spec      14 (20) '2.0'\n-1622C Extract OS            00 (0) 'MS-DOS'\n-1622D General Purpose Flag  0000 (0)\n-1622F Compression Method    0000 (0) 'Stored'\n-16231 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-16235 CRC                   00000000 (0)\n-16239 Compressed Size       00000000 (0)\n-1623D Uncompressed Size     00000000 (0)\n-16241 Filename Length       0022 (34)\n-16243 Extra Length          0009 (9)\n-16245 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x16245: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-16267 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-16269   Length              0005 (5)\n-1626B   Flags               01 (1) 'Modification'\n-1626C   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-16270 LOCAL HEADER #26      04034B50 (67324752)\n-16274 Extract Zip Spec      14 (20) '2.0'\n-16275 Extract OS            00 (0) 'MS-DOS'\n-16276 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-16278 Compression Method    0000 (0) 'Stored'\n-1627A Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-1627E CRC                   00000000 (0)\n-16282 Compressed Size       00000000 (0)\n-16286 Uncompressed Size     00000000 (0)\n-1628A Filename Length       0035 (53)\n-1628C Extra Length          0009 (9)\n-1628E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x1628E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-162C3 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-162C5   Length              0005 (5)\n-162C7   Flags               01 (1) 'Modification'\n-162C8   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-162CC PAYLOAD\n-\n-22F78 DATA DESCRIPTOR       08074B50 (134695760)\n-22F7C CRC                   57D2914C (1473417548)\n-22F80 Compressed Size       0000CCAC (52396)\n-22F84 Uncompressed Size     0000CCAC (52396)\n-\n-22F88 LOCAL HEADER #27      04034B50 (67324752)\n-22F8C Extract Zip Spec      14 (20) '2.0'\n-22F8D Extract OS            00 (0) 'MS-DOS'\n-22F8E General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-22F90 Compression Method    0000 (0) 'Stored'\n-22F92 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-22F96 CRC                   00000000 (0)\n-22F9A Compressed Size       00000000 (0)\n-22F9E Uncompressed Size     00000000 (0)\n-22FA2 Filename Length       0046 (70)\n-22FA4 Extra Length          0009 (9)\n-22FA6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x22FA6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-22FEC Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-22FEE   Length              0005 (5)\n-22FF0   Flags               01 (1) 'Modification'\n-22FF1   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-22FF5 PAYLOAD\n-\n-23461 DATA DESCRIPTOR       08074B50 (134695760)\n-23465 CRC                   BB643DBD (3143908797)\n-23469 Compressed Size       0000046C (1132)\n-2346D Uncompressed Size     0000046C (1132)\n-\n-23471 LOCAL HEADER #28      04034B50 (67324752)\n-23475 Extract Zip Spec      14 (20) '2.0'\n-23476 Extract OS            00 (0) 'MS-DOS'\n-23477 General Purpose Flag  0000 (0)\n-23479 Compression Method    0000 (0) 'Stored'\n-2347B Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-2347F CRC                   00000000 (0)\n-23483 Compressed Size       00000000 (0)\n-23487 Uncompressed Size     00000000 (0)\n-2348B Filename Length       002B (43)\n-2348D Extra Length          0009 (9)\n-2348F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x2348F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-234BA Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-234BC   Length              0005 (5)\n-234BE   Flags               01 (1) 'Modification'\n-234BF   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-234C3 LOCAL HEADER #29      04034B50 (67324752)\n-234C7 Extract Zip Spec      14 (20) '2.0'\n-234C8 Extract OS            00 (0) 'MS-DOS'\n-234C9 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-234CB Compression Method    0000 (0) 'Stored'\n-234CD Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-234D1 CRC                   00000000 (0)\n-234D5 Compressed Size       00000000 (0)\n-234D9 Uncompressed Size     00000000 (0)\n-234DD Filename Length       003F (63)\n-234DF Extra Length          0009 (9)\n-234E1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x234E1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-23520 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-23522   Length              0005 (5)\n-23524   Flags               01 (1) 'Modification'\n-23525   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-23529 PAYLOAD\n-\n-23F0E DATA DESCRIPTOR       08074B50 (134695760)\n-23F12 CRC                   272CCF3E (657248062)\n-23F16 Compressed Size       000009E5 (2533)\n-23F1A Uncompressed Size     000009E5 (2533)\n-\n-23F1E LOCAL HEADER #30      04034B50 (67324752)\n-23F22 Extract Zip Spec      14 (20) '2.0'\n-23F23 Extract OS            00 (0) 'MS-DOS'\n-23F24 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-23F26 Compression Method    0000 (0) 'Stored'\n-23F28 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-23F2C CRC                   00000000 (0)\n-23F30 Compressed Size       00000000 (0)\n-23F34 Uncompressed Size     00000000 (0)\n-23F38 Filename Length       0048 (72)\n-23F3A Extra Length          0009 (9)\n-23F3C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x23F3C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-23F84 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-23F86   Length              0005 (5)\n-23F88   Flags               01 (1) 'Modification'\n-23F89   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-23F8D PAYLOAD\n-\n-26389 DATA DESCRIPTOR       08074B50 (134695760)\n-2638D CRC                   A2DFDA9A (2732579482)\n-26391 Compressed Size       000023FC (9212)\n-26395 Uncompressed Size     000023FC (9212)\n-\n-26399 LOCAL HEADER #31      04034B50 (67324752)\n-2639D Extract Zip Spec      14 (20) '2.0'\n-2639E Extract OS            00 (0) 'MS-DOS'\n-2639F General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-263A1 Compression Method    0000 (0) 'Stored'\n-263A3 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-263A7 CRC                   00000000 (0)\n-263AB Compressed Size       00000000 (0)\n-263AF Uncompressed Size     00000000 (0)\n-263B3 Filename Length       0045 (69)\n-263B5 Extra Length          0009 (9)\n-263B7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x263B7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-263FC Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-263FE   Length              0005 (5)\n-26400   Flags               01 (1) 'Modification'\n-26401   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-26405 PAYLOAD\n-\n-27987 DATA DESCRIPTOR       08074B50 (134695760)\n-2798B CRC                   99D438F5 (2580822261)\n-2798F Compressed Size       00001582 (5506)\n-27993 Uncompressed Size     00001582 (5506)\n-\n-27997 LOCAL HEADER #32      04034B50 (67324752)\n-2799B Extract Zip Spec      14 (20) '2.0'\n-2799C Extract OS            00 (0) 'MS-DOS'\n-2799D General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-2799F Compression Method    0000 (0) 'Stored'\n-279A1 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-279A5 CRC                   00000000 (0)\n-279A9 Compressed Size       00000000 (0)\n-279AD Uncompressed Size     00000000 (0)\n-279B1 Filename Length       0048 (72)\n-279B3 Extra Length          0009 (9)\n-279B5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x279B5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-279FD Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-279FF   Length              0005 (5)\n-27A01   Flags               01 (1) 'Modification'\n-27A02   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-27A06 PAYLOAD\n-\n-28A0F DATA DESCRIPTOR       08074B50 (134695760)\n-28A13 CRC                   348CD6A3 (881645219)\n-28A17 Compressed Size       00001009 (4105)\n-28A1B Uncompressed Size     00001009 (4105)\n-\n-28A1F LOCAL HEADER #33      04034B50 (67324752)\n-28A23 Extract Zip Spec      14 (20) '2.0'\n-28A24 Extract OS            00 (0) 'MS-DOS'\n-28A25 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-28A27 Compression Method    0000 (0) 'Stored'\n-28A29 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-28A2D CRC                   00000000 (0)\n-28A31 Compressed Size       00000000 (0)\n-28A35 Uncompressed Size     00000000 (0)\n-28A39 Filename Length       0046 (70)\n-28A3B Extra Length          0009 (9)\n-28A3D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x28A3D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-28A83 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-28A85   Length              0005 (5)\n-28A87   Flags               01 (1) 'Modification'\n-28A88   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-28A8C PAYLOAD\n-\n-2A50F DATA DESCRIPTOR       08074B50 (134695760)\n-2A513 CRC                   C2D529E3 (3268749795)\n-2A517 Compressed Size       00001A83 (6787)\n-2A51B Uncompressed Size     00001A83 (6787)\n-\n-2A51F LOCAL HEADER #34      04034B50 (67324752)\n-2A523 Extract Zip Spec      14 (20) '2.0'\n-2A524 Extract OS            00 (0) 'MS-DOS'\n-2A525 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-2A527 Compression Method    0000 (0) 'Stored'\n-2A529 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-2A52D CRC                   00000000 (0)\n-2A531 Compressed Size       00000000 (0)\n-2A535 Uncompressed Size     00000000 (0)\n-2A539 Filename Length       0042 (66)\n-2A53B Extra Length          0009 (9)\n-2A53D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x2A53D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-2A57F Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-2A581   Length              0005 (5)\n-2A583   Flags               01 (1) 'Modification'\n-2A584   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-2A588 PAYLOAD\n-\n-2BFF7 DATA DESCRIPTOR       08074B50 (134695760)\n-2BFFB CRC                   E72A3EBF (3878305471)\n-2BFFF Compressed Size       00001A6F (6767)\n-2C003 Uncompressed Size     00001A6F (6767)\n-\n-2C007 LOCAL HEADER #35      04034B50 (67324752)\n-2C00B Extract Zip Spec      14 (20) '2.0'\n-2C00C Extract OS            00 (0) 'MS-DOS'\n-2C00D General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-2C00F Compression Method    0000 (0) 'Stored'\n-2C011 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-2C015 CRC                   00000000 (0)\n-2C019 Compressed Size       00000000 (0)\n-2C01D Uncompressed Size     00000000 (0)\n-2C021 Filename Length       003F (63)\n-2C023 Extra Length          0009 (9)\n-2C025 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x2C025: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-2C064 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-2C066   Length              0005 (5)\n-2C068   Flags               01 (1) 'Modification'\n-2C069   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-2C06D PAYLOAD\n-\n-2C7B6 DATA DESCRIPTOR       08074B50 (134695760)\n-2C7BA CRC                   1CF76EFC (485977852)\n-2C7BE Compressed Size       00000749 (1865)\n-2C7C2 Uncompressed Size     00000749 (1865)\n-\n-2C7C6 LOCAL HEADER #36      04034B50 (67324752)\n-2C7CA Extract Zip Spec      14 (20) '2.0'\n-2C7CB Extract OS            00 (0) 'MS-DOS'\n-2C7CC General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-2C7CE Compression Method    0000 (0) 'Stored'\n-2C7D0 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-2C7D4 CRC                   00000000 (0)\n-2C7D8 Compressed Size       00000000 (0)\n-2C7DC Uncompressed Size     00000000 (0)\n-2C7E0 Filename Length       0043 (67)\n-2C7E2 Extra Length          0009 (9)\n-2C7E4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x2C7E4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-2C827 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-2C829   Length              0005 (5)\n-2C82B   Flags               01 (1) 'Modification'\n-2C82C   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-2C830 PAYLOAD\n-\n-2D92E DATA DESCRIPTOR       08074B50 (134695760)\n-2D932 CRC                   187BA855 (410757205)\n-2D936 Compressed Size       000010FE (4350)\n-2D93A Uncompressed Size     000010FE (4350)\n-\n-2D93E LOCAL HEADER #37      04034B50 (67324752)\n-2D942 Extract Zip Spec      14 (20) '2.0'\n-2D943 Extract OS            00 (0) 'MS-DOS'\n-2D944 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-2D946 Compression Method    0000 (0) 'Stored'\n-2D948 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-2D94C CRC                   00000000 (0)\n-2D950 Compressed Size       00000000 (0)\n-2D954 Uncompressed Size     00000000 (0)\n-2D958 Filename Length       003F (63)\n-2D95A Extra Length          0009 (9)\n-2D95C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x2D95C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-2D99B Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-2D99D   Length              0005 (5)\n-2D99F   Flags               01 (1) 'Modification'\n-2D9A0   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-2D9A4 PAYLOAD\n-\n-2E6E1 DATA DESCRIPTOR       08074B50 (134695760)\n-2E6E5 CRC                   D7A41DAE (3617856942)\n-2E6E9 Compressed Size       00000D3D (3389)\n-2E6ED Uncompressed Size     00000D3D (3389)\n-\n-2E6F1 LOCAL HEADER #38      04034B50 (67324752)\n-2E6F5 Extract Zip Spec      14 (20) '2.0'\n-2E6F6 Extract OS            00 (0) 'MS-DOS'\n-2E6F7 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-2E6F9 Compression Method    0000 (0) 'Stored'\n-2E6FB Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-2E6FF CRC                   00000000 (0)\n-2E703 Compressed Size       00000000 (0)\n-2E707 Uncompressed Size     00000000 (0)\n-2E70B Filename Length       0045 (69)\n-2E70D Extra Length          0009 (9)\n-2E70F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x2E70F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-2E754 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-2E756   Length              0005 (5)\n-2E758   Flags               01 (1) 'Modification'\n-2E759   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-2E75D PAYLOAD\n-\n-2F82C DATA DESCRIPTOR       08074B50 (134695760)\n-2F830 CRC                   F1C1369F (4055971487)\n-2F834 Compressed Size       000010CF (4303)\n-2F838 Uncompressed Size     000010CF (4303)\n-\n-2F83C LOCAL HEADER #39      04034B50 (67324752)\n-2F840 Extract Zip Spec      14 (20) '2.0'\n-2F841 Extract OS            00 (0) 'MS-DOS'\n-2F842 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-2F844 Compression Method    0000 (0) 'Stored'\n-2F846 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-2F84A CRC                   00000000 (0)\n-2F84E Compressed Size       00000000 (0)\n-2F852 Uncompressed Size     00000000 (0)\n-2F856 Filename Length       003D (61)\n-2F858 Extra Length          0009 (9)\n-2F85A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x2F85A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-2F897 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-2F899   Length              0005 (5)\n-2F89B   Flags               01 (1) 'Modification'\n-2F89C   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-2F8A0 PAYLOAD\n-\n-31083 DATA DESCRIPTOR       08074B50 (134695760)\n-31087 CRC                   B12B8896 (2972420246)\n-3108B Compressed Size       000017E3 (6115)\n-3108F Uncompressed Size     000017E3 (6115)\n-\n-31093 LOCAL HEADER #40      04034B50 (67324752)\n-31097 Extract Zip Spec      14 (20) '2.0'\n-31098 Extract OS            00 (0) 'MS-DOS'\n-31099 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-3109B Compression Method    0000 (0) 'Stored'\n-3109D Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-310A1 CRC                   00000000 (0)\n-310A5 Compressed Size       00000000 (0)\n-310A9 Uncompressed Size     00000000 (0)\n-310AD Filename Length       003D (61)\n-310AF Extra Length          0009 (9)\n-310B1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x310B1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-310EE Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-310F0   Length              0005 (5)\n-310F2   Flags               01 (1) 'Modification'\n-310F3   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-310F7 PAYLOAD\n-\n-31E7B DATA DESCRIPTOR       08074B50 (134695760)\n-31E7F CRC                   04D43ED1 (81018577)\n-31E83 Compressed Size       00000D84 (3460)\n-31E87 Uncompressed Size     00000D84 (3460)\n-\n-31E8B LOCAL HEADER #41      04034B50 (67324752)\n-31E8F Extract Zip Spec      14 (20) '2.0'\n-31E90 Extract OS            00 (0) 'MS-DOS'\n-31E91 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-31E93 Compression Method    0000 (0) 'Stored'\n-31E95 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-31E99 CRC                   00000000 (0)\n-31E9D Compressed Size       00000000 (0)\n-31EA1 Uncompressed Size     00000000 (0)\n-31EA5 Filename Length       003E (62)\n-31EA7 Extra Length          0009 (9)\n-31EA9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x31EA9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-31EE7 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-31EE9   Length              0005 (5)\n-31EEB   Flags               01 (1) 'Modification'\n-31EEC   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-31EF0 PAYLOAD\n-\n-32D94 DATA DESCRIPTOR       08074B50 (134695760)\n-32D98 CRC                   05580F75 (89657205)\n-32D9C Compressed Size       00000EA4 (3748)\n-32DA0 Uncompressed Size     00000EA4 (3748)\n-\n-32DA4 LOCAL HEADER #42      04034B50 (67324752)\n-32DA8 Extract Zip Spec      14 (20) '2.0'\n-32DA9 Extract OS            00 (0) 'MS-DOS'\n-32DAA General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-32DAC Compression Method    0000 (0) 'Stored'\n-32DAE Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-32DB2 CRC                   00000000 (0)\n-32DB6 Compressed Size       00000000 (0)\n-32DBA Uncompressed Size     00000000 (0)\n-32DBE Filename Length       003F (63)\n-32DC0 Extra Length          0009 (9)\n-32DC2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x32DC2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-32E01 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-32E03   Length              0005 (5)\n-32E05   Flags               01 (1) 'Modification'\n-32E06   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-32E0A PAYLOAD\n-\n-35550 DATA DESCRIPTOR       08074B50 (134695760)\n-35554 CRC                   D6497204 (3595137540)\n-35558 Compressed Size       00002746 (10054)\n-3555C Uncompressed Size     00002746 (10054)\n-\n-35560 LOCAL HEADER #43      04034B50 (67324752)\n-35564 Extract Zip Spec      14 (20) '2.0'\n-35565 Extract OS            00 (0) 'MS-DOS'\n-35566 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-35568 Compression Method    0000 (0) 'Stored'\n-3556A Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-3556E CRC                   00000000 (0)\n-35572 Compressed Size       00000000 (0)\n-35576 Uncompressed Size     00000000 (0)\n-3557A Filename Length       003F (63)\n-3557C Extra Length          0009 (9)\n-3557E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x3557E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-355BD Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-355BF   Length              0005 (5)\n-355C1   Flags               01 (1) 'Modification'\n-355C2   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-355C6 PAYLOAD\n-\n-37048 DATA DESCRIPTOR       08074B50 (134695760)\n-3704C CRC                   1ADB9373 (450597747)\n-37050 Compressed Size       00001A82 (6786)\n-37054 Uncompressed Size     00001A82 (6786)\n-\n-37058 LOCAL HEADER #44      04034B50 (67324752)\n-3705C Extract Zip Spec      14 (20) '2.0'\n-3705D Extract OS            00 (0) 'MS-DOS'\n-3705E General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-37060 Compression Method    0000 (0) 'Stored'\n-37062 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-37066 CRC                   00000000 (0)\n-3706A Compressed Size       00000000 (0)\n-3706E Uncompressed Size     00000000 (0)\n-37072 Filename Length       0040 (64)\n-37074 Extra Length          0009 (9)\n-37076 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x37076: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-370B6 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-370B8   Length              0005 (5)\n-370BA   Flags               01 (1) 'Modification'\n-370BB   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-370BF PAYLOAD\n-\n-382E3 DATA DESCRIPTOR       08074B50 (134695760)\n-382E7 CRC                   41505507 (1095783687)\n-382EB Compressed Size       00001224 (4644)\n-382EF Uncompressed Size     00001224 (4644)\n-\n-382F3 LOCAL HEADER #45      04034B50 (67324752)\n-382F7 Extract Zip Spec      14 (20) '2.0'\n-382F8 Extract OS            00 (0) 'MS-DOS'\n-382F9 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-382FB Compression Method    0000 (0) 'Stored'\n-382FD Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-38301 CRC                   00000000 (0)\n-38305 Compressed Size       00000000 (0)\n-38309 Uncompressed Size     00000000 (0)\n-3830D Filename Length       003F (63)\n-3830F Extra Length          0009 (9)\n-38311 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x38311: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-38350 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-38352   Length              0005 (5)\n-38354   Flags               01 (1) 'Modification'\n-38355   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-38359 PAYLOAD\n-\n-3A91B DATA DESCRIPTOR       08074B50 (134695760)\n-3A91F CRC                   C452CFCB (3293761483)\n-3A923 Compressed Size       000025C2 (9666)\n-3A927 Uncompressed Size     000025C2 (9666)\n-\n-3A92B LOCAL HEADER #46      04034B50 (67324752)\n-3A92F Extract Zip Spec      14 (20) '2.0'\n-3A930 Extract OS            00 (0) 'MS-DOS'\n-3A931 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-3A933 Compression Method    0000 (0) 'Stored'\n-3A935 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-3A939 CRC                   00000000 (0)\n-3A93D Compressed Size       00000000 (0)\n-3A941 Uncompressed Size     00000000 (0)\n-3A945 Filename Length       003E (62)\n-3A947 Extra Length          0009 (9)\n-3A949 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x3A949: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-3A987 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-3A989   Length              0005 (5)\n-3A98B   Flags               01 (1) 'Modification'\n-3A98C   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-3A990 PAYLOAD\n-\n-3BAE8 DATA DESCRIPTOR       08074B50 (134695760)\n-3BAEC CRC                   FCF57B8C (4243946380)\n-3BAF0 Compressed Size       00001158 (4440)\n-3BAF4 Uncompressed Size     00001158 (4440)\n-\n-3BAF8 LOCAL HEADER #47      04034B50 (67324752)\n-3BAFC Extract Zip Spec      14 (20) '2.0'\n-3BAFD Extract OS            00 (0) 'MS-DOS'\n-3BAFE General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-3BB00 Compression Method    0000 (0) 'Stored'\n-3BB02 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-3BB06 CRC                   00000000 (0)\n-3BB0A Compressed Size       00000000 (0)\n-3BB0E Uncompressed Size     00000000 (0)\n-3BB12 Filename Length       003C (60)\n-3BB14 Extra Length          0009 (9)\n-3BB16 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x3BB16: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-3BB52 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-3BB54   Length              0005 (5)\n-3BB56   Flags               01 (1) 'Modification'\n-3BB57   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-3BB5B PAYLOAD\n-\n-3BF65 DATA DESCRIPTOR       08074B50 (134695760)\n-3BF69 CRC                   93AEE0AC (2477711532)\n-3BF6D Compressed Size       0000040A (1034)\n-3BF71 Uncompressed Size     0000040A (1034)\n-\n-3BF75 LOCAL HEADER #48      04034B50 (67324752)\n-3BF79 Extract Zip Spec      14 (20) '2.0'\n-3BF7A Extract OS            00 (0) 'MS-DOS'\n-3BF7B General Purpose Flag  0000 (0)\n-3BF7D Compression Method    0000 (0) 'Stored'\n-3BF7F Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-3BF83 CRC                   00000000 (0)\n-3BF87 Compressed Size       00000000 (0)\n-3BF8B Uncompressed Size     00000000 (0)\n-3BF8F Filename Length       001E (30)\n-3BF91 Extra Length          0009 (9)\n-3BF93 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x3BF93: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-3BFB1 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-3BFB3   Length              0005 (5)\n-3BFB5   Flags               01 (1) 'Modification'\n-3BFB6   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-3BFBA LOCAL HEADER #49      04034B50 (67324752)\n-3BFBE Extract Zip Spec      14 (20) '2.0'\n-3BFBF Extract OS            00 (0) 'MS-DOS'\n-3BFC0 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-3BFC2 Compression Method    0000 (0) 'Stored'\n-3BFC4 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-3BFC8 CRC                   00000000 (0)\n-3BFCC Compressed Size       00000000 (0)\n-3BFD0 Uncompressed Size     00000000 (0)\n-3BFD4 Filename Length       003D (61)\n-3BFD6 Extra Length          0009 (9)\n-3BFD8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x3BFD8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-3C015 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-3C017   Length              0005 (5)\n-3C019   Flags               01 (1) 'Modification'\n-3C01A   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-3C01E PAYLOAD\n-\n-3C497 DATA DESCRIPTOR       08074B50 (134695760)\n-3C49B CRC                   7A3B23D9 (2050696153)\n-3C49F Compressed Size       00000479 (1145)\n-3C4A3 Uncompressed Size     00000479 (1145)\n-\n-3C4A7 LOCAL HEADER #50      04034B50 (67324752)\n-3C4AB Extract Zip Spec      14 (20) '2.0'\n-3C4AC Extract OS            00 (0) 'MS-DOS'\n-3C4AD General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-3C4AF Compression Method    0000 (0) 'Stored'\n-3C4B1 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-3C4B5 CRC                   00000000 (0)\n-3C4B9 Compressed Size       00000000 (0)\n-3C4BD Uncompressed Size     00000000 (0)\n-3C4C1 Filename Length       0043 (67)\n-3C4C3 Extra Length          0009 (9)\n-3C4C5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x3C4C5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-3C508 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-3C50A   Length              0005 (5)\n-3C50C   Flags               01 (1) 'Modification'\n-3C50D   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-3C511 PAYLOAD\n-\n-3CBA1 DATA DESCRIPTOR       08074B50 (134695760)\n-3CBA5 CRC                   3E8906CC (1049167564)\n-3CBA9 Compressed Size       00000690 (1680)\n-3CBAD Uncompressed Size     00000690 (1680)\n-\n-3CBB1 LOCAL HEADER #51      04034B50 (67324752)\n-3CBB5 Extract Zip Spec      14 (20) '2.0'\n-3CBB6 Extract OS            00 (0) 'MS-DOS'\n-3CBB7 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-3CBB9 Compression Method    0000 (0) 'Stored'\n-3CBBB Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-3CBBF CRC                   00000000 (0)\n-3CBC3 Compressed Size       00000000 (0)\n-3CBC7 Uncompressed Size     00000000 (0)\n-3CBCB Filename Length       0045 (69)\n-3CBCD Extra Length          0009 (9)\n-3CBCF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x3CBCF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-3CC14 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-3CC16   Length              0005 (5)\n-3CC18   Flags               01 (1) 'Modification'\n-3CC19   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-3CC1D PAYLOAD\n-\n-3D2B5 DATA DESCRIPTOR       08074B50 (134695760)\n-3D2B9 CRC                   AE1F051B (2921268507)\n-3D2BD Compressed Size       00000698 (1688)\n-3D2C1 Uncompressed Size     00000698 (1688)\n-\n-3D2C5 LOCAL HEADER #52      04034B50 (67324752)\n-3D2C9 Extract Zip Spec      14 (20) '2.0'\n-3D2CA Extract OS            00 (0) 'MS-DOS'\n-3D2CB General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-3D2CD Compression Method    0000 (0) 'Stored'\n-3D2CF Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-3D2D3 CRC                   00000000 (0)\n-3D2D7 Compressed Size       00000000 (0)\n-3D2DB Uncompressed Size     00000000 (0)\n-3D2DF Filename Length       0040 (64)\n-3D2E1 Extra Length          0009 (9)\n-3D2E3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x3D2E3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-3D323 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-3D325   Length              0005 (5)\n-3D327   Flags               01 (1) 'Modification'\n-3D328   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-3D32C PAYLOAD\n-\n-3D8D0 DATA DESCRIPTOR       08074B50 (134695760)\n-3D8D4 CRC                   542D0143 (1412235587)\n-3D8D8 Compressed Size       000005A4 (1444)\n-3D8DC Uncompressed Size     000005A4 (1444)\n-\n-3D8E0 LOCAL HEADER #53      04034B50 (67324752)\n-3D8E4 Extract Zip Spec      14 (20) '2.0'\n-3D8E5 Extract OS            00 (0) 'MS-DOS'\n-3D8E6 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-3D8E8 Compression Method    0000 (0) 'Stored'\n-3D8EA Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-3D8EE CRC                   00000000 (0)\n-3D8F2 Compressed Size       00000000 (0)\n-3D8F6 Uncompressed Size     00000000 (0)\n-3D8FA Filename Length       0042 (66)\n-3D8FC Extra Length          0009 (9)\n-3D8FE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x3D8FE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-3D940 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-3D942   Length              0005 (5)\n-3D944   Flags               01 (1) 'Modification'\n-3D945   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-3D949 PAYLOAD\n-\n-3DFB3 DATA DESCRIPTOR       08074B50 (134695760)\n-3DFB7 CRC                   FC50C2FA (4233151226)\n-3DFBB Compressed Size       0000066A (1642)\n-3DFBF Uncompressed Size     0000066A (1642)\n-\n-3DFC3 LOCAL HEADER #54      04034B50 (67324752)\n-3DFC7 Extract Zip Spec      14 (20) '2.0'\n-3DFC8 Extract OS            00 (0) 'MS-DOS'\n-3DFC9 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-3DFCB Compression Method    0000 (0) 'Stored'\n-3DFCD Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-3DFD1 CRC                   00000000 (0)\n-3DFD5 Compressed Size       00000000 (0)\n-3DFD9 Uncompressed Size     00000000 (0)\n-3DFDD Filename Length       003D (61)\n-3DFDF Extra Length          0009 (9)\n-3DFE1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x3DFE1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-3E01E Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-3E020   Length              0005 (5)\n-3E022   Flags               01 (1) 'Modification'\n-3E023   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-3E027 PAYLOAD\n-\n-3E521 DATA DESCRIPTOR       08074B50 (134695760)\n-3E525 CRC                   E1CD8446 (3788342342)\n-3E529 Compressed Size       000004FA (1274)\n-3E52D Uncompressed Size     000004FA (1274)\n-\n-3E531 LOCAL HEADER #55      04034B50 (67324752)\n-3E535 Extract Zip Spec      14 (20) '2.0'\n-3E536 Extract OS            00 (0) 'MS-DOS'\n-3E537 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-3E539 Compression Method    0000 (0) 'Stored'\n-3E53B Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-3E53F CRC                   00000000 (0)\n-3E543 Compressed Size       00000000 (0)\n-3E547 Uncompressed Size     00000000 (0)\n-3E54B Filename Length       003F (63)\n-3E54D Extra Length          0009 (9)\n-3E54F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x3E54F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-3E58E Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-3E590   Length              0005 (5)\n-3E592   Flags               01 (1) 'Modification'\n-3E593   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-3E597 PAYLOAD\n-\n-3EA99 DATA DESCRIPTOR       08074B50 (134695760)\n-3EA9D CRC                   FE2922A2 (4264108706)\n-3EAA1 Compressed Size       00000502 (1282)\n-3EAA5 Uncompressed Size     00000502 (1282)\n-\n-3EAA9 LOCAL HEADER #56      04034B50 (67324752)\n-3EAAD Extract Zip Spec      14 (20) '2.0'\n-3EAAE Extract OS            00 (0) 'MS-DOS'\n-3EAAF General Purpose Flag  0000 (0)\n-3EAB1 Compression Method    0000 (0) 'Stored'\n-3EAB3 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-3EAB7 CRC                   00000000 (0)\n-3EABB Compressed Size       00000000 (0)\n-3EABF Uncompressed Size     00000000 (0)\n-3EAC3 Filename Length       0027 (39)\n-3EAC5 Extra Length          0009 (9)\n-3EAC7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x3EAC7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-3EAEE Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-3EAF0   Length              0005 (5)\n-3EAF2   Flags               01 (1) 'Modification'\n-3EAF3   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-3EAF7 LOCAL HEADER #57      04034B50 (67324752)\n-3EAFB Extract Zip Spec      14 (20) '2.0'\n-3EAFC Extract OS            00 (0) 'MS-DOS'\n-3EAFD General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-3EAFF Compression Method    0000 (0) 'Stored'\n-3EB01 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-3EB05 CRC                   00000000 (0)\n-3EB09 Compressed Size       00000000 (0)\n-3EB0D Uncompressed Size     00000000 (0)\n-3EB11 Filename Length       0040 (64)\n-3EB13 Extra Length          0009 (9)\n-3EB15 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x3EB15: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-3EB55 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-3EB57   Length              0005 (5)\n-3EB59   Flags               01 (1) 'Modification'\n-3EB5A   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-3EB5E PAYLOAD\n-\n-3F29F DATA DESCRIPTOR       08074B50 (134695760)\n-3F2A3 CRC                   704BFEFA (1884028666)\n-3F2A7 Compressed Size       00000741 (1857)\n-3F2AB Uncompressed Size     00000741 (1857)\n-\n-3F2AF LOCAL HEADER #58      04034B50 (67324752)\n-3F2B3 Extract Zip Spec      14 (20) '2.0'\n-3F2B4 Extract OS            00 (0) 'MS-DOS'\n-3F2B5 General Purpose Flag  0000 (0)\n-3F2B7 Compression Method    0000 (0) 'Stored'\n-3F2B9 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-3F2BD CRC                   00000000 (0)\n-3F2C1 Compressed Size       00000000 (0)\n-3F2C5 Uncompressed Size     00000000 (0)\n-3F2C9 Filename Length       0020 (32)\n-3F2CB Extra Length          0009 (9)\n-3F2CD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x3F2CD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-3F2ED Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-3F2EF   Length              0005 (5)\n-3F2F1   Flags               01 (1) 'Modification'\n-3F2F2   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-3F2F6 LOCAL HEADER #59      04034B50 (67324752)\n-3F2FA Extract Zip Spec      14 (20) '2.0'\n-3F2FB Extract OS            00 (0) 'MS-DOS'\n-3F2FC General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-3F2FE Compression Method    0000 (0) 'Stored'\n-3F300 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-3F304 CRC                   00000000 (0)\n-3F308 Compressed Size       00000000 (0)\n-3F30C Uncompressed Size     00000000 (0)\n-3F310 Filename Length       0044 (68)\n-3F312 Extra Length          0009 (9)\n-3F314 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x3F314: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-3F358 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-3F35A   Length              0005 (5)\n-3F35C   Flags               01 (1) 'Modification'\n-3F35D   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-3F361 PAYLOAD\n-\n-3FB5E DATA DESCRIPTOR       08074B50 (134695760)\n-3FB62 CRC                   7E779F80 (2121768832)\n-3FB66 Compressed Size       000007FD (2045)\n-3FB6A Uncompressed Size     000007FD (2045)\n-\n-3FB6E LOCAL HEADER #60      04034B50 (67324752)\n-3FB72 Extract Zip Spec      14 (20) '2.0'\n-3FB73 Extract OS            00 (0) 'MS-DOS'\n-3FB74 General Purpose Flag  0000 (0)\n-3FB76 Compression Method    0000 (0) 'Stored'\n-3FB78 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-3FB7C CRC                   00000000 (0)\n-3FB80 Compressed Size       00000000 (0)\n-3FB84 Uncompressed Size     00000000 (0)\n-3FB88 Filename Length       0021 (33)\n-3FB8A Extra Length          0009 (9)\n-3FB8C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x3FB8C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-3FBAD Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-3FBAF   Length              0005 (5)\n-3FBB1   Flags               01 (1) 'Modification'\n-3FBB2   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-3FBB6 LOCAL HEADER #61      04034B50 (67324752)\n-3FBBA Extract Zip Spec      14 (20) '2.0'\n-3FBBB Extract OS            00 (0) 'MS-DOS'\n-3FBBC General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-3FBBE Compression Method    0000 (0) 'Stored'\n-3FBC0 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-3FBC4 CRC                   00000000 (0)\n-3FBC8 Compressed Size       00000000 (0)\n-3FBCC Uncompressed Size     00000000 (0)\n-3FBD0 Filename Length       0049 (73)\n-3FBD2 Extra Length          0009 (9)\n-3FBD4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x3FBD4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-3FC1D Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-3FC1F   Length              0005 (5)\n-3FC21   Flags               01 (1) 'Modification'\n-3FC22   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-3FC26 PAYLOAD\n-\n-40E7F DATA DESCRIPTOR       08074B50 (134695760)\n-40E83 CRC                   33B32090 (867377296)\n-40E87 Compressed Size       00001259 (4697)\n-40E8B Uncompressed Size     00001259 (4697)\n-\n-40E8F LOCAL HEADER #62      04034B50 (67324752)\n-40E93 Extract Zip Spec      14 (20) '2.0'\n-40E94 Extract OS            00 (0) 'MS-DOS'\n-40E95 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-40E97 Compression Method    0000 (0) 'Stored'\n-40E99 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-40E9D CRC                   00000000 (0)\n-40EA1 Compressed Size       00000000 (0)\n-40EA5 Uncompressed Size     00000000 (0)\n-40EA9 Filename Length       0043 (67)\n-40EAB Extra Length          0009 (9)\n-40EAD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x40EAD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-40EF0 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-40EF2   Length              0005 (5)\n-40EF4   Flags               01 (1) 'Modification'\n-40EF5   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-40EF9 PAYLOAD\n-\n-4190C DATA DESCRIPTOR       08074B50 (134695760)\n-41910 CRC                   DEA0C858 (3735079000)\n-41914 Compressed Size       00000A13 (2579)\n-41918 Uncompressed Size     00000A13 (2579)\n-\n-4191C LOCAL HEADER #63      04034B50 (67324752)\n-41920 Extract Zip Spec      14 (20) '2.0'\n-41921 Extract OS            00 (0) 'MS-DOS'\n-41922 General Purpose Flag  0000 (0)\n-41924 Compression Method    0000 (0) 'Stored'\n-41926 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4192A CRC                   00000000 (0)\n-4192E Compressed Size       00000000 (0)\n-41932 Uncompressed Size     00000000 (0)\n-41936 Filename Length       001E (30)\n-41938 Extra Length          0009 (9)\n-4193A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4193A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-41958 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4195A   Length              0005 (5)\n-4195C   Flags               01 (1) 'Modification'\n-4195D   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-41961 LOCAL HEADER #64      04034B50 (67324752)\n-41965 Extract Zip Spec      14 (20) '2.0'\n-41966 Extract OS            00 (0) 'MS-DOS'\n-41967 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-41969 Compression Method    0000 (0) 'Stored'\n-4196B Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4196F CRC                   00000000 (0)\n-41973 Compressed Size       00000000 (0)\n-41977 Uncompressed Size     00000000 (0)\n-4197B Filename Length       0038 (56)\n-4197D Extra Length          0009 (9)\n-4197F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4197F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-419B7 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-419B9   Length              0005 (5)\n-419BB   Flags               01 (1) 'Modification'\n-419BC   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-419C0 PAYLOAD\n-\n-48D16 DATA DESCRIPTOR       08074B50 (134695760)\n-48D1A CRC                   CE83BFB8 (3464740792)\n-48D1E Compressed Size       00007356 (29526)\n-48D22 Uncompressed Size     00007356 (29526)\n-\n-48D26 LOCAL HEADER #65      04034B50 (67324752)\n-48D2A Extract Zip Spec      14 (20) '2.0'\n-48D2B Extract OS            00 (0) 'MS-DOS'\n-48D2C General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-48D2E Compression Method    0000 (0) 'Stored'\n-48D30 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-48D34 CRC                   00000000 (0)\n-48D38 Compressed Size       00000000 (0)\n-48D3C Uncompressed Size     00000000 (0)\n-48D40 Filename Length       0037 (55)\n-48D42 Extra Length          0009 (9)\n-48D44 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x48D44: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-48D7B Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-48D7D   Length              0005 (5)\n-48D7F   Flags               01 (1) 'Modification'\n-48D80   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-48D84 PAYLOAD\n-\n-4B001 DATA DESCRIPTOR       08074B50 (134695760)\n-4B005 CRC                   B659AACE (3059329742)\n-4B009 Compressed Size       0000227D (8829)\n-4B00D Uncompressed Size     0000227D (8829)\n-\n-4B011 CENTRAL HEADER #1     02014B50 (33639248)\n-4B015 Created Zip Spec      14 (20) '2.0'\n-4B016 Created OS            00 (0) 'MS-DOS'\n-4B017 Extract Zip Spec      14 (20) '2.0'\n-4B018 Extract OS            00 (0) 'MS-DOS'\n-4B019 General Purpose Flag  0000 (0)\n-4B01B Compression Method    0000 (0) 'Stored'\n-4B01D Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4B021 CRC                   00000000 (0)\n-4B025 Compressed Size       00000000 (0)\n-4B029 Uncompressed Size     00000000 (0)\n-4B02D Filename Length       0009 (9)\n-4B02F Extra Length          0009 (9)\n-4B031 Comment Length        0000 (0)\n-4B033 Disk Start            0000 (0)\n-4B035 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-4B037 Ext File Attributes   00000000 (0)\n-4B03B Local Header Offset   00000000 (0)\n-4B03F Filename              'XXXXXXXXX'\n-#\n-# WARNING: Offset 0x4B03F: Filename 'XXXXXXXXX'\n-#          Zero length filename\n-#\n-4B048 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4B04A   Length              0005 (5)\n-4B04C   Flags               01 (1) 'Modification'\n-4B04D   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-4B051 CENTRAL HEADER #2     02014B50 (33639248)\n-4B055 Created Zip Spec      14 (20) '2.0'\n-4B056 Created OS            00 (0) 'MS-DOS'\n-4B057 Extract Zip Spec      14 (20) '2.0'\n-4B058 Extract OS            00 (0) 'MS-DOS'\n-4B059 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-4B05B Compression Method    0000 (0) 'Stored'\n-4B05D Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4B061 CRC                   D1996C93 (3516492947)\n-4B065 Compressed Size       000014CC (5324)\n-4B069 Uncompressed Size     000014CC (5324)\n-4B06D Filename Length       0015 (21)\n-4B06F Extra Length          0009 (9)\n-4B071 Comment Length        0000 (0)\n-4B073 Disk Start            0000 (0)\n-4B075 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-4B077 Ext File Attributes   00000000 (0)\n-4B07B Local Header Offset   00000030 (48)\n-4B07F Filename              'XXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4B07F: Filename 'XXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-4B094 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4B096   Length              0005 (5)\n-4B098   Flags               01 (1) 'Modification'\n-4B099   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-4B09D CENTRAL HEADER #3     02014B50 (33639248)\n-4B0A1 Created Zip Spec      14 (20) '2.0'\n-4B0A2 Created OS            00 (0) 'MS-DOS'\n-4B0A3 Extract Zip Spec      14 (20) '2.0'\n-4B0A4 Extract OS            00 (0) 'MS-DOS'\n-4B0A5 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-4B0A7 Compression Method    0000 (0) 'Stored'\n-4B0A9 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4B0AD CRC                   86E2B4B4 (2263004340)\n-4B0B1 Compressed Size       00002C5E (11358)\n-4B0B5 Uncompressed Size     00002C5E (11358)\n-4B0B9 Filename Length       0010 (16)\n-4B0BB Extra Length          0009 (9)\n-4B0BD Comment Length        0000 (0)\n-4B0BF Disk Start            0000 (0)\n-4B0C1 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-4B0C3 Ext File Attributes   00000000 (0)\n-4B0C7 Local Header Offset   00001548 (5448)\n-4B0CB Filename              'XXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4B0CB: Filename 'XXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-4B0DB Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4B0DD   Length              0005 (5)\n-4B0DF   Flags               01 (1) 'Modification'\n-4B0E0   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-4B0E4 CENTRAL HEADER #4     02014B50 (33639248)\n-4B0E8 Created Zip Spec      14 (20) '2.0'\n-4B0E9 Created OS            00 (0) 'MS-DOS'\n-4B0EA Extract Zip Spec      14 (20) '2.0'\n-4B0EB Extract OS            00 (0) 'MS-DOS'\n-4B0EC General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-4B0EE Compression Method    0000 (0) 'Stored'\n-4B0F0 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4B0F4 CRC                   EE027FB2 (3993141170)\n-4B0F8 Compressed Size       00000019 (25)\n-4B0FC Uncompressed Size     00000019 (25)\n-4B100 Filename Length       0014 (20)\n-4B102 Extra Length          0009 (9)\n-4B104 Comment Length        0000 (0)\n-4B106 Disk Start            0000 (0)\n-4B108 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-4B10A Ext File Attributes   00000000 (0)\n-4B10E Local Header Offset   000041ED (16877)\n-4B112 Filename              'XXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4B112: Filename 'XXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-4B126 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4B128   Length              0005 (5)\n-4B12A   Flags               01 (1) 'Modification'\n-4B12B   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-4B12F CENTRAL HEADER #5     02014B50 (33639248)\n-4B133 Created Zip Spec      14 (20) '2.0'\n-4B134 Created OS            00 (0) 'MS-DOS'\n-4B135 Extract Zip Spec      14 (20) '2.0'\n-4B136 Extract OS            00 (0) 'MS-DOS'\n-4B137 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-4B139 Compression Method    0000 (0) 'Stored'\n-4B13B Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4B13F CRC                   5C793A50 (1551448656)\n-4B143 Compressed Size       000000AD (173)\n-4B147 Uncompressed Size     000000AD (173)\n-4B14B Filename Length       000F (15)\n-4B14D Extra Length          0009 (9)\n-4B14F Comment Length        0000 (0)\n-4B151 Disk Start            0000 (0)\n-4B153 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-4B155 Ext File Attributes   00000000 (0)\n-4B159 Local Header Offset   00004251 (16977)\n-4B15D Filename              'XXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4B15D: Filename 'XXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-4B16C Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4B16E   Length              0005 (5)\n-4B170   Flags               01 (1) 'Modification'\n-4B171   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-4B175 CENTRAL HEADER #6     02014B50 (33639248)\n-4B179 Created Zip Spec      14 (20) '2.0'\n-4B17A Created OS            00 (0) 'MS-DOS'\n-4B17B Extract Zip Spec      14 (20) '2.0'\n-4B17C Extract OS            00 (0) 'MS-DOS'\n-4B17D General Purpose Flag  0000 (0)\n-4B17F Compression Method    0000 (0) 'Stored'\n-4B181 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4B185 CRC                   00000000 (0)\n-4B189 Compressed Size       00000000 (0)\n-4B18D Uncompressed Size     00000000 (0)\n-4B191 Filename Length       000F (15)\n-4B193 Extra Length          0009 (9)\n-4B195 Comment Length        0000 (0)\n-4B197 Disk Start            0000 (0)\n-4B199 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-4B19B Ext File Attributes   00000000 (0)\n-4B19F Local Header Offset   00004344 (17220)\n-4B1A3 Filename              'XXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4B1A3: Filename 'XXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-4B1B2 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4B1B4   Length              0005 (5)\n-4B1B6   Flags               01 (1) 'Modification'\n-4B1B7   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-4B1BB CENTRAL HEADER #7     02014B50 (33639248)\n-4B1BF Created Zip Spec      14 (20) '2.0'\n-4B1C0 Created OS            00 (0) 'MS-DOS'\n-4B1C1 Extract Zip Spec      14 (20) '2.0'\n-4B1C2 Extract OS            00 (0) 'MS-DOS'\n-4B1C3 General Purpose Flag  0000 (0)\n-4B1C5 Compression Method    0000 (0) 'Stored'\n-4B1C7 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4B1CB CRC                   00000000 (0)\n-4B1CF Compressed Size       00000000 (0)\n-4B1D3 Uncompressed Size     00000000 (0)\n-4B1D7 Filename Length       0018 (24)\n-4B1D9 Extra Length          0009 (9)\n-4B1DB Comment Length        0000 (0)\n-4B1DD Disk Start            0000 (0)\n-4B1DF Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-4B1E1 Ext File Attributes   00000000 (0)\n-4B1E5 Local Header Offset   0000437A (17274)\n-4B1E9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4B1E9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-4B201 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4B203   Length              0005 (5)\n-4B205   Flags               01 (1) 'Modification'\n-4B206   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-4B20A CENTRAL HEADER #8     02014B50 (33639248)\n-4B20E Created Zip Spec      14 (20) '2.0'\n-4B20F Created OS            00 (0) 'MS-DOS'\n-4B210 Extract Zip Spec      14 (20) '2.0'\n-4B211 Extract OS            00 (0) 'MS-DOS'\n-4B212 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-4B214 Compression Method    0000 (0) 'Stored'\n-4B216 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4B21A CRC                   2E6A10BD (778703037)\n-4B21E Compressed Size       0000004B (75)\n-4B222 Uncompressed Size     0000004B (75)\n-4B226 Filename Length       003C (60)\n-4B228 Extra Length          0009 (9)\n-4B22A Comment Length        0000 (0)\n-4B22C Disk Start            0000 (0)\n-4B22E Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-4B230 Ext File Attributes   00000000 (0)\n-4B234 Local Header Offset   000043B9 (17337)\n-4B238 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4B238: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-4B274 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4B276   Length              0005 (5)\n-4B278   Flags               01 (1) 'Modification'\n-4B279   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-4B27D CENTRAL HEADER #9     02014B50 (33639248)\n-4B281 Created Zip Spec      14 (20) '2.0'\n-4B282 Created OS            00 (0) 'MS-DOS'\n-4B283 Extract Zip Spec      14 (20) '2.0'\n-4B284 Extract OS            00 (0) 'MS-DOS'\n-4B285 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-4B287 Compression Method    0000 (0) 'Stored'\n-4B289 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4B28D CRC                   175EE5B1 (392095153)\n-4B291 Compressed Size       0000005B (91)\n-4B295 Uncompressed Size     0000005B (91)\n-4B299 Filename Length       0049 (73)\n-4B29B Extra Length          0009 (9)\n-4B29D Comment Length        0000 (0)\n-4B29F Disk Start            0000 (0)\n-4B2A1 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-4B2A3 Ext File Attributes   00000000 (0)\n-4B2A7 Local Header Offset   00004477 (17527)\n-4B2AB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4B2AB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-4B2F4 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4B2F6   Length              0005 (5)\n-4B2F8   Flags               01 (1) 'Modification'\n-4B2F9   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-4B2FD CENTRAL HEADER #10    02014B50 (33639248)\n-4B301 Created Zip Spec      14 (20) '2.0'\n-4B302 Created OS            00 (0) 'MS-DOS'\n-4B303 Extract Zip Spec      14 (20) '2.0'\n-4B304 Extract OS            00 (0) 'MS-DOS'\n-4B305 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-4B307 Compression Method    0000 (0) 'Stored'\n-4B309 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4B30D CRC                   02CBA695 (46900885)\n-4B311 Compressed Size       00000043 (67)\n-4B315 Uncompressed Size     00000043 (67)\n-4B319 Filename Length       0052 (82)\n-4B31B Extra Length          0009 (9)\n-4B31D Comment Length        0000 (0)\n-4B31F Disk Start            0000 (0)\n-4B321 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-4B323 Ext File Attributes   00000000 (0)\n-4B327 Local Header Offset   00004552 (17746)\n-4B32B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4B32B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-4B37D Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4B37F   Length              0005 (5)\n-4B381   Flags               01 (1) 'Modification'\n-4B382   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-4B386 CENTRAL HEADER #11    02014B50 (33639248)\n-4B38A Created Zip Spec      14 (20) '2.0'\n-4B38B Created OS            00 (0) 'MS-DOS'\n-4B38C Extract Zip Spec      14 (20) '2.0'\n-4B38D Extract OS            00 (0) 'MS-DOS'\n-4B38E General Purpose Flag  0000 (0)\n-4B390 Compression Method    0000 (0) 'Stored'\n-4B392 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4B396 CRC                   00000000 (0)\n-4B39A Compressed Size       00000000 (0)\n-4B39E Uncompressed Size     00000000 (0)\n-4B3A2 Filename Length       000F (15)\n-4B3A4 Extra Length          0009 (9)\n-4B3A6 Comment Length        0000 (0)\n-4B3A8 Disk Start            0000 (0)\n-4B3AA Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-4B3AC Ext File Attributes   00000000 (0)\n-4B3B0 Local Header Offset   0000461E (17950)\n-4B3B4 Filename              'XXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4B3B4: Filename 'XXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-4B3C3 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4B3C5   Length              0005 (5)\n-4B3C7   Flags               01 (1) 'Modification'\n-4B3C8   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-4B3CC CENTRAL HEADER #12    02014B50 (33639248)\n-4B3D0 Created Zip Spec      14 (20) '2.0'\n-4B3D1 Created OS            00 (0) 'MS-DOS'\n-4B3D2 Extract Zip Spec      14 (20) '2.0'\n-4B3D3 Extract OS            00 (0) 'MS-DOS'\n-4B3D4 General Purpose Flag  0000 (0)\n-4B3D6 Compression Method    0000 (0) 'Stored'\n-4B3D8 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4B3DC CRC                   00000000 (0)\n-4B3E0 Compressed Size       00000000 (0)\n-4B3E4 Uncompressed Size     00000000 (0)\n-4B3E8 Filename Length       0020 (32)\n-4B3EA Extra Length          0009 (9)\n-4B3EC Comment Length        0000 (0)\n-4B3EE Disk Start            0000 (0)\n-4B3F0 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-4B3F2 Ext File Attributes   00000000 (0)\n-4B3F6 Local Header Offset   00004654 (18004)\n-4B3FA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4B3FA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-4B41A Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4B41C   Length              0005 (5)\n-4B41E   Flags               01 (1) 'Modification'\n-4B41F   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-4B423 CENTRAL HEADER #13    02014B50 (33639248)\n-4B427 Created Zip Spec      14 (20) '2.0'\n-4B428 Created OS            00 (0) 'MS-DOS'\n-4B429 Extract Zip Spec      14 (20) '2.0'\n-4B42A Extract OS            00 (0) 'MS-DOS'\n-4B42B General Purpose Flag  0000 (0)\n-4B42D Compression Method    0000 (0) 'Stored'\n-4B42F Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4B433 CRC                   00000000 (0)\n-4B437 Compressed Size       00000000 (0)\n-4B43B Uncompressed Size     00000000 (0)\n-4B43F Filename Length       0031 (49)\n-4B441 Extra Length          0009 (9)\n-4B443 Comment Length        0000 (0)\n-4B445 Disk Start            0000 (0)\n-4B447 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-4B449 Ext File Attributes   00000000 (0)\n-4B44D Local Header Offset   0000469B (18075)\n-4B451 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4B451: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-4B482 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4B484   Length              0005 (5)\n-4B486   Flags               01 (1) 'Modification'\n-4B487   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-4B48B CENTRAL HEADER #14    02014B50 (33639248)\n-4B48F Created Zip Spec      14 (20) '2.0'\n-4B490 Created OS            00 (0) 'MS-DOS'\n-4B491 Extract Zip Spec      14 (20) '2.0'\n-4B492 Extract OS            00 (0) 'MS-DOS'\n-4B493 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-4B495 Compression Method    0000 (0) 'Stored'\n-4B497 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4B49B CRC                   00000000 (0)\n-4B49F Compressed Size       00000000 (0)\n-4B4A3 Uncompressed Size     00000000 (0)\n-4B4A7 Filename Length       003F (63)\n-4B4A9 Extra Length          0009 (9)\n-4B4AB Comment Length        0000 (0)\n-4B4AD Disk Start            0000 (0)\n-4B4AF Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-4B4B1 Ext File Attributes   00000000 (0)\n-4B4B5 Local Header Offset   000046F3 (18163)\n-4B4B9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4B4B9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-4B4F8 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4B4FA   Length              0005 (5)\n-4B4FC   Flags               01 (1) 'Modification'\n-4B4FD   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-4B501 CENTRAL HEADER #15    02014B50 (33639248)\n-4B505 Created Zip Spec      14 (20) '2.0'\n-4B506 Created OS            00 (0) 'MS-DOS'\n-4B507 Extract Zip Spec      14 (20) '2.0'\n-4B508 Extract OS            00 (0) 'MS-DOS'\n-4B509 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-4B50B Compression Method    0000 (0) 'Stored'\n-4B50D Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4B511 CRC                   48945B27 (1217682215)\n-4B515 Compressed Size       00001F82 (8066)\n-4B519 Uncompressed Size     00001F82 (8066)\n-4B51D Filename Length       0038 (56)\n-4B51F Extra Length          0009 (9)\n-4B521 Comment Length        0000 (0)\n-4B523 Disk Start            0000 (0)\n-4B525 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-4B527 Ext File Attributes   00000000 (0)\n-4B52B Local Header Offset   00004769 (18281)\n-4B52F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4B52F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-4B567 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4B569   Length              0005 (5)\n-4B56B   Flags               01 (1) 'Modification'\n-4B56C   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-4B570 CENTRAL HEADER #16    02014B50 (33639248)\n-4B574 Created Zip Spec      14 (20) '2.0'\n-4B575 Created OS            00 (0) 'MS-DOS'\n-4B576 Extract Zip Spec      14 (20) '2.0'\n-4B577 Extract OS            00 (0) 'MS-DOS'\n-4B578 General Purpose Flag  0000 (0)\n-4B57A Compression Method    0000 (0) 'Stored'\n-4B57C Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4B580 CRC                   00000000 (0)\n-4B584 Compressed Size       00000000 (0)\n-4B588 Uncompressed Size     00000000 (0)\n-4B58C Filename Length       0004 (4)\n-4B58E Extra Length          0009 (9)\n-4B590 Comment Length        0000 (0)\n-4B592 Disk Start            0000 (0)\n-4B594 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-4B596 Ext File Attributes   00000000 (0)\n-4B59A Local Header Offset   0000675A (26458)\n-4B59E Filename              'XXXX'\n-#\n-# WARNING: Offset 0x4B59E: Filename 'XXXX'\n-#          Zero length filename\n-#\n-4B5A2 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4B5A4   Length              0005 (5)\n-4B5A6   Flags               01 (1) 'Modification'\n-4B5A7   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-4B5AB CENTRAL HEADER #17    02014B50 (33639248)\n-4B5AF Created Zip Spec      14 (20) '2.0'\n-4B5B0 Created OS            00 (0) 'MS-DOS'\n-4B5B1 Extract Zip Spec      14 (20) '2.0'\n-4B5B2 Extract OS            00 (0) 'MS-DOS'\n-4B5B3 General Purpose Flag  0000 (0)\n-4B5B5 Compression Method    0000 (0) 'Stored'\n-4B5B7 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4B5BB CRC                   00000000 (0)\n-4B5BF Compressed Size       00000000 (0)\n-4B5C3 Uncompressed Size     00000000 (0)\n-4B5C7 Filename Length       000B (11)\n-4B5C9 Extra Length          0009 (9)\n-4B5CB Comment Length        0000 (0)\n-4B5CD Disk Start            0000 (0)\n-4B5CF Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-4B5D1 Ext File Attributes   00000000 (0)\n-4B5D5 Local Header Offset   00006785 (26501)\n-4B5D9 Filename              'XXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4B5D9: Filename 'XXXXXXXXXXX'\n-#          Zero length filename\n-#\n-4B5E4 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4B5E6   Length              0005 (5)\n-4B5E8   Flags               01 (1) 'Modification'\n-4B5E9   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-4B5ED CENTRAL HEADER #18    02014B50 (33639248)\n-4B5F1 Created Zip Spec      14 (20) '2.0'\n-4B5F2 Created OS            00 (0) 'MS-DOS'\n-4B5F3 Extract Zip Spec      14 (20) '2.0'\n-4B5F4 Extract OS            00 (0) 'MS-DOS'\n-4B5F5 General Purpose Flag  0000 (0)\n-4B5F7 Compression Method    0000 (0) 'Stored'\n-4B5F9 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4B5FD CRC                   00000000 (0)\n-4B601 Compressed Size       00000000 (0)\n-4B605 Uncompressed Size     00000000 (0)\n-4B609 Filename Length       0011 (17)\n-4B60B Extra Length          0009 (9)\n-4B60D Comment Length        0000 (0)\n-4B60F Disk Start            0000 (0)\n-4B611 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-4B613 Ext File Attributes   00000000 (0)\n-4B617 Local Header Offset   000067B7 (26551)\n-4B61B Filename              'XXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4B61B: Filename 'XXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-4B62C Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4B62E   Length              0005 (5)\n-4B630   Flags               01 (1) 'Modification'\n-4B631   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-4B635 CENTRAL HEADER #19    02014B50 (33639248)\n-4B639 Created Zip Spec      14 (20) '2.0'\n-4B63A Created OS            00 (0) 'MS-DOS'\n-4B63B Extract Zip Spec      14 (20) '2.0'\n-4B63C Extract OS            00 (0) 'MS-DOS'\n-4B63D General Purpose Flag  0000 (0)\n-4B63F Compression Method    0000 (0) 'Stored'\n-4B641 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4B645 CRC                   00000000 (0)\n-4B649 Compressed Size       00000000 (0)\n-4B64D Uncompressed Size     00000000 (0)\n-4B651 Filename Length       0018 (24)\n-4B653 Extra Length          0009 (9)\n-4B655 Comment Length        0000 (0)\n-4B657 Disk Start            0000 (0)\n-4B659 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-4B65B Ext File Attributes   00000000 (0)\n-4B65F Local Header Offset   000067EF (26607)\n-4B663 Filename              'XXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4B663: Filename 'XXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-4B67B Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4B67D   Length              0005 (5)\n-4B67F   Flags               01 (1) 'Modification'\n-4B680   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-4B684 CENTRAL HEADER #20    02014B50 (33639248)\n-4B688 Created Zip Spec      14 (20) '2.0'\n-4B689 Created OS            00 (0) 'MS-DOS'\n-4B68A Extract Zip Spec      14 (20) '2.0'\n-4B68B Extract OS            00 (0) 'MS-DOS'\n-4B68C General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-4B68E Compression Method    0000 (0) 'Stored'\n-4B690 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4B694 CRC                   44C14167 (1153515879)\n-4B698 Compressed Size       00000471 (1137)\n-4B69C Uncompressed Size     00000471 (1137)\n-4B6A0 Filename Length       002E (46)\n-4B6A2 Extra Length          0009 (9)\n-4B6A4 Comment Length        0000 (0)\n-4B6A6 Disk Start            0000 (0)\n-4B6A8 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-4B6AA Ext File Attributes   00000000 (0)\n-4B6AE Local Header Offset   0000682E (26670)\n-4B6B2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4B6B2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-4B6E0 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4B6E2   Length              0005 (5)\n-4B6E4   Flags               01 (1) 'Modification'\n-4B6E5   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-4B6E9 CENTRAL HEADER #21    02014B50 (33639248)\n-4B6ED Created Zip Spec      14 (20) '2.0'\n-4B6EE Created OS            00 (0) 'MS-DOS'\n-4B6EF Extract Zip Spec      14 (20) '2.0'\n-4B6F0 Extract OS            00 (0) 'MS-DOS'\n-4B6F1 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-4B6F3 Compression Method    0000 (0) 'Stored'\n-4B6F5 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4B6F9 CRC                   F5917ED9 (4119953113)\n-4B6FD Compressed Size       0000045C (1116)\n-4B701 Uncompressed Size     0000045C (1116)\n-4B705 Filename Length       0030 (48)\n-4B707 Extra Length          0009 (9)\n-4B709 Comment Length        0000 (0)\n-4B70B Disk Start            0000 (0)\n-4B70D Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-4B70F Ext File Attributes   00000000 (0)\n-4B713 Local Header Offset   00006D04 (27908)\n-4B717 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4B717: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-4B747 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4B749   Length              0005 (5)\n-4B74B   Flags               01 (1) 'Modification'\n-4B74C   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-4B750 CENTRAL HEADER #22    02014B50 (33639248)\n-4B754 Created Zip Spec      14 (20) '2.0'\n-4B755 Created OS            00 (0) 'MS-DOS'\n-4B756 Extract Zip Spec      14 (20) '2.0'\n-4B757 Extract OS            00 (0) 'MS-DOS'\n-4B758 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-4B75A Compression Method    0000 (0) 'Stored'\n-4B75C Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4B760 CRC                   7CE2D61E (2095240734)\n-4B764 Compressed Size       0000131F (4895)\n-4B768 Uncompressed Size     0000131F (4895)\n-4B76C Filename Length       002E (46)\n-4B76E Extra Length          0009 (9)\n-4B770 Comment Length        0000 (0)\n-4B772 Disk Start            0000 (0)\n-4B774 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-4B776 Ext File Attributes   00000000 (0)\n-4B77A Local Header Offset   000071C7 (29127)\n-4B77E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4B77E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-4B7AC Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4B7AE   Length              0005 (5)\n-4B7B0   Flags               01 (1) 'Modification'\n-4B7B1   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-4B7B5 CENTRAL HEADER #23    02014B50 (33639248)\n-4B7B9 Created Zip Spec      14 (20) '2.0'\n-4B7BA Created OS            00 (0) 'MS-DOS'\n-4B7BB Extract Zip Spec      14 (20) '2.0'\n-4B7BC Extract OS            00 (0) 'MS-DOS'\n-4B7BD General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-4B7BF Compression Method    0000 (0) 'Stored'\n-4B7C1 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4B7C5 CRC                   5F946D70 (1603562864)\n-4B7C9 Compressed Size       00005E41 (24129)\n-4B7CD Uncompressed Size     00005E41 (24129)\n-4B7D1 Filename Length       002C (44)\n-4B7D3 Extra Length          0009 (9)\n-4B7D5 Comment Length        0000 (0)\n-4B7D7 Disk Start            0000 (0)\n-4B7D9 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-4B7DB Ext File Attributes   00000000 (0)\n-4B7DF Local Header Offset   0000854B (34123)\n-4B7E3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4B7E3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-4B80F Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4B811   Length              0005 (5)\n-4B813   Flags               01 (1) 'Modification'\n-4B814   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-4B818 CENTRAL HEADER #24    02014B50 (33639248)\n-4B81C Created Zip Spec      14 (20) '2.0'\n-4B81D Created OS            00 (0) 'MS-DOS'\n-4B81E Extract Zip Spec      14 (20) '2.0'\n-4B81F Extract OS            00 (0) 'MS-DOS'\n-4B820 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-4B822 Compression Method    0000 (0) 'Stored'\n-4B824 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4B828 CRC                   CBF03B71 (3421518705)\n-4B82C Compressed Size       00007DD7 (32215)\n-4B830 Uncompressed Size     00007DD7 (32215)\n-4B834 Filename Length       002A (42)\n-4B836 Extra Length          0009 (9)\n-4B838 Comment Length        0000 (0)\n-4B83A Disk Start            0000 (0)\n-4B83C Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-4B83E Ext File Attributes   00000000 (0)\n-4B842 Local Header Offset   0000E3EF (58351)\n-4B846 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4B846: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-4B870 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4B872   Length              0005 (5)\n-4B874   Flags               01 (1) 'Modification'\n-4B875   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-4B879 CENTRAL HEADER #25    02014B50 (33639248)\n-4B87D Created Zip Spec      14 (20) '2.0'\n-4B87E Created OS            00 (0) 'MS-DOS'\n-4B87F Extract Zip Spec      14 (20) '2.0'\n-4B880 Extract OS            00 (0) 'MS-DOS'\n-4B881 General Purpose Flag  0000 (0)\n-4B883 Compression Method    0000 (0) 'Stored'\n-4B885 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4B889 CRC                   00000000 (0)\n-4B88D Compressed Size       00000000 (0)\n-4B891 Uncompressed Size     00000000 (0)\n-4B895 Filename Length       0022 (34)\n-4B897 Extra Length          0009 (9)\n-4B899 Comment Length        0000 (0)\n-4B89B Disk Start            0000 (0)\n-4B89D Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-4B89F Ext File Attributes   00000000 (0)\n-4B8A3 Local Header Offset   00016227 (90663)\n-4B8A7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4B8A7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-4B8C9 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4B8CB   Length              0005 (5)\n-4B8CD   Flags               01 (1) 'Modification'\n-4B8CE   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-4B8D2 CENTRAL HEADER #26    02014B50 (33639248)\n-4B8D6 Created Zip Spec      14 (20) '2.0'\n-4B8D7 Created OS            00 (0) 'MS-DOS'\n-4B8D8 Extract Zip Spec      14 (20) '2.0'\n-4B8D9 Extract OS            00 (0) 'MS-DOS'\n-4B8DA General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-4B8DC Compression Method    0000 (0) 'Stored'\n-4B8DE Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4B8E2 CRC                   57D2914C (1473417548)\n-4B8E6 Compressed Size       0000CCAC (52396)\n-4B8EA Uncompressed Size     0000CCAC (52396)\n-4B8EE Filename Length       0035 (53)\n-4B8F0 Extra Length          0009 (9)\n-4B8F2 Comment Length        0000 (0)\n-4B8F4 Disk Start            0000 (0)\n-4B8F6 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-4B8F8 Ext File Attributes   00000000 (0)\n-4B8FC Local Header Offset   00016270 (90736)\n-4B900 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4B900: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-4B935 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4B937   Length              0005 (5)\n-4B939   Flags               01 (1) 'Modification'\n-4B93A   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-4B93E CENTRAL HEADER #27    02014B50 (33639248)\n-4B942 Created Zip Spec      14 (20) '2.0'\n-4B943 Created OS            00 (0) 'MS-DOS'\n-4B944 Extract Zip Spec      14 (20) '2.0'\n-4B945 Extract OS            00 (0) 'MS-DOS'\n-4B946 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-4B948 Compression Method    0000 (0) 'Stored'\n-4B94A Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4B94E CRC                   BB643DBD (3143908797)\n-4B952 Compressed Size       0000046C (1132)\n-4B956 Uncompressed Size     0000046C (1132)\n-4B95A Filename Length       0046 (70)\n-4B95C Extra Length          0009 (9)\n-4B95E Comment Length        0000 (0)\n-4B960 Disk Start            0000 (0)\n-4B962 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-4B964 Ext File Attributes   00000000 (0)\n-4B968 Local Header Offset   00022F88 (143240)\n-4B96C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4B96C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-4B9B2 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4B9B4   Length              0005 (5)\n-4B9B6   Flags               01 (1) 'Modification'\n-4B9B7   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-4B9BB CENTRAL HEADER #28    02014B50 (33639248)\n-4B9BF Created Zip Spec      14 (20) '2.0'\n-4B9C0 Created OS            00 (0) 'MS-DOS'\n-4B9C1 Extract Zip Spec      14 (20) '2.0'\n-4B9C2 Extract OS            00 (0) 'MS-DOS'\n-4B9C3 General Purpose Flag  0000 (0)\n-4B9C5 Compression Method    0000 (0) 'Stored'\n-4B9C7 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4B9CB CRC                   00000000 (0)\n-4B9CF Compressed Size       00000000 (0)\n-4B9D3 Uncompressed Size     00000000 (0)\n-4B9D7 Filename Length       002B (43)\n-4B9D9 Extra Length          0009 (9)\n-4B9DB Comment Length        0000 (0)\n-4B9DD Disk Start            0000 (0)\n-4B9DF Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-4B9E1 Ext File Attributes   00000000 (0)\n-4B9E5 Local Header Offset   00023471 (144497)\n-4B9E9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4B9E9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-4BA14 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4BA16   Length              0005 (5)\n-4BA18   Flags               01 (1) 'Modification'\n-4BA19   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-4BA1D CENTRAL HEADER #29    02014B50 (33639248)\n-4BA21 Created Zip Spec      14 (20) '2.0'\n-4BA22 Created OS            00 (0) 'MS-DOS'\n-4BA23 Extract Zip Spec      14 (20) '2.0'\n-4BA24 Extract OS            00 (0) 'MS-DOS'\n-4BA25 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-4BA27 Compression Method    0000 (0) 'Stored'\n-4BA29 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4BA2D CRC                   272CCF3E (657248062)\n-4BA31 Compressed Size       000009E5 (2533)\n-4BA35 Uncompressed Size     000009E5 (2533)\n-4BA39 Filename Length       003F (63)\n-4BA3B Extra Length          0009 (9)\n-4BA3D Comment Length        0000 (0)\n-4BA3F Disk Start            0000 (0)\n-4BA41 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-4BA43 Ext File Attributes   00000000 (0)\n-4BA47 Local Header Offset   000234C3 (144579)\n-4BA4B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4BA4B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-4BA8A Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4BA8C   Length              0005 (5)\n-4BA8E   Flags               01 (1) 'Modification'\n-4BA8F   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-4BA93 CENTRAL HEADER #30    02014B50 (33639248)\n-4BA97 Created Zip Spec      14 (20) '2.0'\n-4BA98 Created OS            00 (0) 'MS-DOS'\n-4BA99 Extract Zip Spec      14 (20) '2.0'\n-4BA9A Extract OS            00 (0) 'MS-DOS'\n-4BA9B General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-4BA9D Compression Method    0000 (0) 'Stored'\n-4BA9F Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4BAA3 CRC                   A2DFDA9A (2732579482)\n-4BAA7 Compressed Size       000023FC (9212)\n-4BAAB Uncompressed Size     000023FC (9212)\n-4BAAF Filename Length       0048 (72)\n-4BAB1 Extra Length          0009 (9)\n-4BAB3 Comment Length        0000 (0)\n-4BAB5 Disk Start            0000 (0)\n-4BAB7 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-4BAB9 Ext File Attributes   00000000 (0)\n-4BABD Local Header Offset   00023F1E (147230)\n-4BAC1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4BAC1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-4BB09 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4BB0B   Length              0005 (5)\n-4BB0D   Flags               01 (1) 'Modification'\n-4BB0E   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-4BB12 CENTRAL HEADER #31    02014B50 (33639248)\n-4BB16 Created Zip Spec      14 (20) '2.0'\n-4BB17 Created OS            00 (0) 'MS-DOS'\n-4BB18 Extract Zip Spec      14 (20) '2.0'\n-4BB19 Extract OS            00 (0) 'MS-DOS'\n-4BB1A General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-4BB1C Compression Method    0000 (0) 'Stored'\n-4BB1E Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4BB22 CRC                   99D438F5 (2580822261)\n-4BB26 Compressed Size       00001582 (5506)\n-4BB2A Uncompressed Size     00001582 (5506)\n-4BB2E Filename Length       0045 (69)\n-4BB30 Extra Length          0009 (9)\n-4BB32 Comment Length        0000 (0)\n-4BB34 Disk Start            0000 (0)\n-4BB36 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-4BB38 Ext File Attributes   00000000 (0)\n-4BB3C Local Header Offset   00026399 (156569)\n-4BB40 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4BB40: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-4BB85 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4BB87   Length              0005 (5)\n-4BB89   Flags               01 (1) 'Modification'\n-4BB8A   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-4BB8E CENTRAL HEADER #32    02014B50 (33639248)\n-4BB92 Created Zip Spec      14 (20) '2.0'\n-4BB93 Created OS            00 (0) 'MS-DOS'\n-4BB94 Extract Zip Spec      14 (20) '2.0'\n-4BB95 Extract OS            00 (0) 'MS-DOS'\n-4BB96 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-4BB98 Compression Method    0000 (0) 'Stored'\n-4BB9A Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4BB9E CRC                   348CD6A3 (881645219)\n-4BBA2 Compressed Size       00001009 (4105)\n-4BBA6 Uncompressed Size     00001009 (4105)\n-4BBAA Filename Length       0048 (72)\n-4BBAC Extra Length          0009 (9)\n-4BBAE Comment Length        0000 (0)\n-4BBB0 Disk Start            0000 (0)\n-4BBB2 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-4BBB4 Ext File Attributes   00000000 (0)\n-4BBB8 Local Header Offset   00027997 (162199)\n-4BBBC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4BBBC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-4BC04 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4BC06   Length              0005 (5)\n-4BC08   Flags               01 (1) 'Modification'\n-4BC09   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-4BC0D CENTRAL HEADER #33    02014B50 (33639248)\n-4BC11 Created Zip Spec      14 (20) '2.0'\n-4BC12 Created OS            00 (0) 'MS-DOS'\n-4BC13 Extract Zip Spec      14 (20) '2.0'\n-4BC14 Extract OS            00 (0) 'MS-DOS'\n-4BC15 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-4BC17 Compression Method    0000 (0) 'Stored'\n-4BC19 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4BC1D CRC                   C2D529E3 (3268749795)\n-4BC21 Compressed Size       00001A83 (6787)\n-4BC25 Uncompressed Size     00001A83 (6787)\n-4BC29 Filename Length       0046 (70)\n-4BC2B Extra Length          0009 (9)\n-4BC2D Comment Length        0000 (0)\n-4BC2F Disk Start            0000 (0)\n-4BC31 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-4BC33 Ext File Attributes   00000000 (0)\n-4BC37 Local Header Offset   00028A1F (166431)\n-4BC3B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4BC3B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-4BC81 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4BC83   Length              0005 (5)\n-4BC85   Flags               01 (1) 'Modification'\n-4BC86   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-4BC8A CENTRAL HEADER #34    02014B50 (33639248)\n-4BC8E Created Zip Spec      14 (20) '2.0'\n-4BC8F Created OS            00 (0) 'MS-DOS'\n-4BC90 Extract Zip Spec      14 (20) '2.0'\n-4BC91 Extract OS            00 (0) 'MS-DOS'\n-4BC92 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-4BC94 Compression Method    0000 (0) 'Stored'\n-4BC96 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4BC9A CRC                   E72A3EBF (3878305471)\n-4BC9E Compressed Size       00001A6F (6767)\n-4BCA2 Uncompressed Size     00001A6F (6767)\n-4BCA6 Filename Length       0042 (66)\n-4BCA8 Extra Length          0009 (9)\n-4BCAA Comment Length        0000 (0)\n-4BCAC Disk Start            0000 (0)\n-4BCAE Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-4BCB0 Ext File Attributes   00000000 (0)\n-4BCB4 Local Header Offset   0002A51F (173343)\n-4BCB8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4BCB8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-4BCFA Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4BCFC   Length              0005 (5)\n-4BCFE   Flags               01 (1) 'Modification'\n-4BCFF   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-4BD03 CENTRAL HEADER #35    02014B50 (33639248)\n-4BD07 Created Zip Spec      14 (20) '2.0'\n-4BD08 Created OS            00 (0) 'MS-DOS'\n-4BD09 Extract Zip Spec      14 (20) '2.0'\n-4BD0A Extract OS            00 (0) 'MS-DOS'\n-4BD0B General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-4BD0D Compression Method    0000 (0) 'Stored'\n-4BD0F Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4BD13 CRC                   1CF76EFC (485977852)\n-4BD17 Compressed Size       00000749 (1865)\n-4BD1B Uncompressed Size     00000749 (1865)\n-4BD1F Filename Length       003F (63)\n-4BD21 Extra Length          0009 (9)\n-4BD23 Comment Length        0000 (0)\n-4BD25 Disk Start            0000 (0)\n-4BD27 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-4BD29 Ext File Attributes   00000000 (0)\n-4BD2D Local Header Offset   0002C007 (180231)\n-4BD31 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4BD31: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-4BD70 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4BD72   Length              0005 (5)\n-4BD74   Flags               01 (1) 'Modification'\n-4BD75   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-4BD79 CENTRAL HEADER #36    02014B50 (33639248)\n-4BD7D Created Zip Spec      14 (20) '2.0'\n-4BD7E Created OS            00 (0) 'MS-DOS'\n-4BD7F Extract Zip Spec      14 (20) '2.0'\n-4BD80 Extract OS            00 (0) 'MS-DOS'\n-4BD81 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-4BD83 Compression Method    0000 (0) 'Stored'\n-4BD85 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4BD89 CRC                   187BA855 (410757205)\n-4BD8D Compressed Size       000010FE (4350)\n-4BD91 Uncompressed Size     000010FE (4350)\n-4BD95 Filename Length       0043 (67)\n-4BD97 Extra Length          0009 (9)\n-4BD99 Comment Length        0000 (0)\n-4BD9B Disk Start            0000 (0)\n-4BD9D Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-4BD9F Ext File Attributes   00000000 (0)\n-4BDA3 Local Header Offset   0002C7C6 (182214)\n-4BDA7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4BDA7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-4BDEA Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4BDEC   Length              0005 (5)\n-4BDEE   Flags               01 (1) 'Modification'\n-4BDEF   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-4BDF3 CENTRAL HEADER #37    02014B50 (33639248)\n-4BDF7 Created Zip Spec      14 (20) '2.0'\n-4BDF8 Created OS            00 (0) 'MS-DOS'\n-4BDF9 Extract Zip Spec      14 (20) '2.0'\n-4BDFA Extract OS            00 (0) 'MS-DOS'\n-4BDFB General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-4BDFD Compression Method    0000 (0) 'Stored'\n-4BDFF Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4BE03 CRC                   D7A41DAE (3617856942)\n-4BE07 Compressed Size       00000D3D (3389)\n-4BE0B Uncompressed Size     00000D3D (3389)\n-4BE0F Filename Length       003F (63)\n-4BE11 Extra Length          0009 (9)\n-4BE13 Comment Length        0000 (0)\n-4BE15 Disk Start            0000 (0)\n-4BE17 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-4BE19 Ext File Attributes   00000000 (0)\n-4BE1D Local Header Offset   0002D93E (186686)\n-4BE21 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4BE21: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-4BE60 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4BE62   Length              0005 (5)\n-4BE64   Flags               01 (1) 'Modification'\n-4BE65   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-4BE69 CENTRAL HEADER #38    02014B50 (33639248)\n-4BE6D Created Zip Spec      14 (20) '2.0'\n-4BE6E Created OS            00 (0) 'MS-DOS'\n-4BE6F Extract Zip Spec      14 (20) '2.0'\n-4BE70 Extract OS            00 (0) 'MS-DOS'\n-4BE71 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-4BE73 Compression Method    0000 (0) 'Stored'\n-4BE75 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4BE79 CRC                   F1C1369F (4055971487)\n-4BE7D Compressed Size       000010CF (4303)\n-4BE81 Uncompressed Size     000010CF (4303)\n-4BE85 Filename Length       0045 (69)\n-4BE87 Extra Length          0009 (9)\n-4BE89 Comment Length        0000 (0)\n-4BE8B Disk Start            0000 (0)\n-4BE8D Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-4BE8F Ext File Attributes   00000000 (0)\n-4BE93 Local Header Offset   0002E6F1 (190193)\n-4BE97 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4BE97: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-4BEDC Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4BEDE   Length              0005 (5)\n-4BEE0   Flags               01 (1) 'Modification'\n-4BEE1   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-4BEE5 CENTRAL HEADER #39    02014B50 (33639248)\n-4BEE9 Created Zip Spec      14 (20) '2.0'\n-4BEEA Created OS            00 (0) 'MS-DOS'\n-4BEEB Extract Zip Spec      14 (20) '2.0'\n-4BEEC Extract OS            00 (0) 'MS-DOS'\n-4BEED General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-4BEEF Compression Method    0000 (0) 'Stored'\n-4BEF1 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4BEF5 CRC                   B12B8896 (2972420246)\n-4BEF9 Compressed Size       000017E3 (6115)\n-4BEFD Uncompressed Size     000017E3 (6115)\n-4BF01 Filename Length       003D (61)\n-4BF03 Extra Length          0009 (9)\n-4BF05 Comment Length        0000 (0)\n-4BF07 Disk Start            0000 (0)\n-4BF09 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-4BF0B Ext File Attributes   00000000 (0)\n-4BF0F Local Header Offset   0002F83C (194620)\n-4BF13 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4BF13: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-4BF50 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4BF52   Length              0005 (5)\n-4BF54   Flags               01 (1) 'Modification'\n-4BF55   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-4BF59 CENTRAL HEADER #40    02014B50 (33639248)\n-4BF5D Created Zip Spec      14 (20) '2.0'\n-4BF5E Created OS            00 (0) 'MS-DOS'\n-4BF5F Extract Zip Spec      14 (20) '2.0'\n-4BF60 Extract OS            00 (0) 'MS-DOS'\n-4BF61 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-4BF63 Compression Method    0000 (0) 'Stored'\n-4BF65 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4BF69 CRC                   04D43ED1 (81018577)\n-4BF6D Compressed Size       00000D84 (3460)\n-4BF71 Uncompressed Size     00000D84 (3460)\n-4BF75 Filename Length       003D (61)\n-4BF77 Extra Length          0009 (9)\n-4BF79 Comment Length        0000 (0)\n-4BF7B Disk Start            0000 (0)\n-4BF7D Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-4BF7F Ext File Attributes   00000000 (0)\n-4BF83 Local Header Offset   00031093 (200851)\n-4BF87 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4BF87: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-4BFC4 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4BFC6   Length              0005 (5)\n-4BFC8   Flags               01 (1) 'Modification'\n-4BFC9   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-4BFCD CENTRAL HEADER #41    02014B50 (33639248)\n-4BFD1 Created Zip Spec      14 (20) '2.0'\n-4BFD2 Created OS            00 (0) 'MS-DOS'\n-4BFD3 Extract Zip Spec      14 (20) '2.0'\n-4BFD4 Extract OS            00 (0) 'MS-DOS'\n-4BFD5 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-4BFD7 Compression Method    0000 (0) 'Stored'\n-4BFD9 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4BFDD CRC                   05580F75 (89657205)\n-4BFE1 Compressed Size       00000EA4 (3748)\n-4BFE5 Uncompressed Size     00000EA4 (3748)\n-4BFE9 Filename Length       003E (62)\n-4BFEB Extra Length          0009 (9)\n-4BFED Comment Length        0000 (0)\n-4BFEF Disk Start            0000 (0)\n-4BFF1 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-4BFF3 Ext File Attributes   00000000 (0)\n-4BFF7 Local Header Offset   00031E8B (204427)\n-4BFFB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4BFFB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-4C039 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4C03B   Length              0005 (5)\n-4C03D   Flags               01 (1) 'Modification'\n-4C03E   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-4C042 CENTRAL HEADER #42    02014B50 (33639248)\n-4C046 Created Zip Spec      14 (20) '2.0'\n-4C047 Created OS            00 (0) 'MS-DOS'\n-4C048 Extract Zip Spec      14 (20) '2.0'\n-4C049 Extract OS            00 (0) 'MS-DOS'\n-4C04A General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-4C04C Compression Method    0000 (0) 'Stored'\n-4C04E Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4C052 CRC                   D6497204 (3595137540)\n-4C056 Compressed Size       00002746 (10054)\n-4C05A Uncompressed Size     00002746 (10054)\n-4C05E Filename Length       003F (63)\n-4C060 Extra Length          0009 (9)\n-4C062 Comment Length        0000 (0)\n-4C064 Disk Start            0000 (0)\n-4C066 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-4C068 Ext File Attributes   00000000 (0)\n-4C06C Local Header Offset   00032DA4 (208292)\n-4C070 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4C070: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-4C0AF Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4C0B1   Length              0005 (5)\n-4C0B3   Flags               01 (1) 'Modification'\n-4C0B4   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-4C0B8 CENTRAL HEADER #43    02014B50 (33639248)\n-4C0BC Created Zip Spec      14 (20) '2.0'\n-4C0BD Created OS            00 (0) 'MS-DOS'\n-4C0BE Extract Zip Spec      14 (20) '2.0'\n-4C0BF Extract OS            00 (0) 'MS-DOS'\n-4C0C0 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-4C0C2 Compression Method    0000 (0) 'Stored'\n-4C0C4 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4C0C8 CRC                   1ADB9373 (450597747)\n-4C0CC Compressed Size       00001A82 (6786)\n-4C0D0 Uncompressed Size     00001A82 (6786)\n-4C0D4 Filename Length       003F (63)\n-4C0D6 Extra Length          0009 (9)\n-4C0D8 Comment Length        0000 (0)\n-4C0DA Disk Start            0000 (0)\n-4C0DC Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-4C0DE Ext File Attributes   00000000 (0)\n-4C0E2 Local Header Offset   00035560 (218464)\n-4C0E6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4C0E6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-4C125 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4C127   Length              0005 (5)\n-4C129   Flags               01 (1) 'Modification'\n-4C12A   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-4C12E CENTRAL HEADER #44    02014B50 (33639248)\n-4C132 Created Zip Spec      14 (20) '2.0'\n-4C133 Created OS            00 (0) 'MS-DOS'\n-4C134 Extract Zip Spec      14 (20) '2.0'\n-4C135 Extract OS            00 (0) 'MS-DOS'\n-4C136 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-4C138 Compression Method    0000 (0) 'Stored'\n-4C13A Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4C13E CRC                   41505507 (1095783687)\n-4C142 Compressed Size       00001224 (4644)\n-4C146 Uncompressed Size     00001224 (4644)\n-4C14A Filename Length       0040 (64)\n-4C14C Extra Length          0009 (9)\n-4C14E Comment Length        0000 (0)\n-4C150 Disk Start            0000 (0)\n-4C152 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-4C154 Ext File Attributes   00000000 (0)\n-4C158 Local Header Offset   00037058 (225368)\n-4C15C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4C15C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-4C19C Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4C19E   Length              0005 (5)\n-4C1A0   Flags               01 (1) 'Modification'\n-4C1A1   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-4C1A5 CENTRAL HEADER #45    02014B50 (33639248)\n-4C1A9 Created Zip Spec      14 (20) '2.0'\n-4C1AA Created OS            00 (0) 'MS-DOS'\n-4C1AB Extract Zip Spec      14 (20) '2.0'\n-4C1AC Extract OS            00 (0) 'MS-DOS'\n-4C1AD General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-4C1AF Compression Method    0000 (0) 'Stored'\n-4C1B1 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4C1B5 CRC                   C452CFCB (3293761483)\n-4C1B9 Compressed Size       000025C2 (9666)\n-4C1BD Uncompressed Size     000025C2 (9666)\n-4C1C1 Filename Length       003F (63)\n-4C1C3 Extra Length          0009 (9)\n-4C1C5 Comment Length        0000 (0)\n-4C1C7 Disk Start            0000 (0)\n-4C1C9 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-4C1CB Ext File Attributes   00000000 (0)\n-4C1CF Local Header Offset   000382F3 (230131)\n-4C1D3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4C1D3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-4C212 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4C214   Length              0005 (5)\n-4C216   Flags               01 (1) 'Modification'\n-4C217   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-4C21B CENTRAL HEADER #46    02014B50 (33639248)\n-4C21F Created Zip Spec      14 (20) '2.0'\n-4C220 Created OS            00 (0) 'MS-DOS'\n-4C221 Extract Zip Spec      14 (20) '2.0'\n-4C222 Extract OS            00 (0) 'MS-DOS'\n-4C223 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-4C225 Compression Method    0000 (0) 'Stored'\n-4C227 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4C22B CRC                   FCF57B8C (4243946380)\n-4C22F Compressed Size       00001158 (4440)\n-4C233 Uncompressed Size     00001158 (4440)\n-4C237 Filename Length       003E (62)\n-4C239 Extra Length          0009 (9)\n-4C23B Comment Length        0000 (0)\n-4C23D Disk Start            0000 (0)\n-4C23F Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-4C241 Ext File Attributes   00000000 (0)\n-4C245 Local Header Offset   0003A92B (239915)\n-4C249 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4C249: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-4C287 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4C289   Length              0005 (5)\n-4C28B   Flags               01 (1) 'Modification'\n-4C28C   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-4C290 CENTRAL HEADER #47    02014B50 (33639248)\n-4C294 Created Zip Spec      14 (20) '2.0'\n-4C295 Created OS            00 (0) 'MS-DOS'\n-4C296 Extract Zip Spec      14 (20) '2.0'\n-4C297 Extract OS            00 (0) 'MS-DOS'\n-4C298 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-4C29A Compression Method    0000 (0) 'Stored'\n-4C29C Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4C2A0 CRC                   93AEE0AC (2477711532)\n-4C2A4 Compressed Size       0000040A (1034)\n-4C2A8 Uncompressed Size     0000040A (1034)\n-4C2AC Filename Length       003C (60)\n-4C2AE Extra Length          0009 (9)\n-4C2B0 Comment Length        0000 (0)\n-4C2B2 Disk Start            0000 (0)\n-4C2B4 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-4C2B6 Ext File Attributes   00000000 (0)\n-4C2BA Local Header Offset   0003BAF8 (244472)\n-4C2BE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4C2BE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-4C2FA Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4C2FC   Length              0005 (5)\n-4C2FE   Flags               01 (1) 'Modification'\n-4C2FF   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-4C303 CENTRAL HEADER #48    02014B50 (33639248)\n-4C307 Created Zip Spec      14 (20) '2.0'\n-4C308 Created OS            00 (0) 'MS-DOS'\n-4C309 Extract Zip Spec      14 (20) '2.0'\n-4C30A Extract OS            00 (0) 'MS-DOS'\n-4C30B General Purpose Flag  0000 (0)\n-4C30D Compression Method    0000 (0) 'Stored'\n-4C30F Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4C313 CRC                   00000000 (0)\n-4C317 Compressed Size       00000000 (0)\n-4C31B Uncompressed Size     00000000 (0)\n-4C31F Filename Length       001E (30)\n-4C321 Extra Length          0009 (9)\n-4C323 Comment Length        0000 (0)\n-4C325 Disk Start            0000 (0)\n-4C327 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-4C329 Ext File Attributes   00000000 (0)\n-4C32D Local Header Offset   0003BF75 (245621)\n-4C331 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4C331: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-4C34F Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4C351   Length              0005 (5)\n-4C353   Flags               01 (1) 'Modification'\n-4C354   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-4C358 CENTRAL HEADER #49    02014B50 (33639248)\n-4C35C Created Zip Spec      14 (20) '2.0'\n-4C35D Created OS            00 (0) 'MS-DOS'\n-4C35E Extract Zip Spec      14 (20) '2.0'\n-4C35F Extract OS            00 (0) 'MS-DOS'\n-4C360 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-4C362 Compression Method    0000 (0) 'Stored'\n-4C364 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4C368 CRC                   7A3B23D9 (2050696153)\n-4C36C Compressed Size       00000479 (1145)\n-4C370 Uncompressed Size     00000479 (1145)\n-4C374 Filename Length       003D (61)\n-4C376 Extra Length          0009 (9)\n-4C378 Comment Length        0000 (0)\n-4C37A Disk Start            0000 (0)\n-4C37C Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-4C37E Ext File Attributes   00000000 (0)\n-4C382 Local Header Offset   0003BFBA (245690)\n-4C386 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4C386: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-4C3C3 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4C3C5   Length              0005 (5)\n-4C3C7   Flags               01 (1) 'Modification'\n-4C3C8   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-4C3CC CENTRAL HEADER #50    02014B50 (33639248)\n-4C3D0 Created Zip Spec      14 (20) '2.0'\n-4C3D1 Created OS            00 (0) 'MS-DOS'\n-4C3D2 Extract Zip Spec      14 (20) '2.0'\n-4C3D3 Extract OS            00 (0) 'MS-DOS'\n-4C3D4 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-4C3D6 Compression Method    0000 (0) 'Stored'\n-4C3D8 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4C3DC CRC                   3E8906CC (1049167564)\n-4C3E0 Compressed Size       00000690 (1680)\n-4C3E4 Uncompressed Size     00000690 (1680)\n-4C3E8 Filename Length       0043 (67)\n-4C3EA Extra Length          0009 (9)\n-4C3EC Comment Length        0000 (0)\n-4C3EE Disk Start            0000 (0)\n-4C3F0 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-4C3F2 Ext File Attributes   00000000 (0)\n-4C3F6 Local Header Offset   0003C4A7 (246951)\n-4C3FA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4C3FA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-4C43D Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4C43F   Length              0005 (5)\n-4C441   Flags               01 (1) 'Modification'\n-4C442   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-4C446 CENTRAL HEADER #51    02014B50 (33639248)\n-4C44A Created Zip Spec      14 (20) '2.0'\n-4C44B Created OS            00 (0) 'MS-DOS'\n-4C44C Extract Zip Spec      14 (20) '2.0'\n-4C44D Extract OS            00 (0) 'MS-DOS'\n-4C44E General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-4C450 Compression Method    0000 (0) 'Stored'\n-4C452 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4C456 CRC                   AE1F051B (2921268507)\n-4C45A Compressed Size       00000698 (1688)\n-4C45E Uncompressed Size     00000698 (1688)\n-4C462 Filename Length       0045 (69)\n-4C464 Extra Length          0009 (9)\n-4C466 Comment Length        0000 (0)\n-4C468 Disk Start            0000 (0)\n-4C46A Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-4C46C Ext File Attributes   00000000 (0)\n-4C470 Local Header Offset   0003CBB1 (248753)\n-4C474 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4C474: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-4C4B9 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4C4BB   Length              0005 (5)\n-4C4BD   Flags               01 (1) 'Modification'\n-4C4BE   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-4C4C2 CENTRAL HEADER #52    02014B50 (33639248)\n-4C4C6 Created Zip Spec      14 (20) '2.0'\n-4C4C7 Created OS            00 (0) 'MS-DOS'\n-4C4C8 Extract Zip Spec      14 (20) '2.0'\n-4C4C9 Extract OS            00 (0) 'MS-DOS'\n-4C4CA General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-4C4CC Compression Method    0000 (0) 'Stored'\n-4C4CE Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4C4D2 CRC                   542D0143 (1412235587)\n-4C4D6 Compressed Size       000005A4 (1444)\n-4C4DA Uncompressed Size     000005A4 (1444)\n-4C4DE Filename Length       0040 (64)\n-4C4E0 Extra Length          0009 (9)\n-4C4E2 Comment Length        0000 (0)\n-4C4E4 Disk Start            0000 (0)\n-4C4E6 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-4C4E8 Ext File Attributes   00000000 (0)\n-4C4EC Local Header Offset   0003D2C5 (250565)\n-4C4F0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4C4F0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-4C530 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4C532   Length              0005 (5)\n-4C534   Flags               01 (1) 'Modification'\n-4C535   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-4C539 CENTRAL HEADER #53    02014B50 (33639248)\n-4C53D Created Zip Spec      14 (20) '2.0'\n-4C53E Created OS            00 (0) 'MS-DOS'\n-4C53F Extract Zip Spec      14 (20) '2.0'\n-4C540 Extract OS            00 (0) 'MS-DOS'\n-4C541 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-4C543 Compression Method    0000 (0) 'Stored'\n-4C545 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4C549 CRC                   FC50C2FA (4233151226)\n-4C54D Compressed Size       0000066A (1642)\n-4C551 Uncompressed Size     0000066A (1642)\n-4C555 Filename Length       0042 (66)\n-4C557 Extra Length          0009 (9)\n-4C559 Comment Length        0000 (0)\n-4C55B Disk Start            0000 (0)\n-4C55D Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-4C55F Ext File Attributes   00000000 (0)\n-4C563 Local Header Offset   0003D8E0 (252128)\n-4C567 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4C567: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-4C5A9 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4C5AB   Length              0005 (5)\n-4C5AD   Flags               01 (1) 'Modification'\n-4C5AE   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-4C5B2 CENTRAL HEADER #54    02014B50 (33639248)\n-4C5B6 Created Zip Spec      14 (20) '2.0'\n-4C5B7 Created OS            00 (0) 'MS-DOS'\n-4C5B8 Extract Zip Spec      14 (20) '2.0'\n-4C5B9 Extract OS            00 (0) 'MS-DOS'\n-4C5BA General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-4C5BC Compression Method    0000 (0) 'Stored'\n-4C5BE Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4C5C2 CRC                   E1CD8446 (3788342342)\n-4C5C6 Compressed Size       000004FA (1274)\n-4C5CA Uncompressed Size     000004FA (1274)\n-4C5CE Filename Length       003D (61)\n-4C5D0 Extra Length          0009 (9)\n-4C5D2 Comment Length        0000 (0)\n-4C5D4 Disk Start            0000 (0)\n-4C5D6 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-4C5D8 Ext File Attributes   00000000 (0)\n-4C5DC Local Header Offset   0003DFC3 (253891)\n-4C5E0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4C5E0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-4C61D Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4C61F   Length              0005 (5)\n-4C621   Flags               01 (1) 'Modification'\n-4C622   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-4C626 CENTRAL HEADER #55    02014B50 (33639248)\n-4C62A Created Zip Spec      14 (20) '2.0'\n-4C62B Created OS            00 (0) 'MS-DOS'\n-4C62C Extract Zip Spec      14 (20) '2.0'\n-4C62D Extract OS            00 (0) 'MS-DOS'\n-4C62E General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-4C630 Compression Method    0000 (0) 'Stored'\n-4C632 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4C636 CRC                   FE2922A2 (4264108706)\n-4C63A Compressed Size       00000502 (1282)\n-4C63E Uncompressed Size     00000502 (1282)\n-4C642 Filename Length       003F (63)\n-4C644 Extra Length          0009 (9)\n-4C646 Comment Length        0000 (0)\n-4C648 Disk Start            0000 (0)\n-4C64A Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-4C64C Ext File Attributes   00000000 (0)\n-4C650 Local Header Offset   0003E531 (255281)\n-4C654 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4C654: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-4C693 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4C695   Length              0005 (5)\n-4C697   Flags               01 (1) 'Modification'\n-4C698   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-4C69C CENTRAL HEADER #56    02014B50 (33639248)\n-4C6A0 Created Zip Spec      14 (20) '2.0'\n-4C6A1 Created OS            00 (0) 'MS-DOS'\n-4C6A2 Extract Zip Spec      14 (20) '2.0'\n-4C6A3 Extract OS            00 (0) 'MS-DOS'\n-4C6A4 General Purpose Flag  0000 (0)\n-4C6A6 Compression Method    0000 (0) 'Stored'\n-4C6A8 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4C6AC CRC                   00000000 (0)\n-4C6B0 Compressed Size       00000000 (0)\n-4C6B4 Uncompressed Size     00000000 (0)\n-4C6B8 Filename Length       0027 (39)\n-4C6BA Extra Length          0009 (9)\n-4C6BC Comment Length        0000 (0)\n-4C6BE Disk Start            0000 (0)\n-4C6C0 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-4C6C2 Ext File Attributes   00000000 (0)\n-4C6C6 Local Header Offset   0003EAA9 (256681)\n-4C6CA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4C6CA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-4C6F1 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4C6F3   Length              0005 (5)\n-4C6F5   Flags               01 (1) 'Modification'\n-4C6F6   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-4C6FA CENTRAL HEADER #57    02014B50 (33639248)\n-4C6FE Created Zip Spec      14 (20) '2.0'\n-4C6FF Created OS            00 (0) 'MS-DOS'\n-4C700 Extract Zip Spec      14 (20) '2.0'\n-4C701 Extract OS            00 (0) 'MS-DOS'\n-4C702 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-4C704 Compression Method    0000 (0) 'Stored'\n-4C706 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4C70A CRC                   704BFEFA (1884028666)\n-4C70E Compressed Size       00000741 (1857)\n-4C712 Uncompressed Size     00000741 (1857)\n-4C716 Filename Length       0040 (64)\n-4C718 Extra Length          0009 (9)\n-4C71A Comment Length        0000 (0)\n-4C71C Disk Start            0000 (0)\n-4C71E Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-4C720 Ext File Attributes   00000000 (0)\n-4C724 Local Header Offset   0003EAF7 (256759)\n-4C728 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4C728: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-4C768 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4C76A   Length              0005 (5)\n-4C76C   Flags               01 (1) 'Modification'\n-4C76D   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-4C771 CENTRAL HEADER #58    02014B50 (33639248)\n-4C775 Created Zip Spec      14 (20) '2.0'\n-4C776 Created OS            00 (0) 'MS-DOS'\n-4C777 Extract Zip Spec      14 (20) '2.0'\n-4C778 Extract OS            00 (0) 'MS-DOS'\n-4C779 General Purpose Flag  0000 (0)\n-4C77B Compression Method    0000 (0) 'Stored'\n-4C77D Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4C781 CRC                   00000000 (0)\n-4C785 Compressed Size       00000000 (0)\n-4C789 Uncompressed Size     00000000 (0)\n-4C78D Filename Length       0020 (32)\n-4C78F Extra Length          0009 (9)\n-4C791 Comment Length        0000 (0)\n-4C793 Disk Start            0000 (0)\n-4C795 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-4C797 Ext File Attributes   00000000 (0)\n-4C79B Local Header Offset   0003F2AF (258735)\n-4C79F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4C79F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-4C7BF Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4C7C1   Length              0005 (5)\n-4C7C3   Flags               01 (1) 'Modification'\n-4C7C4   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-4C7C8 CENTRAL HEADER #59    02014B50 (33639248)\n-4C7CC Created Zip Spec      14 (20) '2.0'\n-4C7CD Created OS            00 (0) 'MS-DOS'\n-4C7CE Extract Zip Spec      14 (20) '2.0'\n-4C7CF Extract OS            00 (0) 'MS-DOS'\n-4C7D0 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-4C7D2 Compression Method    0000 (0) 'Stored'\n-4C7D4 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4C7D8 CRC                   7E779F80 (2121768832)\n-4C7DC Compressed Size       000007FD (2045)\n-4C7E0 Uncompressed Size     000007FD (2045)\n-4C7E4 Filename Length       0044 (68)\n-4C7E6 Extra Length          0009 (9)\n-4C7E8 Comment Length        0000 (0)\n-4C7EA Disk Start            0000 (0)\n-4C7EC Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-4C7EE Ext File Attributes   00000000 (0)\n-4C7F2 Local Header Offset   0003F2F6 (258806)\n-4C7F6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4C7F6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-4C83A Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4C83C   Length              0005 (5)\n-4C83E   Flags               01 (1) 'Modification'\n-4C83F   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-4C843 CENTRAL HEADER #60    02014B50 (33639248)\n-4C847 Created Zip Spec      14 (20) '2.0'\n-4C848 Created OS            00 (0) 'MS-DOS'\n-4C849 Extract Zip Spec      14 (20) '2.0'\n-4C84A Extract OS            00 (0) 'MS-DOS'\n-4C84B General Purpose Flag  0000 (0)\n-4C84D Compression Method    0000 (0) 'Stored'\n-4C84F Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4C853 CRC                   00000000 (0)\n-4C857 Compressed Size       00000000 (0)\n-4C85B Uncompressed Size     00000000 (0)\n-4C85F Filename Length       0021 (33)\n-4C861 Extra Length          0009 (9)\n-4C863 Comment Length        0000 (0)\n-4C865 Disk Start            0000 (0)\n-4C867 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-4C869 Ext File Attributes   00000000 (0)\n-4C86D Local Header Offset   0003FB6E (260974)\n-4C871 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4C871: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-4C892 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4C894   Length              0005 (5)\n-4C896   Flags               01 (1) 'Modification'\n-4C897   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-4C89B CENTRAL HEADER #61    02014B50 (33639248)\n-4C89F Created Zip Spec      14 (20) '2.0'\n-4C8A0 Created OS            00 (0) 'MS-DOS'\n-4C8A1 Extract Zip Spec      14 (20) '2.0'\n-4C8A2 Extract OS            00 (0) 'MS-DOS'\n-4C8A3 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-4C8A5 Compression Method    0000 (0) 'Stored'\n-4C8A7 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4C8AB CRC                   33B32090 (867377296)\n-4C8AF Compressed Size       00001259 (4697)\n-4C8B3 Uncompressed Size     00001259 (4697)\n-4C8B7 Filename Length       0049 (73)\n-4C8B9 Extra Length          0009 (9)\n-4C8BB Comment Length        0000 (0)\n-4C8BD Disk Start            0000 (0)\n-4C8BF Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-4C8C1 Ext File Attributes   00000000 (0)\n-4C8C5 Local Header Offset   0003FBB6 (261046)\n-4C8C9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4C8C9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-4C912 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4C914   Length              0005 (5)\n-4C916   Flags               01 (1) 'Modification'\n-4C917   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-4C91B CENTRAL HEADER #62    02014B50 (33639248)\n-4C91F Created Zip Spec      14 (20) '2.0'\n-4C920 Created OS            00 (0) 'MS-DOS'\n-4C921 Extract Zip Spec      14 (20) '2.0'\n-4C922 Extract OS            00 (0) 'MS-DOS'\n-4C923 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-4C925 Compression Method    0000 (0) 'Stored'\n-4C927 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4C92B CRC                   DEA0C858 (3735079000)\n-4C92F Compressed Size       00000A13 (2579)\n-4C933 Uncompressed Size     00000A13 (2579)\n-4C937 Filename Length       0043 (67)\n-4C939 Extra Length          0009 (9)\n-4C93B Comment Length        0000 (0)\n-4C93D Disk Start            0000 (0)\n-4C93F Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-4C941 Ext File Attributes   00000000 (0)\n-4C945 Local Header Offset   00040E8F (265871)\n-4C949 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4C949: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-4C98C Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4C98E   Length              0005 (5)\n-4C990   Flags               01 (1) 'Modification'\n-4C991   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-4C995 CENTRAL HEADER #63    02014B50 (33639248)\n-4C999 Created Zip Spec      14 (20) '2.0'\n-4C99A Created OS            00 (0) 'MS-DOS'\n-4C99B Extract Zip Spec      14 (20) '2.0'\n-4C99C Extract OS            00 (0) 'MS-DOS'\n-4C99D General Purpose Flag  0000 (0)\n-4C99F Compression Method    0000 (0) 'Stored'\n-4C9A1 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4C9A5 CRC                   00000000 (0)\n-4C9A9 Compressed Size       00000000 (0)\n-4C9AD Uncompressed Size     00000000 (0)\n-4C9B1 Filename Length       001E (30)\n-4C9B3 Extra Length          0009 (9)\n-4C9B5 Comment Length        0000 (0)\n-4C9B7 Disk Start            0000 (0)\n-4C9B9 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-4C9BB Ext File Attributes   00000000 (0)\n-4C9BF Local Header Offset   0004191C (268572)\n-4C9C3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4C9C3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-4C9E1 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4C9E3   Length              0005 (5)\n-4C9E5   Flags               01 (1) 'Modification'\n-4C9E6   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-4C9EA CENTRAL HEADER #64    02014B50 (33639248)\n-4C9EE Created Zip Spec      14 (20) '2.0'\n-4C9EF Created OS            00 (0) 'MS-DOS'\n-4C9F0 Extract Zip Spec      14 (20) '2.0'\n-4C9F1 Extract OS            00 (0) 'MS-DOS'\n-4C9F2 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-4C9F4 Compression Method    0000 (0) 'Stored'\n-4C9F6 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4C9FA CRC                   CE83BFB8 (3464740792)\n-4C9FE Compressed Size       00007356 (29526)\n-4CA02 Uncompressed Size     00007356 (29526)\n-4CA06 Filename Length       0038 (56)\n-4CA08 Extra Length          0009 (9)\n-4CA0A Comment Length        0000 (0)\n-4CA0C Disk Start            0000 (0)\n-4CA0E Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-4CA10 Ext File Attributes   00000000 (0)\n-4CA14 Local Header Offset   00041961 (268641)\n-4CA18 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4CA18: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-4CA50 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4CA52   Length              0005 (5)\n-4CA54   Flags               01 (1) 'Modification'\n-4CA55   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-4CA59 CENTRAL HEADER #65    02014B50 (33639248)\n-4CA5D Created Zip Spec      14 (20) '2.0'\n-4CA5E Created OS            00 (0) 'MS-DOS'\n-4CA5F Extract Zip Spec      14 (20) '2.0'\n-4CA60 Extract OS            00 (0) 'MS-DOS'\n-4CA61 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-4CA63 Compression Method    0000 (0) 'Stored'\n-4CA65 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-4CA69 CRC                   B659AACE (3059329742)\n-4CA6D Compressed Size       0000227D (8829)\n-4CA71 Uncompressed Size     0000227D (8829)\n-4CA75 Filename Length       0037 (55)\n-4CA77 Extra Length          0009 (9)\n-4CA79 Comment Length        0000 (0)\n-4CA7B Disk Start            0000 (0)\n-4CA7D Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-4CA7F Ext File Attributes   00000000 (0)\n-4CA83 Local Header Offset   00048D26 (298278)\n-4CA87 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4CA87: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-4CABE Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-4CAC0   Length              0005 (5)\n-4CAC2   Flags               01 (1) 'Modification'\n-4CAC3   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-4CAC7 END CENTRAL HEADER    06054B50 (101010256)\n-4CACB Number of this disk   0000 (0)\n-4CACD Central Dir Disk no   0000 (0)\n-4CACF Entries in this disk  0041 (65)\n-4CAD1 Total Entries         0041 (65)\n-4CAD3 Size of Central Dir   00001AB6 (6838)\n-4CAD7 Offset to Central Dir 0004B011 (307217)\n-4CADB Comment Length        0000 (0)\n+04468 DATA DESCRIPTOR       08074B50 (134695760)\n+0446C CRC                   C8683575 (3362272629)\n+04470 Compressed Size       0000004C (76)\n+04474 Uncompressed Size     0000004C (76)\n+\n+04478 LOCAL HEADER #9       04034B50 (67324752)\n+0447C Extract Zip Spec      14 (20) '2.0'\n+0447D Extract OS            00 (0) 'MS-DOS'\n+0447E General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+04480 Compression Method    0000 (0) 'Stored'\n+04482 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+04486 CRC                   00000000 (0)\n+0448A Compressed Size       00000000 (0)\n+0448E Uncompressed Size     00000000 (0)\n+04492 Filename Length       0049 (73)\n+04494 Extra Length          0009 (9)\n+04496 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4496: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+044DF Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+044E1   Length              0005 (5)\n+044E3   Flags               01 (1) 'Modification'\n+044E4   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+044E8 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+\n+04545 DATA DESCRIPTOR       08074B50 (134695760)\n+04549 CRC                   950165AD (2499896749)\n+0454D Compressed Size       0000005D (93)\n+04551 Uncompressed Size     0000005D (93)\n+\n+04555 LOCAL HEADER #10      04034B50 (67324752)\n+04559 Extract Zip Spec      14 (20) '2.0'\n+0455A Extract OS            00 (0) 'MS-DOS'\n+0455B General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+0455D Compression Method    0000 (0) 'Stored'\n+0455F Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+04563 CRC                   00000000 (0)\n+04567 Compressed Size       00000000 (0)\n+0456B Uncompressed Size     00000000 (0)\n+0456F Filename Length       0052 (82)\n+04571 Extra Length          0009 (9)\n+04573 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4573: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+045C5 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+045C7   Length              0005 (5)\n+045C9   Flags               01 (1) 'Modification'\n+045CA   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+045CE PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+\n+04611 DATA DESCRIPTOR       08074B50 (134695760)\n+04615 CRC                   02CBA695 (46900885)\n+04619 Compressed Size       00000043 (67)\n+0461D Uncompressed Size     00000043 (67)\n+\n+04621 LOCAL HEADER #11      04034B50 (67324752)\n+04625 Extract Zip Spec      14 (20) '2.0'\n+04626 Extract OS            00 (0) 'MS-DOS'\n+04627 General Purpose Flag  0000 (0)\n+04629 Compression Method    0000 (0) 'Stored'\n+0462B Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+0462F CRC                   00000000 (0)\n+04633 Compressed Size       00000000 (0)\n+04637 Uncompressed Size     00000000 (0)\n+0463B Filename Length       000F (15)\n+0463D Extra Length          0009 (9)\n+0463F Filename              'XXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x463F: Filename 'XXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+0464E Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+04650   Length              0005 (5)\n+04652   Flags               01 (1) 'Modification'\n+04653   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+04657 LOCAL HEADER #12      04034B50 (67324752)\n+0465B Extract Zip Spec      14 (20) '2.0'\n+0465C Extract OS            00 (0) 'MS-DOS'\n+0465D General Purpose Flag  0000 (0)\n+0465F Compression Method    0000 (0) 'Stored'\n+04661 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+04665 CRC                   00000000 (0)\n+04669 Compressed Size       00000000 (0)\n+0466D Uncompressed Size     00000000 (0)\n+04671 Filename Length       0020 (32)\n+04673 Extra Length          0009 (9)\n+04675 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4675: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+04695 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+04697   Length              0005 (5)\n+04699   Flags               01 (1) 'Modification'\n+0469A   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+0469E LOCAL HEADER #13      04034B50 (67324752)\n+046A2 Extract Zip Spec      14 (20) '2.0'\n+046A3 Extract OS            00 (0) 'MS-DOS'\n+046A4 General Purpose Flag  0000 (0)\n+046A6 Compression Method    0000 (0) 'Stored'\n+046A8 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+046AC CRC                   00000000 (0)\n+046B0 Compressed Size       00000000 (0)\n+046B4 Uncompressed Size     00000000 (0)\n+046B8 Filename Length       0031 (49)\n+046BA Extra Length          0009 (9)\n+046BC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x46BC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+046ED Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+046EF   Length              0005 (5)\n+046F1   Flags               01 (1) 'Modification'\n+046F2   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+046F6 LOCAL HEADER #14      04034B50 (67324752)\n+046FA Extract Zip Spec      14 (20) '2.0'\n+046FB Extract OS            00 (0) 'MS-DOS'\n+046FC General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+046FE Compression Method    0000 (0) 'Stored'\n+04700 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+04704 CRC                   00000000 (0)\n+04708 Compressed Size       00000000 (0)\n+0470C Uncompressed Size     00000000 (0)\n+04710 Filename Length       003F (63)\n+04712 Extra Length          0009 (9)\n+04714 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4714: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+04753 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+04755   Length              0005 (5)\n+04757   Flags               01 (1) 'Modification'\n+04758   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+0475C DATA DESCRIPTOR       08074B50 (134695760)\n+04760 CRC                   00000000 (0)\n+04764 Compressed Size       00000000 (0)\n+04768 Uncompressed Size     00000000 (0)\n+\n+0476C LOCAL HEADER #15      04034B50 (67324752)\n+04770 Extract Zip Spec      14 (20) '2.0'\n+04771 Extract OS            00 (0) 'MS-DOS'\n+04772 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+04774 Compression Method    0000 (0) 'Stored'\n+04776 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+0477A CRC                   00000000 (0)\n+0477E Compressed Size       00000000 (0)\n+04782 Uncompressed Size     00000000 (0)\n+04786 Filename Length       0038 (56)\n+04788 Extra Length          0009 (9)\n+0478A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x478A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+047C2 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+047C4   Length              0005 (5)\n+047C6   Flags               01 (1) 'Modification'\n+047C7   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+047CB PAYLOAD\n+\n+0666F DATA DESCRIPTOR       08074B50 (134695760)\n+06673 CRC                   50B6758C (1354134924)\n+06677 Compressed Size       00001EA4 (7844)\n+0667B Uncompressed Size     00001EA4 (7844)\n+\n+0667F LOCAL HEADER #16      04034B50 (67324752)\n+06683 Extract Zip Spec      14 (20) '2.0'\n+06684 Extract OS            00 (0) 'MS-DOS'\n+06685 General Purpose Flag  0000 (0)\n+06687 Compression Method    0000 (0) 'Stored'\n+06689 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+0668D CRC                   00000000 (0)\n+06691 Compressed Size       00000000 (0)\n+06695 Uncompressed Size     00000000 (0)\n+06699 Filename Length       0004 (4)\n+0669B Extra Length          0009 (9)\n+0669D Filename              'XXXX'\n+#\n+# WARNING: Offset 0x669D: Filename 'XXXX'\n+#          Zero length filename\n+#\n+066A1 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+066A3   Length              0005 (5)\n+066A5   Flags               01 (1) 'Modification'\n+066A6   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+066AA LOCAL HEADER #17      04034B50 (67324752)\n+066AE Extract Zip Spec      14 (20) '2.0'\n+066AF Extract OS            00 (0) 'MS-DOS'\n+066B0 General Purpose Flag  0000 (0)\n+066B2 Compression Method    0000 (0) 'Stored'\n+066B4 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+066B8 CRC                   00000000 (0)\n+066BC Compressed Size       00000000 (0)\n+066C0 Uncompressed Size     00000000 (0)\n+066C4 Filename Length       000B (11)\n+066C6 Extra Length          0009 (9)\n+066C8 Filename              'XXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x66C8: Filename 'XXXXXXXXXXX'\n+#          Zero length filename\n+#\n+066D3 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+066D5   Length              0005 (5)\n+066D7   Flags               01 (1) 'Modification'\n+066D8   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+066DC LOCAL HEADER #18      04034B50 (67324752)\n+066E0 Extract Zip Spec      14 (20) '2.0'\n+066E1 Extract OS            00 (0) 'MS-DOS'\n+066E2 General Purpose Flag  0000 (0)\n+066E4 Compression Method    0000 (0) 'Stored'\n+066E6 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+066EA CRC                   00000000 (0)\n+066EE Compressed Size       00000000 (0)\n+066F2 Uncompressed Size     00000000 (0)\n+066F6 Filename Length       0011 (17)\n+066F8 Extra Length          0009 (9)\n+066FA Filename              'XXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x66FA: Filename 'XXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+0670B Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+0670D   Length              0005 (5)\n+0670F   Flags               01 (1) 'Modification'\n+06710   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+06714 LOCAL HEADER #19      04034B50 (67324752)\n+06718 Extract Zip Spec      14 (20) '2.0'\n+06719 Extract OS            00 (0) 'MS-DOS'\n+0671A General Purpose Flag  0000 (0)\n+0671C Compression Method    0000 (0) 'Stored'\n+0671E Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+06722 CRC                   00000000 (0)\n+06726 Compressed Size       00000000 (0)\n+0672A Uncompressed Size     00000000 (0)\n+0672E Filename Length       0018 (24)\n+06730 Extra Length          0009 (9)\n+06732 Filename              'XXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6732: Filename 'XXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+0674A Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+0674C   Length              0005 (5)\n+0674E   Flags               01 (1) 'Modification'\n+0674F   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+06753 LOCAL HEADER #20      04034B50 (67324752)\n+06757 Extract Zip Spec      14 (20) '2.0'\n+06758 Extract OS            00 (0) 'MS-DOS'\n+06759 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+0675B Compression Method    0000 (0) 'Stored'\n+0675D Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+06761 CRC                   00000000 (0)\n+06765 Compressed Size       00000000 (0)\n+06769 Uncompressed Size     00000000 (0)\n+0676D Filename Length       002E (46)\n+0676F Extra Length          0009 (9)\n+06771 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6771: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+0679F Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+067A1   Length              0005 (5)\n+067A3   Flags               01 (1) 'Modification'\n+067A4   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+067A8 PAYLOAD\n+\n+06C3D DATA DESCRIPTOR       08074B50 (134695760)\n+06C41 CRC                   6C5A36DD (1817851613)\n+06C45 Compressed Size       00000495 (1173)\n+06C49 Uncompressed Size     00000495 (1173)\n+\n+06C4D LOCAL HEADER #21      04034B50 (67324752)\n+06C51 Extract Zip Spec      14 (20) '2.0'\n+06C52 Extract OS            00 (0) 'MS-DOS'\n+06C53 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+06C55 Compression Method    0000 (0) 'Stored'\n+06C57 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+06C5B CRC                   00000000 (0)\n+06C5F Compressed Size       00000000 (0)\n+06C63 Uncompressed Size     00000000 (0)\n+06C67 Filename Length       0030 (48)\n+06C69 Extra Length          0009 (9)\n+06C6B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x6C6B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+06C9B Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+06C9D   Length              0005 (5)\n+06C9F   Flags               01 (1) 'Modification'\n+06CA0   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+06CA4 PAYLOAD\n+\n+07123 DATA DESCRIPTOR       08074B50 (134695760)\n+07127 CRC                   566E5E12 (1450073618)\n+0712B Compressed Size       0000047F (1151)\n+0712F Uncompressed Size     0000047F (1151)\n+\n+07133 LOCAL HEADER #22      04034B50 (67324752)\n+07137 Extract Zip Spec      14 (20) '2.0'\n+07138 Extract OS            00 (0) 'MS-DOS'\n+07139 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+0713B Compression Method    0000 (0) 'Stored'\n+0713D Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+07141 CRC                   00000000 (0)\n+07145 Compressed Size       00000000 (0)\n+07149 Uncompressed Size     00000000 (0)\n+0714D Filename Length       002E (46)\n+0714F Extra Length          0009 (9)\n+07151 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x7151: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+0717F Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+07181   Length              0005 (5)\n+07183   Flags               01 (1) 'Modification'\n+07184   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+07188 PAYLOAD\n+\n+0853C DATA DESCRIPTOR       08074B50 (134695760)\n+08540 CRC                   8233D78E (2184435598)\n+08544 Compressed Size       000013B4 (5044)\n+08548 Uncompressed Size     000013B4 (5044)\n+\n+0854C LOCAL HEADER #23      04034B50 (67324752)\n+08550 Extract Zip Spec      14 (20) '2.0'\n+08551 Extract OS            00 (0) 'MS-DOS'\n+08552 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+08554 Compression Method    0000 (0) 'Stored'\n+08556 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+0855A CRC                   00000000 (0)\n+0855E Compressed Size       00000000 (0)\n+08562 Uncompressed Size     00000000 (0)\n+08566 Filename Length       002C (44)\n+08568 Extra Length          0009 (9)\n+0856A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x856A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+08596 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+08598   Length              0005 (5)\n+0859A   Flags               01 (1) 'Modification'\n+0859B   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+0859F PAYLOAD\n+\n+0E60A DATA DESCRIPTOR       08074B50 (134695760)\n+0E60E CRC                   23EF92DF (602903263)\n+0E612 Compressed Size       0000606B (24683)\n+0E616 Uncompressed Size     0000606B (24683)\n+\n+0E61A LOCAL HEADER #24      04034B50 (67324752)\n+0E61E Extract Zip Spec      14 (20) '2.0'\n+0E61F Extract OS            00 (0) 'MS-DOS'\n+0E620 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+0E622 Compression Method    0000 (0) 'Stored'\n+0E624 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+0E628 CRC                   00000000 (0)\n+0E62C Compressed Size       00000000 (0)\n+0E630 Uncompressed Size     00000000 (0)\n+0E634 Filename Length       002A (42)\n+0E636 Extra Length          0009 (9)\n+0E638 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0xE638: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+0E662 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+0E664   Length              0005 (5)\n+0E666   Flags               01 (1) 'Modification'\n+0E667   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+0E66B PAYLOAD\n+\n+16719 DATA DESCRIPTOR       08074B50 (134695760)\n+1671D CRC                   8A9B11DB (2325418459)\n+16721 Compressed Size       000080AE (32942)\n+16725 Uncompressed Size     000080AE (32942)\n+\n+16729 LOCAL HEADER #25      04034B50 (67324752)\n+1672D Extract Zip Spec      14 (20) '2.0'\n+1672E Extract OS            00 (0) 'MS-DOS'\n+1672F General Purpose Flag  0000 (0)\n+16731 Compression Method    0000 (0) 'Stored'\n+16733 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+16737 CRC                   00000000 (0)\n+1673B Compressed Size       00000000 (0)\n+1673F Uncompressed Size     00000000 (0)\n+16743 Filename Length       0022 (34)\n+16745 Extra Length          0009 (9)\n+16747 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x16747: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+16769 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+1676B   Length              0005 (5)\n+1676D   Flags               01 (1) 'Modification'\n+1676E   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+16772 LOCAL HEADER #26      04034B50 (67324752)\n+16776 Extract Zip Spec      14 (20) '2.0'\n+16777 Extract OS            00 (0) 'MS-DOS'\n+16778 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+1677A Compression Method    0000 (0) 'Stored'\n+1677C Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+16780 CRC                   00000000 (0)\n+16784 Compressed Size       00000000 (0)\n+16788 Uncompressed Size     00000000 (0)\n+1678C Filename Length       0035 (53)\n+1678E Extra Length          0009 (9)\n+16790 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x16790: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+167C5 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+167C7   Length              0005 (5)\n+167C9   Flags               01 (1) 'Modification'\n+167CA   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+167CE PAYLOAD\n+\n+239FB DATA DESCRIPTOR       08074B50 (134695760)\n+239FF CRC                   D413AF69 (3558059881)\n+23A03 Compressed Size       0000D22D (53805)\n+23A07 Uncompressed Size     0000D22D (53805)\n+\n+23A0B LOCAL HEADER #27      04034B50 (67324752)\n+23A0F Extract Zip Spec      14 (20) '2.0'\n+23A10 Extract OS            00 (0) 'MS-DOS'\n+23A11 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+23A13 Compression Method    0000 (0) 'Stored'\n+23A15 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+23A19 CRC                   00000000 (0)\n+23A1D Compressed Size       00000000 (0)\n+23A21 Uncompressed Size     00000000 (0)\n+23A25 Filename Length       0046 (70)\n+23A27 Extra Length          0009 (9)\n+23A29 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x23A29: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+23A6F Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+23A71   Length              0005 (5)\n+23A73   Flags               01 (1) 'Modification'\n+23A74   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+23A78 PAYLOAD\n+\n+23F06 DATA DESCRIPTOR       08074B50 (134695760)\n+23F0A CRC                   E174331E (3782488862)\n+23F0E Compressed Size       0000048E (1166)\n+23F12 Uncompressed Size     0000048E (1166)\n+\n+23F16 LOCAL HEADER #28      04034B50 (67324752)\n+23F1A Extract Zip Spec      14 (20) '2.0'\n+23F1B Extract OS            00 (0) 'MS-DOS'\n+23F1C General Purpose Flag  0000 (0)\n+23F1E Compression Method    0000 (0) 'Stored'\n+23F20 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+23F24 CRC                   00000000 (0)\n+23F28 Compressed Size       00000000 (0)\n+23F2C Uncompressed Size     00000000 (0)\n+23F30 Filename Length       002B (43)\n+23F32 Extra Length          0009 (9)\n+23F34 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x23F34: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+23F5F Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+23F61   Length              0005 (5)\n+23F63   Flags               01 (1) 'Modification'\n+23F64   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+23F68 LOCAL HEADER #29      04034B50 (67324752)\n+23F6C Extract Zip Spec      14 (20) '2.0'\n+23F6D Extract OS            00 (0) 'MS-DOS'\n+23F6E General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+23F70 Compression Method    0000 (0) 'Stored'\n+23F72 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+23F76 CRC                   00000000 (0)\n+23F7A Compressed Size       00000000 (0)\n+23F7E Uncompressed Size     00000000 (0)\n+23F82 Filename Length       003F (63)\n+23F84 Extra Length          0009 (9)\n+23F86 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x23F86: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+23FC5 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+23FC7   Length              0005 (5)\n+23FC9   Flags               01 (1) 'Modification'\n+23FCA   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+23FCE PAYLOAD\n+\n+24A05 DATA DESCRIPTOR       08074B50 (134695760)\n+24A09 CRC                   FC3CBC13 (4231838739)\n+24A0D Compressed Size       00000A37 (2615)\n+24A11 Uncompressed Size     00000A37 (2615)\n+\n+24A15 LOCAL HEADER #30      04034B50 (67324752)\n+24A19 Extract Zip Spec      14 (20) '2.0'\n+24A1A Extract OS            00 (0) 'MS-DOS'\n+24A1B General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+24A1D Compression Method    0000 (0) 'Stored'\n+24A1F Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+24A23 CRC                   00000000 (0)\n+24A27 Compressed Size       00000000 (0)\n+24A2B Uncompressed Size     00000000 (0)\n+24A2F Filename Length       0048 (72)\n+24A31 Extra Length          0009 (9)\n+24A33 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x24A33: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+24A7B Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+24A7D   Length              0005 (5)\n+24A7F   Flags               01 (1) 'Modification'\n+24A80   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+24A84 PAYLOAD\n+\n+26FD9 DATA DESCRIPTOR       08074B50 (134695760)\n+26FDD CRC                   A83ED6AA (2822690474)\n+26FE1 Compressed Size       00002555 (9557)\n+26FE5 Uncompressed Size     00002555 (9557)\n+\n+26FE9 LOCAL HEADER #31      04034B50 (67324752)\n+26FED Extract Zip Spec      14 (20) '2.0'\n+26FEE Extract OS            00 (0) 'MS-DOS'\n+26FEF General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+26FF1 Compression Method    0000 (0) 'Stored'\n+26FF3 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+26FF7 CRC                   00000000 (0)\n+26FFB Compressed Size       00000000 (0)\n+26FFF Uncompressed Size     00000000 (0)\n+27003 Filename Length       0045 (69)\n+27005 Extra Length          0009 (9)\n+27007 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x27007: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+2704C Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+2704E   Length              0005 (5)\n+27050   Flags               01 (1) 'Modification'\n+27051   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+27055 PAYLOAD\n+\n+286AC DATA DESCRIPTOR       08074B50 (134695760)\n+286B0 CRC                   E160ED1C (3781225756)\n+286B4 Compressed Size       00001657 (5719)\n+286B8 Uncompressed Size     00001657 (5719)\n+\n+286BC LOCAL HEADER #32      04034B50 (67324752)\n+286C0 Extract Zip Spec      14 (20) '2.0'\n+286C1 Extract OS            00 (0) 'MS-DOS'\n+286C2 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+286C4 Compression Method    0000 (0) 'Stored'\n+286C6 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+286CA CRC                   00000000 (0)\n+286CE Compressed Size       00000000 (0)\n+286D2 Uncompressed Size     00000000 (0)\n+286D6 Filename Length       0048 (72)\n+286D8 Extra Length          0009 (9)\n+286DA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x286DA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+28722 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+28724   Length              0005 (5)\n+28726   Flags               01 (1) 'Modification'\n+28727   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+2872B PAYLOAD\n+\n+297D5 DATA DESCRIPTOR       08074B50 (134695760)\n+297D9 CRC                   156605D7 (359007703)\n+297DD Compressed Size       000010AA (4266)\n+297E1 Uncompressed Size     000010AA (4266)\n+\n+297E5 LOCAL HEADER #33      04034B50 (67324752)\n+297E9 Extract Zip Spec      14 (20) '2.0'\n+297EA Extract OS            00 (0) 'MS-DOS'\n+297EB General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+297ED Compression Method    0000 (0) 'Stored'\n+297EF Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+297F3 CRC                   00000000 (0)\n+297F7 Compressed Size       00000000 (0)\n+297FB Uncompressed Size     00000000 (0)\n+297FF Filename Length       0046 (70)\n+29801 Extra Length          0009 (9)\n+29803 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x29803: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+29849 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+2984B   Length              0005 (5)\n+2984D   Flags               01 (1) 'Modification'\n+2984E   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+29852 PAYLOAD\n+\n+2B3E5 DATA DESCRIPTOR       08074B50 (134695760)\n+2B3E9 CRC                   67C26956 (1740794198)\n+2B3ED Compressed Size       00001B93 (7059)\n+2B3F1 Uncompressed Size     00001B93 (7059)\n+\n+2B3F5 LOCAL HEADER #34      04034B50 (67324752)\n+2B3F9 Extract Zip Spec      14 (20) '2.0'\n+2B3FA Extract OS            00 (0) 'MS-DOS'\n+2B3FB General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+2B3FD Compression Method    0000 (0) 'Stored'\n+2B3FF Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+2B403 CRC                   00000000 (0)\n+2B407 Compressed Size       00000000 (0)\n+2B40B Uncompressed Size     00000000 (0)\n+2B40F Filename Length       0042 (66)\n+2B411 Extra Length          0009 (9)\n+2B413 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x2B413: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+2B455 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+2B457   Length              0005 (5)\n+2B459   Flags               01 (1) 'Modification'\n+2B45A   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+2B45E PAYLOAD\n+\n+2CFA3 DATA DESCRIPTOR       08074B50 (134695760)\n+2CFA7 CRC                   46796056 (1182359638)\n+2CFAB Compressed Size       00001B45 (6981)\n+2CFAF Uncompressed Size     00001B45 (6981)\n+\n+2CFB3 LOCAL HEADER #35      04034B50 (67324752)\n+2CFB7 Extract Zip Spec      14 (20) '2.0'\n+2CFB8 Extract OS            00 (0) 'MS-DOS'\n+2CFB9 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+2CFBB Compression Method    0000 (0) 'Stored'\n+2CFBD Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+2CFC1 CRC                   00000000 (0)\n+2CFC5 Compressed Size       00000000 (0)\n+2CFC9 Uncompressed Size     00000000 (0)\n+2CFCD Filename Length       003F (63)\n+2CFCF Extra Length          0009 (9)\n+2CFD1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x2CFD1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+2D010 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+2D012   Length              0005 (5)\n+2D014   Flags               01 (1) 'Modification'\n+2D015   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+2D019 PAYLOAD\n+\n+2D7A1 DATA DESCRIPTOR       08074B50 (134695760)\n+2D7A5 CRC                   C694724C (3331617356)\n+2D7A9 Compressed Size       00000788 (1928)\n+2D7AD Uncompressed Size     00000788 (1928)\n+\n+2D7B1 LOCAL HEADER #36      04034B50 (67324752)\n+2D7B5 Extract Zip Spec      14 (20) '2.0'\n+2D7B6 Extract OS            00 (0) 'MS-DOS'\n+2D7B7 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+2D7B9 Compression Method    0000 (0) 'Stored'\n+2D7BB Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+2D7BF CRC                   00000000 (0)\n+2D7C3 Compressed Size       00000000 (0)\n+2D7C7 Uncompressed Size     00000000 (0)\n+2D7CB Filename Length       0043 (67)\n+2D7CD Extra Length          0009 (9)\n+2D7CF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x2D7CF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+2D812 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+2D814   Length              0005 (5)\n+2D816   Flags               01 (1) 'Modification'\n+2D817   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+2D81B PAYLOAD\n+\n+2E9A6 DATA DESCRIPTOR       08074B50 (134695760)\n+2E9AA CRC                   E2414032 (3795927090)\n+2E9AE Compressed Size       0000118B (4491)\n+2E9B2 Uncompressed Size     0000118B (4491)\n+\n+2E9B6 LOCAL HEADER #37      04034B50 (67324752)\n+2E9BA Extract Zip Spec      14 (20) '2.0'\n+2E9BB Extract OS            00 (0) 'MS-DOS'\n+2E9BC General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+2E9BE Compression Method    0000 (0) 'Stored'\n+2E9C0 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+2E9C4 CRC                   00000000 (0)\n+2E9C8 Compressed Size       00000000 (0)\n+2E9CC Uncompressed Size     00000000 (0)\n+2E9D0 Filename Length       003F (63)\n+2E9D2 Extra Length          0009 (9)\n+2E9D4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x2E9D4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+2EA13 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+2EA15   Length              0005 (5)\n+2EA17   Flags               01 (1) 'Modification'\n+2EA18   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+2EA1C PAYLOAD\n+\n+2F7CF DATA DESCRIPTOR       08074B50 (134695760)\n+2F7D3 CRC                   85CF6764 (2244962148)\n+2F7D7 Compressed Size       00000DB3 (3507)\n+2F7DB Uncompressed Size     00000DB3 (3507)\n+\n+2F7DF LOCAL HEADER #38      04034B50 (67324752)\n+2F7E3 Extract Zip Spec      14 (20) '2.0'\n+2F7E4 Extract OS            00 (0) 'MS-DOS'\n+2F7E5 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+2F7E7 Compression Method    0000 (0) 'Stored'\n+2F7E9 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+2F7ED CRC                   00000000 (0)\n+2F7F1 Compressed Size       00000000 (0)\n+2F7F5 Uncompressed Size     00000000 (0)\n+2F7F9 Filename Length       0045 (69)\n+2F7FB Extra Length          0009 (9)\n+2F7FD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x2F7FD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+2F842 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+2F844   Length              0005 (5)\n+2F846   Flags               01 (1) 'Modification'\n+2F847   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+2F84B PAYLOAD\n+\n+309AA DATA DESCRIPTOR       08074B50 (134695760)\n+309AE CRC                   D26D2315 (3530367765)\n+309B2 Compressed Size       0000115F (4447)\n+309B6 Uncompressed Size     0000115F (4447)\n+\n+309BA LOCAL HEADER #39      04034B50 (67324752)\n+309BE Extract Zip Spec      14 (20) '2.0'\n+309BF Extract OS            00 (0) 'MS-DOS'\n+309C0 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+309C2 Compression Method    0000 (0) 'Stored'\n+309C4 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+309C8 CRC                   00000000 (0)\n+309CC Compressed Size       00000000 (0)\n+309D0 Uncompressed Size     00000000 (0)\n+309D4 Filename Length       003D (61)\n+309D6 Extra Length          0009 (9)\n+309D8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x309D8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+30A15 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+30A17   Length              0005 (5)\n+30A19   Flags               01 (1) 'Modification'\n+30A1A   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+30A1E PAYLOAD\n+\n+322EE DATA DESCRIPTOR       08074B50 (134695760)\n+322F2 CRC                   F796C627 (4153853479)\n+322F6 Compressed Size       000018D0 (6352)\n+322FA Uncompressed Size     000018D0 (6352)\n+\n+322FE LOCAL HEADER #40      04034B50 (67324752)\n+32302 Extract Zip Spec      14 (20) '2.0'\n+32303 Extract OS            00 (0) 'MS-DOS'\n+32304 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+32306 Compression Method    0000 (0) 'Stored'\n+32308 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+3230C CRC                   00000000 (0)\n+32310 Compressed Size       00000000 (0)\n+32314 Uncompressed Size     00000000 (0)\n+32318 Filename Length       003D (61)\n+3231A Extra Length          0009 (9)\n+3231C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x3231C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+32359 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+3235B   Length              0005 (5)\n+3235D   Flags               01 (1) 'Modification'\n+3235E   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+32362 PAYLOAD\n+\n+3316A DATA DESCRIPTOR       08074B50 (134695760)\n+3316E CRC                   EB12A7F1 (3943868401)\n+33172 Compressed Size       00000E08 (3592)\n+33176 Uncompressed Size     00000E08 (3592)\n+\n+3317A LOCAL HEADER #41      04034B50 (67324752)\n+3317E Extract Zip Spec      14 (20) '2.0'\n+3317F Extract OS            00 (0) 'MS-DOS'\n+33180 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+33182 Compression Method    0000 (0) 'Stored'\n+33184 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+33188 CRC                   00000000 (0)\n+3318C Compressed Size       00000000 (0)\n+33190 Uncompressed Size     00000000 (0)\n+33194 Filename Length       003E (62)\n+33196 Extra Length          0009 (9)\n+33198 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x33198: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+331D6 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+331D8   Length              0005 (5)\n+331DA   Flags               01 (1) 'Modification'\n+331DB   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+331DF PAYLOAD\n+\n+3410C DATA DESCRIPTOR       08074B50 (134695760)\n+34110 CRC                   F5A79DAF (4121402799)\n+34114 Compressed Size       00000F2D (3885)\n+34118 Uncompressed Size     00000F2D (3885)\n+\n+3411C LOCAL HEADER #42      04034B50 (67324752)\n+34120 Extract Zip Spec      14 (20) '2.0'\n+34121 Extract OS            00 (0) 'MS-DOS'\n+34122 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+34124 Compression Method    0000 (0) 'Stored'\n+34126 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+3412A CRC                   00000000 (0)\n+3412E Compressed Size       00000000 (0)\n+34132 Uncompressed Size     00000000 (0)\n+34136 Filename Length       003F (63)\n+34138 Extra Length          0009 (9)\n+3413A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x3413A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+34179 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+3417B   Length              0005 (5)\n+3417D   Flags               01 (1) 'Modification'\n+3417E   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+34182 PAYLOAD\n+\n+36A73 DATA DESCRIPTOR       08074B50 (134695760)\n+36A77 CRC                   24F4C726 (620021542)\n+36A7B Compressed Size       000028F1 (10481)\n+36A7F Uncompressed Size     000028F1 (10481)\n+\n+36A83 LOCAL HEADER #43      04034B50 (67324752)\n+36A87 Extract Zip Spec      14 (20) '2.0'\n+36A88 Extract OS            00 (0) 'MS-DOS'\n+36A89 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+36A8B Compression Method    0000 (0) 'Stored'\n+36A8D Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+36A91 CRC                   00000000 (0)\n+36A95 Compressed Size       00000000 (0)\n+36A99 Uncompressed Size     00000000 (0)\n+36A9D Filename Length       003F (63)\n+36A9F Extra Length          0009 (9)\n+36AA1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x36AA1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+36AE0 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+36AE2   Length              0005 (5)\n+36AE4   Flags               01 (1) 'Modification'\n+36AE5   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+36AE9 PAYLOAD\n+\n+38690 DATA DESCRIPTOR       08074B50 (134695760)\n+38694 CRC                   35C5DEAF (902160047)\n+38698 Compressed Size       00001BA7 (7079)\n+3869C Uncompressed Size     00001BA7 (7079)\n+\n+386A0 LOCAL HEADER #44      04034B50 (67324752)\n+386A4 Extract Zip Spec      14 (20) '2.0'\n+386A5 Extract OS            00 (0) 'MS-DOS'\n+386A6 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+386A8 Compression Method    0000 (0) 'Stored'\n+386AA Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+386AE CRC                   00000000 (0)\n+386B2 Compressed Size       00000000 (0)\n+386B6 Uncompressed Size     00000000 (0)\n+386BA Filename Length       0040 (64)\n+386BC Extra Length          0009 (9)\n+386BE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x386BE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+386FE Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+38700   Length              0005 (5)\n+38702   Flags               01 (1) 'Modification'\n+38703   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+38707 PAYLOAD\n+\n+399D0 DATA DESCRIPTOR       08074B50 (134695760)\n+399D4 CRC                   4C4BC15C (1280033116)\n+399D8 Compressed Size       000012C9 (4809)\n+399DC Uncompressed Size     000012C9 (4809)\n+\n+399E0 LOCAL HEADER #45      04034B50 (67324752)\n+399E4 Extract Zip Spec      14 (20) '2.0'\n+399E5 Extract OS            00 (0) 'MS-DOS'\n+399E6 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+399E8 Compression Method    0000 (0) 'Stored'\n+399EA Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+399EE CRC                   00000000 (0)\n+399F2 Compressed Size       00000000 (0)\n+399F6 Uncompressed Size     00000000 (0)\n+399FA Filename Length       003F (63)\n+399FC Extra Length          0009 (9)\n+399FE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x399FE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+39A3D Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+39A3F   Length              0005 (5)\n+39A41   Flags               01 (1) 'Modification'\n+39A42   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+39A46 PAYLOAD\n+\n+3C187 DATA DESCRIPTOR       08074B50 (134695760)\n+3C18B CRC                   3875CC22 (947244066)\n+3C18F Compressed Size       00002741 (10049)\n+3C193 Uncompressed Size     00002741 (10049)\n+\n+3C197 LOCAL HEADER #46      04034B50 (67324752)\n+3C19B Extract Zip Spec      14 (20) '2.0'\n+3C19C Extract OS            00 (0) 'MS-DOS'\n+3C19D General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+3C19F Compression Method    0000 (0) 'Stored'\n+3C1A1 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+3C1A5 CRC                   00000000 (0)\n+3C1A9 Compressed Size       00000000 (0)\n+3C1AD Uncompressed Size     00000000 (0)\n+3C1B1 Filename Length       003E (62)\n+3C1B3 Extra Length          0009 (9)\n+3C1B5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x3C1B5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+3C1F3 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+3C1F5   Length              0005 (5)\n+3C1F7   Flags               01 (1) 'Modification'\n+3C1F8   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+3C1FC PAYLOAD\n+\n+3D3F5 DATA DESCRIPTOR       08074B50 (134695760)\n+3D3F9 CRC                   5053B7A1 (1347663777)\n+3D3FD Compressed Size       000011F9 (4601)\n+3D401 Uncompressed Size     000011F9 (4601)\n+\n+3D405 LOCAL HEADER #47      04034B50 (67324752)\n+3D409 Extract Zip Spec      14 (20) '2.0'\n+3D40A Extract OS            00 (0) 'MS-DOS'\n+3D40B General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+3D40D Compression Method    0000 (0) 'Stored'\n+3D40F Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+3D413 CRC                   00000000 (0)\n+3D417 Compressed Size       00000000 (0)\n+3D41B Uncompressed Size     00000000 (0)\n+3D41F Filename Length       003C (60)\n+3D421 Extra Length          0009 (9)\n+3D423 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x3D423: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+3D45F Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+3D461   Length              0005 (5)\n+3D463   Flags               01 (1) 'Modification'\n+3D464   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+3D468 PAYLOAD\n+\n+3D886 DATA DESCRIPTOR       08074B50 (134695760)\n+3D88A CRC                   AA9A314A (2862231882)\n+3D88E Compressed Size       0000041E (1054)\n+3D892 Uncompressed Size     0000041E (1054)\n+\n+3D896 LOCAL HEADER #48      04034B50 (67324752)\n+3D89A Extract Zip Spec      14 (20) '2.0'\n+3D89B Extract OS            00 (0) 'MS-DOS'\n+3D89C General Purpose Flag  0000 (0)\n+3D89E Compression Method    0000 (0) 'Stored'\n+3D8A0 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+3D8A4 CRC                   00000000 (0)\n+3D8A8 Compressed Size       00000000 (0)\n+3D8AC Uncompressed Size     00000000 (0)\n+3D8B0 Filename Length       001E (30)\n+3D8B2 Extra Length          0009 (9)\n+3D8B4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x3D8B4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+3D8D2 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+3D8D4   Length              0005 (5)\n+3D8D6   Flags               01 (1) 'Modification'\n+3D8D7   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+3D8DB LOCAL HEADER #49      04034B50 (67324752)\n+3D8DF Extract Zip Spec      14 (20) '2.0'\n+3D8E0 Extract OS            00 (0) 'MS-DOS'\n+3D8E1 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+3D8E3 Compression Method    0000 (0) 'Stored'\n+3D8E5 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+3D8E9 CRC                   00000000 (0)\n+3D8ED Compressed Size       00000000 (0)\n+3D8F1 Uncompressed Size     00000000 (0)\n+3D8F5 Filename Length       003D (61)\n+3D8F7 Extra Length          0009 (9)\n+3D8F9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x3D8F9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+3D936 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+3D938   Length              0005 (5)\n+3D93A   Flags               01 (1) 'Modification'\n+3D93B   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+3D93F PAYLOAD\n+\n+3DDD8 DATA DESCRIPTOR       08074B50 (134695760)\n+3DDDC CRC                   7C75425F (2088059487)\n+3DDE0 Compressed Size       00000499 (1177)\n+3DDE4 Uncompressed Size     00000499 (1177)\n+\n+3DDE8 LOCAL HEADER #50      04034B50 (67324752)\n+3DDEC Extract Zip Spec      14 (20) '2.0'\n+3DDED Extract OS            00 (0) 'MS-DOS'\n+3DDEE General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+3DDF0 Compression Method    0000 (0) 'Stored'\n+3DDF2 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+3DDF6 CRC                   00000000 (0)\n+3DDFA Compressed Size       00000000 (0)\n+3DDFE Uncompressed Size     00000000 (0)\n+3DE02 Filename Length       0043 (67)\n+3DE04 Extra Length          0009 (9)\n+3DE06 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x3DE06: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+3DE49 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+3DE4B   Length              0005 (5)\n+3DE4D   Flags               01 (1) 'Modification'\n+3DE4E   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+3DE52 PAYLOAD\n+\n+3E510 DATA DESCRIPTOR       08074B50 (134695760)\n+3E514 CRC                   A67D03FF (2793210879)\n+3E518 Compressed Size       000006BE (1726)\n+3E51C Uncompressed Size     000006BE (1726)\n+\n+3E520 LOCAL HEADER #51      04034B50 (67324752)\n+3E524 Extract Zip Spec      14 (20) '2.0'\n+3E525 Extract OS            00 (0) 'MS-DOS'\n+3E526 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+3E528 Compression Method    0000 (0) 'Stored'\n+3E52A Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+3E52E CRC                   00000000 (0)\n+3E532 Compressed Size       00000000 (0)\n+3E536 Uncompressed Size     00000000 (0)\n+3E53A Filename Length       0045 (69)\n+3E53C Extra Length          0009 (9)\n+3E53E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x3E53E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+3E583 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+3E585   Length              0005 (5)\n+3E587   Flags               01 (1) 'Modification'\n+3E588   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+3E58C PAYLOAD\n+\n+3EC51 DATA DESCRIPTOR       08074B50 (134695760)\n+3EC55 CRC                   F6F65296 (4143338134)\n+3EC59 Compressed Size       000006C5 (1733)\n+3EC5D Uncompressed Size     000006C5 (1733)\n+\n+3EC61 LOCAL HEADER #52      04034B50 (67324752)\n+3EC65 Extract Zip Spec      14 (20) '2.0'\n+3EC66 Extract OS            00 (0) 'MS-DOS'\n+3EC67 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+3EC69 Compression Method    0000 (0) 'Stored'\n+3EC6B Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+3EC6F CRC                   00000000 (0)\n+3EC73 Compressed Size       00000000 (0)\n+3EC77 Uncompressed Size     00000000 (0)\n+3EC7B Filename Length       0040 (64)\n+3EC7D Extra Length          0009 (9)\n+3EC7F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x3EC7F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+3ECBF Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+3ECC1   Length              0005 (5)\n+3ECC3   Flags               01 (1) 'Modification'\n+3ECC4   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+3ECC8 PAYLOAD\n+\n+3F294 DATA DESCRIPTOR       08074B50 (134695760)\n+3F298 CRC                   D200547F (3523236991)\n+3F29C Compressed Size       000005CC (1484)\n+3F2A0 Uncompressed Size     000005CC (1484)\n+\n+3F2A4 LOCAL HEADER #53      04034B50 (67324752)\n+3F2A8 Extract Zip Spec      14 (20) '2.0'\n+3F2A9 Extract OS            00 (0) 'MS-DOS'\n+3F2AA General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+3F2AC Compression Method    0000 (0) 'Stored'\n+3F2AE Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+3F2B2 CRC                   00000000 (0)\n+3F2B6 Compressed Size       00000000 (0)\n+3F2BA Uncompressed Size     00000000 (0)\n+3F2BE Filename Length       0042 (66)\n+3F2C0 Extra Length          0009 (9)\n+3F2C2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x3F2C2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+3F304 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+3F306   Length              0005 (5)\n+3F308   Flags               01 (1) 'Modification'\n+3F309   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+3F30D PAYLOAD\n+\n+3F9A7 DATA DESCRIPTOR       08074B50 (134695760)\n+3F9AB CRC                   ADCF7988 (2916055432)\n+3F9AF Compressed Size       0000069A (1690)\n+3F9B3 Uncompressed Size     0000069A (1690)\n+\n+3F9B7 LOCAL HEADER #54      04034B50 (67324752)\n+3F9BB Extract Zip Spec      14 (20) '2.0'\n+3F9BC Extract OS            00 (0) 'MS-DOS'\n+3F9BD General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+3F9BF Compression Method    0000 (0) 'Stored'\n+3F9C1 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+3F9C5 CRC                   00000000 (0)\n+3F9C9 Compressed Size       00000000 (0)\n+3F9CD Uncompressed Size     00000000 (0)\n+3F9D1 Filename Length       003D (61)\n+3F9D3 Extra Length          0009 (9)\n+3F9D5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x3F9D5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+3FA12 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+3FA14   Length              0005 (5)\n+3FA16   Flags               01 (1) 'Modification'\n+3FA17   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+3FA1B PAYLOAD\n+\n+3FF39 DATA DESCRIPTOR       08074B50 (134695760)\n+3FF3D CRC                   A8CE0A81 (2832075393)\n+3FF41 Compressed Size       0000051E (1310)\n+3FF45 Uncompressed Size     0000051E (1310)\n+\n+3FF49 LOCAL HEADER #55      04034B50 (67324752)\n+3FF4D Extract Zip Spec      14 (20) '2.0'\n+3FF4E Extract OS            00 (0) 'MS-DOS'\n+3FF4F General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+3FF51 Compression Method    0000 (0) 'Stored'\n+3FF53 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+3FF57 CRC                   00000000 (0)\n+3FF5B Compressed Size       00000000 (0)\n+3FF5F Uncompressed Size     00000000 (0)\n+3FF63 Filename Length       003F (63)\n+3FF65 Extra Length          0009 (9)\n+3FF67 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x3FF67: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+3FFA6 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+3FFA8   Length              0005 (5)\n+3FFAA   Flags               01 (1) 'Modification'\n+3FFAB   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+3FFAF PAYLOAD\n+\n+404D5 DATA DESCRIPTOR       08074B50 (134695760)\n+404D9 CRC                   5D6056E9 (1566594793)\n+404DD Compressed Size       00000526 (1318)\n+404E1 Uncompressed Size     00000526 (1318)\n+\n+404E5 LOCAL HEADER #56      04034B50 (67324752)\n+404E9 Extract Zip Spec      14 (20) '2.0'\n+404EA Extract OS            00 (0) 'MS-DOS'\n+404EB General Purpose Flag  0000 (0)\n+404ED Compression Method    0000 (0) 'Stored'\n+404EF Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+404F3 CRC                   00000000 (0)\n+404F7 Compressed Size       00000000 (0)\n+404FB Uncompressed Size     00000000 (0)\n+404FF Filename Length       0027 (39)\n+40501 Extra Length          0009 (9)\n+40503 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x40503: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4052A Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4052C   Length              0005 (5)\n+4052E   Flags               01 (1) 'Modification'\n+4052F   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+40533 LOCAL HEADER #57      04034B50 (67324752)\n+40537 Extract Zip Spec      14 (20) '2.0'\n+40538 Extract OS            00 (0) 'MS-DOS'\n+40539 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+4053B Compression Method    0000 (0) 'Stored'\n+4053D Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+40541 CRC                   00000000 (0)\n+40545 Compressed Size       00000000 (0)\n+40549 Uncompressed Size     00000000 (0)\n+4054D Filename Length       0040 (64)\n+4054F Extra Length          0009 (9)\n+40551 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x40551: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+40591 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+40593   Length              0005 (5)\n+40595   Flags               01 (1) 'Modification'\n+40596   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+4059A PAYLOAD\n+\n+40D0E DATA DESCRIPTOR       08074B50 (134695760)\n+40D12 CRC                   FFDB09C9 (4292544969)\n+40D16 Compressed Size       00000774 (1908)\n+40D1A Uncompressed Size     00000774 (1908)\n+\n+40D1E LOCAL HEADER #58      04034B50 (67324752)\n+40D22 Extract Zip Spec      14 (20) '2.0'\n+40D23 Extract OS            00 (0) 'MS-DOS'\n+40D24 General Purpose Flag  0000 (0)\n+40D26 Compression Method    0000 (0) 'Stored'\n+40D28 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+40D2C CRC                   00000000 (0)\n+40D30 Compressed Size       00000000 (0)\n+40D34 Uncompressed Size     00000000 (0)\n+40D38 Filename Length       0020 (32)\n+40D3A Extra Length          0009 (9)\n+40D3C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x40D3C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+40D5C Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+40D5E   Length              0005 (5)\n+40D60   Flags               01 (1) 'Modification'\n+40D61   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+40D65 LOCAL HEADER #59      04034B50 (67324752)\n+40D69 Extract Zip Spec      14 (20) '2.0'\n+40D6A Extract OS            00 (0) 'MS-DOS'\n+40D6B General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+40D6D Compression Method    0000 (0) 'Stored'\n+40D6F Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+40D73 CRC                   00000000 (0)\n+40D77 Compressed Size       00000000 (0)\n+40D7B Uncompressed Size     00000000 (0)\n+40D7F Filename Length       0044 (68)\n+40D81 Extra Length          0009 (9)\n+40D83 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x40D83: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+40DC7 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+40DC9   Length              0005 (5)\n+40DCB   Flags               01 (1) 'Modification'\n+40DCC   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+40DD0 PAYLOAD\n+\n+41610 DATA DESCRIPTOR       08074B50 (134695760)\n+41614 CRC                   A8777CA7 (2826402983)\n+41618 Compressed Size       00000840 (2112)\n+4161C Uncompressed Size     00000840 (2112)\n+\n+41620 LOCAL HEADER #60      04034B50 (67324752)\n+41624 Extract Zip Spec      14 (20) '2.0'\n+41625 Extract OS            00 (0) 'MS-DOS'\n+41626 General Purpose Flag  0000 (0)\n+41628 Compression Method    0000 (0) 'Stored'\n+4162A Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4162E CRC                   00000000 (0)\n+41632 Compressed Size       00000000 (0)\n+41636 Uncompressed Size     00000000 (0)\n+4163A Filename Length       0021 (33)\n+4163C Extra Length          0009 (9)\n+4163E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4163E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4165F Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+41661   Length              0005 (5)\n+41663   Flags               01 (1) 'Modification'\n+41664   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+41668 LOCAL HEADER #61      04034B50 (67324752)\n+4166C Extract Zip Spec      14 (20) '2.0'\n+4166D Extract OS            00 (0) 'MS-DOS'\n+4166E General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+41670 Compression Method    0000 (0) 'Stored'\n+41672 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+41676 CRC                   00000000 (0)\n+4167A Compressed Size       00000000 (0)\n+4167E Uncompressed Size     00000000 (0)\n+41682 Filename Length       0049 (73)\n+41684 Extra Length          0009 (9)\n+41686 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x41686: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+416CF Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+416D1   Length              0005 (5)\n+416D3   Flags               01 (1) 'Modification'\n+416D4   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+416D8 PAYLOAD\n+\n+429B2 DATA DESCRIPTOR       08074B50 (134695760)\n+429B6 CRC                   E294E314 (3801408276)\n+429BA Compressed Size       000012DA (4826)\n+429BE Uncompressed Size     000012DA (4826)\n+\n+429C2 LOCAL HEADER #62      04034B50 (67324752)\n+429C6 Extract Zip Spec      14 (20) '2.0'\n+429C7 Extract OS            00 (0) 'MS-DOS'\n+429C8 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+429CA Compression Method    0000 (0) 'Stored'\n+429CC Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+429D0 CRC                   00000000 (0)\n+429D4 Compressed Size       00000000 (0)\n+429D8 Uncompressed Size     00000000 (0)\n+429DC Filename Length       0043 (67)\n+429DE Extra Length          0009 (9)\n+429E0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x429E0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+42A23 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+42A25   Length              0005 (5)\n+42A27   Flags               01 (1) 'Modification'\n+42A28   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+42A2C PAYLOAD\n+\n+4347F DATA DESCRIPTOR       08074B50 (134695760)\n+43483 CRC                   484F34E6 (1213150438)\n+43487 Compressed Size       00000A53 (2643)\n+4348B Uncompressed Size     00000A53 (2643)\n+\n+4348F LOCAL HEADER #63      04034B50 (67324752)\n+43493 Extract Zip Spec      14 (20) '2.0'\n+43494 Extract OS            00 (0) 'MS-DOS'\n+43495 General Purpose Flag  0000 (0)\n+43497 Compression Method    0000 (0) 'Stored'\n+43499 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4349D CRC                   00000000 (0)\n+434A1 Compressed Size       00000000 (0)\n+434A5 Uncompressed Size     00000000 (0)\n+434A9 Filename Length       001E (30)\n+434AB Extra Length          0009 (9)\n+434AD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x434AD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+434CB Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+434CD   Length              0005 (5)\n+434CF   Flags               01 (1) 'Modification'\n+434D0   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+434D4 LOCAL HEADER #64      04034B50 (67324752)\n+434D8 Extract Zip Spec      14 (20) '2.0'\n+434D9 Extract OS            00 (0) 'MS-DOS'\n+434DA General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+434DC Compression Method    0000 (0) 'Stored'\n+434DE Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+434E2 CRC                   00000000 (0)\n+434E6 Compressed Size       00000000 (0)\n+434EA Uncompressed Size     00000000 (0)\n+434EE Filename Length       0038 (56)\n+434F0 Extra Length          0009 (9)\n+434F2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x434F2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4352A Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4352C   Length              0005 (5)\n+4352E   Flags               01 (1) 'Modification'\n+4352F   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+43533 PAYLOAD\n+\n+4AB1B DATA DESCRIPTOR       08074B50 (134695760)\n+4AB1F CRC                   25A2615A (631398746)\n+4AB23 Compressed Size       000075E8 (30184)\n+4AB27 Uncompressed Size     000075E8 (30184)\n+\n+4AB2B LOCAL HEADER #65      04034B50 (67324752)\n+4AB2F Extract Zip Spec      14 (20) '2.0'\n+4AB30 Extract OS            00 (0) 'MS-DOS'\n+4AB31 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+4AB33 Compression Method    0000 (0) 'Stored'\n+4AB35 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4AB39 CRC                   00000000 (0)\n+4AB3D Compressed Size       00000000 (0)\n+4AB41 Uncompressed Size     00000000 (0)\n+4AB45 Filename Length       0037 (55)\n+4AB47 Extra Length          0009 (9)\n+4AB49 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4AB49: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4AB80 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4AB82   Length              0005 (5)\n+4AB84   Flags               01 (1) 'Modification'\n+4AB85   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+4AB89 PAYLOAD\n+\n+4CF02 DATA DESCRIPTOR       08074B50 (134695760)\n+4CF06 CRC                   3773BB53 (930331475)\n+4CF0A Compressed Size       00002379 (9081)\n+4CF0E Uncompressed Size     00002379 (9081)\n+\n+4CF12 CENTRAL HEADER #1     02014B50 (33639248)\n+4CF16 Created Zip Spec      14 (20) '2.0'\n+4CF17 Created OS            00 (0) 'MS-DOS'\n+4CF18 Extract Zip Spec      14 (20) '2.0'\n+4CF19 Extract OS            00 (0) 'MS-DOS'\n+4CF1A General Purpose Flag  0000 (0)\n+4CF1C Compression Method    0000 (0) 'Stored'\n+4CF1E Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4CF22 CRC                   00000000 (0)\n+4CF26 Compressed Size       00000000 (0)\n+4CF2A Uncompressed Size     00000000 (0)\n+4CF2E Filename Length       0009 (9)\n+4CF30 Extra Length          0009 (9)\n+4CF32 Comment Length        0000 (0)\n+4CF34 Disk Start            0000 (0)\n+4CF36 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+4CF38 Ext File Attributes   00000000 (0)\n+4CF3C Local Header Offset   00000000 (0)\n+4CF40 Filename              'XXXXXXXXX'\n+#\n+# WARNING: Offset 0x4CF40: Filename 'XXXXXXXXX'\n+#          Zero length filename\n+#\n+4CF49 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4CF4B   Length              0005 (5)\n+4CF4D   Flags               01 (1) 'Modification'\n+4CF4E   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+4CF52 CENTRAL HEADER #2     02014B50 (33639248)\n+4CF56 Created Zip Spec      14 (20) '2.0'\n+4CF57 Created OS            00 (0) 'MS-DOS'\n+4CF58 Extract Zip Spec      14 (20) '2.0'\n+4CF59 Extract OS            00 (0) 'MS-DOS'\n+4CF5A General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+4CF5C Compression Method    0000 (0) 'Stored'\n+4CF5E Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4CF62 CRC                   D1996C93 (3516492947)\n+4CF66 Compressed Size       000014CC (5324)\n+4CF6A Uncompressed Size     000014CC (5324)\n+4CF6E Filename Length       0015 (21)\n+4CF70 Extra Length          0009 (9)\n+4CF72 Comment Length        0000 (0)\n+4CF74 Disk Start            0000 (0)\n+4CF76 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+4CF78 Ext File Attributes   00000000 (0)\n+4CF7C Local Header Offset   00000030 (48)\n+4CF80 Filename              'XXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4CF80: Filename 'XXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4CF95 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4CF97   Length              0005 (5)\n+4CF99   Flags               01 (1) 'Modification'\n+4CF9A   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+4CF9E CENTRAL HEADER #3     02014B50 (33639248)\n+4CFA2 Created Zip Spec      14 (20) '2.0'\n+4CFA3 Created OS            00 (0) 'MS-DOS'\n+4CFA4 Extract Zip Spec      14 (20) '2.0'\n+4CFA5 Extract OS            00 (0) 'MS-DOS'\n+4CFA6 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+4CFA8 Compression Method    0000 (0) 'Stored'\n+4CFAA Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4CFAE CRC                   86E2B4B4 (2263004340)\n+4CFB2 Compressed Size       00002C5E (11358)\n+4CFB6 Uncompressed Size     00002C5E (11358)\n+4CFBA Filename Length       0010 (16)\n+4CFBC Extra Length          0009 (9)\n+4CFBE Comment Length        0000 (0)\n+4CFC0 Disk Start            0000 (0)\n+4CFC2 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+4CFC4 Ext File Attributes   00000000 (0)\n+4CFC8 Local Header Offset   00001548 (5448)\n+4CFCC Filename              'XXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4CFCC: Filename 'XXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4CFDC Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4CFDE   Length              0005 (5)\n+4CFE0   Flags               01 (1) 'Modification'\n+4CFE1   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+4CFE5 CENTRAL HEADER #4     02014B50 (33639248)\n+4CFE9 Created Zip Spec      14 (20) '2.0'\n+4CFEA Created OS            00 (0) 'MS-DOS'\n+4CFEB Extract Zip Spec      14 (20) '2.0'\n+4CFEC Extract OS            00 (0) 'MS-DOS'\n+4CFED General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+4CFEF Compression Method    0000 (0) 'Stored'\n+4CFF1 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4CFF5 CRC                   EE027FB2 (3993141170)\n+4CFF9 Compressed Size       00000019 (25)\n+4CFFD Uncompressed Size     00000019 (25)\n+4D001 Filename Length       0014 (20)\n+4D003 Extra Length          0009 (9)\n+4D005 Comment Length        0000 (0)\n+4D007 Disk Start            0000 (0)\n+4D009 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+4D00B Ext File Attributes   00000000 (0)\n+4D00F Local Header Offset   000041ED (16877)\n+4D013 Filename              'XXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4D013: Filename 'XXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4D027 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4D029   Length              0005 (5)\n+4D02B   Flags               01 (1) 'Modification'\n+4D02C   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+4D030 CENTRAL HEADER #5     02014B50 (33639248)\n+4D034 Created Zip Spec      14 (20) '2.0'\n+4D035 Created OS            00 (0) 'MS-DOS'\n+4D036 Extract Zip Spec      14 (20) '2.0'\n+4D037 Extract OS            00 (0) 'MS-DOS'\n+4D038 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+4D03A Compression Method    0000 (0) 'Stored'\n+4D03C Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4D040 CRC                   5C793A50 (1551448656)\n+4D044 Compressed Size       000000AD (173)\n+4D048 Uncompressed Size     000000AD (173)\n+4D04C Filename Length       000F (15)\n+4D04E Extra Length          0009 (9)\n+4D050 Comment Length        0000 (0)\n+4D052 Disk Start            0000 (0)\n+4D054 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+4D056 Ext File Attributes   00000000 (0)\n+4D05A Local Header Offset   00004251 (16977)\n+4D05E Filename              'XXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4D05E: Filename 'XXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4D06D Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4D06F   Length              0005 (5)\n+4D071   Flags               01 (1) 'Modification'\n+4D072   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+4D076 CENTRAL HEADER #6     02014B50 (33639248)\n+4D07A Created Zip Spec      14 (20) '2.0'\n+4D07B Created OS            00 (0) 'MS-DOS'\n+4D07C Extract Zip Spec      14 (20) '2.0'\n+4D07D Extract OS            00 (0) 'MS-DOS'\n+4D07E General Purpose Flag  0000 (0)\n+4D080 Compression Method    0000 (0) 'Stored'\n+4D082 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4D086 CRC                   00000000 (0)\n+4D08A Compressed Size       00000000 (0)\n+4D08E Uncompressed Size     00000000 (0)\n+4D092 Filename Length       000F (15)\n+4D094 Extra Length          0009 (9)\n+4D096 Comment Length        0000 (0)\n+4D098 Disk Start            0000 (0)\n+4D09A Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+4D09C Ext File Attributes   00000000 (0)\n+4D0A0 Local Header Offset   00004344 (17220)\n+4D0A4 Filename              'XXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4D0A4: Filename 'XXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4D0B3 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4D0B5   Length              0005 (5)\n+4D0B7   Flags               01 (1) 'Modification'\n+4D0B8   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+4D0BC CENTRAL HEADER #7     02014B50 (33639248)\n+4D0C0 Created Zip Spec      14 (20) '2.0'\n+4D0C1 Created OS            00 (0) 'MS-DOS'\n+4D0C2 Extract Zip Spec      14 (20) '2.0'\n+4D0C3 Extract OS            00 (0) 'MS-DOS'\n+4D0C4 General Purpose Flag  0000 (0)\n+4D0C6 Compression Method    0000 (0) 'Stored'\n+4D0C8 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4D0CC CRC                   00000000 (0)\n+4D0D0 Compressed Size       00000000 (0)\n+4D0D4 Uncompressed Size     00000000 (0)\n+4D0D8 Filename Length       0018 (24)\n+4D0DA Extra Length          0009 (9)\n+4D0DC Comment Length        0000 (0)\n+4D0DE Disk Start            0000 (0)\n+4D0E0 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+4D0E2 Ext File Attributes   00000000 (0)\n+4D0E6 Local Header Offset   0000437A (17274)\n+4D0EA Filename              'XXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4D0EA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4D102 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4D104   Length              0005 (5)\n+4D106   Flags               01 (1) 'Modification'\n+4D107   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+4D10B CENTRAL HEADER #8     02014B50 (33639248)\n+4D10F Created Zip Spec      14 (20) '2.0'\n+4D110 Created OS            00 (0) 'MS-DOS'\n+4D111 Extract Zip Spec      14 (20) '2.0'\n+4D112 Extract OS            00 (0) 'MS-DOS'\n+4D113 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+4D115 Compression Method    0000 (0) 'Stored'\n+4D117 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4D11B CRC                   C8683575 (3362272629)\n+4D11F Compressed Size       0000004C (76)\n+4D123 Uncompressed Size     0000004C (76)\n+4D127 Filename Length       003C (60)\n+4D129 Extra Length          0009 (9)\n+4D12B Comment Length        0000 (0)\n+4D12D Disk Start            0000 (0)\n+4D12F Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+4D131 Ext File Attributes   00000000 (0)\n+4D135 Local Header Offset   000043B9 (17337)\n+4D139 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4D139: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4D175 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4D177   Length              0005 (5)\n+4D179   Flags               01 (1) 'Modification'\n+4D17A   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+4D17E CENTRAL HEADER #9     02014B50 (33639248)\n+4D182 Created Zip Spec      14 (20) '2.0'\n+4D183 Created OS            00 (0) 'MS-DOS'\n+4D184 Extract Zip Spec      14 (20) '2.0'\n+4D185 Extract OS            00 (0) 'MS-DOS'\n+4D186 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+4D188 Compression Method    0000 (0) 'Stored'\n+4D18A Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4D18E CRC                   950165AD (2499896749)\n+4D192 Compressed Size       0000005D (93)\n+4D196 Uncompressed Size     0000005D (93)\n+4D19A Filename Length       0049 (73)\n+4D19C Extra Length          0009 (9)\n+4D19E Comment Length        0000 (0)\n+4D1A0 Disk Start            0000 (0)\n+4D1A2 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+4D1A4 Ext File Attributes   00000000 (0)\n+4D1A8 Local Header Offset   00004478 (17528)\n+4D1AC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4D1AC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4D1F5 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4D1F7   Length              0005 (5)\n+4D1F9   Flags               01 (1) 'Modification'\n+4D1FA   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+4D1FE CENTRAL HEADER #10    02014B50 (33639248)\n+4D202 Created Zip Spec      14 (20) '2.0'\n+4D203 Created OS            00 (0) 'MS-DOS'\n+4D204 Extract Zip Spec      14 (20) '2.0'\n+4D205 Extract OS            00 (0) 'MS-DOS'\n+4D206 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+4D208 Compression Method    0000 (0) 'Stored'\n+4D20A Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4D20E CRC                   02CBA695 (46900885)\n+4D212 Compressed Size       00000043 (67)\n+4D216 Uncompressed Size     00000043 (67)\n+4D21A Filename Length       0052 (82)\n+4D21C Extra Length          0009 (9)\n+4D21E Comment Length        0000 (0)\n+4D220 Disk Start            0000 (0)\n+4D222 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+4D224 Ext File Attributes   00000000 (0)\n+4D228 Local Header Offset   00004555 (17749)\n+4D22C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4D22C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4D27E Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4D280   Length              0005 (5)\n+4D282   Flags               01 (1) 'Modification'\n+4D283   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+4D287 CENTRAL HEADER #11    02014B50 (33639248)\n+4D28B Created Zip Spec      14 (20) '2.0'\n+4D28C Created OS            00 (0) 'MS-DOS'\n+4D28D Extract Zip Spec      14 (20) '2.0'\n+4D28E Extract OS            00 (0) 'MS-DOS'\n+4D28F General Purpose Flag  0000 (0)\n+4D291 Compression Method    0000 (0) 'Stored'\n+4D293 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4D297 CRC                   00000000 (0)\n+4D29B Compressed Size       00000000 (0)\n+4D29F Uncompressed Size     00000000 (0)\n+4D2A3 Filename Length       000F (15)\n+4D2A5 Extra Length          0009 (9)\n+4D2A7 Comment Length        0000 (0)\n+4D2A9 Disk Start            0000 (0)\n+4D2AB Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+4D2AD Ext File Attributes   00000000 (0)\n+4D2B1 Local Header Offset   00004621 (17953)\n+4D2B5 Filename              'XXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4D2B5: Filename 'XXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4D2C4 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4D2C6   Length              0005 (5)\n+4D2C8   Flags               01 (1) 'Modification'\n+4D2C9   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+4D2CD CENTRAL HEADER #12    02014B50 (33639248)\n+4D2D1 Created Zip Spec      14 (20) '2.0'\n+4D2D2 Created OS            00 (0) 'MS-DOS'\n+4D2D3 Extract Zip Spec      14 (20) '2.0'\n+4D2D4 Extract OS            00 (0) 'MS-DOS'\n+4D2D5 General Purpose Flag  0000 (0)\n+4D2D7 Compression Method    0000 (0) 'Stored'\n+4D2D9 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4D2DD CRC                   00000000 (0)\n+4D2E1 Compressed Size       00000000 (0)\n+4D2E5 Uncompressed Size     00000000 (0)\n+4D2E9 Filename Length       0020 (32)\n+4D2EB Extra Length          0009 (9)\n+4D2ED Comment Length        0000 (0)\n+4D2EF Disk Start            0000 (0)\n+4D2F1 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+4D2F3 Ext File Attributes   00000000 (0)\n+4D2F7 Local Header Offset   00004657 (18007)\n+4D2FB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4D2FB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4D31B Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4D31D   Length              0005 (5)\n+4D31F   Flags               01 (1) 'Modification'\n+4D320   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+4D324 CENTRAL HEADER #13    02014B50 (33639248)\n+4D328 Created Zip Spec      14 (20) '2.0'\n+4D329 Created OS            00 (0) 'MS-DOS'\n+4D32A Extract Zip Spec      14 (20) '2.0'\n+4D32B Extract OS            00 (0) 'MS-DOS'\n+4D32C General Purpose Flag  0000 (0)\n+4D32E Compression Method    0000 (0) 'Stored'\n+4D330 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4D334 CRC                   00000000 (0)\n+4D338 Compressed Size       00000000 (0)\n+4D33C Uncompressed Size     00000000 (0)\n+4D340 Filename Length       0031 (49)\n+4D342 Extra Length          0009 (9)\n+4D344 Comment Length        0000 (0)\n+4D346 Disk Start            0000 (0)\n+4D348 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+4D34A Ext File Attributes   00000000 (0)\n+4D34E Local Header Offset   0000469E (18078)\n+4D352 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4D352: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4D383 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4D385   Length              0005 (5)\n+4D387   Flags               01 (1) 'Modification'\n+4D388   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+4D38C CENTRAL HEADER #14    02014B50 (33639248)\n+4D390 Created Zip Spec      14 (20) '2.0'\n+4D391 Created OS            00 (0) 'MS-DOS'\n+4D392 Extract Zip Spec      14 (20) '2.0'\n+4D393 Extract OS            00 (0) 'MS-DOS'\n+4D394 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+4D396 Compression Method    0000 (0) 'Stored'\n+4D398 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4D39C CRC                   00000000 (0)\n+4D3A0 Compressed Size       00000000 (0)\n+4D3A4 Uncompressed Size     00000000 (0)\n+4D3A8 Filename Length       003F (63)\n+4D3AA Extra Length          0009 (9)\n+4D3AC Comment Length        0000 (0)\n+4D3AE Disk Start            0000 (0)\n+4D3B0 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+4D3B2 Ext File Attributes   00000000 (0)\n+4D3B6 Local Header Offset   000046F6 (18166)\n+4D3BA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4D3BA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4D3F9 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4D3FB   Length              0005 (5)\n+4D3FD   Flags               01 (1) 'Modification'\n+4D3FE   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+4D402 CENTRAL HEADER #15    02014B50 (33639248)\n+4D406 Created Zip Spec      14 (20) '2.0'\n+4D407 Created OS            00 (0) 'MS-DOS'\n+4D408 Extract Zip Spec      14 (20) '2.0'\n+4D409 Extract OS            00 (0) 'MS-DOS'\n+4D40A General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+4D40C Compression Method    0000 (0) 'Stored'\n+4D40E Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4D412 CRC                   50B6758C (1354134924)\n+4D416 Compressed Size       00001EA4 (7844)\n+4D41A Uncompressed Size     00001EA4 (7844)\n+4D41E Filename Length       0038 (56)\n+4D420 Extra Length          0009 (9)\n+4D422 Comment Length        0000 (0)\n+4D424 Disk Start            0000 (0)\n+4D426 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+4D428 Ext File Attributes   00000000 (0)\n+4D42C Local Header Offset   0000476C (18284)\n+4D430 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4D430: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4D468 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4D46A   Length              0005 (5)\n+4D46C   Flags               01 (1) 'Modification'\n+4D46D   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+4D471 CENTRAL HEADER #16    02014B50 (33639248)\n+4D475 Created Zip Spec      14 (20) '2.0'\n+4D476 Created OS            00 (0) 'MS-DOS'\n+4D477 Extract Zip Spec      14 (20) '2.0'\n+4D478 Extract OS            00 (0) 'MS-DOS'\n+4D479 General Purpose Flag  0000 (0)\n+4D47B Compression Method    0000 (0) 'Stored'\n+4D47D Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4D481 CRC                   00000000 (0)\n+4D485 Compressed Size       00000000 (0)\n+4D489 Uncompressed Size     00000000 (0)\n+4D48D Filename Length       0004 (4)\n+4D48F Extra Length          0009 (9)\n+4D491 Comment Length        0000 (0)\n+4D493 Disk Start            0000 (0)\n+4D495 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+4D497 Ext File Attributes   00000000 (0)\n+4D49B Local Header Offset   0000667F (26239)\n+4D49F Filename              'XXXX'\n+#\n+# WARNING: Offset 0x4D49F: Filename 'XXXX'\n+#          Zero length filename\n+#\n+4D4A3 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4D4A5   Length              0005 (5)\n+4D4A7   Flags               01 (1) 'Modification'\n+4D4A8   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+4D4AC CENTRAL HEADER #17    02014B50 (33639248)\n+4D4B0 Created Zip Spec      14 (20) '2.0'\n+4D4B1 Created OS            00 (0) 'MS-DOS'\n+4D4B2 Extract Zip Spec      14 (20) '2.0'\n+4D4B3 Extract OS            00 (0) 'MS-DOS'\n+4D4B4 General Purpose Flag  0000 (0)\n+4D4B6 Compression Method    0000 (0) 'Stored'\n+4D4B8 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4D4BC CRC                   00000000 (0)\n+4D4C0 Compressed Size       00000000 (0)\n+4D4C4 Uncompressed Size     00000000 (0)\n+4D4C8 Filename Length       000B (11)\n+4D4CA Extra Length          0009 (9)\n+4D4CC Comment Length        0000 (0)\n+4D4CE Disk Start            0000 (0)\n+4D4D0 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+4D4D2 Ext File Attributes   00000000 (0)\n+4D4D6 Local Header Offset   000066AA (26282)\n+4D4DA Filename              'XXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4D4DA: Filename 'XXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4D4E5 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4D4E7   Length              0005 (5)\n+4D4E9   Flags               01 (1) 'Modification'\n+4D4EA   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+4D4EE CENTRAL HEADER #18    02014B50 (33639248)\n+4D4F2 Created Zip Spec      14 (20) '2.0'\n+4D4F3 Created OS            00 (0) 'MS-DOS'\n+4D4F4 Extract Zip Spec      14 (20) '2.0'\n+4D4F5 Extract OS            00 (0) 'MS-DOS'\n+4D4F6 General Purpose Flag  0000 (0)\n+4D4F8 Compression Method    0000 (0) 'Stored'\n+4D4FA Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4D4FE CRC                   00000000 (0)\n+4D502 Compressed Size       00000000 (0)\n+4D506 Uncompressed Size     00000000 (0)\n+4D50A Filename Length       0011 (17)\n+4D50C Extra Length          0009 (9)\n+4D50E Comment Length        0000 (0)\n+4D510 Disk Start            0000 (0)\n+4D512 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+4D514 Ext File Attributes   00000000 (0)\n+4D518 Local Header Offset   000066DC (26332)\n+4D51C Filename              'XXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4D51C: Filename 'XXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4D52D Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4D52F   Length              0005 (5)\n+4D531   Flags               01 (1) 'Modification'\n+4D532   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+4D536 CENTRAL HEADER #19    02014B50 (33639248)\n+4D53A Created Zip Spec      14 (20) '2.0'\n+4D53B Created OS            00 (0) 'MS-DOS'\n+4D53C Extract Zip Spec      14 (20) '2.0'\n+4D53D Extract OS            00 (0) 'MS-DOS'\n+4D53E General Purpose Flag  0000 (0)\n+4D540 Compression Method    0000 (0) 'Stored'\n+4D542 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4D546 CRC                   00000000 (0)\n+4D54A Compressed Size       00000000 (0)\n+4D54E Uncompressed Size     00000000 (0)\n+4D552 Filename Length       0018 (24)\n+4D554 Extra Length          0009 (9)\n+4D556 Comment Length        0000 (0)\n+4D558 Disk Start            0000 (0)\n+4D55A Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+4D55C Ext File Attributes   00000000 (0)\n+4D560 Local Header Offset   00006714 (26388)\n+4D564 Filename              'XXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4D564: Filename 'XXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4D57C Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4D57E   Length              0005 (5)\n+4D580   Flags               01 (1) 'Modification'\n+4D581   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+4D585 CENTRAL HEADER #20    02014B50 (33639248)\n+4D589 Created Zip Spec      14 (20) '2.0'\n+4D58A Created OS            00 (0) 'MS-DOS'\n+4D58B Extract Zip Spec      14 (20) '2.0'\n+4D58C Extract OS            00 (0) 'MS-DOS'\n+4D58D General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+4D58F Compression Method    0000 (0) 'Stored'\n+4D591 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4D595 CRC                   6C5A36DD (1817851613)\n+4D599 Compressed Size       00000495 (1173)\n+4D59D Uncompressed Size     00000495 (1173)\n+4D5A1 Filename Length       002E (46)\n+4D5A3 Extra Length          0009 (9)\n+4D5A5 Comment Length        0000 (0)\n+4D5A7 Disk Start            0000 (0)\n+4D5A9 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+4D5AB Ext File Attributes   00000000 (0)\n+4D5AF Local Header Offset   00006753 (26451)\n+4D5B3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4D5B3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4D5E1 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4D5E3   Length              0005 (5)\n+4D5E5   Flags               01 (1) 'Modification'\n+4D5E6   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+4D5EA CENTRAL HEADER #21    02014B50 (33639248)\n+4D5EE Created Zip Spec      14 (20) '2.0'\n+4D5EF Created OS            00 (0) 'MS-DOS'\n+4D5F0 Extract Zip Spec      14 (20) '2.0'\n+4D5F1 Extract OS            00 (0) 'MS-DOS'\n+4D5F2 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+4D5F4 Compression Method    0000 (0) 'Stored'\n+4D5F6 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4D5FA CRC                   566E5E12 (1450073618)\n+4D5FE Compressed Size       0000047F (1151)\n+4D602 Uncompressed Size     0000047F (1151)\n+4D606 Filename Length       0030 (48)\n+4D608 Extra Length          0009 (9)\n+4D60A Comment Length        0000 (0)\n+4D60C Disk Start            0000 (0)\n+4D60E Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+4D610 Ext File Attributes   00000000 (0)\n+4D614 Local Header Offset   00006C4D (27725)\n+4D618 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4D618: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4D648 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4D64A   Length              0005 (5)\n+4D64C   Flags               01 (1) 'Modification'\n+4D64D   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+4D651 CENTRAL HEADER #22    02014B50 (33639248)\n+4D655 Created Zip Spec      14 (20) '2.0'\n+4D656 Created OS            00 (0) 'MS-DOS'\n+4D657 Extract Zip Spec      14 (20) '2.0'\n+4D658 Extract OS            00 (0) 'MS-DOS'\n+4D659 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+4D65B Compression Method    0000 (0) 'Stored'\n+4D65D Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4D661 CRC                   8233D78E (2184435598)\n+4D665 Compressed Size       000013B4 (5044)\n+4D669 Uncompressed Size     000013B4 (5044)\n+4D66D Filename Length       002E (46)\n+4D66F Extra Length          0009 (9)\n+4D671 Comment Length        0000 (0)\n+4D673 Disk Start            0000 (0)\n+4D675 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+4D677 Ext File Attributes   00000000 (0)\n+4D67B Local Header Offset   00007133 (28979)\n+4D67F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4D67F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4D6AD Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4D6AF   Length              0005 (5)\n+4D6B1   Flags               01 (1) 'Modification'\n+4D6B2   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+4D6B6 CENTRAL HEADER #23    02014B50 (33639248)\n+4D6BA Created Zip Spec      14 (20) '2.0'\n+4D6BB Created OS            00 (0) 'MS-DOS'\n+4D6BC Extract Zip Spec      14 (20) '2.0'\n+4D6BD Extract OS            00 (0) 'MS-DOS'\n+4D6BE General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+4D6C0 Compression Method    0000 (0) 'Stored'\n+4D6C2 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4D6C6 CRC                   23EF92DF (602903263)\n+4D6CA Compressed Size       0000606B (24683)\n+4D6CE Uncompressed Size     0000606B (24683)\n+4D6D2 Filename Length       002C (44)\n+4D6D4 Extra Length          0009 (9)\n+4D6D6 Comment Length        0000 (0)\n+4D6D8 Disk Start            0000 (0)\n+4D6DA Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+4D6DC Ext File Attributes   00000000 (0)\n+4D6E0 Local Header Offset   0000854C (34124)\n+4D6E4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4D6E4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4D710 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4D712   Length              0005 (5)\n+4D714   Flags               01 (1) 'Modification'\n+4D715   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+4D719 CENTRAL HEADER #24    02014B50 (33639248)\n+4D71D Created Zip Spec      14 (20) '2.0'\n+4D71E Created OS            00 (0) 'MS-DOS'\n+4D71F Extract Zip Spec      14 (20) '2.0'\n+4D720 Extract OS            00 (0) 'MS-DOS'\n+4D721 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+4D723 Compression Method    0000 (0) 'Stored'\n+4D725 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4D729 CRC                   8A9B11DB (2325418459)\n+4D72D Compressed Size       000080AE (32942)\n+4D731 Uncompressed Size     000080AE (32942)\n+4D735 Filename Length       002A (42)\n+4D737 Extra Length          0009 (9)\n+4D739 Comment Length        0000 (0)\n+4D73B Disk Start            0000 (0)\n+4D73D Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+4D73F Ext File Attributes   00000000 (0)\n+4D743 Local Header Offset   0000E61A (58906)\n+4D747 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4D747: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4D771 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4D773   Length              0005 (5)\n+4D775   Flags               01 (1) 'Modification'\n+4D776   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+4D77A CENTRAL HEADER #25    02014B50 (33639248)\n+4D77E Created Zip Spec      14 (20) '2.0'\n+4D77F Created OS            00 (0) 'MS-DOS'\n+4D780 Extract Zip Spec      14 (20) '2.0'\n+4D781 Extract OS            00 (0) 'MS-DOS'\n+4D782 General Purpose Flag  0000 (0)\n+4D784 Compression Method    0000 (0) 'Stored'\n+4D786 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4D78A CRC                   00000000 (0)\n+4D78E Compressed Size       00000000 (0)\n+4D792 Uncompressed Size     00000000 (0)\n+4D796 Filename Length       0022 (34)\n+4D798 Extra Length          0009 (9)\n+4D79A Comment Length        0000 (0)\n+4D79C Disk Start            0000 (0)\n+4D79E Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+4D7A0 Ext File Attributes   00000000 (0)\n+4D7A4 Local Header Offset   00016729 (91945)\n+4D7A8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4D7A8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4D7CA Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4D7CC   Length              0005 (5)\n+4D7CE   Flags               01 (1) 'Modification'\n+4D7CF   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+4D7D3 CENTRAL HEADER #26    02014B50 (33639248)\n+4D7D7 Created Zip Spec      14 (20) '2.0'\n+4D7D8 Created OS            00 (0) 'MS-DOS'\n+4D7D9 Extract Zip Spec      14 (20) '2.0'\n+4D7DA Extract OS            00 (0) 'MS-DOS'\n+4D7DB General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+4D7DD Compression Method    0000 (0) 'Stored'\n+4D7DF Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4D7E3 CRC                   D413AF69 (3558059881)\n+4D7E7 Compressed Size       0000D22D (53805)\n+4D7EB Uncompressed Size     0000D22D (53805)\n+4D7EF Filename Length       0035 (53)\n+4D7F1 Extra Length          0009 (9)\n+4D7F3 Comment Length        0000 (0)\n+4D7F5 Disk Start            0000 (0)\n+4D7F7 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+4D7F9 Ext File Attributes   00000000 (0)\n+4D7FD Local Header Offset   00016772 (92018)\n+4D801 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4D801: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4D836 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4D838   Length              0005 (5)\n+4D83A   Flags               01 (1) 'Modification'\n+4D83B   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+4D83F CENTRAL HEADER #27    02014B50 (33639248)\n+4D843 Created Zip Spec      14 (20) '2.0'\n+4D844 Created OS            00 (0) 'MS-DOS'\n+4D845 Extract Zip Spec      14 (20) '2.0'\n+4D846 Extract OS            00 (0) 'MS-DOS'\n+4D847 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+4D849 Compression Method    0000 (0) 'Stored'\n+4D84B Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4D84F CRC                   E174331E (3782488862)\n+4D853 Compressed Size       0000048E (1166)\n+4D857 Uncompressed Size     0000048E (1166)\n+4D85B Filename Length       0046 (70)\n+4D85D Extra Length          0009 (9)\n+4D85F Comment Length        0000 (0)\n+4D861 Disk Start            0000 (0)\n+4D863 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+4D865 Ext File Attributes   00000000 (0)\n+4D869 Local Header Offset   00023A0B (145931)\n+4D86D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4D86D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4D8B3 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4D8B5   Length              0005 (5)\n+4D8B7   Flags               01 (1) 'Modification'\n+4D8B8   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+4D8BC CENTRAL HEADER #28    02014B50 (33639248)\n+4D8C0 Created Zip Spec      14 (20) '2.0'\n+4D8C1 Created OS            00 (0) 'MS-DOS'\n+4D8C2 Extract Zip Spec      14 (20) '2.0'\n+4D8C3 Extract OS            00 (0) 'MS-DOS'\n+4D8C4 General Purpose Flag  0000 (0)\n+4D8C6 Compression Method    0000 (0) 'Stored'\n+4D8C8 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4D8CC CRC                   00000000 (0)\n+4D8D0 Compressed Size       00000000 (0)\n+4D8D4 Uncompressed Size     00000000 (0)\n+4D8D8 Filename Length       002B (43)\n+4D8DA Extra Length          0009 (9)\n+4D8DC Comment Length        0000 (0)\n+4D8DE Disk Start            0000 (0)\n+4D8E0 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+4D8E2 Ext File Attributes   00000000 (0)\n+4D8E6 Local Header Offset   00023F16 (147222)\n+4D8EA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4D8EA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4D915 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4D917   Length              0005 (5)\n+4D919   Flags               01 (1) 'Modification'\n+4D91A   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+4D91E CENTRAL HEADER #29    02014B50 (33639248)\n+4D922 Created Zip Spec      14 (20) '2.0'\n+4D923 Created OS            00 (0) 'MS-DOS'\n+4D924 Extract Zip Spec      14 (20) '2.0'\n+4D925 Extract OS            00 (0) 'MS-DOS'\n+4D926 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+4D928 Compression Method    0000 (0) 'Stored'\n+4D92A Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4D92E CRC                   FC3CBC13 (4231838739)\n+4D932 Compressed Size       00000A37 (2615)\n+4D936 Uncompressed Size     00000A37 (2615)\n+4D93A Filename Length       003F (63)\n+4D93C Extra Length          0009 (9)\n+4D93E Comment Length        0000 (0)\n+4D940 Disk Start            0000 (0)\n+4D942 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+4D944 Ext File Attributes   00000000 (0)\n+4D948 Local Header Offset   00023F68 (147304)\n+4D94C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4D94C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4D98B Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4D98D   Length              0005 (5)\n+4D98F   Flags               01 (1) 'Modification'\n+4D990   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+4D994 CENTRAL HEADER #30    02014B50 (33639248)\n+4D998 Created Zip Spec      14 (20) '2.0'\n+4D999 Created OS            00 (0) 'MS-DOS'\n+4D99A Extract Zip Spec      14 (20) '2.0'\n+4D99B Extract OS            00 (0) 'MS-DOS'\n+4D99C General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+4D99E Compression Method    0000 (0) 'Stored'\n+4D9A0 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4D9A4 CRC                   A83ED6AA (2822690474)\n+4D9A8 Compressed Size       00002555 (9557)\n+4D9AC Uncompressed Size     00002555 (9557)\n+4D9B0 Filename Length       0048 (72)\n+4D9B2 Extra Length          0009 (9)\n+4D9B4 Comment Length        0000 (0)\n+4D9B6 Disk Start            0000 (0)\n+4D9B8 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+4D9BA Ext File Attributes   00000000 (0)\n+4D9BE Local Header Offset   00024A15 (150037)\n+4D9C2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4D9C2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4DA0A Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4DA0C   Length              0005 (5)\n+4DA0E   Flags               01 (1) 'Modification'\n+4DA0F   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+4DA13 CENTRAL HEADER #31    02014B50 (33639248)\n+4DA17 Created Zip Spec      14 (20) '2.0'\n+4DA18 Created OS            00 (0) 'MS-DOS'\n+4DA19 Extract Zip Spec      14 (20) '2.0'\n+4DA1A Extract OS            00 (0) 'MS-DOS'\n+4DA1B General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+4DA1D Compression Method    0000 (0) 'Stored'\n+4DA1F Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4DA23 CRC                   E160ED1C (3781225756)\n+4DA27 Compressed Size       00001657 (5719)\n+4DA2B Uncompressed Size     00001657 (5719)\n+4DA2F Filename Length       0045 (69)\n+4DA31 Extra Length          0009 (9)\n+4DA33 Comment Length        0000 (0)\n+4DA35 Disk Start            0000 (0)\n+4DA37 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+4DA39 Ext File Attributes   00000000 (0)\n+4DA3D Local Header Offset   00026FE9 (159721)\n+4DA41 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4DA41: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4DA86 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4DA88   Length              0005 (5)\n+4DA8A   Flags               01 (1) 'Modification'\n+4DA8B   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+4DA8F CENTRAL HEADER #32    02014B50 (33639248)\n+4DA93 Created Zip Spec      14 (20) '2.0'\n+4DA94 Created OS            00 (0) 'MS-DOS'\n+4DA95 Extract Zip Spec      14 (20) '2.0'\n+4DA96 Extract OS            00 (0) 'MS-DOS'\n+4DA97 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+4DA99 Compression Method    0000 (0) 'Stored'\n+4DA9B Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4DA9F CRC                   156605D7 (359007703)\n+4DAA3 Compressed Size       000010AA (4266)\n+4DAA7 Uncompressed Size     000010AA (4266)\n+4DAAB Filename Length       0048 (72)\n+4DAAD Extra Length          0009 (9)\n+4DAAF Comment Length        0000 (0)\n+4DAB1 Disk Start            0000 (0)\n+4DAB3 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+4DAB5 Ext File Attributes   00000000 (0)\n+4DAB9 Local Header Offset   000286BC (165564)\n+4DABD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4DABD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4DB05 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4DB07   Length              0005 (5)\n+4DB09   Flags               01 (1) 'Modification'\n+4DB0A   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+4DB0E CENTRAL HEADER #33    02014B50 (33639248)\n+4DB12 Created Zip Spec      14 (20) '2.0'\n+4DB13 Created OS            00 (0) 'MS-DOS'\n+4DB14 Extract Zip Spec      14 (20) '2.0'\n+4DB15 Extract OS            00 (0) 'MS-DOS'\n+4DB16 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+4DB18 Compression Method    0000 (0) 'Stored'\n+4DB1A Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4DB1E CRC                   67C26956 (1740794198)\n+4DB22 Compressed Size       00001B93 (7059)\n+4DB26 Uncompressed Size     00001B93 (7059)\n+4DB2A Filename Length       0046 (70)\n+4DB2C Extra Length          0009 (9)\n+4DB2E Comment Length        0000 (0)\n+4DB30 Disk Start            0000 (0)\n+4DB32 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+4DB34 Ext File Attributes   00000000 (0)\n+4DB38 Local Header Offset   000297E5 (169957)\n+4DB3C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4DB3C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4DB82 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4DB84   Length              0005 (5)\n+4DB86   Flags               01 (1) 'Modification'\n+4DB87   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+4DB8B CENTRAL HEADER #34    02014B50 (33639248)\n+4DB8F Created Zip Spec      14 (20) '2.0'\n+4DB90 Created OS            00 (0) 'MS-DOS'\n+4DB91 Extract Zip Spec      14 (20) '2.0'\n+4DB92 Extract OS            00 (0) 'MS-DOS'\n+4DB93 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+4DB95 Compression Method    0000 (0) 'Stored'\n+4DB97 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4DB9B CRC                   46796056 (1182359638)\n+4DB9F Compressed Size       00001B45 (6981)\n+4DBA3 Uncompressed Size     00001B45 (6981)\n+4DBA7 Filename Length       0042 (66)\n+4DBA9 Extra Length          0009 (9)\n+4DBAB Comment Length        0000 (0)\n+4DBAD Disk Start            0000 (0)\n+4DBAF Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+4DBB1 Ext File Attributes   00000000 (0)\n+4DBB5 Local Header Offset   0002B3F5 (177141)\n+4DBB9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4DBB9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4DBFB Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4DBFD   Length              0005 (5)\n+4DBFF   Flags               01 (1) 'Modification'\n+4DC00   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+4DC04 CENTRAL HEADER #35    02014B50 (33639248)\n+4DC08 Created Zip Spec      14 (20) '2.0'\n+4DC09 Created OS            00 (0) 'MS-DOS'\n+4DC0A Extract Zip Spec      14 (20) '2.0'\n+4DC0B Extract OS            00 (0) 'MS-DOS'\n+4DC0C General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+4DC0E Compression Method    0000 (0) 'Stored'\n+4DC10 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4DC14 CRC                   C694724C (3331617356)\n+4DC18 Compressed Size       00000788 (1928)\n+4DC1C Uncompressed Size     00000788 (1928)\n+4DC20 Filename Length       003F (63)\n+4DC22 Extra Length          0009 (9)\n+4DC24 Comment Length        0000 (0)\n+4DC26 Disk Start            0000 (0)\n+4DC28 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+4DC2A Ext File Attributes   00000000 (0)\n+4DC2E Local Header Offset   0002CFB3 (184243)\n+4DC32 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4DC32: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4DC71 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4DC73   Length              0005 (5)\n+4DC75   Flags               01 (1) 'Modification'\n+4DC76   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+4DC7A CENTRAL HEADER #36    02014B50 (33639248)\n+4DC7E Created Zip Spec      14 (20) '2.0'\n+4DC7F Created OS            00 (0) 'MS-DOS'\n+4DC80 Extract Zip Spec      14 (20) '2.0'\n+4DC81 Extract OS            00 (0) 'MS-DOS'\n+4DC82 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+4DC84 Compression Method    0000 (0) 'Stored'\n+4DC86 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4DC8A CRC                   E2414032 (3795927090)\n+4DC8E Compressed Size       0000118B (4491)\n+4DC92 Uncompressed Size     0000118B (4491)\n+4DC96 Filename Length       0043 (67)\n+4DC98 Extra Length          0009 (9)\n+4DC9A Comment Length        0000 (0)\n+4DC9C Disk Start            0000 (0)\n+4DC9E Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+4DCA0 Ext File Attributes   00000000 (0)\n+4DCA4 Local Header Offset   0002D7B1 (186289)\n+4DCA8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4DCA8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4DCEB Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4DCED   Length              0005 (5)\n+4DCEF   Flags               01 (1) 'Modification'\n+4DCF0   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+4DCF4 CENTRAL HEADER #37    02014B50 (33639248)\n+4DCF8 Created Zip Spec      14 (20) '2.0'\n+4DCF9 Created OS            00 (0) 'MS-DOS'\n+4DCFA Extract Zip Spec      14 (20) '2.0'\n+4DCFB Extract OS            00 (0) 'MS-DOS'\n+4DCFC General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+4DCFE Compression Method    0000 (0) 'Stored'\n+4DD00 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4DD04 CRC                   85CF6764 (2244962148)\n+4DD08 Compressed Size       00000DB3 (3507)\n+4DD0C Uncompressed Size     00000DB3 (3507)\n+4DD10 Filename Length       003F (63)\n+4DD12 Extra Length          0009 (9)\n+4DD14 Comment Length        0000 (0)\n+4DD16 Disk Start            0000 (0)\n+4DD18 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+4DD1A Ext File Attributes   00000000 (0)\n+4DD1E Local Header Offset   0002E9B6 (190902)\n+4DD22 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4DD22: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4DD61 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4DD63   Length              0005 (5)\n+4DD65   Flags               01 (1) 'Modification'\n+4DD66   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+4DD6A CENTRAL HEADER #38    02014B50 (33639248)\n+4DD6E Created Zip Spec      14 (20) '2.0'\n+4DD6F Created OS            00 (0) 'MS-DOS'\n+4DD70 Extract Zip Spec      14 (20) '2.0'\n+4DD71 Extract OS            00 (0) 'MS-DOS'\n+4DD72 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+4DD74 Compression Method    0000 (0) 'Stored'\n+4DD76 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4DD7A CRC                   D26D2315 (3530367765)\n+4DD7E Compressed Size       0000115F (4447)\n+4DD82 Uncompressed Size     0000115F (4447)\n+4DD86 Filename Length       0045 (69)\n+4DD88 Extra Length          0009 (9)\n+4DD8A Comment Length        0000 (0)\n+4DD8C Disk Start            0000 (0)\n+4DD8E Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+4DD90 Ext File Attributes   00000000 (0)\n+4DD94 Local Header Offset   0002F7DF (194527)\n+4DD98 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4DD98: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4DDDD Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4DDDF   Length              0005 (5)\n+4DDE1   Flags               01 (1) 'Modification'\n+4DDE2   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+4DDE6 CENTRAL HEADER #39    02014B50 (33639248)\n+4DDEA Created Zip Spec      14 (20) '2.0'\n+4DDEB Created OS            00 (0) 'MS-DOS'\n+4DDEC Extract Zip Spec      14 (20) '2.0'\n+4DDED Extract OS            00 (0) 'MS-DOS'\n+4DDEE General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+4DDF0 Compression Method    0000 (0) 'Stored'\n+4DDF2 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4DDF6 CRC                   F796C627 (4153853479)\n+4DDFA Compressed Size       000018D0 (6352)\n+4DDFE Uncompressed Size     000018D0 (6352)\n+4DE02 Filename Length       003D (61)\n+4DE04 Extra Length          0009 (9)\n+4DE06 Comment Length        0000 (0)\n+4DE08 Disk Start            0000 (0)\n+4DE0A Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+4DE0C Ext File Attributes   00000000 (0)\n+4DE10 Local Header Offset   000309BA (199098)\n+4DE14 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4DE14: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4DE51 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4DE53   Length              0005 (5)\n+4DE55   Flags               01 (1) 'Modification'\n+4DE56   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+4DE5A CENTRAL HEADER #40    02014B50 (33639248)\n+4DE5E Created Zip Spec      14 (20) '2.0'\n+4DE5F Created OS            00 (0) 'MS-DOS'\n+4DE60 Extract Zip Spec      14 (20) '2.0'\n+4DE61 Extract OS            00 (0) 'MS-DOS'\n+4DE62 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+4DE64 Compression Method    0000 (0) 'Stored'\n+4DE66 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4DE6A CRC                   EB12A7F1 (3943868401)\n+4DE6E Compressed Size       00000E08 (3592)\n+4DE72 Uncompressed Size     00000E08 (3592)\n+4DE76 Filename Length       003D (61)\n+4DE78 Extra Length          0009 (9)\n+4DE7A Comment Length        0000 (0)\n+4DE7C Disk Start            0000 (0)\n+4DE7E Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+4DE80 Ext File Attributes   00000000 (0)\n+4DE84 Local Header Offset   000322FE (205566)\n+4DE88 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4DE88: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4DEC5 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4DEC7   Length              0005 (5)\n+4DEC9   Flags               01 (1) 'Modification'\n+4DECA   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+4DECE CENTRAL HEADER #41    02014B50 (33639248)\n+4DED2 Created Zip Spec      14 (20) '2.0'\n+4DED3 Created OS            00 (0) 'MS-DOS'\n+4DED4 Extract Zip Spec      14 (20) '2.0'\n+4DED5 Extract OS            00 (0) 'MS-DOS'\n+4DED6 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+4DED8 Compression Method    0000 (0) 'Stored'\n+4DEDA Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4DEDE CRC                   F5A79DAF (4121402799)\n+4DEE2 Compressed Size       00000F2D (3885)\n+4DEE6 Uncompressed Size     00000F2D (3885)\n+4DEEA Filename Length       003E (62)\n+4DEEC Extra Length          0009 (9)\n+4DEEE Comment Length        0000 (0)\n+4DEF0 Disk Start            0000 (0)\n+4DEF2 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+4DEF4 Ext File Attributes   00000000 (0)\n+4DEF8 Local Header Offset   0003317A (209274)\n+4DEFC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4DEFC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4DF3A Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4DF3C   Length              0005 (5)\n+4DF3E   Flags               01 (1) 'Modification'\n+4DF3F   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+4DF43 CENTRAL HEADER #42    02014B50 (33639248)\n+4DF47 Created Zip Spec      14 (20) '2.0'\n+4DF48 Created OS            00 (0) 'MS-DOS'\n+4DF49 Extract Zip Spec      14 (20) '2.0'\n+4DF4A Extract OS            00 (0) 'MS-DOS'\n+4DF4B General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+4DF4D Compression Method    0000 (0) 'Stored'\n+4DF4F Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4DF53 CRC                   24F4C726 (620021542)\n+4DF57 Compressed Size       000028F1 (10481)\n+4DF5B Uncompressed Size     000028F1 (10481)\n+4DF5F Filename Length       003F (63)\n+4DF61 Extra Length          0009 (9)\n+4DF63 Comment Length        0000 (0)\n+4DF65 Disk Start            0000 (0)\n+4DF67 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+4DF69 Ext File Attributes   00000000 (0)\n+4DF6D Local Header Offset   0003411C (213276)\n+4DF71 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4DF71: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4DFB0 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4DFB2   Length              0005 (5)\n+4DFB4   Flags               01 (1) 'Modification'\n+4DFB5   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+4DFB9 CENTRAL HEADER #43    02014B50 (33639248)\n+4DFBD Created Zip Spec      14 (20) '2.0'\n+4DFBE Created OS            00 (0) 'MS-DOS'\n+4DFBF Extract Zip Spec      14 (20) '2.0'\n+4DFC0 Extract OS            00 (0) 'MS-DOS'\n+4DFC1 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+4DFC3 Compression Method    0000 (0) 'Stored'\n+4DFC5 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4DFC9 CRC                   35C5DEAF (902160047)\n+4DFCD Compressed Size       00001BA7 (7079)\n+4DFD1 Uncompressed Size     00001BA7 (7079)\n+4DFD5 Filename Length       003F (63)\n+4DFD7 Extra Length          0009 (9)\n+4DFD9 Comment Length        0000 (0)\n+4DFDB Disk Start            0000 (0)\n+4DFDD Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+4DFDF Ext File Attributes   00000000 (0)\n+4DFE3 Local Header Offset   00036A83 (223875)\n+4DFE7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4DFE7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4E026 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4E028   Length              0005 (5)\n+4E02A   Flags               01 (1) 'Modification'\n+4E02B   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+4E02F CENTRAL HEADER #44    02014B50 (33639248)\n+4E033 Created Zip Spec      14 (20) '2.0'\n+4E034 Created OS            00 (0) 'MS-DOS'\n+4E035 Extract Zip Spec      14 (20) '2.0'\n+4E036 Extract OS            00 (0) 'MS-DOS'\n+4E037 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+4E039 Compression Method    0000 (0) 'Stored'\n+4E03B Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4E03F CRC                   4C4BC15C (1280033116)\n+4E043 Compressed Size       000012C9 (4809)\n+4E047 Uncompressed Size     000012C9 (4809)\n+4E04B Filename Length       0040 (64)\n+4E04D Extra Length          0009 (9)\n+4E04F Comment Length        0000 (0)\n+4E051 Disk Start            0000 (0)\n+4E053 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+4E055 Ext File Attributes   00000000 (0)\n+4E059 Local Header Offset   000386A0 (231072)\n+4E05D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4E05D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4E09D Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4E09F   Length              0005 (5)\n+4E0A1   Flags               01 (1) 'Modification'\n+4E0A2   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+4E0A6 CENTRAL HEADER #45    02014B50 (33639248)\n+4E0AA Created Zip Spec      14 (20) '2.0'\n+4E0AB Created OS            00 (0) 'MS-DOS'\n+4E0AC Extract Zip Spec      14 (20) '2.0'\n+4E0AD Extract OS            00 (0) 'MS-DOS'\n+4E0AE General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+4E0B0 Compression Method    0000 (0) 'Stored'\n+4E0B2 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4E0B6 CRC                   3875CC22 (947244066)\n+4E0BA Compressed Size       00002741 (10049)\n+4E0BE Uncompressed Size     00002741 (10049)\n+4E0C2 Filename Length       003F (63)\n+4E0C4 Extra Length          0009 (9)\n+4E0C6 Comment Length        0000 (0)\n+4E0C8 Disk Start            0000 (0)\n+4E0CA Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+4E0CC Ext File Attributes   00000000 (0)\n+4E0D0 Local Header Offset   000399E0 (236000)\n+4E0D4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4E0D4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4E113 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4E115   Length              0005 (5)\n+4E117   Flags               01 (1) 'Modification'\n+4E118   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+4E11C CENTRAL HEADER #46    02014B50 (33639248)\n+4E120 Created Zip Spec      14 (20) '2.0'\n+4E121 Created OS            00 (0) 'MS-DOS'\n+4E122 Extract Zip Spec      14 (20) '2.0'\n+4E123 Extract OS            00 (0) 'MS-DOS'\n+4E124 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+4E126 Compression Method    0000 (0) 'Stored'\n+4E128 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4E12C CRC                   5053B7A1 (1347663777)\n+4E130 Compressed Size       000011F9 (4601)\n+4E134 Uncompressed Size     000011F9 (4601)\n+4E138 Filename Length       003E (62)\n+4E13A Extra Length          0009 (9)\n+4E13C Comment Length        0000 (0)\n+4E13E Disk Start            0000 (0)\n+4E140 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+4E142 Ext File Attributes   00000000 (0)\n+4E146 Local Header Offset   0003C197 (246167)\n+4E14A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4E14A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4E188 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4E18A   Length              0005 (5)\n+4E18C   Flags               01 (1) 'Modification'\n+4E18D   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+4E191 CENTRAL HEADER #47    02014B50 (33639248)\n+4E195 Created Zip Spec      14 (20) '2.0'\n+4E196 Created OS            00 (0) 'MS-DOS'\n+4E197 Extract Zip Spec      14 (20) '2.0'\n+4E198 Extract OS            00 (0) 'MS-DOS'\n+4E199 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+4E19B Compression Method    0000 (0) 'Stored'\n+4E19D Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4E1A1 CRC                   AA9A314A (2862231882)\n+4E1A5 Compressed Size       0000041E (1054)\n+4E1A9 Uncompressed Size     0000041E (1054)\n+4E1AD Filename Length       003C (60)\n+4E1AF Extra Length          0009 (9)\n+4E1B1 Comment Length        0000 (0)\n+4E1B3 Disk Start            0000 (0)\n+4E1B5 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+4E1B7 Ext File Attributes   00000000 (0)\n+4E1BB Local Header Offset   0003D405 (250885)\n+4E1BF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4E1BF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4E1FB Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4E1FD   Length              0005 (5)\n+4E1FF   Flags               01 (1) 'Modification'\n+4E200   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+4E204 CENTRAL HEADER #48    02014B50 (33639248)\n+4E208 Created Zip Spec      14 (20) '2.0'\n+4E209 Created OS            00 (0) 'MS-DOS'\n+4E20A Extract Zip Spec      14 (20) '2.0'\n+4E20B Extract OS            00 (0) 'MS-DOS'\n+4E20C General Purpose Flag  0000 (0)\n+4E20E Compression Method    0000 (0) 'Stored'\n+4E210 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4E214 CRC                   00000000 (0)\n+4E218 Compressed Size       00000000 (0)\n+4E21C Uncompressed Size     00000000 (0)\n+4E220 Filename Length       001E (30)\n+4E222 Extra Length          0009 (9)\n+4E224 Comment Length        0000 (0)\n+4E226 Disk Start            0000 (0)\n+4E228 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+4E22A Ext File Attributes   00000000 (0)\n+4E22E Local Header Offset   0003D896 (252054)\n+4E232 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4E232: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4E250 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4E252   Length              0005 (5)\n+4E254   Flags               01 (1) 'Modification'\n+4E255   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+4E259 CENTRAL HEADER #49    02014B50 (33639248)\n+4E25D Created Zip Spec      14 (20) '2.0'\n+4E25E Created OS            00 (0) 'MS-DOS'\n+4E25F Extract Zip Spec      14 (20) '2.0'\n+4E260 Extract OS            00 (0) 'MS-DOS'\n+4E261 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+4E263 Compression Method    0000 (0) 'Stored'\n+4E265 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4E269 CRC                   7C75425F (2088059487)\n+4E26D Compressed Size       00000499 (1177)\n+4E271 Uncompressed Size     00000499 (1177)\n+4E275 Filename Length       003D (61)\n+4E277 Extra Length          0009 (9)\n+4E279 Comment Length        0000 (0)\n+4E27B Disk Start            0000 (0)\n+4E27D Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+4E27F Ext File Attributes   00000000 (0)\n+4E283 Local Header Offset   0003D8DB (252123)\n+4E287 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4E287: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4E2C4 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4E2C6   Length              0005 (5)\n+4E2C8   Flags               01 (1) 'Modification'\n+4E2C9   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+4E2CD CENTRAL HEADER #50    02014B50 (33639248)\n+4E2D1 Created Zip Spec      14 (20) '2.0'\n+4E2D2 Created OS            00 (0) 'MS-DOS'\n+4E2D3 Extract Zip Spec      14 (20) '2.0'\n+4E2D4 Extract OS            00 (0) 'MS-DOS'\n+4E2D5 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+4E2D7 Compression Method    0000 (0) 'Stored'\n+4E2D9 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4E2DD CRC                   A67D03FF (2793210879)\n+4E2E1 Compressed Size       000006BE (1726)\n+4E2E5 Uncompressed Size     000006BE (1726)\n+4E2E9 Filename Length       0043 (67)\n+4E2EB Extra Length          0009 (9)\n+4E2ED Comment Length        0000 (0)\n+4E2EF Disk Start            0000 (0)\n+4E2F1 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+4E2F3 Ext File Attributes   00000000 (0)\n+4E2F7 Local Header Offset   0003DDE8 (253416)\n+4E2FB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4E2FB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4E33E Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4E340   Length              0005 (5)\n+4E342   Flags               01 (1) 'Modification'\n+4E343   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+4E347 CENTRAL HEADER #51    02014B50 (33639248)\n+4E34B Created Zip Spec      14 (20) '2.0'\n+4E34C Created OS            00 (0) 'MS-DOS'\n+4E34D Extract Zip Spec      14 (20) '2.0'\n+4E34E Extract OS            00 (0) 'MS-DOS'\n+4E34F General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+4E351 Compression Method    0000 (0) 'Stored'\n+4E353 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4E357 CRC                   F6F65296 (4143338134)\n+4E35B Compressed Size       000006C5 (1733)\n+4E35F Uncompressed Size     000006C5 (1733)\n+4E363 Filename Length       0045 (69)\n+4E365 Extra Length          0009 (9)\n+4E367 Comment Length        0000 (0)\n+4E369 Disk Start            0000 (0)\n+4E36B Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+4E36D Ext File Attributes   00000000 (0)\n+4E371 Local Header Offset   0003E520 (255264)\n+4E375 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4E375: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4E3BA Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4E3BC   Length              0005 (5)\n+4E3BE   Flags               01 (1) 'Modification'\n+4E3BF   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+4E3C3 CENTRAL HEADER #52    02014B50 (33639248)\n+4E3C7 Created Zip Spec      14 (20) '2.0'\n+4E3C8 Created OS            00 (0) 'MS-DOS'\n+4E3C9 Extract Zip Spec      14 (20) '2.0'\n+4E3CA Extract OS            00 (0) 'MS-DOS'\n+4E3CB General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+4E3CD Compression Method    0000 (0) 'Stored'\n+4E3CF Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4E3D3 CRC                   D200547F (3523236991)\n+4E3D7 Compressed Size       000005CC (1484)\n+4E3DB Uncompressed Size     000005CC (1484)\n+4E3DF Filename Length       0040 (64)\n+4E3E1 Extra Length          0009 (9)\n+4E3E3 Comment Length        0000 (0)\n+4E3E5 Disk Start            0000 (0)\n+4E3E7 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+4E3E9 Ext File Attributes   00000000 (0)\n+4E3ED Local Header Offset   0003EC61 (257121)\n+4E3F1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4E3F1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4E431 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4E433   Length              0005 (5)\n+4E435   Flags               01 (1) 'Modification'\n+4E436   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+4E43A CENTRAL HEADER #53    02014B50 (33639248)\n+4E43E Created Zip Spec      14 (20) '2.0'\n+4E43F Created OS            00 (0) 'MS-DOS'\n+4E440 Extract Zip Spec      14 (20) '2.0'\n+4E441 Extract OS            00 (0) 'MS-DOS'\n+4E442 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+4E444 Compression Method    0000 (0) 'Stored'\n+4E446 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4E44A CRC                   ADCF7988 (2916055432)\n+4E44E Compressed Size       0000069A (1690)\n+4E452 Uncompressed Size     0000069A (1690)\n+4E456 Filename Length       0042 (66)\n+4E458 Extra Length          0009 (9)\n+4E45A Comment Length        0000 (0)\n+4E45C Disk Start            0000 (0)\n+4E45E Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+4E460 Ext File Attributes   00000000 (0)\n+4E464 Local Header Offset   0003F2A4 (258724)\n+4E468 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4E468: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4E4AA Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4E4AC   Length              0005 (5)\n+4E4AE   Flags               01 (1) 'Modification'\n+4E4AF   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+4E4B3 CENTRAL HEADER #54    02014B50 (33639248)\n+4E4B7 Created Zip Spec      14 (20) '2.0'\n+4E4B8 Created OS            00 (0) 'MS-DOS'\n+4E4B9 Extract Zip Spec      14 (20) '2.0'\n+4E4BA Extract OS            00 (0) 'MS-DOS'\n+4E4BB General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+4E4BD Compression Method    0000 (0) 'Stored'\n+4E4BF Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4E4C3 CRC                   A8CE0A81 (2832075393)\n+4E4C7 Compressed Size       0000051E (1310)\n+4E4CB Uncompressed Size     0000051E (1310)\n+4E4CF Filename Length       003D (61)\n+4E4D1 Extra Length          0009 (9)\n+4E4D3 Comment Length        0000 (0)\n+4E4D5 Disk Start            0000 (0)\n+4E4D7 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+4E4D9 Ext File Attributes   00000000 (0)\n+4E4DD Local Header Offset   0003F9B7 (260535)\n+4E4E1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4E4E1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4E51E Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4E520   Length              0005 (5)\n+4E522   Flags               01 (1) 'Modification'\n+4E523   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+4E527 CENTRAL HEADER #55    02014B50 (33639248)\n+4E52B Created Zip Spec      14 (20) '2.0'\n+4E52C Created OS            00 (0) 'MS-DOS'\n+4E52D Extract Zip Spec      14 (20) '2.0'\n+4E52E Extract OS            00 (0) 'MS-DOS'\n+4E52F General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+4E531 Compression Method    0000 (0) 'Stored'\n+4E533 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4E537 CRC                   5D6056E9 (1566594793)\n+4E53B Compressed Size       00000526 (1318)\n+4E53F Uncompressed Size     00000526 (1318)\n+4E543 Filename Length       003F (63)\n+4E545 Extra Length          0009 (9)\n+4E547 Comment Length        0000 (0)\n+4E549 Disk Start            0000 (0)\n+4E54B Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+4E54D Ext File Attributes   00000000 (0)\n+4E551 Local Header Offset   0003FF49 (261961)\n+4E555 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4E555: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4E594 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4E596   Length              0005 (5)\n+4E598   Flags               01 (1) 'Modification'\n+4E599   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+4E59D CENTRAL HEADER #56    02014B50 (33639248)\n+4E5A1 Created Zip Spec      14 (20) '2.0'\n+4E5A2 Created OS            00 (0) 'MS-DOS'\n+4E5A3 Extract Zip Spec      14 (20) '2.0'\n+4E5A4 Extract OS            00 (0) 'MS-DOS'\n+4E5A5 General Purpose Flag  0000 (0)\n+4E5A7 Compression Method    0000 (0) 'Stored'\n+4E5A9 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4E5AD CRC                   00000000 (0)\n+4E5B1 Compressed Size       00000000 (0)\n+4E5B5 Uncompressed Size     00000000 (0)\n+4E5B9 Filename Length       0027 (39)\n+4E5BB Extra Length          0009 (9)\n+4E5BD Comment Length        0000 (0)\n+4E5BF Disk Start            0000 (0)\n+4E5C1 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+4E5C3 Ext File Attributes   00000000 (0)\n+4E5C7 Local Header Offset   000404E5 (263397)\n+4E5CB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4E5CB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4E5F2 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4E5F4   Length              0005 (5)\n+4E5F6   Flags               01 (1) 'Modification'\n+4E5F7   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+4E5FB CENTRAL HEADER #57    02014B50 (33639248)\n+4E5FF Created Zip Spec      14 (20) '2.0'\n+4E600 Created OS            00 (0) 'MS-DOS'\n+4E601 Extract Zip Spec      14 (20) '2.0'\n+4E602 Extract OS            00 (0) 'MS-DOS'\n+4E603 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+4E605 Compression Method    0000 (0) 'Stored'\n+4E607 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4E60B CRC                   FFDB09C9 (4292544969)\n+4E60F Compressed Size       00000774 (1908)\n+4E613 Uncompressed Size     00000774 (1908)\n+4E617 Filename Length       0040 (64)\n+4E619 Extra Length          0009 (9)\n+4E61B Comment Length        0000 (0)\n+4E61D Disk Start            0000 (0)\n+4E61F Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+4E621 Ext File Attributes   00000000 (0)\n+4E625 Local Header Offset   00040533 (263475)\n+4E629 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4E629: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4E669 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4E66B   Length              0005 (5)\n+4E66D   Flags               01 (1) 'Modification'\n+4E66E   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+4E672 CENTRAL HEADER #58    02014B50 (33639248)\n+4E676 Created Zip Spec      14 (20) '2.0'\n+4E677 Created OS            00 (0) 'MS-DOS'\n+4E678 Extract Zip Spec      14 (20) '2.0'\n+4E679 Extract OS            00 (0) 'MS-DOS'\n+4E67A General Purpose Flag  0000 (0)\n+4E67C Compression Method    0000 (0) 'Stored'\n+4E67E Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4E682 CRC                   00000000 (0)\n+4E686 Compressed Size       00000000 (0)\n+4E68A Uncompressed Size     00000000 (0)\n+4E68E Filename Length       0020 (32)\n+4E690 Extra Length          0009 (9)\n+4E692 Comment Length        0000 (0)\n+4E694 Disk Start            0000 (0)\n+4E696 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+4E698 Ext File Attributes   00000000 (0)\n+4E69C Local Header Offset   00040D1E (265502)\n+4E6A0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4E6A0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4E6C0 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4E6C2   Length              0005 (5)\n+4E6C4   Flags               01 (1) 'Modification'\n+4E6C5   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+4E6C9 CENTRAL HEADER #59    02014B50 (33639248)\n+4E6CD Created Zip Spec      14 (20) '2.0'\n+4E6CE Created OS            00 (0) 'MS-DOS'\n+4E6CF Extract Zip Spec      14 (20) '2.0'\n+4E6D0 Extract OS            00 (0) 'MS-DOS'\n+4E6D1 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+4E6D3 Compression Method    0000 (0) 'Stored'\n+4E6D5 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4E6D9 CRC                   A8777CA7 (2826402983)\n+4E6DD Compressed Size       00000840 (2112)\n+4E6E1 Uncompressed Size     00000840 (2112)\n+4E6E5 Filename Length       0044 (68)\n+4E6E7 Extra Length          0009 (9)\n+4E6E9 Comment Length        0000 (0)\n+4E6EB Disk Start            0000 (0)\n+4E6ED Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+4E6EF Ext File Attributes   00000000 (0)\n+4E6F3 Local Header Offset   00040D65 (265573)\n+4E6F7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4E6F7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4E73B Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4E73D   Length              0005 (5)\n+4E73F   Flags               01 (1) 'Modification'\n+4E740   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+4E744 CENTRAL HEADER #60    02014B50 (33639248)\n+4E748 Created Zip Spec      14 (20) '2.0'\n+4E749 Created OS            00 (0) 'MS-DOS'\n+4E74A Extract Zip Spec      14 (20) '2.0'\n+4E74B Extract OS            00 (0) 'MS-DOS'\n+4E74C General Purpose Flag  0000 (0)\n+4E74E Compression Method    0000 (0) 'Stored'\n+4E750 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4E754 CRC                   00000000 (0)\n+4E758 Compressed Size       00000000 (0)\n+4E75C Uncompressed Size     00000000 (0)\n+4E760 Filename Length       0021 (33)\n+4E762 Extra Length          0009 (9)\n+4E764 Comment Length        0000 (0)\n+4E766 Disk Start            0000 (0)\n+4E768 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+4E76A Ext File Attributes   00000000 (0)\n+4E76E Local Header Offset   00041620 (267808)\n+4E772 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4E772: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4E793 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4E795   Length              0005 (5)\n+4E797   Flags               01 (1) 'Modification'\n+4E798   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+4E79C CENTRAL HEADER #61    02014B50 (33639248)\n+4E7A0 Created Zip Spec      14 (20) '2.0'\n+4E7A1 Created OS            00 (0) 'MS-DOS'\n+4E7A2 Extract Zip Spec      14 (20) '2.0'\n+4E7A3 Extract OS            00 (0) 'MS-DOS'\n+4E7A4 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+4E7A6 Compression Method    0000 (0) 'Stored'\n+4E7A8 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4E7AC CRC                   E294E314 (3801408276)\n+4E7B0 Compressed Size       000012DA (4826)\n+4E7B4 Uncompressed Size     000012DA (4826)\n+4E7B8 Filename Length       0049 (73)\n+4E7BA Extra Length          0009 (9)\n+4E7BC Comment Length        0000 (0)\n+4E7BE Disk Start            0000 (0)\n+4E7C0 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+4E7C2 Ext File Attributes   00000000 (0)\n+4E7C6 Local Header Offset   00041668 (267880)\n+4E7CA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4E7CA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4E813 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4E815   Length              0005 (5)\n+4E817   Flags               01 (1) 'Modification'\n+4E818   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+4E81C CENTRAL HEADER #62    02014B50 (33639248)\n+4E820 Created Zip Spec      14 (20) '2.0'\n+4E821 Created OS            00 (0) 'MS-DOS'\n+4E822 Extract Zip Spec      14 (20) '2.0'\n+4E823 Extract OS            00 (0) 'MS-DOS'\n+4E824 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+4E826 Compression Method    0000 (0) 'Stored'\n+4E828 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4E82C CRC                   484F34E6 (1213150438)\n+4E830 Compressed Size       00000A53 (2643)\n+4E834 Uncompressed Size     00000A53 (2643)\n+4E838 Filename Length       0043 (67)\n+4E83A Extra Length          0009 (9)\n+4E83C Comment Length        0000 (0)\n+4E83E Disk Start            0000 (0)\n+4E840 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+4E842 Ext File Attributes   00000000 (0)\n+4E846 Local Header Offset   000429C2 (272834)\n+4E84A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4E84A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4E88D Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4E88F   Length              0005 (5)\n+4E891   Flags               01 (1) 'Modification'\n+4E892   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+4E896 CENTRAL HEADER #63    02014B50 (33639248)\n+4E89A Created Zip Spec      14 (20) '2.0'\n+4E89B Created OS            00 (0) 'MS-DOS'\n+4E89C Extract Zip Spec      14 (20) '2.0'\n+4E89D Extract OS            00 (0) 'MS-DOS'\n+4E89E General Purpose Flag  0000 (0)\n+4E8A0 Compression Method    0000 (0) 'Stored'\n+4E8A2 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4E8A6 CRC                   00000000 (0)\n+4E8AA Compressed Size       00000000 (0)\n+4E8AE Uncompressed Size     00000000 (0)\n+4E8B2 Filename Length       001E (30)\n+4E8B4 Extra Length          0009 (9)\n+4E8B6 Comment Length        0000 (0)\n+4E8B8 Disk Start            0000 (0)\n+4E8BA Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+4E8BC Ext File Attributes   00000000 (0)\n+4E8C0 Local Header Offset   0004348F (275599)\n+4E8C4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4E8C4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4E8E2 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4E8E4   Length              0005 (5)\n+4E8E6   Flags               01 (1) 'Modification'\n+4E8E7   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+4E8EB CENTRAL HEADER #64    02014B50 (33639248)\n+4E8EF Created Zip Spec      14 (20) '2.0'\n+4E8F0 Created OS            00 (0) 'MS-DOS'\n+4E8F1 Extract Zip Spec      14 (20) '2.0'\n+4E8F2 Extract OS            00 (0) 'MS-DOS'\n+4E8F3 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+4E8F5 Compression Method    0000 (0) 'Stored'\n+4E8F7 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4E8FB CRC                   25A2615A (631398746)\n+4E8FF Compressed Size       000075E8 (30184)\n+4E903 Uncompressed Size     000075E8 (30184)\n+4E907 Filename Length       0038 (56)\n+4E909 Extra Length          0009 (9)\n+4E90B Comment Length        0000 (0)\n+4E90D Disk Start            0000 (0)\n+4E90F Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+4E911 Ext File Attributes   00000000 (0)\n+4E915 Local Header Offset   000434D4 (275668)\n+4E919 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4E919: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4E951 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4E953   Length              0005 (5)\n+4E955   Flags               01 (1) 'Modification'\n+4E956   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+4E95A CENTRAL HEADER #65    02014B50 (33639248)\n+4E95E Created Zip Spec      14 (20) '2.0'\n+4E95F Created OS            00 (0) 'MS-DOS'\n+4E960 Extract Zip Spec      14 (20) '2.0'\n+4E961 Extract OS            00 (0) 'MS-DOS'\n+4E962 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+4E964 Compression Method    0000 (0) 'Stored'\n+4E966 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+4E96A CRC                   3773BB53 (930331475)\n+4E96E Compressed Size       00002379 (9081)\n+4E972 Uncompressed Size     00002379 (9081)\n+4E976 Filename Length       0037 (55)\n+4E978 Extra Length          0009 (9)\n+4E97A Comment Length        0000 (0)\n+4E97C Disk Start            0000 (0)\n+4E97E Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+4E980 Ext File Attributes   00000000 (0)\n+4E984 Local Header Offset   0004AB2B (305963)\n+4E988 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4E988: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+4E9BF Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+4E9C1   Length              0005 (5)\n+4E9C3   Flags               01 (1) 'Modification'\n+4E9C4   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+4E9C8 END CENTRAL HEADER    06054B50 (101010256)\n+4E9CC Number of this disk   0000 (0)\n+4E9CE Central Dir Disk no   0000 (0)\n+4E9D0 Entries in this disk  0041 (65)\n+4E9D2 Total Entries         0041 (65)\n+4E9D4 Size of Central Dir   00001AB6 (6838)\n+4E9D8 Offset to Central Dir 0004CF12 (315154)\n+4E9DC Comment Length        0000 (0)\n #\n # Warning Count: 130\n #\n # Done\n"}, {"source1": "META-INF/dubbo/internal/org.apache.dubbo.event.EventListener", "source2": "META-INF/dubbo/internal/org.apache.dubbo.event.EventListener", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1 +1 @@\n-config-logging=org.apache.dubbo.config.event.listener.LoggingEventListener\n+config-logging=org.apache.dubbo.config.event.listener.LoggingEventListener\r\n"}, {"source1": "META-INF/dubbo/internal/org.apache.dubbo.metadata.MetadataServiceExporter", "source2": "META-INF/dubbo/internal/org.apache.dubbo.metadata.MetadataServiceExporter", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,2 +1,2 @@\n-# since 2.7.8\n-local = org.apache.dubbo.config.metadata.ConfigurableMetadataServiceExporter\n+# since 2.7.8\r\n+local = org.apache.dubbo.config.metadata.ConfigurableMetadataServiceExporter\r\n"}, {"source1": "META-INF/maven/org.apache.dubbo/dubbo-config-api/pom.xml", "source2": "META-INF/maven/org.apache.dubbo/dubbo-config-api/pom.xml", "unified_diff": null, "details": [{"source1": "META-INF/maven/org.apache.dubbo/dubbo-config-api/pom.xml", "source2": "META-INF/maven/org.apache.dubbo/dubbo-config-api/pom.xml", "comments": ["Ordering differences only"], "unified_diff": "@@ -130,16 +130,16 @@\n     <dependency>\n       <groupId>org.apache.dubbo</groupId>\n       <artifactId>dubbo-registry-eureka</artifactId>\n       <version>${project.parent.version}</version>\n       <scope>test</scope>\n       <exclusions>\n         <exclusion>\n-          <artifactId>guava</artifactId>\n           <groupId>com.google.guava</groupId>\n+          <artifactId>guava</artifactId>\n         </exclusion>\n       </exclusions>\n     </dependency>\n     <dependency>\n       <groupId>org.apache.dubbo</groupId>\n       <artifactId>dubbo-registry-etcd3</artifactId>\n       <version>${project.parent.version}</version>\n@@ -154,16 +154,16 @@\n     <dependency>\n       <groupId>org.apache.dubbo</groupId>\n       <artifactId>dubbo-metadata-report-zookeeper</artifactId>\n       <version>${project.parent.version}</version>\n       <scope>test</scope>\n       <exclusions>\n         <exclusion>\n-          <artifactId>guava</artifactId>\n           <groupId>com.google.guava</groupId>\n+          <artifactId>guava</artifactId>\n         </exclusion>\n       </exclusions>\n     </dependency>\n     <dependency>\n       <groupId>org.apache.dubbo</groupId>\n       <artifactId>dubbo-metadata-report-etcd</artifactId>\n       <version>${project.parent.version}</version>\n@@ -172,16 +172,16 @@\n     <dependency>\n       <groupId>org.apache.dubbo</groupId>\n       <artifactId>dubbo-metadata-report-nacos</artifactId>\n       <version>${project.parent.version}</version>\n       <scope>test</scope>\n       <exclusions>\n         <exclusion>\n-          <artifactId>guava</artifactId>\n           <groupId>com.google.guava</groupId>\n+          <artifactId>guava</artifactId>\n         </exclusion>\n       </exclusions>\n     </dependency>\n     <dependency>\n       <groupId>org.apache.dubbo</groupId>\n       <artifactId>dubbo-metadata-report-consul</artifactId>\n       <version>${project.parent.version}</version>\n@@ -202,16 +202,16 @@\n     <dependency>\n       <groupId>org.apache.dubbo</groupId>\n       <artifactId>dubbo-configcenter-nacos</artifactId>\n       <version>${project.parent.version}</version>\n       <scope>test</scope>\n       <exclusions>\n         <exclusion>\n-          <artifactId>guava</artifactId>\n           <groupId>com.google.guava</groupId>\n+          <artifactId>guava</artifactId>\n         </exclusion>\n       </exclusions>\n     </dependency>\n     <dependency>\n       <groupId>org.apache.dubbo</groupId>\n       <artifactId>dubbo-configcenter-consul</artifactId>\n       <version>${project.parent.version}</version>\n"}]}, {"source1": "org/apache/dubbo/config/ConfigInitializer.java", "source2": "org/apache/dubbo/config/ConfigInitializer.java", "comments": ["Line-ending 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.config;\n-\n-import org.apache.dubbo.common.extension.SPI;\n-\n-/**\n- * Dynamically add some parameters / check config\n- */\n-\n-@SPI\n-public interface ConfigInitializer {\n-\n-    default void initReferConfig(ReferenceConfig referenceConfig) {\n-\n-    }\n-\n-    default void initServiceConfig(ServiceConfig serviceConfig) {\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.config;\r\n+\r\n+import org.apache.dubbo.common.extension.SPI;\r\n+\r\n+/**\r\n+ * Dynamically add some parameters / check config\r\n+ */\r\n+\r\n+@SPI\r\n+public interface ConfigInitializer {\r\n+\r\n+    default void initReferConfig(ReferenceConfig referenceConfig) {\r\n+\r\n+    }\r\n+\r\n+    default void initServiceConfig(ServiceConfig serviceConfig) {\r\n+\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/ConfigPostProcessor.java", "source2": "org/apache/dubbo/config/ConfigPostProcessor.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,35 +1,35 @@\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.config;\n-\n-import org.apache.dubbo.common.extension.SPI;\n-\n-/**\n- * 2019/12/30\n- */\n-\n-@SPI\n-public interface ConfigPostProcessor {\n-\n-    default void postProcessReferConfig(ReferenceConfig referenceConfig) {\n-\n-    }\n-\n-    default void postProcessServiceConfig(ServiceConfig serviceConfig) {\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.config;\r\n+\r\n+import org.apache.dubbo.common.extension.SPI;\r\n+\r\n+/**\r\n+ * 2019/12/30\r\n+ */\r\n+\r\n+@SPI\r\n+public interface ConfigPostProcessor {\r\n+\r\n+    default void postProcessReferConfig(ReferenceConfig referenceConfig) {\r\n+\r\n+    }\r\n+\r\n+    default void postProcessServiceConfig(ServiceConfig serviceConfig) {\r\n+\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/DubboShutdownHook.java", "source2": "org/apache/dubbo/config/DubboShutdownHook.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,149 +1,149 @@\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.config;\n-\n-import org.apache.dubbo.common.extension.ExtensionLoader;\n-import org.apache.dubbo.common.lang.ShutdownHookCallbacks;\n-import org.apache.dubbo.common.logger.Logger;\n-import org.apache.dubbo.common.logger.LoggerFactory;\n-import org.apache.dubbo.config.event.DubboServiceDestroyedEvent;\n-import org.apache.dubbo.config.event.DubboShutdownHookRegisteredEvent;\n-import org.apache.dubbo.config.event.DubboShutdownHookUnregisteredEvent;\n-import org.apache.dubbo.event.Event;\n-import org.apache.dubbo.event.EventDispatcher;\n-import org.apache.dubbo.registry.support.AbstractRegistryFactory;\n-import org.apache.dubbo.rpc.Protocol;\n-\n-import java.util.concurrent.atomic.AtomicBoolean;\n-\n-/**\n- * The shutdown hook thread to do the clean up stuff.\n- * This is a singleton in order to ensure there is only one shutdown hook registered.\n- * Because {@link ApplicationShutdownHooks} use {@link java.util.IdentityHashMap}\n- * to store the shutdown hooks.\n- */\n-public class DubboShutdownHook extends Thread {\n-\n-    private static final Logger logger = LoggerFactory.getLogger(DubboShutdownHook.class);\n-\n-    private static final DubboShutdownHook DUBBO_SHUTDOWN_HOOK = new DubboShutdownHook(\"DubboShutdownHook\");\n-\n-    private final ShutdownHookCallbacks callbacks = ShutdownHookCallbacks.INSTANCE;\n-\n-    /**\n-     * Has it already been registered or not?\n-     */\n-    private final AtomicBoolean registered = new AtomicBoolean(false);\n-\n-    /**\n-     * Has it already been destroyed or not?\n-     */\n-    private static final AtomicBoolean destroyed = new AtomicBoolean(false);\n-\n-    private final EventDispatcher eventDispatcher = EventDispatcher.getDefaultExtension();\n-\n-    private DubboShutdownHook(String name) {\n-        super(name);\n-    }\n-\n-    public static DubboShutdownHook getDubboShutdownHook() {\n-        return DUBBO_SHUTDOWN_HOOK;\n-    }\n-\n-    @Override\n-    public void run() {\n-        if (logger.isInfoEnabled()) {\n-            logger.info(\"Run shutdown hook now.\");\n-        }\n-\n-        callback();\n-        doDestroy();\n-    }\n-\n-    /**\n-     * For testing purpose\n-     */\n-    void clear() {\n-        callbacks.clear();\n-    }\n-\n-    private void callback() {\n-        callbacks.callback();\n-    }\n-\n-    /**\n-     * Register the ShutdownHook\n-     */\n-    public void register() {\n-        if (registered.compareAndSet(false, true)) {\n-            DubboShutdownHook dubboShutdownHook = getDubboShutdownHook();\n-            Runtime.getRuntime().addShutdownHook(dubboShutdownHook);\n-            dispatch(new DubboShutdownHookRegisteredEvent(dubboShutdownHook));\n-        }\n-    }\n-\n-    /**\n-     * Unregister the ShutdownHook\n-     */\n-    public void unregister() {\n-        if (registered.compareAndSet(true, false)) {\n-            DubboShutdownHook dubboShutdownHook = getDubboShutdownHook();\n-            Runtime.getRuntime().removeShutdownHook(dubboShutdownHook);\n-            dispatch(new DubboShutdownHookUnregisteredEvent(dubboShutdownHook));\n-        }\n-    }\n-\n-    /**\n-     * Destroy all the resources, including registries and protocols.\n-     */\n-    public void doDestroy() {\n-        // dispatch the DubboDestroyedEvent @since 2.7.5\n-        dispatch(new DubboServiceDestroyedEvent(this));\n-    }\n-\n-    private void dispatch(Event event) {\n-        eventDispatcher.dispatch(event);\n-    }\n-\n-    public boolean getRegistered() {\n-        return registered.get();\n-    }\n-\n-    public static void destroyAll() {\n-        if (destroyed.compareAndSet(false, true)) {\n-            AbstractRegistryFactory.destroyAll();\n-            destroyProtocols();\n-        }\n-    }\n-\n-    /**\n-     * Destroy all the protocols.\n-     */\n-    public static void destroyProtocols() {\n-        ExtensionLoader<Protocol> loader = ExtensionLoader.getExtensionLoader(Protocol.class);\n-        for (String protocolName : loader.getLoadedExtensions()) {\n-            try {\n-                Protocol protocol = loader.getLoadedExtension(protocolName);\n-                if (protocol != null) {\n-                    protocol.destroy();\n-                }\n-            } catch (Throwable t) {\n-                logger.warn(t.getMessage(), t);\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.config;\r\n+\r\n+import org.apache.dubbo.common.extension.ExtensionLoader;\r\n+import org.apache.dubbo.common.lang.ShutdownHookCallbacks;\r\n+import org.apache.dubbo.common.logger.Logger;\r\n+import org.apache.dubbo.common.logger.LoggerFactory;\r\n+import org.apache.dubbo.config.event.DubboServiceDestroyedEvent;\r\n+import org.apache.dubbo.config.event.DubboShutdownHookRegisteredEvent;\r\n+import org.apache.dubbo.config.event.DubboShutdownHookUnregisteredEvent;\r\n+import org.apache.dubbo.event.Event;\r\n+import org.apache.dubbo.event.EventDispatcher;\r\n+import org.apache.dubbo.registry.support.AbstractRegistryFactory;\r\n+import org.apache.dubbo.rpc.Protocol;\r\n+\r\n+import java.util.concurrent.atomic.AtomicBoolean;\r\n+\r\n+/**\r\n+ * The shutdown hook thread to do the clean up stuff.\r\n+ * This is a singleton in order to ensure there is only one shutdown hook registered.\r\n+ * Because {@link ApplicationShutdownHooks} use {@link java.util.IdentityHashMap}\r\n+ * to store the shutdown hooks.\r\n+ */\r\n+public class DubboShutdownHook extends Thread {\r\n+\r\n+    private static final Logger logger = LoggerFactory.getLogger(DubboShutdownHook.class);\r\n+\r\n+    private static final DubboShutdownHook DUBBO_SHUTDOWN_HOOK = new DubboShutdownHook(\"DubboShutdownHook\");\r\n+\r\n+    private final ShutdownHookCallbacks callbacks = ShutdownHookCallbacks.INSTANCE;\r\n+\r\n+    /**\r\n+     * Has it already been registered or not?\r\n+     */\r\n+    private final AtomicBoolean registered = new AtomicBoolean(false);\r\n+\r\n+    /**\r\n+     * Has it already been destroyed or not?\r\n+     */\r\n+    private static final AtomicBoolean destroyed = new AtomicBoolean(false);\r\n+\r\n+    private final EventDispatcher eventDispatcher = EventDispatcher.getDefaultExtension();\r\n+\r\n+    private DubboShutdownHook(String name) {\r\n+        super(name);\r\n+    }\r\n+\r\n+    public static DubboShutdownHook getDubboShutdownHook() {\r\n+        return DUBBO_SHUTDOWN_HOOK;\r\n+    }\r\n+\r\n+    @Override\r\n+    public void run() {\r\n+        if (logger.isInfoEnabled()) {\r\n+            logger.info(\"Run shutdown hook now.\");\r\n+        }\r\n+\r\n+        callback();\r\n+        doDestroy();\r\n+    }\r\n+\r\n+    /**\r\n+     * For testing purpose\r\n+     */\r\n+    void clear() {\r\n+        callbacks.clear();\r\n+    }\r\n+\r\n+    private void callback() {\r\n+        callbacks.callback();\r\n+    }\r\n+\r\n+    /**\r\n+     * Register the ShutdownHook\r\n+     */\r\n+    public void register() {\r\n+        if (registered.compareAndSet(false, true)) {\r\n+            DubboShutdownHook dubboShutdownHook = getDubboShutdownHook();\r\n+            Runtime.getRuntime().addShutdownHook(dubboShutdownHook);\r\n+            dispatch(new DubboShutdownHookRegisteredEvent(dubboShutdownHook));\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * Unregister the ShutdownHook\r\n+     */\r\n+    public void unregister() {\r\n+        if (registered.compareAndSet(true, false)) {\r\n+            DubboShutdownHook dubboShutdownHook = getDubboShutdownHook();\r\n+            Runtime.getRuntime().removeShutdownHook(dubboShutdownHook);\r\n+            dispatch(new DubboShutdownHookUnregisteredEvent(dubboShutdownHook));\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * Destroy all the resources, including registries and protocols.\r\n+     */\r\n+    public void doDestroy() {\r\n+        // dispatch the DubboDestroyedEvent @since 2.7.5\r\n+        dispatch(new DubboServiceDestroyedEvent(this));\r\n+    }\r\n+\r\n+    private void dispatch(Event event) {\r\n+        eventDispatcher.dispatch(event);\r\n+    }\r\n+\r\n+    public boolean getRegistered() {\r\n+        return registered.get();\r\n+    }\r\n+\r\n+    public static void destroyAll() {\r\n+        if (destroyed.compareAndSet(false, true)) {\r\n+            AbstractRegistryFactory.destroyAll();\r\n+            destroyProtocols();\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * Destroy all the protocols.\r\n+     */\r\n+    public static void destroyProtocols() {\r\n+        ExtensionLoader<Protocol> loader = ExtensionLoader.getExtensionLoader(Protocol.class);\r\n+        for (String protocolName : loader.getLoadedExtensions()) {\r\n+            try {\r\n+                Protocol protocol = loader.getLoadedExtension(protocolName);\r\n+                if (protocol != null) {\r\n+                    protocol.destroy();\r\n+                }\r\n+            } catch (Throwable t) {\r\n+                logger.warn(t.getMessage(), t);\r\n+            }\r\n+        }\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/ReferenceConfig.java", "source2": "org/apache/dubbo/config/ReferenceConfig.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,554 +1,554 @@\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.config;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.Version;\n-import org.apache.dubbo.common.bytecode.Wrapper;\n-import org.apache.dubbo.common.constants.RegistryConstants;\n-import org.apache.dubbo.common.extension.ExtensionLoader;\n-import org.apache.dubbo.common.logger.Logger;\n-import org.apache.dubbo.common.logger.LoggerFactory;\n-import org.apache.dubbo.common.utils.CollectionUtils;\n-import org.apache.dubbo.common.utils.ConfigUtils;\n-import org.apache.dubbo.common.utils.NetUtils;\n-import org.apache.dubbo.common.utils.StringUtils;\n-import org.apache.dubbo.common.utils.UrlUtils;\n-import org.apache.dubbo.config.annotation.Reference;\n-import org.apache.dubbo.config.bootstrap.DubboBootstrap;\n-import org.apache.dubbo.config.event.ReferenceConfigDestroyedEvent;\n-import org.apache.dubbo.config.event.ReferenceConfigInitializedEvent;\n-import org.apache.dubbo.config.support.Parameter;\n-import org.apache.dubbo.config.utils.ConfigValidationUtils;\n-import org.apache.dubbo.event.Event;\n-import org.apache.dubbo.event.EventDispatcher;\n-import org.apache.dubbo.registry.client.metadata.MetadataUtils;\n-import org.apache.dubbo.rpc.Invoker;\n-import org.apache.dubbo.rpc.Protocol;\n-import org.apache.dubbo.rpc.ProxyFactory;\n-import org.apache.dubbo.rpc.cluster.Cluster;\n-import org.apache.dubbo.rpc.cluster.directory.StaticDirectory;\n-import org.apache.dubbo.rpc.cluster.support.ClusterUtils;\n-import org.apache.dubbo.rpc.cluster.support.registry.ZoneAwareCluster;\n-import org.apache.dubbo.rpc.model.ApplicationModel;\n-import org.apache.dubbo.rpc.model.AsyncMethodInfo;\n-import org.apache.dubbo.rpc.model.ConsumerModel;\n-import org.apache.dubbo.rpc.model.ServiceDescriptor;\n-import org.apache.dubbo.rpc.model.ServiceRepository;\n-import org.apache.dubbo.rpc.protocol.injvm.InjvmProtocol;\n-import org.apache.dubbo.rpc.service.GenericService;\n-import org.apache.dubbo.rpc.support.ProtocolUtils;\n-\n-import java.util.ArrayList;\n-import java.util.Arrays;\n-import java.util.HashMap;\n-import java.util.HashSet;\n-import java.util.List;\n-import java.util.Map;\n-import java.util.Set;\n-\n-import static org.apache.dubbo.common.constants.CommonConstants.ANY_VALUE;\n-import static org.apache.dubbo.common.constants.CommonConstants.CLUSTER_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.COMMA_SEPARATOR;\n-import static org.apache.dubbo.common.constants.CommonConstants.COMMA_SEPARATOR_CHAR;\n-import static org.apache.dubbo.common.constants.CommonConstants.CONSUMER_SIDE;\n-import static org.apache.dubbo.common.constants.CommonConstants.INTERFACE_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.LOCALHOST_VALUE;\n-import static org.apache.dubbo.common.constants.CommonConstants.METADATA_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.METHODS_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.MONITOR_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.PROXY_CLASS_REF;\n-import static org.apache.dubbo.common.constants.CommonConstants.REMOTE_METADATA_STORAGE_TYPE;\n-import static org.apache.dubbo.common.constants.CommonConstants.REVISION_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.SEMICOLON_SPLIT_PATTERN;\n-import static org.apache.dubbo.common.constants.CommonConstants.SIDE_KEY;\n-import static org.apache.dubbo.common.constants.RegistryConstants.SUBSCRIBED_SERVICE_NAMES_KEY;\n-import static org.apache.dubbo.common.utils.NetUtils.isInvalidLocalHost;\n-import static org.apache.dubbo.common.utils.StringUtils.splitToSet;\n-import static org.apache.dubbo.config.Constants.DUBBO_IP_TO_REGISTRY;\n-import static org.apache.dubbo.registry.Constants.CONSUMER_PROTOCOL;\n-import static org.apache.dubbo.registry.Constants.REGISTER_IP_KEY;\n-import static org.apache.dubbo.rpc.Constants.LOCAL_PROTOCOL;\n-import static org.apache.dubbo.rpc.cluster.Constants.REFER_KEY;\n-\n-/**\n- * Please avoid using this class for any new application,\n- * use {@link ReferenceConfigBase} instead.\n- */\n-public class ReferenceConfig<T> extends ReferenceConfigBase<T> {\n-\n-    public static final Logger logger = LoggerFactory.getLogger(ReferenceConfig.class);\n-\n-    /**\n-     * The {@link Protocol} implementation with adaptive functionality,it will be different in different scenarios.\n-     * A particular {@link Protocol} implementation is determined by the protocol attribute in the {@link URL}.\n-     * For example:\n-     *\n-     * <li>when the url is registry://224.5.6.7:1234/org.apache.dubbo.registry.RegistryService?application=dubbo-sample,\n-     * then the protocol is <b>RegistryProtocol</b></li>\n-     *\n-     * <li>when the url is dubbo://224.5.6.7:1234/org.apache.dubbo.config.api.DemoService?application=dubbo-sample, then\n-     * the protocol is <b>DubboProtocol</b></li>\n-     * <p>\n-     * Actually\uff0cwhen the {@link ExtensionLoader} init the {@link Protocol} instants,it will automatically wraps two\n-     * layers, and eventually will get a <b>ProtocolFilterWrapper</b> or <b>ProtocolListenerWrapper</b>\n-     */\n-    private static final Protocol REF_PROTOCOL = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();\n-\n-    /**\n-     * The {@link Cluster}'s implementation with adaptive functionality, and actually it will get a {@link Cluster}'s\n-     * specific implementation who is wrapped with <b>MockClusterInvoker</b>\n-     */\n-    private static final Cluster CLUSTER = ExtensionLoader.getExtensionLoader(Cluster.class).getAdaptiveExtension();\n-\n-    /**\n-     * A {@link ProxyFactory} implementation that will generate a reference service's proxy,the JavassistProxyFactory is\n-     * its default implementation\n-     */\n-    private static final ProxyFactory PROXY_FACTORY = ExtensionLoader.getExtensionLoader(ProxyFactory.class).getAdaptiveExtension();\n-\n-    /**\n-     * The interface proxy reference\n-     */\n-    private transient volatile T ref;\n-\n-    /**\n-     * The invoker of the reference service\n-     */\n-    private transient volatile Invoker<?> invoker;\n-\n-    /**\n-     * The flag whether the ReferenceConfig has been initialized\n-     */\n-    private transient volatile boolean initialized;\n-\n-    /**\n-     * whether this ReferenceConfig has been destroyed\n-     */\n-    private transient volatile boolean destroyed;\n-\n-    private final ServiceRepository repository;\n-\n-    private DubboBootstrap bootstrap;\n-\n-    /**\n-     * The service names that the Dubbo interface subscribed.\n-     *\n-     * @since 2.7.8\n-     */\n-    private String services;\n-\n-    public ReferenceConfig() {\n-        super();\n-        this.repository = ApplicationModel.getServiceRepository();\n-    }\n-\n-    public ReferenceConfig(Reference reference) {\n-        super(reference);\n-        this.repository = ApplicationModel.getServiceRepository();\n-    }\n-\n-    /**\n-     * Get a string presenting the service names that the Dubbo interface subscribed.\n-     * If it is a multiple-values, the content will be a comma-delimited String.\n-     *\n-     * @return non-null\n-     * @see RegistryConstants#SUBSCRIBED_SERVICE_NAMES_KEY\n-     * @since 2.7.8\n-     */\n-    @Deprecated\n-    @Parameter(key = SUBSCRIBED_SERVICE_NAMES_KEY)\n-    public String getServices() {\n-        return services;\n-    }\n-\n-    /**\n-     * It's an alias method for {@link #getServices()}, but the more convenient.\n-     *\n-     * @return the String {@link List} presenting the Dubbo interface subscribed\n-     * @since 2.7.8\n-     */\n-    @Deprecated\n-    @Parameter(excluded = true)\n-    public Set<String> getSubscribedServices() {\n-        return splitToSet(getServices(), COMMA_SEPARATOR_CHAR);\n-    }\n-\n-    /**\n-     * Set the service names that the Dubbo interface subscribed.\n-     *\n-     * @param services If it is a multiple-values, the content will be a comma-delimited String.\n-     * @since 2.7.8\n-     */\n-    public void setServices(String services) {\n-        this.services = services;\n-    }\n-\n-    public synchronized T get() {\n-        if (destroyed) {\n-            throw new IllegalStateException(\"The invoker of ReferenceConfig(\" + url + \") has already destroyed!\");\n-        }\n-        if (ref == null) {\n-            init();\n-        }\n-        return ref;\n-    }\n-\n-    public synchronized void destroy() {\n-        if (ref == null) {\n-            return;\n-        }\n-        if (destroyed) {\n-            return;\n-        }\n-        destroyed = true;\n-        try {\n-            invoker.destroy();\n-        } catch (Throwable t) {\n-            logger.warn(\"Unexpected error occurred when destroy invoker of ReferenceConfig(\" + url + \").\", t);\n-        }\n-        invoker = null;\n-        ref = null;\n-\n-        // dispatch a ReferenceConfigDestroyedEvent since 2.7.4\n-        dispatch(new ReferenceConfigDestroyedEvent(this));\n-    }\n-\n-    public synchronized void init() {\n-        if (initialized) {\n-            return;\n-        }\n-\n-\n-        if (bootstrap == null) {\n-            bootstrap = DubboBootstrap.getInstance();\n-            bootstrap.initialize();\n-        }\n-\n-        checkAndUpdateSubConfigs();\n-\n-        checkStubAndLocal(interfaceClass);\n-        ConfigValidationUtils.checkMock(interfaceClass, this);\n-\n-        Map<String, String> map = new HashMap<String, String>();\n-        map.put(SIDE_KEY, CONSUMER_SIDE);\n-\n-        ReferenceConfigBase.appendRuntimeParameters(map);\n-        if (!ProtocolUtils.isGeneric(generic)) {\n-            String revision = Version.getVersion(interfaceClass, version);\n-            if (revision != null && revision.length() > 0) {\n-                map.put(REVISION_KEY, revision);\n-            }\n-\n-            String[] methods = Wrapper.getWrapper(interfaceClass).getMethodNames();\n-            if (methods.length == 0) {\n-                logger.warn(\"No method found in service interface \" + interfaceClass.getName());\n-                map.put(METHODS_KEY, ANY_VALUE);\n-            } else {\n-                map.put(METHODS_KEY, StringUtils.join(new HashSet<String>(Arrays.asList(methods)), COMMA_SEPARATOR));\n-            }\n-        }\n-        map.put(INTERFACE_KEY, interfaceName);\n-        AbstractConfig.appendParameters(map, getMetrics());\n-        AbstractConfig.appendParameters(map, getApplication());\n-        AbstractConfig.appendParameters(map, getModule());\n-        // remove 'default.' prefix for configs from ConsumerConfig\n-        // appendParameters(map, consumer, Constants.DEFAULT_KEY);\n-        AbstractConfig.appendParameters(map, consumer);\n-        AbstractConfig.appendParameters(map, this);\n-        MetadataReportConfig metadataReportConfig = getMetadataReportConfig();\n-        if (metadataReportConfig != null && metadataReportConfig.isValid()) {\n-            map.putIfAbsent(METADATA_KEY, REMOTE_METADATA_STORAGE_TYPE);\n-        }\n-        Map<String, AsyncMethodInfo> attributes = null;\n-        if (CollectionUtils.isNotEmpty(getMethods())) {\n-            attributes = new HashMap<>();\n-            for (MethodConfig methodConfig : getMethods()) {\n-                AbstractConfig.appendParameters(map, methodConfig, methodConfig.getName());\n-                String retryKey = methodConfig.getName() + \".retry\";\n-                if (map.containsKey(retryKey)) {\n-                    String retryValue = map.remove(retryKey);\n-                    if (\"false\".equals(retryValue)) {\n-                        map.put(methodConfig.getName() + \".retries\", \"0\");\n-                    }\n-                }\n-                AsyncMethodInfo asyncMethodInfo = AbstractConfig.convertMethodConfig2AsyncInfo(methodConfig);\n-                if (asyncMethodInfo != null) {\n-//                    consumerModel.getMethodModel(methodConfig.getName()).addAttribute(ASYNC_KEY, asyncMethodInfo);\n-                    attributes.put(methodConfig.getName(), asyncMethodInfo);\n-                }\n-            }\n-        }\n-\n-        String hostToRegistry = ConfigUtils.getSystemProperty(DUBBO_IP_TO_REGISTRY);\n-        if (StringUtils.isEmpty(hostToRegistry)) {\n-            hostToRegistry = NetUtils.getLocalHost();\n-        } else if (isInvalidLocalHost(hostToRegistry)) {\n-            throw new IllegalArgumentException(\n-                    \"Specified invalid registry ip from property:\" + DUBBO_IP_TO_REGISTRY + \", value:\" + hostToRegistry);\n-        }\n-        map.put(REGISTER_IP_KEY, hostToRegistry);\n-\n-        serviceMetadata.getAttachments().putAll(map);\n-\n-        ref = createProxy(map);\n-\n-        serviceMetadata.setTarget(ref);\n-        serviceMetadata.addAttribute(PROXY_CLASS_REF, ref);\n-        ConsumerModel consumerModel = repository.lookupReferredService(serviceMetadata.getServiceKey());\n-        consumerModel.setProxyObject(ref);\n-        consumerModel.init(attributes);\n-\n-        initialized = true;\n-\n-        checkInvokerAvailable();\n-\n-        // dispatch a ReferenceConfigInitializedEvent since 2.7.4\n-        dispatch(new ReferenceConfigInitializedEvent(this, invoker));\n-    }\n-\n-    @SuppressWarnings({\"unchecked\", \"rawtypes\", \"deprecation\"})\n-    private T createProxy(Map<String, String> map) {\n-        if (shouldJvmRefer(map)) {\n-            URL url = new URL(LOCAL_PROTOCOL, LOCALHOST_VALUE, 0, interfaceClass.getName()).addParameters(map);\n-            invoker = REF_PROTOCOL.refer(interfaceClass, url);\n-            if (logger.isInfoEnabled()) {\n-                logger.info(\"Using injvm service \" + interfaceClass.getName());\n-            }\n-        } else {\n-            urls.clear();\n-            if (url != null && url.length() > 0) { // user specified URL, could be peer-to-peer address, or register center's address.\n-                String[] us = SEMICOLON_SPLIT_PATTERN.split(url);\n-                if (us != null && us.length > 0) {\n-                    for (String u : us) {\n-                        URL url = URL.valueOf(u);\n-                        if (StringUtils.isEmpty(url.getPath())) {\n-                            url = url.setPath(interfaceName);\n-                        }\n-                        if (UrlUtils.isRegistry(url)) {\n-                            urls.add(url.addParameterAndEncoded(REFER_KEY, StringUtils.toQueryString(map)));\n-                        } else {\n-                            urls.add(ClusterUtils.mergeUrl(url, map));\n-                        }\n-                    }\n-                }\n-            } else { // assemble URL from register center's configuration\n-                // if protocols not injvm checkRegistry\n-                if (!LOCAL_PROTOCOL.equalsIgnoreCase(getProtocol())) {\n-                    checkRegistry();\n-                    List<URL> us = ConfigValidationUtils.loadRegistries(this, false);\n-                    if (CollectionUtils.isNotEmpty(us)) {\n-                        for (URL u : us) {\n-                            URL monitorUrl = ConfigValidationUtils.loadMonitor(this, u);\n-                            if (monitorUrl != null) {\n-                                map.put(MONITOR_KEY, URL.encode(monitorUrl.toFullString()));\n-                            }\n-                            urls.add(u.addParameterAndEncoded(REFER_KEY, StringUtils.toQueryString(map)));\n-                        }\n-                    }\n-                    if (urls.isEmpty()) {\n-                        throw new IllegalStateException(\n-                                \"No such any registry to reference \" + interfaceName + \" on the consumer \" + NetUtils.getLocalHost() +\n-                                        \" use dubbo version \" + Version.getVersion() +\n-                                        \", please config <dubbo:registry address=\\\"...\\\" /> to your spring config.\");\n-                    }\n-                }\n-            }\n-\n-            if (urls.size() == 1) {\n-                invoker = REF_PROTOCOL.refer(interfaceClass, urls.get(0));\n-            } else {\n-                List<Invoker<?>> invokers = new ArrayList<Invoker<?>>();\n-                URL registryURL = null;\n-                for (URL url : urls) {\n-                    Invoker<?> referInvoker = REF_PROTOCOL.refer(interfaceClass, url);\n-                    if (shouldCheck()) {\n-                        if (referInvoker.isAvailable()) {\n-                            invokers.add(referInvoker);\n-                        } else {\n-                            referInvoker.destroy();\n-                        }\n-                    } else {\n-                        invokers.add(referInvoker);\n-                    }\n-\n-                    if (UrlUtils.isRegistry(url)) {\n-                        registryURL = url; // use last registry url\n-                    }\n-                }\n-\n-                if (shouldCheck() && invokers.size() == 0) {\n-                    throw new IllegalStateException(\"Failed to check the status of the service \"\n-                            + interfaceName\n-                            + \". No provider available for the service \"\n-                            + (group == null ? \"\" : group + \"/\")\n-                            + interfaceName +\n-                            (version == null ? \"\" : \":\" + version)\n-                            + \" from the multi registry cluster\"\n-                            + \" use dubbo version \" + Version.getVersion());\n-                }\n-\n-                if (registryURL != null) { // registry url is available\n-                    // for multi-subscription scenario, use 'zone-aware' policy by default\n-                    String cluster = registryURL.getParameter(CLUSTER_KEY, ZoneAwareCluster.NAME);\n-                    // The invoker wrap sequence would be: ZoneAwareClusterInvoker(StaticDirectory) -> FailoverClusterInvoker(RegistryDirectory, routing happens here) -> Invoker\n-                    invoker = Cluster.getCluster(cluster, false).join(new StaticDirectory(registryURL, invokers));\n-                } else { // not a registry url, must be direct invoke.\n-                    String cluster = CollectionUtils.isNotEmpty(invokers)\n-                            ?\n-                            (invokers.get(0).getUrl() != null ? invokers.get(0).getUrl().getParameter(CLUSTER_KEY, ZoneAwareCluster.NAME) :\n-                                    Cluster.DEFAULT)\n-                            : Cluster.DEFAULT;\n-                    invoker = Cluster.getCluster(cluster).join(new StaticDirectory(invokers));\n-                }\n-            }\n-        }\n-\n-        if (logger.isInfoEnabled()) {\n-            logger.info(\"Refer dubbo service \" + interfaceClass.getName() + \" from url \" + invoker.getUrl());\n-        }\n-\n-        URL consumerURL = new URL(CONSUMER_PROTOCOL, map.remove(REGISTER_IP_KEY), 0, map.get(INTERFACE_KEY), map);\n-        MetadataUtils.publishServiceDefinition(consumerURL);\n-\n-        // create service proxy\n-        return (T) PROXY_FACTORY.getProxy(invoker, ProtocolUtils.isGeneric(generic));\n-    }\n-\n-    private void checkInvokerAvailable() throws IllegalStateException {\n-        if (shouldCheck() && !invoker.isAvailable()) {\n-            invoker.destroy();\n-            throw new IllegalStateException(\"Failed to check the status of the service \"\n-                    + interfaceName\n-                    + \". No provider available for the service \"\n-                    + (group == null ? \"\" : group + \"/\")\n-                    + interfaceName +\n-                    (version == null ? \"\" : \":\" + version)\n-                    + \" from the url \"\n-                    + invoker.getUrl()\n-                    + \" to the consumer \"\n-                    + NetUtils.getLocalHost() + \" use dubbo version \" + Version.getVersion());\n-        }\n-    }\n-\n-    /**\n-     * This method should be called right after the creation of this class's instance, before any property in other config modules is used.\n-     * Check each config modules are created properly and override their properties if necessary.\n-     */\n-    public void checkAndUpdateSubConfigs() {\n-        if (StringUtils.isEmpty(interfaceName)) {\n-            throw new IllegalStateException(\"<dubbo:reference interface=\\\"\\\" /> interface not allow null!\");\n-        }\n-        completeCompoundConfigs(consumer);\n-        // get consumer's global configuration\n-        checkDefault();\n-\n-        // init some null configuration.\n-        List<ConfigInitializer> configInitializers = ExtensionLoader.getExtensionLoader(ConfigInitializer.class)\n-                .getActivateExtension(URL.valueOf(\"configInitializer://\"), (String[]) null);\n-        configInitializers.forEach(e -> e.initReferConfig(this));\n-\n-        this.refresh();\n-        if (getGeneric() == null && getConsumer() != null) {\n-            setGeneric(getConsumer().getGeneric());\n-        }\n-        if (ProtocolUtils.isGeneric(generic)) {\n-            interfaceClass = GenericService.class;\n-        } else {\n-            try {\n-                interfaceClass = Class.forName(interfaceName, true, Thread.currentThread()\n-                        .getContextClassLoader());\n-            } catch (ClassNotFoundException e) {\n-                throw new IllegalStateException(e.getMessage(), e);\n-            }\n-            checkInterfaceAndMethods(interfaceClass, getMethods());\n-        }\n-\n-        initServiceMetadata(consumer);\n-        serviceMetadata.setServiceType(getActualInterface());\n-        // TODO, uncomment this line once service key is unified\n-        serviceMetadata.setServiceKey(URL.buildKey(interfaceName, group, version));\n-\n-        ServiceRepository repository = ApplicationModel.getServiceRepository();\n-        ServiceDescriptor serviceDescriptor = repository.registerService(interfaceClass);\n-        repository.registerConsumer(\n-                serviceMetadata.getServiceKey(),\n-                serviceDescriptor,\n-                this,\n-                null,\n-                serviceMetadata);\n-\n-        resolveFile();\n-        ConfigValidationUtils.validateReferenceConfig(this);\n-        postProcessConfig();\n-    }\n-\n-\n-    /**\n-     * Figure out should refer the service in the same JVM from configurations. The default behavior is true\n-     * 1. if injvm is specified, then use it\n-     * 2. then if a url is specified, then assume it's a remote call\n-     * 3. otherwise, check scope parameter\n-     * 4. if scope is not specified but the target service is provided in the same JVM, then prefer to make the local\n-     * call, which is the default behavior\n-     */\n-    protected boolean shouldJvmRefer(Map<String, String> map) {\n-        URL tmpUrl = new URL(\"temp\", \"localhost\", 0, map);\n-        boolean isJvmRefer;\n-        if (isInjvm() == null) {\n-            // if a url is specified, don't do local reference\n-            if (url != null && url.length() > 0) {\n-                isJvmRefer = false;\n-            } else {\n-                // by default, reference local service if there is\n-                isJvmRefer = InjvmProtocol.getInjvmProtocol().isInjvmRefer(tmpUrl);\n-            }\n-        } else {\n-            isJvmRefer = isInjvm();\n-        }\n-        return isJvmRefer;\n-    }\n-\n-    /**\n-     * Dispatch an {@link Event event}\n-     *\n-     * @param event an {@link Event event}\n-     * @since 2.7.5\n-     */\n-    protected void dispatch(Event event) {\n-        EventDispatcher.getDefaultExtension().dispatch(event);\n-    }\n-\n-    public DubboBootstrap getBootstrap() {\n-        return bootstrap;\n-    }\n-\n-    public void setBootstrap(DubboBootstrap bootstrap) {\n-        this.bootstrap = bootstrap;\n-    }\n-\n-    private void postProcessConfig() {\n-        List<ConfigPostProcessor> configPostProcessors = ExtensionLoader.getExtensionLoader(ConfigPostProcessor.class)\n-                .getActivateExtension(URL.valueOf(\"configPostProcessor://\"), (String[]) null);\n-        configPostProcessors.forEach(component -> component.postProcessReferConfig(this));\n-    }\n-\n-    // just for test\n-    Invoker<?> getInvoker() {\n-        return invoker;\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.config;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.Version;\r\n+import org.apache.dubbo.common.bytecode.Wrapper;\r\n+import org.apache.dubbo.common.constants.RegistryConstants;\r\n+import org.apache.dubbo.common.extension.ExtensionLoader;\r\n+import org.apache.dubbo.common.logger.Logger;\r\n+import org.apache.dubbo.common.logger.LoggerFactory;\r\n+import org.apache.dubbo.common.utils.CollectionUtils;\r\n+import org.apache.dubbo.common.utils.ConfigUtils;\r\n+import org.apache.dubbo.common.utils.NetUtils;\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+import org.apache.dubbo.common.utils.UrlUtils;\r\n+import org.apache.dubbo.config.annotation.Reference;\r\n+import org.apache.dubbo.config.bootstrap.DubboBootstrap;\r\n+import org.apache.dubbo.config.event.ReferenceConfigDestroyedEvent;\r\n+import org.apache.dubbo.config.event.ReferenceConfigInitializedEvent;\r\n+import org.apache.dubbo.config.support.Parameter;\r\n+import org.apache.dubbo.config.utils.ConfigValidationUtils;\r\n+import org.apache.dubbo.event.Event;\r\n+import org.apache.dubbo.event.EventDispatcher;\r\n+import org.apache.dubbo.registry.client.metadata.MetadataUtils;\r\n+import org.apache.dubbo.rpc.Invoker;\r\n+import org.apache.dubbo.rpc.Protocol;\r\n+import org.apache.dubbo.rpc.ProxyFactory;\r\n+import org.apache.dubbo.rpc.cluster.Cluster;\r\n+import org.apache.dubbo.rpc.cluster.directory.StaticDirectory;\r\n+import org.apache.dubbo.rpc.cluster.support.ClusterUtils;\r\n+import org.apache.dubbo.rpc.cluster.support.registry.ZoneAwareCluster;\r\n+import org.apache.dubbo.rpc.model.ApplicationModel;\r\n+import org.apache.dubbo.rpc.model.AsyncMethodInfo;\r\n+import org.apache.dubbo.rpc.model.ConsumerModel;\r\n+import org.apache.dubbo.rpc.model.ServiceDescriptor;\r\n+import org.apache.dubbo.rpc.model.ServiceRepository;\r\n+import org.apache.dubbo.rpc.protocol.injvm.InjvmProtocol;\r\n+import org.apache.dubbo.rpc.service.GenericService;\r\n+import org.apache.dubbo.rpc.support.ProtocolUtils;\r\n+\r\n+import java.util.ArrayList;\r\n+import java.util.Arrays;\r\n+import java.util.HashMap;\r\n+import java.util.HashSet;\r\n+import java.util.List;\r\n+import java.util.Map;\r\n+import java.util.Set;\r\n+\r\n+import static org.apache.dubbo.common.constants.CommonConstants.ANY_VALUE;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.CLUSTER_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.COMMA_SEPARATOR;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.COMMA_SEPARATOR_CHAR;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.CONSUMER_SIDE;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.INTERFACE_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.LOCALHOST_VALUE;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.METADATA_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.METHODS_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.MONITOR_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.PROXY_CLASS_REF;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.REMOTE_METADATA_STORAGE_TYPE;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.REVISION_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.SEMICOLON_SPLIT_PATTERN;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.SIDE_KEY;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.SUBSCRIBED_SERVICE_NAMES_KEY;\r\n+import static org.apache.dubbo.common.utils.NetUtils.isInvalidLocalHost;\r\n+import static org.apache.dubbo.common.utils.StringUtils.splitToSet;\r\n+import static org.apache.dubbo.config.Constants.DUBBO_IP_TO_REGISTRY;\r\n+import static org.apache.dubbo.registry.Constants.CONSUMER_PROTOCOL;\r\n+import static org.apache.dubbo.registry.Constants.REGISTER_IP_KEY;\r\n+import static org.apache.dubbo.rpc.Constants.LOCAL_PROTOCOL;\r\n+import static org.apache.dubbo.rpc.cluster.Constants.REFER_KEY;\r\n+\r\n+/**\r\n+ * Please avoid using this class for any new application,\r\n+ * use {@link ReferenceConfigBase} instead.\r\n+ */\r\n+public class ReferenceConfig<T> extends ReferenceConfigBase<T> {\r\n+\r\n+    public static final Logger logger = LoggerFactory.getLogger(ReferenceConfig.class);\r\n+\r\n+    /**\r\n+     * The {@link Protocol} implementation with adaptive functionality,it will be different in different scenarios.\r\n+     * A particular {@link Protocol} implementation is determined by the protocol attribute in the {@link URL}.\r\n+     * For example:\r\n+     *\r\n+     * <li>when the url is registry://224.5.6.7:1234/org.apache.dubbo.registry.RegistryService?application=dubbo-sample,\r\n+     * then the protocol is <b>RegistryProtocol</b></li>\r\n+     *\r\n+     * <li>when the url is dubbo://224.5.6.7:1234/org.apache.dubbo.config.api.DemoService?application=dubbo-sample, then\r\n+     * the protocol is <b>DubboProtocol</b></li>\r\n+     * <p>\r\n+     * Actually\uff0cwhen the {@link ExtensionLoader} init the {@link Protocol} instants,it will automatically wraps two\r\n+     * layers, and eventually will get a <b>ProtocolFilterWrapper</b> or <b>ProtocolListenerWrapper</b>\r\n+     */\r\n+    private static final Protocol REF_PROTOCOL = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();\r\n+\r\n+    /**\r\n+     * The {@link Cluster}'s implementation with adaptive functionality, and actually it will get a {@link Cluster}'s\r\n+     * specific implementation who is wrapped with <b>MockClusterInvoker</b>\r\n+     */\r\n+    private static final Cluster CLUSTER = ExtensionLoader.getExtensionLoader(Cluster.class).getAdaptiveExtension();\r\n+\r\n+    /**\r\n+     * A {@link ProxyFactory} implementation that will generate a reference service's proxy,the JavassistProxyFactory is\r\n+     * its default implementation\r\n+     */\r\n+    private static final ProxyFactory PROXY_FACTORY = ExtensionLoader.getExtensionLoader(ProxyFactory.class).getAdaptiveExtension();\r\n+\r\n+    /**\r\n+     * The interface proxy reference\r\n+     */\r\n+    private transient volatile T ref;\r\n+\r\n+    /**\r\n+     * The invoker of the reference service\r\n+     */\r\n+    private transient volatile Invoker<?> invoker;\r\n+\r\n+    /**\r\n+     * The flag whether the ReferenceConfig has been initialized\r\n+     */\r\n+    private transient volatile boolean initialized;\r\n+\r\n+    /**\r\n+     * whether this ReferenceConfig has been destroyed\r\n+     */\r\n+    private transient volatile boolean destroyed;\r\n+\r\n+    private final ServiceRepository repository;\r\n+\r\n+    private DubboBootstrap bootstrap;\r\n+\r\n+    /**\r\n+     * The service names that the Dubbo interface subscribed.\r\n+     *\r\n+     * @since 2.7.8\r\n+     */\r\n+    private String services;\r\n+\r\n+    public ReferenceConfig() {\r\n+        super();\r\n+        this.repository = ApplicationModel.getServiceRepository();\r\n+    }\r\n+\r\n+    public ReferenceConfig(Reference reference) {\r\n+        super(reference);\r\n+        this.repository = ApplicationModel.getServiceRepository();\r\n+    }\r\n+\r\n+    /**\r\n+     * Get a string presenting the service names that the Dubbo interface subscribed.\r\n+     * If it is a multiple-values, the content will be a comma-delimited String.\r\n+     *\r\n+     * @return non-null\r\n+     * @see RegistryConstants#SUBSCRIBED_SERVICE_NAMES_KEY\r\n+     * @since 2.7.8\r\n+     */\r\n+    @Deprecated\r\n+    @Parameter(key = SUBSCRIBED_SERVICE_NAMES_KEY)\r\n+    public String getServices() {\r\n+        return services;\r\n+    }\r\n+\r\n+    /**\r\n+     * It's an alias method for {@link #getServices()}, but the more convenient.\r\n+     *\r\n+     * @return the String {@link List} presenting the Dubbo interface subscribed\r\n+     * @since 2.7.8\r\n+     */\r\n+    @Deprecated\r\n+    @Parameter(excluded = true)\r\n+    public Set<String> getSubscribedServices() {\r\n+        return splitToSet(getServices(), COMMA_SEPARATOR_CHAR);\r\n+    }\r\n+\r\n+    /**\r\n+     * Set the service names that the Dubbo interface subscribed.\r\n+     *\r\n+     * @param services If it is a multiple-values, the content will be a comma-delimited String.\r\n+     * @since 2.7.8\r\n+     */\r\n+    public void setServices(String services) {\r\n+        this.services = services;\r\n+    }\r\n+\r\n+    public synchronized T get() {\r\n+        if (destroyed) {\r\n+            throw new IllegalStateException(\"The invoker of ReferenceConfig(\" + url + \") has already destroyed!\");\r\n+        }\r\n+        if (ref == null) {\r\n+            init();\r\n+        }\r\n+        return ref;\r\n+    }\r\n+\r\n+    public synchronized void destroy() {\r\n+        if (ref == null) {\r\n+            return;\r\n+        }\r\n+        if (destroyed) {\r\n+            return;\r\n+        }\r\n+        destroyed = true;\r\n+        try {\r\n+            invoker.destroy();\r\n+        } catch (Throwable t) {\r\n+            logger.warn(\"Unexpected error occurred when destroy invoker of ReferenceConfig(\" + url + \").\", t);\r\n+        }\r\n+        invoker = null;\r\n+        ref = null;\r\n+\r\n+        // dispatch a ReferenceConfigDestroyedEvent since 2.7.4\r\n+        dispatch(new ReferenceConfigDestroyedEvent(this));\r\n+    }\r\n+\r\n+    public synchronized void init() {\r\n+        if (initialized) {\r\n+            return;\r\n+        }\r\n+\r\n+\r\n+        if (bootstrap == null) {\r\n+            bootstrap = DubboBootstrap.getInstance();\r\n+            bootstrap.initialize();\r\n+        }\r\n+\r\n+        checkAndUpdateSubConfigs();\r\n+\r\n+        checkStubAndLocal(interfaceClass);\r\n+        ConfigValidationUtils.checkMock(interfaceClass, this);\r\n+\r\n+        Map<String, String> map = new HashMap<String, String>();\r\n+        map.put(SIDE_KEY, CONSUMER_SIDE);\r\n+\r\n+        ReferenceConfigBase.appendRuntimeParameters(map);\r\n+        if (!ProtocolUtils.isGeneric(generic)) {\r\n+            String revision = Version.getVersion(interfaceClass, version);\r\n+            if (revision != null && revision.length() > 0) {\r\n+                map.put(REVISION_KEY, revision);\r\n+            }\r\n+\r\n+            String[] methods = Wrapper.getWrapper(interfaceClass).getMethodNames();\r\n+            if (methods.length == 0) {\r\n+                logger.warn(\"No method found in service interface \" + interfaceClass.getName());\r\n+                map.put(METHODS_KEY, ANY_VALUE);\r\n+            } else {\r\n+                map.put(METHODS_KEY, StringUtils.join(new HashSet<String>(Arrays.asList(methods)), COMMA_SEPARATOR));\r\n+            }\r\n+        }\r\n+        map.put(INTERFACE_KEY, interfaceName);\r\n+        AbstractConfig.appendParameters(map, getMetrics());\r\n+        AbstractConfig.appendParameters(map, getApplication());\r\n+        AbstractConfig.appendParameters(map, getModule());\r\n+        // remove 'default.' prefix for configs from ConsumerConfig\r\n+        // appendParameters(map, consumer, Constants.DEFAULT_KEY);\r\n+        AbstractConfig.appendParameters(map, consumer);\r\n+        AbstractConfig.appendParameters(map, this);\r\n+        MetadataReportConfig metadataReportConfig = getMetadataReportConfig();\r\n+        if (metadataReportConfig != null && metadataReportConfig.isValid()) {\r\n+            map.putIfAbsent(METADATA_KEY, REMOTE_METADATA_STORAGE_TYPE);\r\n+        }\r\n+        Map<String, AsyncMethodInfo> attributes = null;\r\n+        if (CollectionUtils.isNotEmpty(getMethods())) {\r\n+            attributes = new HashMap<>();\r\n+            for (MethodConfig methodConfig : getMethods()) {\r\n+                AbstractConfig.appendParameters(map, methodConfig, methodConfig.getName());\r\n+                String retryKey = methodConfig.getName() + \".retry\";\r\n+                if (map.containsKey(retryKey)) {\r\n+                    String retryValue = map.remove(retryKey);\r\n+                    if (\"false\".equals(retryValue)) {\r\n+                        map.put(methodConfig.getName() + \".retries\", \"0\");\r\n+                    }\r\n+                }\r\n+                AsyncMethodInfo asyncMethodInfo = AbstractConfig.convertMethodConfig2AsyncInfo(methodConfig);\r\n+                if (asyncMethodInfo != null) {\r\n+//                    consumerModel.getMethodModel(methodConfig.getName()).addAttribute(ASYNC_KEY, asyncMethodInfo);\r\n+                    attributes.put(methodConfig.getName(), asyncMethodInfo);\r\n+                }\r\n+            }\r\n+        }\r\n+\r\n+        String hostToRegistry = ConfigUtils.getSystemProperty(DUBBO_IP_TO_REGISTRY);\r\n+        if (StringUtils.isEmpty(hostToRegistry)) {\r\n+            hostToRegistry = NetUtils.getLocalHost();\r\n+        } else if (isInvalidLocalHost(hostToRegistry)) {\r\n+            throw new IllegalArgumentException(\r\n+                    \"Specified invalid registry ip from property:\" + DUBBO_IP_TO_REGISTRY + \", value:\" + hostToRegistry);\r\n+        }\r\n+        map.put(REGISTER_IP_KEY, hostToRegistry);\r\n+\r\n+        serviceMetadata.getAttachments().putAll(map);\r\n+\r\n+        ref = createProxy(map);\r\n+\r\n+        serviceMetadata.setTarget(ref);\r\n+        serviceMetadata.addAttribute(PROXY_CLASS_REF, ref);\r\n+        ConsumerModel consumerModel = repository.lookupReferredService(serviceMetadata.getServiceKey());\r\n+        consumerModel.setProxyObject(ref);\r\n+        consumerModel.init(attributes);\r\n+\r\n+        initialized = true;\r\n+\r\n+        checkInvokerAvailable();\r\n+\r\n+        // dispatch a ReferenceConfigInitializedEvent since 2.7.4\r\n+        dispatch(new ReferenceConfigInitializedEvent(this, invoker));\r\n+    }\r\n+\r\n+    @SuppressWarnings({\"unchecked\", \"rawtypes\", \"deprecation\"})\r\n+    private T createProxy(Map<String, String> map) {\r\n+        if (shouldJvmRefer(map)) {\r\n+            URL url = new URL(LOCAL_PROTOCOL, LOCALHOST_VALUE, 0, interfaceClass.getName()).addParameters(map);\r\n+            invoker = REF_PROTOCOL.refer(interfaceClass, url);\r\n+            if (logger.isInfoEnabled()) {\r\n+                logger.info(\"Using injvm service \" + interfaceClass.getName());\r\n+            }\r\n+        } else {\r\n+            urls.clear();\r\n+            if (url != null && url.length() > 0) { // user specified URL, could be peer-to-peer address, or register center's address.\r\n+                String[] us = SEMICOLON_SPLIT_PATTERN.split(url);\r\n+                if (us != null && us.length > 0) {\r\n+                    for (String u : us) {\r\n+                        URL url = URL.valueOf(u);\r\n+                        if (StringUtils.isEmpty(url.getPath())) {\r\n+                            url = url.setPath(interfaceName);\r\n+                        }\r\n+                        if (UrlUtils.isRegistry(url)) {\r\n+                            urls.add(url.addParameterAndEncoded(REFER_KEY, StringUtils.toQueryString(map)));\r\n+                        } else {\r\n+                            urls.add(ClusterUtils.mergeUrl(url, map));\r\n+                        }\r\n+                    }\r\n+                }\r\n+            } else { // assemble URL from register center's configuration\r\n+                // if protocols not injvm checkRegistry\r\n+                if (!LOCAL_PROTOCOL.equalsIgnoreCase(getProtocol())) {\r\n+                    checkRegistry();\r\n+                    List<URL> us = ConfigValidationUtils.loadRegistries(this, false);\r\n+                    if (CollectionUtils.isNotEmpty(us)) {\r\n+                        for (URL u : us) {\r\n+                            URL monitorUrl = ConfigValidationUtils.loadMonitor(this, u);\r\n+                            if (monitorUrl != null) {\r\n+                                map.put(MONITOR_KEY, URL.encode(monitorUrl.toFullString()));\r\n+                            }\r\n+                            urls.add(u.addParameterAndEncoded(REFER_KEY, StringUtils.toQueryString(map)));\r\n+                        }\r\n+                    }\r\n+                    if (urls.isEmpty()) {\r\n+                        throw new IllegalStateException(\r\n+                                \"No such any registry to reference \" + interfaceName + \" on the consumer \" + NetUtils.getLocalHost() +\r\n+                                        \" use dubbo version \" + Version.getVersion() +\r\n+                                        \", please config <dubbo:registry address=\\\"...\\\" /> to your spring config.\");\r\n+                    }\r\n+                }\r\n+            }\r\n+\r\n+            if (urls.size() == 1) {\r\n+                invoker = REF_PROTOCOL.refer(interfaceClass, urls.get(0));\r\n+            } else {\r\n+                List<Invoker<?>> invokers = new ArrayList<Invoker<?>>();\r\n+                URL registryURL = null;\r\n+                for (URL url : urls) {\r\n+                    Invoker<?> referInvoker = REF_PROTOCOL.refer(interfaceClass, url);\r\n+                    if (shouldCheck()) {\r\n+                        if (referInvoker.isAvailable()) {\r\n+                            invokers.add(referInvoker);\r\n+                        } else {\r\n+                            referInvoker.destroy();\r\n+                        }\r\n+                    } else {\r\n+                        invokers.add(referInvoker);\r\n+                    }\r\n+\r\n+                    if (UrlUtils.isRegistry(url)) {\r\n+                        registryURL = url; // use last registry url\r\n+                    }\r\n+                }\r\n+\r\n+                if (shouldCheck() && invokers.size() == 0) {\r\n+                    throw new IllegalStateException(\"Failed to check the status of the service \"\r\n+                            + interfaceName\r\n+                            + \". No provider available for the service \"\r\n+                            + (group == null ? \"\" : group + \"/\")\r\n+                            + interfaceName +\r\n+                            (version == null ? \"\" : \":\" + version)\r\n+                            + \" from the multi registry cluster\"\r\n+                            + \" use dubbo version \" + Version.getVersion());\r\n+                }\r\n+\r\n+                if (registryURL != null) { // registry url is available\r\n+                    // for multi-subscription scenario, use 'zone-aware' policy by default\r\n+                    String cluster = registryURL.getParameter(CLUSTER_KEY, ZoneAwareCluster.NAME);\r\n+                    // The invoker wrap sequence would be: ZoneAwareClusterInvoker(StaticDirectory) -> FailoverClusterInvoker(RegistryDirectory, routing happens here) -> Invoker\r\n+                    invoker = Cluster.getCluster(cluster, false).join(new StaticDirectory(registryURL, invokers));\r\n+                } else { // not a registry url, must be direct invoke.\r\n+                    String cluster = CollectionUtils.isNotEmpty(invokers)\r\n+                            ?\r\n+                            (invokers.get(0).getUrl() != null ? invokers.get(0).getUrl().getParameter(CLUSTER_KEY, ZoneAwareCluster.NAME) :\r\n+                                    Cluster.DEFAULT)\r\n+                            : Cluster.DEFAULT;\r\n+                    invoker = Cluster.getCluster(cluster).join(new StaticDirectory(invokers));\r\n+                }\r\n+            }\r\n+        }\r\n+\r\n+        if (logger.isInfoEnabled()) {\r\n+            logger.info(\"Refer dubbo service \" + interfaceClass.getName() + \" from url \" + invoker.getUrl());\r\n+        }\r\n+\r\n+        URL consumerURL = new URL(CONSUMER_PROTOCOL, map.remove(REGISTER_IP_KEY), 0, map.get(INTERFACE_KEY), map);\r\n+        MetadataUtils.publishServiceDefinition(consumerURL);\r\n+\r\n+        // create service proxy\r\n+        return (T) PROXY_FACTORY.getProxy(invoker, ProtocolUtils.isGeneric(generic));\r\n+    }\r\n+\r\n+    private void checkInvokerAvailable() throws IllegalStateException {\r\n+        if (shouldCheck() && !invoker.isAvailable()) {\r\n+            invoker.destroy();\r\n+            throw new IllegalStateException(\"Failed to check the status of the service \"\r\n+                    + interfaceName\r\n+                    + \". No provider available for the service \"\r\n+                    + (group == null ? \"\" : group + \"/\")\r\n+                    + interfaceName +\r\n+                    (version == null ? \"\" : \":\" + version)\r\n+                    + \" from the url \"\r\n+                    + invoker.getUrl()\r\n+                    + \" to the consumer \"\r\n+                    + NetUtils.getLocalHost() + \" use dubbo version \" + Version.getVersion());\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * This method should be called right after the creation of this class's instance, before any property in other config modules is used.\r\n+     * Check each config modules are created properly and override their properties if necessary.\r\n+     */\r\n+    public void checkAndUpdateSubConfigs() {\r\n+        if (StringUtils.isEmpty(interfaceName)) {\r\n+            throw new IllegalStateException(\"<dubbo:reference interface=\\\"\\\" /> interface not allow null!\");\r\n+        }\r\n+        completeCompoundConfigs(consumer);\r\n+        // get consumer's global configuration\r\n+        checkDefault();\r\n+\r\n+        // init some null configuration.\r\n+        List<ConfigInitializer> configInitializers = ExtensionLoader.getExtensionLoader(ConfigInitializer.class)\r\n+                .getActivateExtension(URL.valueOf(\"configInitializer://\"), (String[]) null);\r\n+        configInitializers.forEach(e -> e.initReferConfig(this));\r\n+\r\n+        this.refresh();\r\n+        if (getGeneric() == null && getConsumer() != null) {\r\n+            setGeneric(getConsumer().getGeneric());\r\n+        }\r\n+        if (ProtocolUtils.isGeneric(generic)) {\r\n+            interfaceClass = GenericService.class;\r\n+        } else {\r\n+            try {\r\n+                interfaceClass = Class.forName(interfaceName, true, Thread.currentThread()\r\n+                        .getContextClassLoader());\r\n+            } catch (ClassNotFoundException e) {\r\n+                throw new IllegalStateException(e.getMessage(), e);\r\n+            }\r\n+            checkInterfaceAndMethods(interfaceClass, getMethods());\r\n+        }\r\n+\r\n+        initServiceMetadata(consumer);\r\n+        serviceMetadata.setServiceType(getActualInterface());\r\n+        // TODO, uncomment this line once service key is unified\r\n+        serviceMetadata.setServiceKey(URL.buildKey(interfaceName, group, version));\r\n+\r\n+        ServiceRepository repository = ApplicationModel.getServiceRepository();\r\n+        ServiceDescriptor serviceDescriptor = repository.registerService(interfaceClass);\r\n+        repository.registerConsumer(\r\n+                serviceMetadata.getServiceKey(),\r\n+                serviceDescriptor,\r\n+                this,\r\n+                null,\r\n+                serviceMetadata);\r\n+\r\n+        resolveFile();\r\n+        ConfigValidationUtils.validateReferenceConfig(this);\r\n+        postProcessConfig();\r\n+    }\r\n+\r\n+\r\n+    /**\r\n+     * Figure out should refer the service in the same JVM from configurations. The default behavior is true\r\n+     * 1. if injvm is specified, then use it\r\n+     * 2. then if a url is specified, then assume it's a remote call\r\n+     * 3. otherwise, check scope parameter\r\n+     * 4. if scope is not specified but the target service is provided in the same JVM, then prefer to make the local\r\n+     * call, which is the default behavior\r\n+     */\r\n+    protected boolean shouldJvmRefer(Map<String, String> map) {\r\n+        URL tmpUrl = new URL(\"temp\", \"localhost\", 0, map);\r\n+        boolean isJvmRefer;\r\n+        if (isInjvm() == null) {\r\n+            // if a url is specified, don't do local reference\r\n+            if (url != null && url.length() > 0) {\r\n+                isJvmRefer = false;\r\n+            } else {\r\n+                // by default, reference local service if there is\r\n+                isJvmRefer = InjvmProtocol.getInjvmProtocol().isInjvmRefer(tmpUrl);\r\n+            }\r\n+        } else {\r\n+            isJvmRefer = isInjvm();\r\n+        }\r\n+        return isJvmRefer;\r\n+    }\r\n+\r\n+    /**\r\n+     * Dispatch an {@link Event event}\r\n+     *\r\n+     * @param event an {@link Event event}\r\n+     * @since 2.7.5\r\n+     */\r\n+    protected void dispatch(Event event) {\r\n+        EventDispatcher.getDefaultExtension().dispatch(event);\r\n+    }\r\n+\r\n+    public DubboBootstrap getBootstrap() {\r\n+        return bootstrap;\r\n+    }\r\n+\r\n+    public void setBootstrap(DubboBootstrap bootstrap) {\r\n+        this.bootstrap = bootstrap;\r\n+    }\r\n+\r\n+    private void postProcessConfig() {\r\n+        List<ConfigPostProcessor> configPostProcessors = ExtensionLoader.getExtensionLoader(ConfigPostProcessor.class)\r\n+                .getActivateExtension(URL.valueOf(\"configPostProcessor://\"), (String[]) null);\r\n+        configPostProcessors.forEach(component -> component.postProcessReferConfig(this));\r\n+    }\r\n+\r\n+    // just for test\r\n+    Invoker<?> getInvoker() {\r\n+        return invoker;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/ServiceConfig.java", "source2": "org/apache/dubbo/config/ServiceConfig.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,727 +1,727 @@\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.config;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.URLBuilder;\n-import org.apache.dubbo.common.Version;\n-import org.apache.dubbo.common.bytecode.Wrapper;\n-import org.apache.dubbo.common.extension.ExtensionLoader;\n-import org.apache.dubbo.common.logger.Logger;\n-import org.apache.dubbo.common.logger.LoggerFactory;\n-import org.apache.dubbo.common.utils.ClassUtils;\n-import org.apache.dubbo.common.utils.CollectionUtils;\n-import org.apache.dubbo.common.utils.ConfigUtils;\n-import org.apache.dubbo.common.utils.NamedThreadFactory;\n-import org.apache.dubbo.common.utils.StringUtils;\n-import org.apache.dubbo.config.annotation.Service;\n-import org.apache.dubbo.config.bootstrap.DubboBootstrap;\n-import org.apache.dubbo.config.event.ServiceConfigExportedEvent;\n-import org.apache.dubbo.config.event.ServiceConfigUnexportedEvent;\n-import org.apache.dubbo.config.invoker.DelegateProviderMetaDataInvoker;\n-import org.apache.dubbo.config.support.Parameter;\n-import org.apache.dubbo.config.utils.ConfigValidationUtils;\n-import org.apache.dubbo.event.Event;\n-import org.apache.dubbo.event.EventDispatcher;\n-import org.apache.dubbo.metadata.ServiceNameMapping;\n-import org.apache.dubbo.registry.client.metadata.MetadataUtils;\n-import org.apache.dubbo.rpc.Exporter;\n-import org.apache.dubbo.rpc.Invoker;\n-import org.apache.dubbo.rpc.Protocol;\n-import org.apache.dubbo.rpc.ProxyFactory;\n-import org.apache.dubbo.rpc.cluster.ConfiguratorFactory;\n-import org.apache.dubbo.rpc.model.ApplicationModel;\n-import org.apache.dubbo.rpc.model.ServiceDescriptor;\n-import org.apache.dubbo.rpc.model.ServiceRepository;\n-import org.apache.dubbo.rpc.service.GenericService;\n-import org.apache.dubbo.rpc.support.ProtocolUtils;\n-\n-import java.lang.reflect.Method;\n-import java.net.InetAddress;\n-import java.net.InetSocketAddress;\n-import java.net.Socket;\n-import java.net.SocketAddress;\n-import java.net.UnknownHostException;\n-import java.util.ArrayList;\n-import java.util.Arrays;\n-import java.util.HashMap;\n-import java.util.HashSet;\n-import java.util.List;\n-import java.util.Map;\n-import java.util.UUID;\n-import java.util.concurrent.Executors;\n-import java.util.concurrent.ScheduledExecutorService;\n-import java.util.concurrent.TimeUnit;\n-\n-import static org.apache.dubbo.common.constants.CommonConstants.ANYHOST_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.ANY_VALUE;\n-import static org.apache.dubbo.common.constants.CommonConstants.DUBBO;\n-import static org.apache.dubbo.common.constants.CommonConstants.DUBBO_IP_TO_BIND;\n-import static org.apache.dubbo.common.constants.CommonConstants.LOCALHOST_VALUE;\n-import static org.apache.dubbo.common.constants.CommonConstants.MAPPING_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.METADATA_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.METHODS_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.MONITOR_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.PROVIDER_SIDE;\n-import static org.apache.dubbo.common.constants.CommonConstants.REGISTER_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.REMOTE_METADATA_STORAGE_TYPE;\n-import static org.apache.dubbo.common.constants.CommonConstants.REVISION_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.SIDE_KEY;\n-import static org.apache.dubbo.common.constants.RegistryConstants.DYNAMIC_KEY;\n-import static org.apache.dubbo.common.utils.NetUtils.getAvailablePort;\n-import static org.apache.dubbo.common.utils.NetUtils.getLocalHost;\n-import static org.apache.dubbo.common.utils.NetUtils.isInvalidLocalHost;\n-import static org.apache.dubbo.common.utils.NetUtils.isInvalidPort;\n-import static org.apache.dubbo.config.Constants.DUBBO_IP_TO_REGISTRY;\n-import static org.apache.dubbo.config.Constants.DUBBO_PORT_TO_BIND;\n-import static org.apache.dubbo.config.Constants.DUBBO_PORT_TO_REGISTRY;\n-import static org.apache.dubbo.config.Constants.MULTICAST;\n-import static org.apache.dubbo.config.Constants.SCOPE_NONE;\n-import static org.apache.dubbo.remoting.Constants.BIND_IP_KEY;\n-import static org.apache.dubbo.remoting.Constants.BIND_PORT_KEY;\n-import static org.apache.dubbo.rpc.Constants.GENERIC_KEY;\n-import static org.apache.dubbo.rpc.Constants.LOCAL_PROTOCOL;\n-import static org.apache.dubbo.rpc.Constants.PROXY_KEY;\n-import static org.apache.dubbo.rpc.Constants.SCOPE_KEY;\n-import static org.apache.dubbo.rpc.Constants.SCOPE_LOCAL;\n-import static org.apache.dubbo.rpc.Constants.SCOPE_REMOTE;\n-import static org.apache.dubbo.rpc.Constants.TOKEN_KEY;\n-import static org.apache.dubbo.rpc.cluster.Constants.EXPORT_KEY;\n-\n-public class ServiceConfig<T> extends ServiceConfigBase<T> {\n-\n-    public static final Logger logger = LoggerFactory.getLogger(ServiceConfig.class);\n-\n-    /**\n-     * A random port cache, the different protocols who has no port specified have different random port\n-     */\n-    private static final Map<String, Integer> RANDOM_PORT_MAP = new HashMap<String, Integer>();\n-\n-    /**\n-     * A delayed exposure service timer\n-     */\n-    private static final ScheduledExecutorService DELAY_EXPORT_EXECUTOR = Executors.newSingleThreadScheduledExecutor(new NamedThreadFactory(\"DubboServiceDelayExporter\", true));\n-\n-    private static final Protocol PROTOCOL = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();\n-\n-    /**\n-     * A {@link ProxyFactory} implementation that will generate a exported service proxy,the JavassistProxyFactory is its\n-     * default implementation\n-     */\n-    private static final ProxyFactory PROXY_FACTORY = ExtensionLoader.getExtensionLoader(ProxyFactory.class).getAdaptiveExtension();\n-\n-    /**\n-     * Whether the provider has been exported\n-     */\n-    private transient volatile boolean exported;\n-\n-    /**\n-     * The flag whether a service has unexported ,if the method unexported is invoked, the value is true\n-     */\n-    private transient volatile boolean unexported;\n-\n-    private DubboBootstrap bootstrap;\n-\n-    /**\n-     * The exported services\n-     */\n-    private final List<Exporter<?>> exporters = new ArrayList<Exporter<?>>();\n-\n-    public ServiceConfig() {\n-    }\n-\n-    public ServiceConfig(Service service) {\n-        super(service);\n-    }\n-\n-    @Parameter(excluded = true)\n-    public boolean isExported() {\n-        return exported;\n-    }\n-\n-    @Parameter(excluded = true)\n-    public boolean isUnexported() {\n-        return unexported;\n-    }\n-\n-    public void unexport() {\n-        if (!exported) {\n-            return;\n-        }\n-        if (unexported) {\n-            return;\n-        }\n-        if (!exporters.isEmpty()) {\n-            for (Exporter<?> exporter : exporters) {\n-                try {\n-                    exporter.unexport();\n-                } catch (Throwable t) {\n-                    logger.warn(\"Unexpected error occurred when unexport \" + exporter, t);\n-                }\n-            }\n-            exporters.clear();\n-        }\n-        unexported = true;\n-\n-        // dispatch a ServiceConfigUnExportedEvent since 2.7.4\n-        dispatch(new ServiceConfigUnexportedEvent(this));\n-    }\n-\n-    public synchronized void export() {\n-        if (bootstrap == null) {\n-            bootstrap = DubboBootstrap.getInstance();\n-            bootstrap.initialize();\n-        }\n-\n-        checkAndUpdateSubConfigs();\n-\n-        initServiceMetadata(provider);\n-        serviceMetadata.setServiceType(getInterfaceClass());\n-        serviceMetadata.setTarget(getRef());\n-        serviceMetadata.generateServiceKey();\n-\n-        if (!shouldExport()) {\n-            return;\n-        }\n-\n-        if (shouldDelay()) {\n-            DELAY_EXPORT_EXECUTOR.schedule(this::doExport, getDelay(), TimeUnit.MILLISECONDS);\n-        } else {\n-            doExport();\n-        }\n-\n-        exported();\n-    }\n-\n-    public void exported() {\n-        List<URL> exportedURLs = this.getExportedUrls();\n-        exportedURLs.forEach(url -> {\n-            Map<String, String> parameters = getApplication().getParameters();\n-            ServiceNameMapping.getExtension(parameters != null ? parameters.get(MAPPING_KEY) : null).map(url);\n-        });\n-        // dispatch a ServiceConfigExportedEvent since 2.7.4\n-        dispatch(new ServiceConfigExportedEvent(this));\n-    }\n-\n-    private void checkAndUpdateSubConfigs() {\n-        // Use default configs defined explicitly with global scope\n-        completeCompoundConfigs();\n-        checkDefault();\n-        checkProtocol();\n-        // init some null configuration.\n-        List<ConfigInitializer> configInitializers = ExtensionLoader.getExtensionLoader(ConfigInitializer.class)\n-                .getActivateExtension(URL.valueOf(\"configInitializer://\"), (String[]) null);\n-        configInitializers.forEach(e -> e.initServiceConfig(this));\n-\n-        // if protocol is not injvm checkRegistry\n-        if (!isOnlyInJvm()) {\n-            checkRegistry();\n-        }\n-        this.refresh();\n-\n-        if (StringUtils.isEmpty(interfaceName)) {\n-            throw new IllegalStateException(\"<dubbo:service interface=\\\"\\\" /> interface not allow null!\");\n-        }\n-\n-        if (ref instanceof GenericService) {\n-            interfaceClass = GenericService.class;\n-            if (StringUtils.isEmpty(generic)) {\n-                generic = Boolean.TRUE.toString();\n-            }\n-        } else {\n-            try {\n-                interfaceClass = Class.forName(interfaceName, true, Thread.currentThread()\n-                        .getContextClassLoader());\n-            } catch (ClassNotFoundException e) {\n-                throw new IllegalStateException(e.getMessage(), e);\n-            }\n-            checkInterfaceAndMethods(interfaceClass, getMethods());\n-            checkRef();\n-            generic = Boolean.FALSE.toString();\n-        }\n-        if (local != null) {\n-            if (\"true\".equals(local)) {\n-                local = interfaceName + \"Local\";\n-            }\n-            Class<?> localClass;\n-            try {\n-                localClass = ClassUtils.forNameWithThreadContextClassLoader(local);\n-            } catch (ClassNotFoundException e) {\n-                throw new IllegalStateException(e.getMessage(), e);\n-            }\n-            if (!interfaceClass.isAssignableFrom(localClass)) {\n-                throw new IllegalStateException(\"The local implementation class \" + localClass.getName() + \" not implement interface \" + interfaceName);\n-            }\n-        }\n-        if (stub != null) {\n-            if (\"true\".equals(stub)) {\n-                stub = interfaceName + \"Stub\";\n-            }\n-            Class<?> stubClass;\n-            try {\n-                stubClass = ClassUtils.forNameWithThreadContextClassLoader(stub);\n-            } catch (ClassNotFoundException e) {\n-                throw new IllegalStateException(e.getMessage(), e);\n-            }\n-            if (!interfaceClass.isAssignableFrom(stubClass)) {\n-                throw new IllegalStateException(\"The stub implementation class \" + stubClass.getName() + \" not implement interface \" + interfaceName);\n-            }\n-        }\n-        checkStubAndLocal(interfaceClass);\n-        ConfigValidationUtils.checkMock(interfaceClass, this);\n-        ConfigValidationUtils.validateServiceConfig(this);\n-        postProcessConfig();\n-    }\n-\n-\n-    protected synchronized void doExport() {\n-        if (unexported) {\n-            throw new IllegalStateException(\"The service \" + interfaceClass.getName() + \" has already unexported!\");\n-        }\n-        if (exported) {\n-            return;\n-        }\n-        exported = true;\n-\n-        if (StringUtils.isEmpty(path)) {\n-            path = interfaceName;\n-        }\n-        doExportUrls();\n-        bootstrap.setReady(true);\n-    }\n-\n-    @SuppressWarnings({\"unchecked\", \"rawtypes\"})\n-    private void doExportUrls() {\n-        ServiceRepository repository = ApplicationModel.getServiceRepository();\n-        ServiceDescriptor serviceDescriptor = repository.registerService(getInterfaceClass());\n-        repository.registerProvider(\n-                getUniqueServiceName(),\n-                ref,\n-                serviceDescriptor,\n-                this,\n-                serviceMetadata\n-        );\n-\n-        List<URL> registryURLs = ConfigValidationUtils.loadRegistries(this, true);\n-\n-        for (ProtocolConfig protocolConfig : protocols) {\n-            String pathKey = URL.buildKey(getContextPath(protocolConfig)\n-                    .map(p -> p + \"/\" + path)\n-                    .orElse(path), group, version);\n-            // In case user specified path, register service one more time to map it to path.\n-            repository.registerService(pathKey, interfaceClass);\n-            doExportUrlsFor1Protocol(protocolConfig, registryURLs);\n-        }\n-    }\n-\n-    private void doExportUrlsFor1Protocol(ProtocolConfig protocolConfig, List<URL> registryURLs) {\n-        String name = protocolConfig.getName();\n-        if (StringUtils.isEmpty(name)) {\n-            name = DUBBO;\n-        }\n-\n-        Map<String, String> map = new HashMap<String, String>();\n-        map.put(SIDE_KEY, PROVIDER_SIDE);\n-\n-        ServiceConfig.appendRuntimeParameters(map);\n-        AbstractConfig.appendParameters(map, getMetrics());\n-        AbstractConfig.appendParameters(map, getApplication());\n-        AbstractConfig.appendParameters(map, getModule());\n-        // remove 'default.' prefix for configs from ProviderConfig\n-        // appendParameters(map, provider, Constants.DEFAULT_KEY);\n-        AbstractConfig.appendParameters(map, provider);\n-        AbstractConfig.appendParameters(map, protocolConfig);\n-        AbstractConfig.appendParameters(map, this);\n-        MetadataReportConfig metadataReportConfig = getMetadataReportConfig();\n-        if (metadataReportConfig != null && metadataReportConfig.isValid()) {\n-            map.putIfAbsent(METADATA_KEY, REMOTE_METADATA_STORAGE_TYPE);\n-        }\n-        if (CollectionUtils.isNotEmpty(getMethods())) {\n-            for (MethodConfig method : getMethods()) {\n-                AbstractConfig.appendParameters(map, method, method.getName());\n-                String retryKey = method.getName() + \".retry\";\n-                if (map.containsKey(retryKey)) {\n-                    String retryValue = map.remove(retryKey);\n-                    if (\"false\".equals(retryValue)) {\n-                        map.put(method.getName() + \".retries\", \"0\");\n-                    }\n-                }\n-                List<ArgumentConfig> arguments = method.getArguments();\n-                if (CollectionUtils.isNotEmpty(arguments)) {\n-                    for (ArgumentConfig argument : arguments) {\n-                        // convert argument type\n-                        if (argument.getType() != null && argument.getType().length() > 0) {\n-                            Method[] methods = interfaceClass.getMethods();\n-                            // visit all methods\n-                            if (methods.length > 0) {\n-                                for (int i = 0; i < methods.length; i++) {\n-                                    String methodName = methods[i].getName();\n-                                    // target the method, and get its signature\n-                                    if (methodName.equals(method.getName())) {\n-                                        Class<?>[] argtypes = methods[i].getParameterTypes();\n-                                        // one callback in the method\n-                                        if (argument.getIndex() != -1) {\n-                                            if (argtypes[argument.getIndex()].getName().equals(argument.getType())) {\n-                                                AbstractConfig.appendParameters(map, argument, method.getName() + \".\" + argument.getIndex());\n-                                            } else {\n-                                                throw new IllegalArgumentException(\"Argument config error : the index attribute and type attribute not match :index :\" + argument.getIndex() + \", type:\" + argument.getType());\n-                                            }\n-                                        } else {\n-                                            // multiple callbacks in the method\n-                                            for (int j = 0; j < argtypes.length; j++) {\n-                                                Class<?> argclazz = argtypes[j];\n-                                                if (argclazz.getName().equals(argument.getType())) {\n-                                                    AbstractConfig.appendParameters(map, argument, method.getName() + \".\" + j);\n-                                                    if (argument.getIndex() != -1 && argument.getIndex() != j) {\n-                                                        throw new IllegalArgumentException(\"Argument config error : the index attribute and type attribute not match :index :\" + argument.getIndex() + \", type:\" + argument.getType());\n-                                                    }\n-                                                }\n-                                            }\n-                                        }\n-                                    }\n-                                }\n-                            }\n-                        } else if (argument.getIndex() != -1) {\n-                            AbstractConfig.appendParameters(map, argument, method.getName() + \".\" + argument.getIndex());\n-                        } else {\n-                            throw new IllegalArgumentException(\"Argument config must set index or type attribute.eg: <dubbo:argument index='0' .../> or <dubbo:argument type=xxx .../>\");\n-                        }\n-\n-                    }\n-                }\n-            } // end of methods for\n-        }\n-\n-        if (ProtocolUtils.isGeneric(generic)) {\n-            map.put(GENERIC_KEY, generic);\n-            map.put(METHODS_KEY, ANY_VALUE);\n-        } else {\n-            String revision = Version.getVersion(interfaceClass, version);\n-            if (revision != null && revision.length() > 0) {\n-                map.put(REVISION_KEY, revision);\n-            }\n-\n-            String[] methods = Wrapper.getWrapper(interfaceClass).getMethodNames();\n-            if (methods.length == 0) {\n-                logger.warn(\"No method found in service interface \" + interfaceClass.getName());\n-                map.put(METHODS_KEY, ANY_VALUE);\n-            } else {\n-                map.put(METHODS_KEY, StringUtils.join(new HashSet<String>(Arrays.asList(methods)), \",\"));\n-            }\n-        }\n-\n-        /**\n-         * Here the token value configured by the provider is used to assign the value to ServiceConfig#token\n-         */\n-        if (ConfigUtils.isEmpty(token) && provider != null) {\n-            token = provider.getToken();\n-        }\n-\n-        if (!ConfigUtils.isEmpty(token)) {\n-            if (ConfigUtils.isDefault(token)) {\n-                map.put(TOKEN_KEY, UUID.randomUUID().toString());\n-            } else {\n-                map.put(TOKEN_KEY, token);\n-            }\n-        }\n-        //init serviceMetadata attachments\n-        serviceMetadata.getAttachments().putAll(map);\n-\n-        // export service\n-        String host = findConfigedHosts(protocolConfig, registryURLs, map);\n-        Integer port = findConfigedPorts(protocolConfig, name, map);\n-        URL url = new URL(name, host, port, getContextPath(protocolConfig).map(p -> p + \"/\" + path).orElse(path), map);\n-\n-        // You can customize Configurator to append extra parameters\n-        if (ExtensionLoader.getExtensionLoader(ConfiguratorFactory.class)\n-                .hasExtension(url.getProtocol())) {\n-            url = ExtensionLoader.getExtensionLoader(ConfiguratorFactory.class)\n-                    .getExtension(url.getProtocol()).getConfigurator(url).configure(url);\n-        }\n-\n-        String scope = url.getParameter(SCOPE_KEY);\n-        // don't export when none is configured\n-        if (!SCOPE_NONE.equalsIgnoreCase(scope)) {\n-\n-            // export to local if the config is not remote (export to remote only when config is remote)\n-            if (!SCOPE_REMOTE.equalsIgnoreCase(scope)) {\n-                exportLocal(url);\n-            }\n-            // export to remote if the config is not local (export to local only when config is local)\n-            if (!SCOPE_LOCAL.equalsIgnoreCase(scope)) {\n-                if (CollectionUtils.isNotEmpty(registryURLs)) {\n-                    for (URL registryURL : registryURLs) {\n-                        //if protocol is only injvm ,not register\n-                        if (LOCAL_PROTOCOL.equalsIgnoreCase(url.getProtocol())) {\n-                            continue;\n-                        }\n-                        url = url.addParameterIfAbsent(DYNAMIC_KEY, registryURL.getParameter(DYNAMIC_KEY));\n-                        URL monitorUrl = ConfigValidationUtils.loadMonitor(this, registryURL);\n-                        if (monitorUrl != null) {\n-                            url = url.addParameterAndEncoded(MONITOR_KEY, monitorUrl.toFullString());\n-                        }\n-                        if (logger.isInfoEnabled()) {\n-                            if (url.getParameter(REGISTER_KEY, true)) {\n-                                logger.info(\"Register dubbo service \" + interfaceClass.getName() + \" url \" + url + \" to registry \" + registryURL);\n-                            } else {\n-                                logger.info(\"Export dubbo service \" + interfaceClass.getName() + \" to url \" + url);\n-                            }\n-                        }\n-\n-                        // For providers, this is used to enable custom proxy to generate invoker\n-                        String proxy = url.getParameter(PROXY_KEY);\n-                        if (StringUtils.isNotEmpty(proxy)) {\n-                            registryURL = registryURL.addParameter(PROXY_KEY, proxy);\n-                        }\n-\n-                        Invoker<?> invoker = PROXY_FACTORY.getInvoker(ref, (Class) interfaceClass, registryURL.addParameterAndEncoded(EXPORT_KEY, url.toFullString()));\n-                        DelegateProviderMetaDataInvoker wrapperInvoker = new DelegateProviderMetaDataInvoker(invoker, this);\n-\n-                        Exporter<?> exporter = PROTOCOL.export(wrapperInvoker);\n-                        exporters.add(exporter);\n-                    }\n-                } else {\n-                    if (logger.isInfoEnabled()) {\n-                        logger.info(\"Export dubbo service \" + interfaceClass.getName() + \" to url \" + url);\n-                    }\n-                    Invoker<?> invoker = PROXY_FACTORY.getInvoker(ref, (Class) interfaceClass, url);\n-                    DelegateProviderMetaDataInvoker wrapperInvoker = new DelegateProviderMetaDataInvoker(invoker, this);\n-\n-                    Exporter<?> exporter = PROTOCOL.export(wrapperInvoker);\n-                    exporters.add(exporter);\n-                }\n-\n-                MetadataUtils.publishServiceDefinition(url);\n-            }\n-        }\n-        this.urls.add(url);\n-    }\n-\n-    @SuppressWarnings({\"unchecked\", \"rawtypes\"})\n-    /**\n-     * always export injvm\n-     */\n-    private void exportLocal(URL url) {\n-        URL local = URLBuilder.from(url)\n-                .setProtocol(LOCAL_PROTOCOL)\n-                .setHost(LOCALHOST_VALUE)\n-                .setPort(0)\n-                .build();\n-        Exporter<?> exporter = PROTOCOL.export(\n-                PROXY_FACTORY.getInvoker(ref, (Class) interfaceClass, local));\n-        exporters.add(exporter);\n-        logger.info(\"Export dubbo service \" + interfaceClass.getName() + \" to local registry url : \" + local);\n-    }\n-\n-    /**\n-     * Determine if it is injvm\n-     *\n-     * @return\n-     */\n-    private boolean isOnlyInJvm() {\n-        return getProtocols().size() == 1\n-                && LOCAL_PROTOCOL.equalsIgnoreCase(getProtocols().get(0).getName());\n-    }\n-\n-\n-    /**\n-     * Register & bind IP address for service provider, can be configured separately.\n-     * Configuration priority: environment variables -> java system properties -> host property in config file ->\n-     * /etc/hosts -> default network address -> first available network address\n-     *\n-     * @param protocolConfig\n-     * @param registryURLs\n-     * @param map\n-     * @return\n-     */\n-    private String findConfigedHosts(ProtocolConfig protocolConfig,\n-                                     List<URL> registryURLs,\n-                                     Map<String, String> map) {\n-        boolean anyhost = false;\n-\n-        String hostToBind = getValueFromConfig(protocolConfig, DUBBO_IP_TO_BIND);\n-        if (hostToBind != null && hostToBind.length() > 0 && isInvalidLocalHost(hostToBind)) {\n-            throw new IllegalArgumentException(\"Specified invalid bind ip from property:\" + DUBBO_IP_TO_BIND + \", value:\" + hostToBind);\n-        }\n-\n-        // if bind ip is not found in environment, keep looking up\n-        if (StringUtils.isEmpty(hostToBind)) {\n-            hostToBind = protocolConfig.getHost();\n-            if (provider != null && StringUtils.isEmpty(hostToBind)) {\n-                hostToBind = provider.getHost();\n-            }\n-            if (isInvalidLocalHost(hostToBind)) {\n-                anyhost = true;\n-                try {\n-                    logger.info(\"No valid ip found from environment, try to find valid host from DNS.\");\n-                    hostToBind = InetAddress.getLocalHost().getHostAddress();\n-                } catch (UnknownHostException e) {\n-                    logger.warn(e.getMessage(), e);\n-                }\n-                if (isInvalidLocalHost(hostToBind)) {\n-                    if (CollectionUtils.isNotEmpty(registryURLs)) {\n-                        for (URL registryURL : registryURLs) {\n-                            if (MULTICAST.equalsIgnoreCase(registryURL.getParameter(\"registry\"))) {\n-                                // skip multicast registry since we cannot connect to it via Socket\n-                                continue;\n-                            }\n-                            try (Socket socket = new Socket()) {\n-                                SocketAddress addr = new InetSocketAddress(registryURL.getHost(), registryURL.getPort());\n-                                socket.connect(addr, 1000);\n-                                hostToBind = socket.getLocalAddress().getHostAddress();\n-                                break;\n-                            } catch (Exception e) {\n-                                logger.warn(e.getMessage(), e);\n-                            }\n-                        }\n-                    }\n-                    if (isInvalidLocalHost(hostToBind)) {\n-                        hostToBind = getLocalHost();\n-                    }\n-                }\n-            }\n-        }\n-\n-        map.put(BIND_IP_KEY, hostToBind);\n-\n-        // registry ip is not used for bind ip by default\n-        String hostToRegistry = getValueFromConfig(protocolConfig, DUBBO_IP_TO_REGISTRY);\n-        if (hostToRegistry != null && hostToRegistry.length() > 0 && isInvalidLocalHost(hostToRegistry)) {\n-            throw new IllegalArgumentException(\"Specified invalid registry ip from property:\" + DUBBO_IP_TO_REGISTRY + \", value:\" + hostToRegistry);\n-        } else if (StringUtils.isEmpty(hostToRegistry)) {\n-            // bind ip is used as registry ip by default\n-            hostToRegistry = hostToBind;\n-        }\n-\n-        map.put(ANYHOST_KEY, String.valueOf(anyhost));\n-\n-        return hostToRegistry;\n-    }\n-\n-\n-    /**\n-     * Register port and bind port for the provider, can be configured separately\n-     * Configuration priority: environment variable -> java system properties -> port property in protocol config file\n-     * -> protocol default port\n-     *\n-     * @param protocolConfig\n-     * @param name\n-     * @return\n-     */\n-    private Integer findConfigedPorts(ProtocolConfig protocolConfig,\n-                                      String name,\n-                                      Map<String, String> map) {\n-        Integer portToBind = null;\n-\n-        // parse bind port from environment\n-        String port = getValueFromConfig(protocolConfig, DUBBO_PORT_TO_BIND);\n-        portToBind = parsePort(port);\n-\n-        // if there's no bind port found from environment, keep looking up.\n-        if (portToBind == null) {\n-            portToBind = protocolConfig.getPort();\n-            if (provider != null && (portToBind == null || portToBind == 0)) {\n-                portToBind = provider.getPort();\n-            }\n-            final int defaultPort = ExtensionLoader.getExtensionLoader(Protocol.class).getExtension(name).getDefaultPort();\n-            if (portToBind == null || portToBind == 0) {\n-                portToBind = defaultPort;\n-            }\n-            if (portToBind <= 0) {\n-                portToBind = getRandomPort(name);\n-                if (portToBind == null || portToBind < 0) {\n-                    portToBind = getAvailablePort(defaultPort);\n-                    putRandomPort(name, portToBind);\n-                }\n-            }\n-        }\n-\n-        // save bind port, used as url's key later\n-        map.put(BIND_PORT_KEY, String.valueOf(portToBind));\n-\n-        // registry port, not used as bind port by default\n-        String portToRegistryStr = getValueFromConfig(protocolConfig, DUBBO_PORT_TO_REGISTRY);\n-        Integer portToRegistry = parsePort(portToRegistryStr);\n-        if (portToRegistry == null) {\n-            portToRegistry = portToBind;\n-        }\n-\n-        return portToRegistry;\n-    }\n-\n-    private Integer parsePort(String configPort) {\n-        Integer port = null;\n-        if (configPort != null && configPort.length() > 0) {\n-            try {\n-                Integer intPort = Integer.parseInt(configPort);\n-                if (isInvalidPort(intPort)) {\n-                    throw new IllegalArgumentException(\"Specified invalid port from env value:\" + configPort);\n-                }\n-                port = intPort;\n-            } catch (Exception e) {\n-                throw new IllegalArgumentException(\"Specified invalid port from env value:\" + configPort);\n-            }\n-        }\n-        return port;\n-    }\n-\n-    private String getValueFromConfig(ProtocolConfig protocolConfig, String key) {\n-        String protocolPrefix = protocolConfig.getName().toUpperCase() + \"_\";\n-        String value = ConfigUtils.getSystemProperty(protocolPrefix + key);\n-        if (StringUtils.isEmpty(value)) {\n-            value = ConfigUtils.getSystemProperty(key);\n-        }\n-        return value;\n-    }\n-\n-    private Integer getRandomPort(String protocol) {\n-        protocol = protocol.toLowerCase();\n-        return RANDOM_PORT_MAP.getOrDefault(protocol, Integer.MIN_VALUE);\n-    }\n-\n-    private void putRandomPort(String protocol, Integer port) {\n-        protocol = protocol.toLowerCase();\n-        if (!RANDOM_PORT_MAP.containsKey(protocol)) {\n-            RANDOM_PORT_MAP.put(protocol, port);\n-            logger.warn(\"Use random available port(\" + port + \") for protocol \" + protocol);\n-        }\n-    }\n-\n-    private void postProcessConfig() {\n-        List<ConfigPostProcessor> configPostProcessors = ExtensionLoader.getExtensionLoader(ConfigPostProcessor.class)\n-                .getActivateExtension(URL.valueOf(\"configPostProcessor://\"), (String[]) null);\n-        configPostProcessors.forEach(component -> component.postProcessServiceConfig(this));\n-    }\n-\n-    /**\n-     * Dispatch an {@link Event event}\n-     *\n-     * @param event an {@link Event event}\n-     * @since 2.7.5\n-     */\n-    private void dispatch(Event event) {\n-        EventDispatcher.getDefaultExtension().dispatch(event);\n-    }\n-\n-    public DubboBootstrap getBootstrap() {\n-        return bootstrap;\n-    }\n-\n-    public void setBootstrap(DubboBootstrap bootstrap) {\n-        this.bootstrap = bootstrap;\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.config;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.URLBuilder;\r\n+import org.apache.dubbo.common.Version;\r\n+import org.apache.dubbo.common.bytecode.Wrapper;\r\n+import org.apache.dubbo.common.extension.ExtensionLoader;\r\n+import org.apache.dubbo.common.logger.Logger;\r\n+import org.apache.dubbo.common.logger.LoggerFactory;\r\n+import org.apache.dubbo.common.utils.ClassUtils;\r\n+import org.apache.dubbo.common.utils.CollectionUtils;\r\n+import org.apache.dubbo.common.utils.ConfigUtils;\r\n+import org.apache.dubbo.common.utils.NamedThreadFactory;\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+import org.apache.dubbo.config.annotation.Service;\r\n+import org.apache.dubbo.config.bootstrap.DubboBootstrap;\r\n+import org.apache.dubbo.config.event.ServiceConfigExportedEvent;\r\n+import org.apache.dubbo.config.event.ServiceConfigUnexportedEvent;\r\n+import org.apache.dubbo.config.invoker.DelegateProviderMetaDataInvoker;\r\n+import org.apache.dubbo.config.support.Parameter;\r\n+import org.apache.dubbo.config.utils.ConfigValidationUtils;\r\n+import org.apache.dubbo.event.Event;\r\n+import org.apache.dubbo.event.EventDispatcher;\r\n+import org.apache.dubbo.metadata.ServiceNameMapping;\r\n+import org.apache.dubbo.registry.client.metadata.MetadataUtils;\r\n+import org.apache.dubbo.rpc.Exporter;\r\n+import org.apache.dubbo.rpc.Invoker;\r\n+import org.apache.dubbo.rpc.Protocol;\r\n+import org.apache.dubbo.rpc.ProxyFactory;\r\n+import org.apache.dubbo.rpc.cluster.ConfiguratorFactory;\r\n+import org.apache.dubbo.rpc.model.ApplicationModel;\r\n+import org.apache.dubbo.rpc.model.ServiceDescriptor;\r\n+import org.apache.dubbo.rpc.model.ServiceRepository;\r\n+import org.apache.dubbo.rpc.service.GenericService;\r\n+import org.apache.dubbo.rpc.support.ProtocolUtils;\r\n+\r\n+import java.lang.reflect.Method;\r\n+import java.net.InetAddress;\r\n+import java.net.InetSocketAddress;\r\n+import java.net.Socket;\r\n+import java.net.SocketAddress;\r\n+import java.net.UnknownHostException;\r\n+import java.util.ArrayList;\r\n+import java.util.Arrays;\r\n+import java.util.HashMap;\r\n+import java.util.HashSet;\r\n+import java.util.List;\r\n+import java.util.Map;\r\n+import java.util.UUID;\r\n+import java.util.concurrent.Executors;\r\n+import java.util.concurrent.ScheduledExecutorService;\r\n+import java.util.concurrent.TimeUnit;\r\n+\r\n+import static org.apache.dubbo.common.constants.CommonConstants.ANYHOST_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.ANY_VALUE;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.DUBBO;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.DUBBO_IP_TO_BIND;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.LOCALHOST_VALUE;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.MAPPING_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.METADATA_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.METHODS_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.MONITOR_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.PROVIDER_SIDE;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.REGISTER_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.REMOTE_METADATA_STORAGE_TYPE;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.REVISION_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.SIDE_KEY;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.DYNAMIC_KEY;\r\n+import static org.apache.dubbo.common.utils.NetUtils.getAvailablePort;\r\n+import static org.apache.dubbo.common.utils.NetUtils.getLocalHost;\r\n+import static org.apache.dubbo.common.utils.NetUtils.isInvalidLocalHost;\r\n+import static org.apache.dubbo.common.utils.NetUtils.isInvalidPort;\r\n+import static org.apache.dubbo.config.Constants.DUBBO_IP_TO_REGISTRY;\r\n+import static org.apache.dubbo.config.Constants.DUBBO_PORT_TO_BIND;\r\n+import static org.apache.dubbo.config.Constants.DUBBO_PORT_TO_REGISTRY;\r\n+import static org.apache.dubbo.config.Constants.MULTICAST;\r\n+import static org.apache.dubbo.config.Constants.SCOPE_NONE;\r\n+import static org.apache.dubbo.remoting.Constants.BIND_IP_KEY;\r\n+import static org.apache.dubbo.remoting.Constants.BIND_PORT_KEY;\r\n+import static org.apache.dubbo.rpc.Constants.GENERIC_KEY;\r\n+import static org.apache.dubbo.rpc.Constants.LOCAL_PROTOCOL;\r\n+import static org.apache.dubbo.rpc.Constants.PROXY_KEY;\r\n+import static org.apache.dubbo.rpc.Constants.SCOPE_KEY;\r\n+import static org.apache.dubbo.rpc.Constants.SCOPE_LOCAL;\r\n+import static org.apache.dubbo.rpc.Constants.SCOPE_REMOTE;\r\n+import static org.apache.dubbo.rpc.Constants.TOKEN_KEY;\r\n+import static org.apache.dubbo.rpc.cluster.Constants.EXPORT_KEY;\r\n+\r\n+public class ServiceConfig<T> extends ServiceConfigBase<T> {\r\n+\r\n+    public static final Logger logger = LoggerFactory.getLogger(ServiceConfig.class);\r\n+\r\n+    /**\r\n+     * A random port cache, the different protocols who has no port specified have different random port\r\n+     */\r\n+    private static final Map<String, Integer> RANDOM_PORT_MAP = new HashMap<String, Integer>();\r\n+\r\n+    /**\r\n+     * A delayed exposure service timer\r\n+     */\r\n+    private static final ScheduledExecutorService DELAY_EXPORT_EXECUTOR = Executors.newSingleThreadScheduledExecutor(new NamedThreadFactory(\"DubboServiceDelayExporter\", true));\r\n+\r\n+    private static final Protocol PROTOCOL = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();\r\n+\r\n+    /**\r\n+     * A {@link ProxyFactory} implementation that will generate a exported service proxy,the JavassistProxyFactory is its\r\n+     * default implementation\r\n+     */\r\n+    private static final ProxyFactory PROXY_FACTORY = ExtensionLoader.getExtensionLoader(ProxyFactory.class).getAdaptiveExtension();\r\n+\r\n+    /**\r\n+     * Whether the provider has been exported\r\n+     */\r\n+    private transient volatile boolean exported;\r\n+\r\n+    /**\r\n+     * The flag whether a service has unexported ,if the method unexported is invoked, the value is true\r\n+     */\r\n+    private transient volatile boolean unexported;\r\n+\r\n+    private DubboBootstrap bootstrap;\r\n+\r\n+    /**\r\n+     * The exported services\r\n+     */\r\n+    private final List<Exporter<?>> exporters = new ArrayList<Exporter<?>>();\r\n+\r\n+    public ServiceConfig() {\r\n+    }\r\n+\r\n+    public ServiceConfig(Service service) {\r\n+        super(service);\r\n+    }\r\n+\r\n+    @Parameter(excluded = true)\r\n+    public boolean isExported() {\r\n+        return exported;\r\n+    }\r\n+\r\n+    @Parameter(excluded = true)\r\n+    public boolean isUnexported() {\r\n+        return unexported;\r\n+    }\r\n+\r\n+    public void unexport() {\r\n+        if (!exported) {\r\n+            return;\r\n+        }\r\n+        if (unexported) {\r\n+            return;\r\n+        }\r\n+        if (!exporters.isEmpty()) {\r\n+            for (Exporter<?> exporter : exporters) {\r\n+                try {\r\n+                    exporter.unexport();\r\n+                } catch (Throwable t) {\r\n+                    logger.warn(\"Unexpected error occurred when unexport \" + exporter, t);\r\n+                }\r\n+            }\r\n+            exporters.clear();\r\n+        }\r\n+        unexported = true;\r\n+\r\n+        // dispatch a ServiceConfigUnExportedEvent since 2.7.4\r\n+        dispatch(new ServiceConfigUnexportedEvent(this));\r\n+    }\r\n+\r\n+    public synchronized void export() {\r\n+        if (bootstrap == null) {\r\n+            bootstrap = DubboBootstrap.getInstance();\r\n+            bootstrap.initialize();\r\n+        }\r\n+\r\n+        checkAndUpdateSubConfigs();\r\n+\r\n+        initServiceMetadata(provider);\r\n+        serviceMetadata.setServiceType(getInterfaceClass());\r\n+        serviceMetadata.setTarget(getRef());\r\n+        serviceMetadata.generateServiceKey();\r\n+\r\n+        if (!shouldExport()) {\r\n+            return;\r\n+        }\r\n+\r\n+        if (shouldDelay()) {\r\n+            DELAY_EXPORT_EXECUTOR.schedule(this::doExport, getDelay(), TimeUnit.MILLISECONDS);\r\n+        } else {\r\n+            doExport();\r\n+        }\r\n+\r\n+        exported();\r\n+    }\r\n+\r\n+    public void exported() {\r\n+        List<URL> exportedURLs = this.getExportedUrls();\r\n+        exportedURLs.forEach(url -> {\r\n+            Map<String, String> parameters = getApplication().getParameters();\r\n+            ServiceNameMapping.getExtension(parameters != null ? parameters.get(MAPPING_KEY) : null).map(url);\r\n+        });\r\n+        // dispatch a ServiceConfigExportedEvent since 2.7.4\r\n+        dispatch(new ServiceConfigExportedEvent(this));\r\n+    }\r\n+\r\n+    private void checkAndUpdateSubConfigs() {\r\n+        // Use default configs defined explicitly with global scope\r\n+        completeCompoundConfigs();\r\n+        checkDefault();\r\n+        checkProtocol();\r\n+        // init some null configuration.\r\n+        List<ConfigInitializer> configInitializers = ExtensionLoader.getExtensionLoader(ConfigInitializer.class)\r\n+                .getActivateExtension(URL.valueOf(\"configInitializer://\"), (String[]) null);\r\n+        configInitializers.forEach(e -> e.initServiceConfig(this));\r\n+\r\n+        // if protocol is not injvm checkRegistry\r\n+        if (!isOnlyInJvm()) {\r\n+            checkRegistry();\r\n+        }\r\n+        this.refresh();\r\n+\r\n+        if (StringUtils.isEmpty(interfaceName)) {\r\n+            throw new IllegalStateException(\"<dubbo:service interface=\\\"\\\" /> interface not allow null!\");\r\n+        }\r\n+\r\n+        if (ref instanceof GenericService) {\r\n+            interfaceClass = GenericService.class;\r\n+            if (StringUtils.isEmpty(generic)) {\r\n+                generic = Boolean.TRUE.toString();\r\n+            }\r\n+        } else {\r\n+            try {\r\n+                interfaceClass = Class.forName(interfaceName, true, Thread.currentThread()\r\n+                        .getContextClassLoader());\r\n+            } catch (ClassNotFoundException e) {\r\n+                throw new IllegalStateException(e.getMessage(), e);\r\n+            }\r\n+            checkInterfaceAndMethods(interfaceClass, getMethods());\r\n+            checkRef();\r\n+            generic = Boolean.FALSE.toString();\r\n+        }\r\n+        if (local != null) {\r\n+            if (\"true\".equals(local)) {\r\n+                local = interfaceName + \"Local\";\r\n+            }\r\n+            Class<?> localClass;\r\n+            try {\r\n+                localClass = ClassUtils.forNameWithThreadContextClassLoader(local);\r\n+            } catch (ClassNotFoundException e) {\r\n+                throw new IllegalStateException(e.getMessage(), e);\r\n+            }\r\n+            if (!interfaceClass.isAssignableFrom(localClass)) {\r\n+                throw new IllegalStateException(\"The local implementation class \" + localClass.getName() + \" not implement interface \" + interfaceName);\r\n+            }\r\n+        }\r\n+        if (stub != null) {\r\n+            if (\"true\".equals(stub)) {\r\n+                stub = interfaceName + \"Stub\";\r\n+            }\r\n+            Class<?> stubClass;\r\n+            try {\r\n+                stubClass = ClassUtils.forNameWithThreadContextClassLoader(stub);\r\n+            } catch (ClassNotFoundException e) {\r\n+                throw new IllegalStateException(e.getMessage(), e);\r\n+            }\r\n+            if (!interfaceClass.isAssignableFrom(stubClass)) {\r\n+                throw new IllegalStateException(\"The stub implementation class \" + stubClass.getName() + \" not implement interface \" + interfaceName);\r\n+            }\r\n+        }\r\n+        checkStubAndLocal(interfaceClass);\r\n+        ConfigValidationUtils.checkMock(interfaceClass, this);\r\n+        ConfigValidationUtils.validateServiceConfig(this);\r\n+        postProcessConfig();\r\n+    }\r\n+\r\n+\r\n+    protected synchronized void doExport() {\r\n+        if (unexported) {\r\n+            throw new IllegalStateException(\"The service \" + interfaceClass.getName() + \" has already unexported!\");\r\n+        }\r\n+        if (exported) {\r\n+            return;\r\n+        }\r\n+        exported = true;\r\n+\r\n+        if (StringUtils.isEmpty(path)) {\r\n+            path = interfaceName;\r\n+        }\r\n+        doExportUrls();\r\n+        bootstrap.setReady(true);\r\n+    }\r\n+\r\n+    @SuppressWarnings({\"unchecked\", \"rawtypes\"})\r\n+    private void doExportUrls() {\r\n+        ServiceRepository repository = ApplicationModel.getServiceRepository();\r\n+        ServiceDescriptor serviceDescriptor = repository.registerService(getInterfaceClass());\r\n+        repository.registerProvider(\r\n+                getUniqueServiceName(),\r\n+                ref,\r\n+                serviceDescriptor,\r\n+                this,\r\n+                serviceMetadata\r\n+        );\r\n+\r\n+        List<URL> registryURLs = ConfigValidationUtils.loadRegistries(this, true);\r\n+\r\n+        for (ProtocolConfig protocolConfig : protocols) {\r\n+            String pathKey = URL.buildKey(getContextPath(protocolConfig)\r\n+                    .map(p -> p + \"/\" + path)\r\n+                    .orElse(path), group, version);\r\n+            // In case user specified path, register service one more time to map it to path.\r\n+            repository.registerService(pathKey, interfaceClass);\r\n+            doExportUrlsFor1Protocol(protocolConfig, registryURLs);\r\n+        }\r\n+    }\r\n+\r\n+    private void doExportUrlsFor1Protocol(ProtocolConfig protocolConfig, List<URL> registryURLs) {\r\n+        String name = protocolConfig.getName();\r\n+        if (StringUtils.isEmpty(name)) {\r\n+            name = DUBBO;\r\n+        }\r\n+\r\n+        Map<String, String> map = new HashMap<String, String>();\r\n+        map.put(SIDE_KEY, PROVIDER_SIDE);\r\n+\r\n+        ServiceConfig.appendRuntimeParameters(map);\r\n+        AbstractConfig.appendParameters(map, getMetrics());\r\n+        AbstractConfig.appendParameters(map, getApplication());\r\n+        AbstractConfig.appendParameters(map, getModule());\r\n+        // remove 'default.' prefix for configs from ProviderConfig\r\n+        // appendParameters(map, provider, Constants.DEFAULT_KEY);\r\n+        AbstractConfig.appendParameters(map, provider);\r\n+        AbstractConfig.appendParameters(map, protocolConfig);\r\n+        AbstractConfig.appendParameters(map, this);\r\n+        MetadataReportConfig metadataReportConfig = getMetadataReportConfig();\r\n+        if (metadataReportConfig != null && metadataReportConfig.isValid()) {\r\n+            map.putIfAbsent(METADATA_KEY, REMOTE_METADATA_STORAGE_TYPE);\r\n+        }\r\n+        if (CollectionUtils.isNotEmpty(getMethods())) {\r\n+            for (MethodConfig method : getMethods()) {\r\n+                AbstractConfig.appendParameters(map, method, method.getName());\r\n+                String retryKey = method.getName() + \".retry\";\r\n+                if (map.containsKey(retryKey)) {\r\n+                    String retryValue = map.remove(retryKey);\r\n+                    if (\"false\".equals(retryValue)) {\r\n+                        map.put(method.getName() + \".retries\", \"0\");\r\n+                    }\r\n+                }\r\n+                List<ArgumentConfig> arguments = method.getArguments();\r\n+                if (CollectionUtils.isNotEmpty(arguments)) {\r\n+                    for (ArgumentConfig argument : arguments) {\r\n+                        // convert argument type\r\n+                        if (argument.getType() != null && argument.getType().length() > 0) {\r\n+                            Method[] methods = interfaceClass.getMethods();\r\n+                            // visit all methods\r\n+                            if (methods.length > 0) {\r\n+                                for (int i = 0; i < methods.length; i++) {\r\n+                                    String methodName = methods[i].getName();\r\n+                                    // target the method, and get its signature\r\n+                                    if (methodName.equals(method.getName())) {\r\n+                                        Class<?>[] argtypes = methods[i].getParameterTypes();\r\n+                                        // one callback in the method\r\n+                                        if (argument.getIndex() != -1) {\r\n+                                            if (argtypes[argument.getIndex()].getName().equals(argument.getType())) {\r\n+                                                AbstractConfig.appendParameters(map, argument, method.getName() + \".\" + argument.getIndex());\r\n+                                            } else {\r\n+                                                throw new IllegalArgumentException(\"Argument config error : the index attribute and type attribute not match :index :\" + argument.getIndex() + \", type:\" + argument.getType());\r\n+                                            }\r\n+                                        } else {\r\n+                                            // multiple callbacks in the method\r\n+                                            for (int j = 0; j < argtypes.length; j++) {\r\n+                                                Class<?> argclazz = argtypes[j];\r\n+                                                if (argclazz.getName().equals(argument.getType())) {\r\n+                                                    AbstractConfig.appendParameters(map, argument, method.getName() + \".\" + j);\r\n+                                                    if (argument.getIndex() != -1 && argument.getIndex() != j) {\r\n+                                                        throw new IllegalArgumentException(\"Argument config error : the index attribute and type attribute not match :index :\" + argument.getIndex() + \", type:\" + argument.getType());\r\n+                                                    }\r\n+                                                }\r\n+                                            }\r\n+                                        }\r\n+                                    }\r\n+                                }\r\n+                            }\r\n+                        } else if (argument.getIndex() != -1) {\r\n+                            AbstractConfig.appendParameters(map, argument, method.getName() + \".\" + argument.getIndex());\r\n+                        } else {\r\n+                            throw new IllegalArgumentException(\"Argument config must set index or type attribute.eg: <dubbo:argument index='0' .../> or <dubbo:argument type=xxx .../>\");\r\n+                        }\r\n+\r\n+                    }\r\n+                }\r\n+            } // end of methods for\r\n+        }\r\n+\r\n+        if (ProtocolUtils.isGeneric(generic)) {\r\n+            map.put(GENERIC_KEY, generic);\r\n+            map.put(METHODS_KEY, ANY_VALUE);\r\n+        } else {\r\n+            String revision = Version.getVersion(interfaceClass, version);\r\n+            if (revision != null && revision.length() > 0) {\r\n+                map.put(REVISION_KEY, revision);\r\n+            }\r\n+\r\n+            String[] methods = Wrapper.getWrapper(interfaceClass).getMethodNames();\r\n+            if (methods.length == 0) {\r\n+                logger.warn(\"No method found in service interface \" + interfaceClass.getName());\r\n+                map.put(METHODS_KEY, ANY_VALUE);\r\n+            } else {\r\n+                map.put(METHODS_KEY, StringUtils.join(new HashSet<String>(Arrays.asList(methods)), \",\"));\r\n+            }\r\n+        }\r\n+\r\n+        /**\r\n+         * Here the token value configured by the provider is used to assign the value to ServiceConfig#token\r\n+         */\r\n+        if (ConfigUtils.isEmpty(token) && provider != null) {\r\n+            token = provider.getToken();\r\n+        }\r\n+\r\n+        if (!ConfigUtils.isEmpty(token)) {\r\n+            if (ConfigUtils.isDefault(token)) {\r\n+                map.put(TOKEN_KEY, UUID.randomUUID().toString());\r\n+            } else {\r\n+                map.put(TOKEN_KEY, token);\r\n+            }\r\n+        }\r\n+        //init serviceMetadata attachments\r\n+        serviceMetadata.getAttachments().putAll(map);\r\n+\r\n+        // export service\r\n+        String host = findConfigedHosts(protocolConfig, registryURLs, map);\r\n+        Integer port = findConfigedPorts(protocolConfig, name, map);\r\n+        URL url = new URL(name, host, port, getContextPath(protocolConfig).map(p -> p + \"/\" + path).orElse(path), map);\r\n+\r\n+        // You can customize Configurator to append extra parameters\r\n+        if (ExtensionLoader.getExtensionLoader(ConfiguratorFactory.class)\r\n+                .hasExtension(url.getProtocol())) {\r\n+            url = ExtensionLoader.getExtensionLoader(ConfiguratorFactory.class)\r\n+                    .getExtension(url.getProtocol()).getConfigurator(url).configure(url);\r\n+        }\r\n+\r\n+        String scope = url.getParameter(SCOPE_KEY);\r\n+        // don't export when none is configured\r\n+        if (!SCOPE_NONE.equalsIgnoreCase(scope)) {\r\n+\r\n+            // export to local if the config is not remote (export to remote only when config is remote)\r\n+            if (!SCOPE_REMOTE.equalsIgnoreCase(scope)) {\r\n+                exportLocal(url);\r\n+            }\r\n+            // export to remote if the config is not local (export to local only when config is local)\r\n+            if (!SCOPE_LOCAL.equalsIgnoreCase(scope)) {\r\n+                if (CollectionUtils.isNotEmpty(registryURLs)) {\r\n+                    for (URL registryURL : registryURLs) {\r\n+                        //if protocol is only injvm ,not register\r\n+                        if (LOCAL_PROTOCOL.equalsIgnoreCase(url.getProtocol())) {\r\n+                            continue;\r\n+                        }\r\n+                        url = url.addParameterIfAbsent(DYNAMIC_KEY, registryURL.getParameter(DYNAMIC_KEY));\r\n+                        URL monitorUrl = ConfigValidationUtils.loadMonitor(this, registryURL);\r\n+                        if (monitorUrl != null) {\r\n+                            url = url.addParameterAndEncoded(MONITOR_KEY, monitorUrl.toFullString());\r\n+                        }\r\n+                        if (logger.isInfoEnabled()) {\r\n+                            if (url.getParameter(REGISTER_KEY, true)) {\r\n+                                logger.info(\"Register dubbo service \" + interfaceClass.getName() + \" url \" + url + \" to registry \" + registryURL);\r\n+                            } else {\r\n+                                logger.info(\"Export dubbo service \" + interfaceClass.getName() + \" to url \" + url);\r\n+                            }\r\n+                        }\r\n+\r\n+                        // For providers, this is used to enable custom proxy to generate invoker\r\n+                        String proxy = url.getParameter(PROXY_KEY);\r\n+                        if (StringUtils.isNotEmpty(proxy)) {\r\n+                            registryURL = registryURL.addParameter(PROXY_KEY, proxy);\r\n+                        }\r\n+\r\n+                        Invoker<?> invoker = PROXY_FACTORY.getInvoker(ref, (Class) interfaceClass, registryURL.addParameterAndEncoded(EXPORT_KEY, url.toFullString()));\r\n+                        DelegateProviderMetaDataInvoker wrapperInvoker = new DelegateProviderMetaDataInvoker(invoker, this);\r\n+\r\n+                        Exporter<?> exporter = PROTOCOL.export(wrapperInvoker);\r\n+                        exporters.add(exporter);\r\n+                    }\r\n+                } else {\r\n+                    if (logger.isInfoEnabled()) {\r\n+                        logger.info(\"Export dubbo service \" + interfaceClass.getName() + \" to url \" + url);\r\n+                    }\r\n+                    Invoker<?> invoker = PROXY_FACTORY.getInvoker(ref, (Class) interfaceClass, url);\r\n+                    DelegateProviderMetaDataInvoker wrapperInvoker = new DelegateProviderMetaDataInvoker(invoker, this);\r\n+\r\n+                    Exporter<?> exporter = PROTOCOL.export(wrapperInvoker);\r\n+                    exporters.add(exporter);\r\n+                }\r\n+\r\n+                MetadataUtils.publishServiceDefinition(url);\r\n+            }\r\n+        }\r\n+        this.urls.add(url);\r\n+    }\r\n+\r\n+    @SuppressWarnings({\"unchecked\", \"rawtypes\"})\r\n+    /**\r\n+     * always export injvm\r\n+     */\r\n+    private void exportLocal(URL url) {\r\n+        URL local = URLBuilder.from(url)\r\n+                .setProtocol(LOCAL_PROTOCOL)\r\n+                .setHost(LOCALHOST_VALUE)\r\n+                .setPort(0)\r\n+                .build();\r\n+        Exporter<?> exporter = PROTOCOL.export(\r\n+                PROXY_FACTORY.getInvoker(ref, (Class) interfaceClass, local));\r\n+        exporters.add(exporter);\r\n+        logger.info(\"Export dubbo service \" + interfaceClass.getName() + \" to local registry url : \" + local);\r\n+    }\r\n+\r\n+    /**\r\n+     * Determine if it is injvm\r\n+     *\r\n+     * @return\r\n+     */\r\n+    private boolean isOnlyInJvm() {\r\n+        return getProtocols().size() == 1\r\n+                && LOCAL_PROTOCOL.equalsIgnoreCase(getProtocols().get(0).getName());\r\n+    }\r\n+\r\n+\r\n+    /**\r\n+     * Register & bind IP address for service provider, can be configured separately.\r\n+     * Configuration priority: environment variables -> java system properties -> host property in config file ->\r\n+     * /etc/hosts -> default network address -> first available network address\r\n+     *\r\n+     * @param protocolConfig\r\n+     * @param registryURLs\r\n+     * @param map\r\n+     * @return\r\n+     */\r\n+    private String findConfigedHosts(ProtocolConfig protocolConfig,\r\n+                                     List<URL> registryURLs,\r\n+                                     Map<String, String> map) {\r\n+        boolean anyhost = false;\r\n+\r\n+        String hostToBind = getValueFromConfig(protocolConfig, DUBBO_IP_TO_BIND);\r\n+        if (hostToBind != null && hostToBind.length() > 0 && isInvalidLocalHost(hostToBind)) {\r\n+            throw new IllegalArgumentException(\"Specified invalid bind ip from property:\" + DUBBO_IP_TO_BIND + \", value:\" + hostToBind);\r\n+        }\r\n+\r\n+        // if bind ip is not found in environment, keep looking up\r\n+        if (StringUtils.isEmpty(hostToBind)) {\r\n+            hostToBind = protocolConfig.getHost();\r\n+            if (provider != null && StringUtils.isEmpty(hostToBind)) {\r\n+                hostToBind = provider.getHost();\r\n+            }\r\n+            if (isInvalidLocalHost(hostToBind)) {\r\n+                anyhost = true;\r\n+                try {\r\n+                    logger.info(\"No valid ip found from environment, try to find valid host from DNS.\");\r\n+                    hostToBind = InetAddress.getLocalHost().getHostAddress();\r\n+                } catch (UnknownHostException e) {\r\n+                    logger.warn(e.getMessage(), e);\r\n+                }\r\n+                if (isInvalidLocalHost(hostToBind)) {\r\n+                    if (CollectionUtils.isNotEmpty(registryURLs)) {\r\n+                        for (URL registryURL : registryURLs) {\r\n+                            if (MULTICAST.equalsIgnoreCase(registryURL.getParameter(\"registry\"))) {\r\n+                                // skip multicast registry since we cannot connect to it via Socket\r\n+                                continue;\r\n+                            }\r\n+                            try (Socket socket = new Socket()) {\r\n+                                SocketAddress addr = new InetSocketAddress(registryURL.getHost(), registryURL.getPort());\r\n+                                socket.connect(addr, 1000);\r\n+                                hostToBind = socket.getLocalAddress().getHostAddress();\r\n+                                break;\r\n+                            } catch (Exception e) {\r\n+                                logger.warn(e.getMessage(), e);\r\n+                            }\r\n+                        }\r\n+                    }\r\n+                    if (isInvalidLocalHost(hostToBind)) {\r\n+                        hostToBind = getLocalHost();\r\n+                    }\r\n+                }\r\n+            }\r\n+        }\r\n+\r\n+        map.put(BIND_IP_KEY, hostToBind);\r\n+\r\n+        // registry ip is not used for bind ip by default\r\n+        String hostToRegistry = getValueFromConfig(protocolConfig, DUBBO_IP_TO_REGISTRY);\r\n+        if (hostToRegistry != null && hostToRegistry.length() > 0 && isInvalidLocalHost(hostToRegistry)) {\r\n+            throw new IllegalArgumentException(\"Specified invalid registry ip from property:\" + DUBBO_IP_TO_REGISTRY + \", value:\" + hostToRegistry);\r\n+        } else if (StringUtils.isEmpty(hostToRegistry)) {\r\n+            // bind ip is used as registry ip by default\r\n+            hostToRegistry = hostToBind;\r\n+        }\r\n+\r\n+        map.put(ANYHOST_KEY, String.valueOf(anyhost));\r\n+\r\n+        return hostToRegistry;\r\n+    }\r\n+\r\n+\r\n+    /**\r\n+     * Register port and bind port for the provider, can be configured separately\r\n+     * Configuration priority: environment variable -> java system properties -> port property in protocol config file\r\n+     * -> protocol default port\r\n+     *\r\n+     * @param protocolConfig\r\n+     * @param name\r\n+     * @return\r\n+     */\r\n+    private Integer findConfigedPorts(ProtocolConfig protocolConfig,\r\n+                                      String name,\r\n+                                      Map<String, String> map) {\r\n+        Integer portToBind = null;\r\n+\r\n+        // parse bind port from environment\r\n+        String port = getValueFromConfig(protocolConfig, DUBBO_PORT_TO_BIND);\r\n+        portToBind = parsePort(port);\r\n+\r\n+        // if there's no bind port found from environment, keep looking up.\r\n+        if (portToBind == null) {\r\n+            portToBind = protocolConfig.getPort();\r\n+            if (provider != null && (portToBind == null || portToBind == 0)) {\r\n+                portToBind = provider.getPort();\r\n+            }\r\n+            final int defaultPort = ExtensionLoader.getExtensionLoader(Protocol.class).getExtension(name).getDefaultPort();\r\n+            if (portToBind == null || portToBind == 0) {\r\n+                portToBind = defaultPort;\r\n+            }\r\n+            if (portToBind <= 0) {\r\n+                portToBind = getRandomPort(name);\r\n+                if (portToBind == null || portToBind < 0) {\r\n+                    portToBind = getAvailablePort(defaultPort);\r\n+                    putRandomPort(name, portToBind);\r\n+                }\r\n+            }\r\n+        }\r\n+\r\n+        // save bind port, used as url's key later\r\n+        map.put(BIND_PORT_KEY, String.valueOf(portToBind));\r\n+\r\n+        // registry port, not used as bind port by default\r\n+        String portToRegistryStr = getValueFromConfig(protocolConfig, DUBBO_PORT_TO_REGISTRY);\r\n+        Integer portToRegistry = parsePort(portToRegistryStr);\r\n+        if (portToRegistry == null) {\r\n+            portToRegistry = portToBind;\r\n+        }\r\n+\r\n+        return portToRegistry;\r\n+    }\r\n+\r\n+    private Integer parsePort(String configPort) {\r\n+        Integer port = null;\r\n+        if (configPort != null && configPort.length() > 0) {\r\n+            try {\r\n+                Integer intPort = Integer.parseInt(configPort);\r\n+                if (isInvalidPort(intPort)) {\r\n+                    throw new IllegalArgumentException(\"Specified invalid port from env value:\" + configPort);\r\n+                }\r\n+                port = intPort;\r\n+            } catch (Exception e) {\r\n+                throw new IllegalArgumentException(\"Specified invalid port from env value:\" + configPort);\r\n+            }\r\n+        }\r\n+        return port;\r\n+    }\r\n+\r\n+    private String getValueFromConfig(ProtocolConfig protocolConfig, String key) {\r\n+        String protocolPrefix = protocolConfig.getName().toUpperCase() + \"_\";\r\n+        String value = ConfigUtils.getSystemProperty(protocolPrefix + key);\r\n+        if (StringUtils.isEmpty(value)) {\r\n+            value = ConfigUtils.getSystemProperty(key);\r\n+        }\r\n+        return value;\r\n+    }\r\n+\r\n+    private Integer getRandomPort(String protocol) {\r\n+        protocol = protocol.toLowerCase();\r\n+        return RANDOM_PORT_MAP.getOrDefault(protocol, Integer.MIN_VALUE);\r\n+    }\r\n+\r\n+    private void putRandomPort(String protocol, Integer port) {\r\n+        protocol = protocol.toLowerCase();\r\n+        if (!RANDOM_PORT_MAP.containsKey(protocol)) {\r\n+            RANDOM_PORT_MAP.put(protocol, port);\r\n+            logger.warn(\"Use random available port(\" + port + \") for protocol \" + protocol);\r\n+        }\r\n+    }\r\n+\r\n+    private void postProcessConfig() {\r\n+        List<ConfigPostProcessor> configPostProcessors = ExtensionLoader.getExtensionLoader(ConfigPostProcessor.class)\r\n+                .getActivateExtension(URL.valueOf(\"configPostProcessor://\"), (String[]) null);\r\n+        configPostProcessors.forEach(component -> component.postProcessServiceConfig(this));\r\n+    }\r\n+\r\n+    /**\r\n+     * Dispatch an {@link Event event}\r\n+     *\r\n+     * @param event an {@link Event event}\r\n+     * @since 2.7.5\r\n+     */\r\n+    private void dispatch(Event event) {\r\n+        EventDispatcher.getDefaultExtension().dispatch(event);\r\n+    }\r\n+\r\n+    public DubboBootstrap getBootstrap() {\r\n+        return bootstrap;\r\n+    }\r\n+\r\n+    public void setBootstrap(DubboBootstrap bootstrap) {\r\n+        this.bootstrap = bootstrap;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/bootstrap/DubboBootstrap.java", "source2": "org/apache/dubbo/config/bootstrap/DubboBootstrap.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,1409 +1,1409 @@\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.config.bootstrap;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.config.ConfigurationUtils;\n-import org.apache.dubbo.common.config.Environment;\n-import org.apache.dubbo.common.config.configcenter.DynamicConfiguration;\n-import org.apache.dubbo.common.config.configcenter.DynamicConfigurationFactory;\n-import org.apache.dubbo.common.config.configcenter.wrapper.CompositeDynamicConfiguration;\n-import org.apache.dubbo.common.extension.ExtensionLoader;\n-import org.apache.dubbo.common.lang.ShutdownHookCallbacks;\n-import org.apache.dubbo.common.logger.Logger;\n-import org.apache.dubbo.common.logger.LoggerFactory;\n-import org.apache.dubbo.common.threadpool.concurrent.ScheduledCompletableFuture;\n-import org.apache.dubbo.common.threadpool.manager.ExecutorRepository;\n-import org.apache.dubbo.common.utils.ArrayUtils;\n-import org.apache.dubbo.common.utils.CollectionUtils;\n-import org.apache.dubbo.common.utils.StringUtils;\n-import org.apache.dubbo.config.ApplicationConfig;\n-import org.apache.dubbo.config.ConfigCenterConfig;\n-import org.apache.dubbo.config.ConsumerConfig;\n-import org.apache.dubbo.config.DubboShutdownHook;\n-import org.apache.dubbo.config.MetadataReportConfig;\n-import org.apache.dubbo.config.MetricsConfig;\n-import org.apache.dubbo.config.ModuleConfig;\n-import org.apache.dubbo.config.MonitorConfig;\n-import org.apache.dubbo.config.ProtocolConfig;\n-import org.apache.dubbo.config.ProviderConfig;\n-import org.apache.dubbo.config.ReferenceConfig;\n-import org.apache.dubbo.config.RegistryConfig;\n-import org.apache.dubbo.config.ServiceConfig;\n-import org.apache.dubbo.config.ServiceConfigBase;\n-import org.apache.dubbo.config.SslConfig;\n-import org.apache.dubbo.config.bootstrap.builders.ApplicationBuilder;\n-import org.apache.dubbo.config.bootstrap.builders.ConsumerBuilder;\n-import org.apache.dubbo.config.bootstrap.builders.ProtocolBuilder;\n-import org.apache.dubbo.config.bootstrap.builders.ProviderBuilder;\n-import org.apache.dubbo.config.bootstrap.builders.ReferenceBuilder;\n-import org.apache.dubbo.config.bootstrap.builders.RegistryBuilder;\n-import org.apache.dubbo.config.bootstrap.builders.ServiceBuilder;\n-import org.apache.dubbo.config.context.ConfigManager;\n-import org.apache.dubbo.config.metadata.ConfigurableMetadataServiceExporter;\n-import org.apache.dubbo.config.utils.ConfigValidationUtils;\n-import org.apache.dubbo.config.utils.ReferenceConfigCache;\n-import org.apache.dubbo.event.EventDispatcher;\n-import org.apache.dubbo.event.EventListener;\n-import org.apache.dubbo.event.GenericEventListener;\n-import org.apache.dubbo.metadata.MetadataService;\n-import org.apache.dubbo.metadata.MetadataServiceExporter;\n-import org.apache.dubbo.metadata.WritableMetadataService;\n-import org.apache.dubbo.metadata.report.MetadataReportFactory;\n-import org.apache.dubbo.metadata.report.MetadataReportInstance;\n-import org.apache.dubbo.registry.client.DefaultServiceInstance;\n-import org.apache.dubbo.registry.client.ServiceInstance;\n-import org.apache.dubbo.registry.client.ServiceInstanceCustomizer;\n-import org.apache.dubbo.registry.client.metadata.MetadataUtils;\n-import org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils;\n-import org.apache.dubbo.registry.client.metadata.store.InMemoryWritableMetadataService;\n-import org.apache.dubbo.registry.client.metadata.store.RemoteMetadataServiceImpl;\n-import org.apache.dubbo.registry.support.AbstractRegistryFactory;\n-import org.apache.dubbo.rpc.model.ApplicationModel;\n-\n-import java.io.IOException;\n-import java.util.ArrayList;\n-import java.util.Collection;\n-import java.util.HashMap;\n-import java.util.List;\n-import java.util.Set;\n-import java.util.SortedSet;\n-import java.util.concurrent.CompletableFuture;\n-import java.util.concurrent.ExecutorService;\n-import java.util.concurrent.Future;\n-import java.util.concurrent.TimeUnit;\n-import java.util.concurrent.atomic.AtomicBoolean;\n-import java.util.concurrent.locks.Condition;\n-import java.util.concurrent.locks.Lock;\n-import java.util.concurrent.locks.ReentrantLock;\n-import java.util.function.Consumer;\n-import java.util.function.Supplier;\n-\n-import static java.lang.String.format;\n-import static java.util.Collections.singletonList;\n-import static java.util.concurrent.Executors.newSingleThreadExecutor;\n-import static org.apache.dubbo.common.config.ConfigurationUtils.parseProperties;\n-import static org.apache.dubbo.common.config.configcenter.DynamicConfiguration.getDynamicConfiguration;\n-import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_METADATA_STORAGE_TYPE;\n-import static org.apache.dubbo.common.constants.CommonConstants.REGISTRY_SPLIT_PATTERN;\n-import static org.apache.dubbo.common.constants.CommonConstants.REMOTE_METADATA_STORAGE_TYPE;\n-import static org.apache.dubbo.common.extension.ExtensionLoader.getExtensionLoader;\n-import static org.apache.dubbo.common.function.ThrowableAction.execute;\n-import static org.apache.dubbo.common.utils.StringUtils.isEmpty;\n-import static org.apache.dubbo.common.utils.StringUtils.isNotEmpty;\n-import static org.apache.dubbo.metadata.MetadataConstants.DEFAULT_METADATA_PUBLISH_DELAY;\n-import static org.apache.dubbo.metadata.MetadataConstants.METADATA_PUBLISH_DELAY_KEY;\n-import static org.apache.dubbo.metadata.WritableMetadataService.getDefaultExtension;\n-import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.calInstanceRevision;\n-import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.setMetadataStorageType;\n-import static org.apache.dubbo.registry.support.AbstractRegistryFactory.getServiceDiscoveries;\n-import static org.apache.dubbo.remoting.Constants.CLIENT_KEY;\n-\n-/**\n- * See {@link ApplicationModel} and {@link ExtensionLoader} for why this class is designed to be singleton.\n- * <p>\n- * The bootstrap class of Dubbo\n- * <p>\n- * Get singleton instance by calling static method {@link #getInstance()}.\n- * Designed as singleton because some classes inside Dubbo, such as ExtensionLoader, are designed only for one instance per process.\n- *\n- * @since 2.7.5\n- */\n-public class DubboBootstrap extends GenericEventListener {\n-\n-    public static final String DEFAULT_REGISTRY_ID = \"REGISTRY#DEFAULT\";\n-\n-    public static final String DEFAULT_PROTOCOL_ID = \"PROTOCOL#DEFAULT\";\n-\n-    public static final String DEFAULT_SERVICE_ID = \"SERVICE#DEFAULT\";\n-\n-    public static final String DEFAULT_REFERENCE_ID = \"REFERENCE#DEFAULT\";\n-\n-    public static final String DEFAULT_PROVIDER_ID = \"PROVIDER#DEFAULT\";\n-\n-    public static final String DEFAULT_CONSUMER_ID = \"CONSUMER#DEFAULT\";\n-\n-    private static final String NAME = DubboBootstrap.class.getSimpleName();\n-\n-    private final Logger logger = LoggerFactory.getLogger(getClass());\n-\n-    private static volatile DubboBootstrap instance;\n-\n-    private final AtomicBoolean awaited = new AtomicBoolean(false);\n-\n-    private final Lock lock = new ReentrantLock();\n-\n-    private final Condition condition = lock.newCondition();\n-\n-    private final Lock destroyLock = new ReentrantLock();\n-\n-    private final ExecutorService executorService = newSingleThreadExecutor();\n-\n-    private final EventDispatcher eventDispatcher = EventDispatcher.getDefaultExtension();\n-\n-    private final ExecutorRepository executorRepository = getExtensionLoader(ExecutorRepository.class).getDefaultExtension();\n-\n-    private final ConfigManager configManager;\n-\n-    private final Environment environment;\n-\n-    private ReferenceConfigCache cache;\n-\n-    private volatile boolean exportAsync;\n-\n-    private volatile boolean referAsync;\n-\n-    private AtomicBoolean initialized = new AtomicBoolean(false);\n-\n-    private AtomicBoolean started = new AtomicBoolean(false);\n-\n-    private AtomicBoolean ready = new AtomicBoolean(false);\n-\n-    private AtomicBoolean destroyed = new AtomicBoolean(false);\n-\n-    private volatile ServiceInstance serviceInstance;\n-\n-    private volatile MetadataService metadataService;\n-\n-    private volatile MetadataServiceExporter metadataServiceExporter;\n-\n-    private List<ServiceConfigBase<?>> exportedServices = new ArrayList<>();\n-\n-    private List<Future<?>> asyncExportingFutures = new ArrayList<>();\n-\n-    private List<CompletableFuture<Object>> asyncReferringFutures = new ArrayList<>();\n-\n-    /**\n-     * See {@link ApplicationModel} and {@link ExtensionLoader} for why DubboBootstrap is designed to be singleton.\n-     */\n-    public static DubboBootstrap getInstance() {\n-        if (instance == null) {\n-            synchronized (DubboBootstrap.class) {\n-                if (instance == null) {\n-                    instance = new DubboBootstrap();\n-                }\n-            }\n-        }\n-        return instance;\n-    }\n-\n-    private DubboBootstrap() {\n-        configManager = ApplicationModel.getConfigManager();\n-        environment = ApplicationModel.getEnvironment();\n-\n-        DubboShutdownHook.getDubboShutdownHook().register();\n-        ShutdownHookCallbacks.INSTANCE.addCallback(DubboBootstrap.this::destroy);\n-    }\n-\n-    public void unRegisterShutdownHook() {\n-        DubboShutdownHook.getDubboShutdownHook().unregister();\n-    }\n-\n-    private boolean isOnlyRegisterProvider() {\n-        Boolean registerConsumer = getApplication().getRegisterConsumer();\n-        return registerConsumer == null || !registerConsumer;\n-    }\n-\n-    private String getMetadataType() {\n-        String type = getApplication().getMetadataType();\n-        if (StringUtils.isEmpty(type)) {\n-            type = DEFAULT_METADATA_STORAGE_TYPE;\n-        }\n-        return type;\n-    }\n-\n-    public DubboBootstrap metadataReport(MetadataReportConfig metadataReportConfig) {\n-        configManager.addMetadataReport(metadataReportConfig);\n-        return this;\n-    }\n-\n-    public DubboBootstrap metadataReports(List<MetadataReportConfig> metadataReportConfigs) {\n-        if (CollectionUtils.isEmpty(metadataReportConfigs)) {\n-            return this;\n-        }\n-\n-        configManager.addMetadataReports(metadataReportConfigs);\n-        return this;\n-    }\n-\n-    // {@link ApplicationConfig} correlative methods\n-\n-    /**\n-     * Set the name of application\n-     *\n-     * @param name the name of application\n-     * @return current {@link DubboBootstrap} instance\n-     */\n-    public DubboBootstrap application(String name) {\n-        return application(name, builder -> {\n-            // DO NOTHING\n-        });\n-    }\n-\n-    /**\n-     * Set the name of application and it's future build\n-     *\n-     * @param name            the name of application\n-     * @param consumerBuilder {@link ApplicationBuilder}\n-     * @return current {@link DubboBootstrap} instance\n-     */\n-    public DubboBootstrap application(String name, Consumer<ApplicationBuilder> consumerBuilder) {\n-        ApplicationBuilder builder = createApplicationBuilder(name);\n-        consumerBuilder.accept(builder);\n-        return application(builder.build());\n-    }\n-\n-    /**\n-     * Set the {@link ApplicationConfig}\n-     *\n-     * @param applicationConfig the {@link ApplicationConfig}\n-     * @return current {@link DubboBootstrap} instance\n-     */\n-    public DubboBootstrap application(ApplicationConfig applicationConfig) {\n-        configManager.setApplication(applicationConfig);\n-        return this;\n-    }\n-\n-\n-    // {@link RegistryConfig} correlative methods\n-\n-    /**\n-     * Add an instance of {@link RegistryConfig} with {@link #DEFAULT_REGISTRY_ID default ID}\n-     *\n-     * @param consumerBuilder the {@link Consumer} of {@link RegistryBuilder}\n-     * @return current {@link DubboBootstrap} instance\n-     */\n-    public DubboBootstrap registry(Consumer<RegistryBuilder> consumerBuilder) {\n-        return registry(DEFAULT_REGISTRY_ID, consumerBuilder);\n-    }\n-\n-    /**\n-     * Add an instance of {@link RegistryConfig} with the specified ID\n-     *\n-     * @param id              the {@link RegistryConfig#getId() id}  of {@link RegistryConfig}\n-     * @param consumerBuilder the {@link Consumer} of {@link RegistryBuilder}\n-     * @return current {@link DubboBootstrap} instance\n-     */\n-    public DubboBootstrap registry(String id, Consumer<RegistryBuilder> consumerBuilder) {\n-        RegistryBuilder builder = createRegistryBuilder(id);\n-        consumerBuilder.accept(builder);\n-        return registry(builder.build());\n-    }\n-\n-    /**\n-     * Add an instance of {@link RegistryConfig}\n-     *\n-     * @param registryConfig an instance of {@link RegistryConfig}\n-     * @return current {@link DubboBootstrap} instance\n-     */\n-    public DubboBootstrap registry(RegistryConfig registryConfig) {\n-        configManager.addRegistry(registryConfig);\n-        return this;\n-    }\n-\n-    /**\n-     * Add an instance of {@link RegistryConfig}\n-     *\n-     * @param registryConfigs the multiple instances of {@link RegistryConfig}\n-     * @return current {@link DubboBootstrap} instance\n-     */\n-    public DubboBootstrap registries(List<RegistryConfig> registryConfigs) {\n-        if (CollectionUtils.isEmpty(registryConfigs)) {\n-            return this;\n-        }\n-        registryConfigs.forEach(this::registry);\n-        return this;\n-    }\n-\n-\n-    // {@link ProtocolConfig} correlative methods\n-    public DubboBootstrap protocol(Consumer<ProtocolBuilder> consumerBuilder) {\n-        return protocol(DEFAULT_PROTOCOL_ID, consumerBuilder);\n-    }\n-\n-    public DubboBootstrap protocol(String id, Consumer<ProtocolBuilder> consumerBuilder) {\n-        ProtocolBuilder builder = createProtocolBuilder(id);\n-        consumerBuilder.accept(builder);\n-        return protocol(builder.build());\n-    }\n-\n-    public DubboBootstrap protocol(ProtocolConfig protocolConfig) {\n-        return protocols(singletonList(protocolConfig));\n-    }\n-\n-    public DubboBootstrap protocols(List<ProtocolConfig> protocolConfigs) {\n-        if (CollectionUtils.isEmpty(protocolConfigs)) {\n-            return this;\n-        }\n-        configManager.addProtocols(protocolConfigs);\n-        return this;\n-    }\n-\n-    // {@link ServiceConfig} correlative methods\n-    public <S> DubboBootstrap service(Consumer<ServiceBuilder<S>> consumerBuilder) {\n-        return service(DEFAULT_SERVICE_ID, consumerBuilder);\n-    }\n-\n-    public <S> DubboBootstrap service(String id, Consumer<ServiceBuilder<S>> consumerBuilder) {\n-        ServiceBuilder builder = createServiceBuilder(id);\n-        consumerBuilder.accept(builder);\n-        return service(builder.build());\n-    }\n-\n-    public DubboBootstrap service(ServiceConfig<?> serviceConfig) {\n-        configManager.addService(serviceConfig);\n-        return this;\n-    }\n-\n-    public DubboBootstrap services(List<ServiceConfig> serviceConfigs) {\n-        if (CollectionUtils.isEmpty(serviceConfigs)) {\n-            return this;\n-        }\n-        serviceConfigs.forEach(configManager::addService);\n-        return this;\n-    }\n-\n-    // {@link Reference} correlative methods\n-    public <S> DubboBootstrap reference(Consumer<ReferenceBuilder<S>> consumerBuilder) {\n-        return reference(DEFAULT_REFERENCE_ID, consumerBuilder);\n-    }\n-\n-    public <S> DubboBootstrap reference(String id, Consumer<ReferenceBuilder<S>> consumerBuilder) {\n-        ReferenceBuilder builder = createReferenceBuilder(id);\n-        consumerBuilder.accept(builder);\n-        return reference(builder.build());\n-    }\n-\n-    public DubboBootstrap reference(ReferenceConfig<?> referenceConfig) {\n-        configManager.addReference(referenceConfig);\n-        return this;\n-    }\n-\n-    public DubboBootstrap references(List<ReferenceConfig> referenceConfigs) {\n-        if (CollectionUtils.isEmpty(referenceConfigs)) {\n-            return this;\n-        }\n-\n-        referenceConfigs.forEach(configManager::addReference);\n-        return this;\n-    }\n-\n-    // {@link ProviderConfig} correlative methods\n-    public DubboBootstrap provider(Consumer<ProviderBuilder> builderConsumer) {\n-        return provider(DEFAULT_PROVIDER_ID, builderConsumer);\n-    }\n-\n-    public DubboBootstrap provider(String id, Consumer<ProviderBuilder> builderConsumer) {\n-        ProviderBuilder builder = createProviderBuilder(id);\n-        builderConsumer.accept(builder);\n-        return provider(builder.build());\n-    }\n-\n-    public DubboBootstrap provider(ProviderConfig providerConfig) {\n-        return providers(singletonList(providerConfig));\n-    }\n-\n-    public DubboBootstrap providers(List<ProviderConfig> providerConfigs) {\n-        if (CollectionUtils.isEmpty(providerConfigs)) {\n-            return this;\n-        }\n-\n-        providerConfigs.forEach(configManager::addProvider);\n-        return this;\n-    }\n-\n-    // {@link ConsumerConfig} correlative methods\n-    public DubboBootstrap consumer(Consumer<ConsumerBuilder> builderConsumer) {\n-        return consumer(DEFAULT_CONSUMER_ID, builderConsumer);\n-    }\n-\n-    public DubboBootstrap consumer(String id, Consumer<ConsumerBuilder> builderConsumer) {\n-        ConsumerBuilder builder = createConsumerBuilder(id);\n-        builderConsumer.accept(builder);\n-        return consumer(builder.build());\n-    }\n-\n-    public DubboBootstrap consumer(ConsumerConfig consumerConfig) {\n-        return consumers(singletonList(consumerConfig));\n-    }\n-\n-    public DubboBootstrap consumers(List<ConsumerConfig> consumerConfigs) {\n-        if (CollectionUtils.isEmpty(consumerConfigs)) {\n-            return this;\n-        }\n-\n-        consumerConfigs.forEach(configManager::addConsumer);\n-        return this;\n-    }\n-\n-    // {@link ConfigCenterConfig} correlative methods\n-    public DubboBootstrap configCenter(ConfigCenterConfig configCenterConfig) {\n-        return configCenters(singletonList(configCenterConfig));\n-    }\n-\n-    public DubboBootstrap configCenters(List<ConfigCenterConfig> configCenterConfigs) {\n-        if (CollectionUtils.isEmpty(configCenterConfigs)) {\n-            return this;\n-        }\n-        configManager.addConfigCenters(configCenterConfigs);\n-        return this;\n-    }\n-\n-    public DubboBootstrap monitor(MonitorConfig monitor) {\n-        configManager.setMonitor(monitor);\n-        return this;\n-    }\n-\n-    public DubboBootstrap metrics(MetricsConfig metrics) {\n-        configManager.setMetrics(metrics);\n-        return this;\n-    }\n-\n-    public DubboBootstrap module(ModuleConfig module) {\n-        configManager.setModule(module);\n-        return this;\n-    }\n-\n-    public DubboBootstrap ssl(SslConfig sslConfig) {\n-        configManager.setSsl(sslConfig);\n-        return this;\n-    }\n-\n-    public DubboBootstrap cache(ReferenceConfigCache cache) {\n-        this.cache = cache;\n-        return this;\n-    }\n-\n-    public ReferenceConfigCache getCache() {\n-        if (cache == null) {\n-            cache = ReferenceConfigCache.getCache();\n-        }\n-        return cache;\n-    }\n-\n-    public DubboBootstrap exportAsync() {\n-        this.exportAsync = true;\n-        return this;\n-    }\n-\n-    public DubboBootstrap referAsync() {\n-        this.referAsync = true;\n-        return this;\n-    }\n-\n-    @Deprecated\n-    public void init() {\n-        initialize();\n-    }\n-\n-    /**\n-     * Initialize\n-     */\n-    public void initialize() {\n-        if (!initialized.compareAndSet(false, true)) {\n-            return;\n-        }\n-\n-        ApplicationModel.initFrameworkExts();\n-\n-        startConfigCenter();\n-\n-        loadRemoteConfigs();\n-\n-        checkGlobalConfigs();\n-\n-        // @since 2.7.8\n-        startMetadataCenter();\n-\n-        initMetadataService();\n-\n-        initEventListener();\n-\n-        if (logger.isInfoEnabled()) {\n-            logger.info(NAME + \" has been initialized!\");\n-        }\n-    }\n-\n-    private void checkGlobalConfigs() {\n-        // check Application\n-        ConfigValidationUtils.validateApplicationConfig(getApplication());\n-\n-        // check Metadata\n-        Collection<MetadataReportConfig> metadatas = configManager.getMetadataConfigs();\n-        if (CollectionUtils.isEmpty(metadatas)) {\n-            MetadataReportConfig metadataReportConfig = new MetadataReportConfig();\n-            metadataReportConfig.refresh();\n-            if (metadataReportConfig.isValid()) {\n-                configManager.addMetadataReport(metadataReportConfig);\n-                metadatas = configManager.getMetadataConfigs();\n-            }\n-        }\n-        if (CollectionUtils.isNotEmpty(metadatas)) {\n-            for (MetadataReportConfig metadataReportConfig : metadatas) {\n-                metadataReportConfig.refresh();\n-                ConfigValidationUtils.validateMetadataConfig(metadataReportConfig);\n-            }\n-        }\n-\n-        // check Provider\n-        Collection<ProviderConfig> providers = configManager.getProviders();\n-        if (CollectionUtils.isEmpty(providers)) {\n-            configManager.getDefaultProvider().orElseGet(() -> {\n-                ProviderConfig providerConfig = new ProviderConfig();\n-                configManager.addProvider(providerConfig);\n-                providerConfig.refresh();\n-                return providerConfig;\n-            });\n-        }\n-        for (ProviderConfig providerConfig : configManager.getProviders()) {\n-            ConfigValidationUtils.validateProviderConfig(providerConfig);\n-        }\n-        // check Consumer\n-        Collection<ConsumerConfig> consumers = configManager.getConsumers();\n-        if (CollectionUtils.isEmpty(consumers)) {\n-            configManager.getDefaultConsumer().orElseGet(() -> {\n-                ConsumerConfig consumerConfig = new ConsumerConfig();\n-                configManager.addConsumer(consumerConfig);\n-                consumerConfig.refresh();\n-                return consumerConfig;\n-            });\n-        }\n-        for (ConsumerConfig consumerConfig : configManager.getConsumers()) {\n-            ConfigValidationUtils.validateConsumerConfig(consumerConfig);\n-        }\n-\n-        // check Monitor\n-        ConfigValidationUtils.validateMonitorConfig(getMonitor());\n-        // check Metrics\n-        ConfigValidationUtils.validateMetricsConfig(getMetrics());\n-        // check Module\n-        ConfigValidationUtils.validateModuleConfig(getModule());\n-        // check Ssl\n-        ConfigValidationUtils.validateSslConfig(getSsl());\n-    }\n-\n-    private void startConfigCenter() {\n-\n-        useRegistryAsConfigCenterIfNecessary();\n-\n-        Collection<ConfigCenterConfig> configCenters = configManager.getConfigCenters();\n-\n-        // check Config Center\n-        if (CollectionUtils.isEmpty(configCenters)) {\n-            ConfigCenterConfig configCenterConfig = new ConfigCenterConfig();\n-            configCenterConfig.refresh();\n-            if (configCenterConfig.isValid()) {\n-                configManager.addConfigCenter(configCenterConfig);\n-                configCenters = configManager.getConfigCenters();\n-            }\n-        } else {\n-            for (ConfigCenterConfig configCenterConfig : configCenters) {\n-                configCenterConfig.refresh();\n-                ConfigValidationUtils.validateConfigCenterConfig(configCenterConfig);\n-            }\n-        }\n-\n-        if (CollectionUtils.isNotEmpty(configCenters)) {\n-            CompositeDynamicConfiguration compositeDynamicConfiguration = new CompositeDynamicConfiguration();\n-            for (ConfigCenterConfig configCenter : configCenters) {\n-                compositeDynamicConfiguration.addConfiguration(prepareEnvironment(configCenter));\n-            }\n-            environment.setDynamicConfiguration(compositeDynamicConfiguration);\n-        }\n-        configManager.refreshAll();\n-    }\n-\n-    private void startMetadataCenter() {\n-\n-        useRegistryAsMetadataCenterIfNecessary();\n-\n-        ApplicationConfig applicationConfig = getApplication();\n-\n-        String metadataType = applicationConfig.getMetadataType();\n-        // FIXME, multiple metadata config support.\n-        Collection<MetadataReportConfig> metadataReportConfigs = configManager.getMetadataConfigs();\n-        if (CollectionUtils.isEmpty(metadataReportConfigs)) {\n-            if (REMOTE_METADATA_STORAGE_TYPE.equals(metadataType)) {\n-                throw new IllegalStateException(\"No MetadataConfig found, Metadata Center address is required when 'metadata=remote' is enabled.\");\n-            }\n-            return;\n-        }\n-\n-        for (MetadataReportConfig metadataReportConfig : metadataReportConfigs) {\n-            ConfigValidationUtils.validateMetadataConfig(metadataReportConfig);\n-            if (!metadataReportConfig.isValid()) {\n-                return;\n-            }\n-            MetadataReportInstance.init(metadataReportConfig);\n-        }\n-    }\n-\n-    /**\n-     * For compatibility purpose, use registry as the default config center when\n-     * there's no config center specified explicitly and\n-     * useAsConfigCenter of registryConfig is null or true\n-     */\n-    private void useRegistryAsConfigCenterIfNecessary() {\n-        // we use the loading status of DynamicConfiguration to decide whether ConfigCenter has been initiated.\n-        if (environment.getDynamicConfiguration().isPresent()) {\n-            return;\n-        }\n-\n-        if (CollectionUtils.isNotEmpty(configManager.getConfigCenters())) {\n-            return;\n-        }\n-\n-        configManager\n-                .getDefaultRegistries()\n-                .stream()\n-                .filter(this::isUsedRegistryAsConfigCenter)\n-                .map(this::registryAsConfigCenter)\n-                .forEach(configManager::addConfigCenter);\n-    }\n-\n-    private boolean isUsedRegistryAsConfigCenter(RegistryConfig registryConfig) {\n-        return isUsedRegistryAsCenter(registryConfig, registryConfig::getUseAsConfigCenter, \"config\",\n-                DynamicConfigurationFactory.class);\n-    }\n-\n-    private ConfigCenterConfig registryAsConfigCenter(RegistryConfig registryConfig) {\n-        String protocol = registryConfig.getProtocol();\n-        Integer port = registryConfig.getPort();\n-        String id = \"config-center-\" + protocol + \"-\" + port;\n-        ConfigCenterConfig cc = new ConfigCenterConfig();\n-        cc.setId(id);\n-        if (cc.getParameters() == null) {\n-            cc.setParameters(new HashMap<>());\n-        }\n-        if (registryConfig.getParameters() != null) {\n-            cc.getParameters().putAll(registryConfig.getParameters()); // copy the parameters\n-        }\n-        cc.getParameters().put(CLIENT_KEY, registryConfig.getClient());\n-        cc.setProtocol(protocol);\n-        cc.setPort(port);\n-        if (StringUtils.isNotEmpty(registryConfig.getGroup())) {\n-            cc.setGroup(registryConfig.getGroup());\n-        }\n-        cc.setAddress(getRegistryCompatibleAddress(registryConfig));\n-        cc.setNamespace(registryConfig.getGroup());\n-        cc.setUsername(registryConfig.getUsername());\n-        cc.setPassword(registryConfig.getPassword());\n-        if (registryConfig.getTimeout() != null) {\n-            cc.setTimeout(registryConfig.getTimeout().longValue());\n-        }\n-        cc.setHighestPriority(false);\n-        return cc;\n-    }\n-\n-    private void useRegistryAsMetadataCenterIfNecessary() {\n-\n-        Collection<MetadataReportConfig> metadataConfigs = configManager.getMetadataConfigs();\n-\n-        if (CollectionUtils.isNotEmpty(metadataConfigs)) {\n-            return;\n-        }\n-\n-        configManager\n-                .getDefaultRegistries()\n-                .stream()\n-                .filter(this::isUsedRegistryAsMetadataCenter)\n-                .map(this::registryAsMetadataCenter)\n-                .forEach(configManager::addMetadataReport);\n-\n-    }\n-\n-    private boolean isUsedRegistryAsMetadataCenter(RegistryConfig registryConfig) {\n-        return isUsedRegistryAsCenter(registryConfig, registryConfig::getUseAsMetadataCenter, \"metadata\",\n-                MetadataReportFactory.class);\n-    }\n-\n-    /**\n-     * Is used the specified registry as a center infrastructure\n-     *\n-     * @param registryConfig       the {@link RegistryConfig}\n-     * @param usedRegistryAsCenter the configured value on\n-     * @param centerType           the type name of center\n-     * @param extensionClass       an extension class of a center infrastructure\n-     * @return\n-     * @since 2.7.8\n-     */\n-    private boolean isUsedRegistryAsCenter(RegistryConfig registryConfig, Supplier<Boolean> usedRegistryAsCenter,\n-                                           String centerType,\n-                                           Class<?> extensionClass) {\n-        final boolean supported;\n-\n-        Boolean configuredValue = usedRegistryAsCenter.get();\n-        if (configuredValue != null) { // If configured, take its value.\n-            supported = configuredValue.booleanValue();\n-        } else {                       // Or check the extension existence\n-            String protocol = registryConfig.getProtocol();\n-            supported = supportsExtension(extensionClass, protocol);\n-            if (logger.isInfoEnabled()) {\n-                logger.info(format(\"No value is configured in the registry, the %s extension[name : %s] %s as the %s center\"\n-                        , extensionClass.getSimpleName(), protocol, supported ? \"supports\" : \"does not support\", centerType));\n-            }\n-        }\n-\n-        if (logger.isInfoEnabled()) {\n-            logger.info(format(\"The registry[%s] will be %s as the %s center\", registryConfig,\n-                    supported ? \"used\" : \"not used\", centerType));\n-        }\n-        return supported;\n-    }\n-\n-    /**\n-     * Supports the extension with the specified class and name\n-     *\n-     * @param extensionClass the {@link Class} of extension\n-     * @param name           the name of extension\n-     * @return if supports, return <code>true</code>, or <code>false</code>\n-     * @since 2.7.8\n-     */\n-    private boolean supportsExtension(Class<?> extensionClass, String name) {\n-        if (isNotEmpty(name)) {\n-            ExtensionLoader extensionLoader = getExtensionLoader(extensionClass);\n-            return extensionLoader.hasExtension(name);\n-        }\n-        return false;\n-    }\n-\n-    private MetadataReportConfig registryAsMetadataCenter(RegistryConfig registryConfig) {\n-        String protocol = registryConfig.getProtocol();\n-        Integer port = registryConfig.getPort();\n-        String id = \"metadata-center-\" + protocol + \"-\" + port;\n-        MetadataReportConfig metadataReportConfig = new MetadataReportConfig();\n-        metadataReportConfig.setId(id);\n-        if (metadataReportConfig.getParameters() == null) {\n-            metadataReportConfig.setParameters(new HashMap<>());\n-        }\n-        if (registryConfig.getParameters() != null) {\n-            metadataReportConfig.getParameters().putAll(registryConfig.getParameters()); // copy the parameters\n-        }\n-        metadataReportConfig.getParameters().put(CLIENT_KEY, registryConfig.getClient());\n-        metadataReportConfig.setGroup(registryConfig.getGroup());\n-        metadataReportConfig.setAddress(getRegistryCompatibleAddress(registryConfig));\n-        metadataReportConfig.setUsername(registryConfig.getUsername());\n-        metadataReportConfig.setPassword(registryConfig.getPassword());\n-        metadataReportConfig.setTimeout(registryConfig.getTimeout());\n-        return metadataReportConfig;\n-    }\n-\n-    private String getRegistryCompatibleAddress(RegistryConfig registryConfig) {\n-        String registryAddress = registryConfig.getAddress();\n-        String[] addresses = REGISTRY_SPLIT_PATTERN.split(registryAddress);\n-        if (ArrayUtils.isEmpty(addresses)) {\n-            throw new IllegalStateException(\"Invalid registry address found.\");\n-        }\n-        String address = addresses[0];\n-        // since 2.7.8\n-        // Issue : https://github.com/apache/dubbo/issues/6476\n-        StringBuilder metadataAddressBuilder = new StringBuilder();\n-        URL url = URL.valueOf(address);\n-        String protocolFromAddress = url.getProtocol();\n-        if (isEmpty(protocolFromAddress)) {\n-            // If the protocol from address is missing, is like :\n-            // \"dubbo.registry.address = 127.0.0.1:2181\"\n-            String protocolFromConfig = registryConfig.getProtocol();\n-            metadataAddressBuilder.append(protocolFromConfig).append(\"://\");\n-        }\n-        metadataAddressBuilder.append(address);\n-        return metadataAddressBuilder.toString();\n-    }\n-\n-    private void loadRemoteConfigs() {\n-        // registry ids to registry configs\n-        List<RegistryConfig> tmpRegistries = new ArrayList<>();\n-        Set<String> registryIds = configManager.getRegistryIds();\n-        registryIds.forEach(id -> {\n-            if (tmpRegistries.stream().noneMatch(reg -> reg.getId().equals(id))) {\n-                tmpRegistries.add(configManager.getRegistry(id).orElseGet(() -> {\n-                    RegistryConfig registryConfig = new RegistryConfig();\n-                    registryConfig.setId(id);\n-                    registryConfig.refresh();\n-                    return registryConfig;\n-                }));\n-            }\n-        });\n-\n-        configManager.addRegistries(tmpRegistries);\n-\n-        // protocol ids to protocol configs\n-        List<ProtocolConfig> tmpProtocols = new ArrayList<>();\n-        Set<String> protocolIds = configManager.getProtocolIds();\n-        protocolIds.forEach(id -> {\n-            if (tmpProtocols.stream().noneMatch(prot -> prot.getId().equals(id))) {\n-                tmpProtocols.add(configManager.getProtocol(id).orElseGet(() -> {\n-                    ProtocolConfig protocolConfig = new ProtocolConfig();\n-                    protocolConfig.setId(id);\n-                    protocolConfig.refresh();\n-                    return protocolConfig;\n-                }));\n-            }\n-        });\n-\n-        configManager.addProtocols(tmpProtocols);\n-    }\n-\n-\n-    /**\n-     * Initialize {@link MetadataService} from {@link WritableMetadataService}'s extension\n-     */\n-    private void initMetadataService() {\n-        this.metadataService = getDefaultExtension();\n-        this.metadataServiceExporter = new ConfigurableMetadataServiceExporter(metadataService);\n-    }\n-\n-    /**\n-     * Initialize {@link EventListener}\n-     */\n-    private void initEventListener() {\n-        // Add current instance into listeners\n-        addEventListener(this);\n-    }\n-\n-    /**\n-     * Start the bootstrap\n-     */\n-    public DubboBootstrap start() {\n-        if (started.compareAndSet(false, true)) {\n-            ready.set(false);\n-            initialize();\n-            if (logger.isInfoEnabled()) {\n-                logger.info(NAME + \" is starting...\");\n-            }\n-            // 1. export Dubbo Services\n-            exportServices();\n-\n-            // Not only provider register\n-            if (!isOnlyRegisterProvider() || hasExportedServices()) {\n-                // 2. export MetadataService\n-                exportMetadataService();\n-                //3. Register the local ServiceInstance if required\n-                registerServiceInstance();\n-            }\n-\n-            referServices();\n-            if (asyncExportingFutures.size() > 0) {\n-                new Thread(() -> {\n-                    try {\n-                        this.awaitFinish();\n-                    } catch (Exception e) {\n-                        logger.warn(NAME + \" exportAsync occurred an exception.\");\n-                    }\n-                    ready.set(true);\n-                    if (logger.isInfoEnabled()) {\n-                        logger.info(NAME + \" is ready.\");\n-                    }\n-                    ExtensionLoader<DubboBootstrapStartStopListener> exts = getExtensionLoader(DubboBootstrapStartStopListener.class);\n-                    exts.getSupportedExtensionInstances().forEach(ext -> ext.onStart(this));\n-                }).start();\n-            } else {\n-                ready.set(true);\n-                if (logger.isInfoEnabled()) {\n-                    logger.info(NAME + \" is ready.\");\n-                }\n-                ExtensionLoader<DubboBootstrapStartStopListener> exts = getExtensionLoader(DubboBootstrapStartStopListener.class);\n-                exts.getSupportedExtensionInstances().forEach(ext -> ext.onStart(this));\n-            }\n-            if (logger.isInfoEnabled()) {\n-                logger.info(NAME + \" has started.\");\n-            }\n-        }\n-        return this;\n-    }\n-\n-    private boolean hasExportedServices() {\n-        return !metadataService.getExportedURLs().isEmpty();\n-    }\n-\n-    /**\n-     * Block current thread to be await.\n-     *\n-     * @return {@link DubboBootstrap}\n-     */\n-    public DubboBootstrap await() {\n-        // if has been waited, no need to wait again, return immediately\n-        if (!awaited.get()) {\n-            if (!executorService.isShutdown()) {\n-                executeMutually(() -> {\n-                    while (!awaited.get()) {\n-                        if (logger.isInfoEnabled()) {\n-                            logger.info(NAME + \" awaiting ...\");\n-                        }\n-                        try {\n-                            condition.await();\n-                        } catch (InterruptedException e) {\n-                            Thread.currentThread().interrupt();\n-                        }\n-                    }\n-                });\n-            }\n-        }\n-        return this;\n-    }\n-\n-    public DubboBootstrap awaitFinish() throws Exception {\n-        logger.info(NAME + \" waiting services exporting / referring ...\");\n-        if (exportAsync && asyncExportingFutures.size() > 0) {\n-            CompletableFuture future = CompletableFuture.allOf(asyncExportingFutures.toArray(new CompletableFuture[0]));\n-            future.get();\n-        }\n-        if (referAsync && asyncReferringFutures.size() > 0) {\n-            CompletableFuture future = CompletableFuture.allOf(asyncReferringFutures.toArray(new CompletableFuture[0]));\n-            future.get();\n-        }\n-\n-        logger.info(\"Service export / refer finished.\");\n-        return this;\n-    }\n-\n-    public boolean isInitialized() {\n-        return initialized.get();\n-    }\n-\n-    public boolean isStarted() {\n-        return started.get();\n-    }\n-\n-    public boolean isReady() {\n-        return ready.get();\n-    }\n-\n-\n-    public DubboBootstrap stop() throws IllegalStateException {\n-        destroy();\n-        return this;\n-    }\n-    /* serve for builder apis, begin */\n-\n-    private ApplicationBuilder createApplicationBuilder(String name) {\n-        return new ApplicationBuilder().name(name);\n-    }\n-\n-    private RegistryBuilder createRegistryBuilder(String id) {\n-        return new RegistryBuilder().id(id);\n-    }\n-\n-    private ProtocolBuilder createProtocolBuilder(String id) {\n-        return new ProtocolBuilder().id(id);\n-    }\n-\n-    private ServiceBuilder createServiceBuilder(String id) {\n-        return new ServiceBuilder().id(id);\n-    }\n-\n-    private ReferenceBuilder createReferenceBuilder(String id) {\n-        return new ReferenceBuilder().id(id);\n-    }\n-\n-    private ProviderBuilder createProviderBuilder(String id) {\n-        return new ProviderBuilder().id(id);\n-    }\n-\n-    private ConsumerBuilder createConsumerBuilder(String id) {\n-        return new ConsumerBuilder().id(id);\n-    }\n-    /* serve for builder apis, end */\n-\n-    private DynamicConfiguration prepareEnvironment(ConfigCenterConfig configCenter) {\n-        if (configCenter.isValid()) {\n-            if (!configCenter.checkOrUpdateInited()) {\n-                return null;\n-            }\n-            DynamicConfiguration dynamicConfiguration = getDynamicConfiguration(configCenter.toUrl());\n-            String configContent = dynamicConfiguration.getProperties(configCenter.getConfigFile(), configCenter.getGroup());\n-\n-            String appGroup = getApplication().getName();\n-            String appConfigContent = null;\n-            if (isNotEmpty(appGroup)) {\n-                appConfigContent = dynamicConfiguration.getProperties\n-                        (isNotEmpty(configCenter.getAppConfigFile()) ? configCenter.getAppConfigFile() : configCenter.getConfigFile(),\n-                                appGroup\n-                        );\n-            }\n-            try {\n-                environment.setConfigCenterFirst(configCenter.isHighestPriority());\n-                environment.updateExternalConfigurationMap(parseProperties(configContent));\n-                environment.updateAppExternalConfigurationMap(parseProperties(appConfigContent));\n-            } catch (IOException e) {\n-                throw new IllegalStateException(\"Failed to parse configurations from Config Center.\", e);\n-            }\n-            return dynamicConfiguration;\n-        }\n-        return null;\n-    }\n-\n-    /**\n-     * Add an instance of {@link EventListener}\n-     *\n-     * @param listener {@link EventListener}\n-     * @return {@link DubboBootstrap}\n-     */\n-    public DubboBootstrap addEventListener(EventListener<?> listener) {\n-        eventDispatcher.addEventListener(listener);\n-        return this;\n-    }\n-\n-    /**\n-     * export {@link MetadataService}\n-     */\n-    private void exportMetadataService() {\n-        metadataServiceExporter.export();\n-    }\n-\n-    private void unexportMetadataService() {\n-        if (metadataServiceExporter != null && metadataServiceExporter.isExported()) {\n-            metadataServiceExporter.unexport();\n-        }\n-    }\n-\n-    private void exportServices() {\n-        configManager.getServices().forEach(sc -> {\n-            // TODO, compatible with ServiceConfig.export()\n-            ServiceConfig serviceConfig = (ServiceConfig) sc;\n-            serviceConfig.setBootstrap(this);\n-\n-            if (exportAsync) {\n-                ExecutorService executor = executorRepository.getServiceExporterExecutor();\n-                Future<?> future = executor.submit(() -> {\n-                    sc.export();\n-                    exportedServices.add(sc);\n-                });\n-                asyncExportingFutures.add(future);\n-            } else {\n-                sc.export();\n-                exportedServices.add(sc);\n-            }\n-        });\n-    }\n-\n-    private void unexportServices() {\n-        exportedServices.forEach(sc -> {\n-            configManager.removeConfig(sc);\n-            sc.unexport();\n-        });\n-\n-        asyncExportingFutures.forEach(future -> {\n-            if (!future.isDone()) {\n-                future.cancel(true);\n-            }\n-        });\n-        asyncExportingFutures.clear();\n-        exportedServices.clear();\n-    }\n-\n-    private void referServices() {\n-        if (cache == null) {\n-            cache = ReferenceConfigCache.getCache();\n-        }\n-\n-        configManager.getReferences().forEach(rc -> {\n-            // TODO, compatible with  ReferenceConfig.refer()\n-            ReferenceConfig referenceConfig = (ReferenceConfig) rc;\n-            referenceConfig.setBootstrap(this);\n-\n-            if (rc.shouldInit()) {\n-                if (referAsync) {\n-                    CompletableFuture<Object> future = ScheduledCompletableFuture.submit(\n-                            executorRepository.getServiceExporterExecutor(),\n-                            () -> cache.get(rc)\n-                    );\n-                    asyncReferringFutures.add(future);\n-                } else {\n-                    cache.get(rc);\n-                }\n-            }\n-        });\n-    }\n-\n-    private void unreferServices() {\n-        if (cache == null) {\n-            cache = ReferenceConfigCache.getCache();\n-        }\n-\n-        asyncReferringFutures.forEach(future -> {\n-            if (!future.isDone()) {\n-                future.cancel(true);\n-            }\n-        });\n-        asyncReferringFutures.clear();\n-        cache.destroyAll();\n-    }\n-\n-    private void registerServiceInstance() {\n-        if (CollectionUtils.isEmpty(getServiceDiscoveries())) {\n-            return;\n-        }\n-\n-        ApplicationConfig application = getApplication();\n-\n-        String serviceName = application.getName();\n-\n-        URL exportedURL = selectMetadataServiceExportedURL();\n-\n-        String host = exportedURL.getHost();\n-\n-        int port = exportedURL.getPort();\n-\n-        ServiceInstance serviceInstance = createServiceInstance(serviceName, host, port);\n-\n-        doRegisterServiceInstance(serviceInstance);\n-\n-        // scheduled task for updating Metadata and ServiceInstance\n-        executorRepository.nextScheduledExecutor().scheduleAtFixedRate(() -> {\n-            try {\n-                InMemoryWritableMetadataService localMetadataService = (InMemoryWritableMetadataService) WritableMetadataService.getDefaultExtension();\n-                localMetadataService.blockUntilUpdated();\n-                ServiceInstanceMetadataUtils.refreshMetadataAndInstance();\n-            } catch (Throwable e) {\n-                logger.error(\"refresh metadata and instance failed\", e);\n-            }\n-        }, 0, ConfigurationUtils.get(METADATA_PUBLISH_DELAY_KEY, DEFAULT_METADATA_PUBLISH_DELAY), TimeUnit.MILLISECONDS);\n-    }\n-\n-    private void doRegisterServiceInstance(ServiceInstance serviceInstance) {\n-        //FIXME\n-        if (logger.isInfoEnabled()) {\n-            logger.info(\"Start publishing metadata to remote center, this only makes sense for applications enabled remote metadata center.\");\n-        }\n-        publishMetadataToRemote(serviceInstance);\n-\n-        logger.info(\"Start registering instance address to registry.\");\n-        getServiceDiscoveries().forEach(serviceDiscovery ->\n-        {\n-            calInstanceRevision(serviceDiscovery, serviceInstance);\n-            if (logger.isDebugEnabled()) {\n-                logger.info(\"Start registering instance address to registry\" + serviceDiscovery.getUrl() + \", instance \" + serviceInstance);\n-            }\n-            // register metadata\n-            serviceDiscovery.register(serviceInstance);\n-        });\n-    }\n-\n-    private void publishMetadataToRemote(ServiceInstance serviceInstance) {\n-//        InMemoryWritableMetadataService localMetadataService = (InMemoryWritableMetadataService)WritableMetadataService.getDefaultExtension();\n-//        localMetadataService.blockUntilUpdated();\n-        RemoteMetadataServiceImpl remoteMetadataService = MetadataUtils.getRemoteMetadataService();\n-        remoteMetadataService.publishMetadata(serviceInstance.getServiceName());\n-    }\n-\n-    private URL selectMetadataServiceExportedURL() {\n-\n-        URL selectedURL = null;\n-\n-        SortedSet<String> urlValues = metadataService.getExportedURLs();\n-\n-        for (String urlValue : urlValues) {\n-            URL url = URL.valueOf(urlValue);\n-            if (MetadataService.class.getName().equals(url.getServiceInterface())) {\n-                continue;\n-            }\n-            if (\"rest\".equals(url.getProtocol())) { // REST first\n-                selectedURL = url;\n-                break;\n-            } else {\n-                selectedURL = url; // If not found, take any one\n-            }\n-        }\n-\n-        if (selectedURL == null && CollectionUtils.isNotEmpty(urlValues)) {\n-            selectedURL = URL.valueOf(urlValues.iterator().next());\n-        }\n-\n-        return selectedURL;\n-    }\n-\n-    private void unregisterServiceInstance() {\n-        if (serviceInstance != null) {\n-            getServiceDiscoveries().forEach(serviceDiscovery -> {\n-                serviceDiscovery.unregister(serviceInstance);\n-            });\n-        }\n-    }\n-\n-    private ServiceInstance createServiceInstance(String serviceName, String host, int port) {\n-        this.serviceInstance = new DefaultServiceInstance(serviceName, host, port);\n-        setMetadataStorageType(serviceInstance, getMetadataType());\n-\n-        ExtensionLoader<ServiceInstanceCustomizer> loader =\n-                ExtensionLoader.getExtensionLoader(ServiceInstanceCustomizer.class);\n-        // FIXME, sort customizer before apply\n-        loader.getSupportedExtensionInstances().forEach(customizer -> {\n-            // customizes\n-            customizer.customize(this.serviceInstance);\n-        });\n-\n-        return this.serviceInstance;\n-    }\n-\n-    public void destroy() {\n-        if (destroyLock.tryLock()) {\n-            try {\n-                DubboShutdownHook.destroyAll();\n-\n-                if (started.compareAndSet(true, false)\n-                        && destroyed.compareAndSet(false, true)) {\n-\n-                    unregisterServiceInstance();\n-                    unexportMetadataService();\n-                    unexportServices();\n-                    unreferServices();\n-\n-                    destroyRegistries();\n-\n-                    destroyServiceDiscoveries();\n-                    destroyExecutorRepository();\n-                    clear();\n-                    shutdown();\n-                    release();\n-                    ExtensionLoader<DubboBootstrapStartStopListener> exts = getExtensionLoader(DubboBootstrapStartStopListener.class);\n-                    exts.getSupportedExtensionInstances().forEach(ext -> ext.onStop(this));\n-                }\n-            } finally {\n-                destroyLock.unlock();\n-            }\n-        }\n-    }\n-\n-    private void destroyExecutorRepository() {\n-        ExtensionLoader.getExtensionLoader(ExecutorRepository.class).getDefaultExtension().destroyAll();\n-    }\n-\n-    private void destroyRegistries() {\n-        AbstractRegistryFactory.destroyAll();\n-    }\n-\n-    private void destroyServiceDiscoveries() {\n-        getServiceDiscoveries().forEach(serviceDiscovery -> {\n-            execute(serviceDiscovery::destroy);\n-        });\n-        if (logger.isDebugEnabled()) {\n-            logger.debug(NAME + \"'s all ServiceDiscoveries have been destroyed.\");\n-        }\n-    }\n-\n-    private void clear() {\n-        clearConfigs();\n-        clearApplicationModel();\n-    }\n-\n-    private void clearApplicationModel() {\n-\n-    }\n-\n-    private void clearConfigs() {\n-        configManager.destroy();\n-        if (logger.isDebugEnabled()) {\n-            logger.debug(NAME + \"'s configs have been clear.\");\n-        }\n-    }\n-\n-    private void release() {\n-        executeMutually(() -> {\n-            while (awaited.compareAndSet(false, true)) {\n-                if (logger.isInfoEnabled()) {\n-                    logger.info(NAME + \" is about to shutdown...\");\n-                }\n-                condition.signalAll();\n-            }\n-        });\n-    }\n-\n-    private void shutdown() {\n-        if (!executorService.isShutdown()) {\n-            // Shutdown executorService\n-            executorService.shutdown();\n-        }\n-    }\n-\n-    private void executeMutually(Runnable runnable) {\n-        try {\n-            lock.lock();\n-            runnable.run();\n-        } finally {\n-            lock.unlock();\n-        }\n-    }\n-\n-    public ApplicationConfig getApplication() {\n-        ApplicationConfig application = configManager\n-                .getApplication()\n-                .orElseGet(() -> {\n-                    ApplicationConfig applicationConfig = new ApplicationConfig();\n-                    configManager.setApplication(applicationConfig);\n-                    return applicationConfig;\n-                });\n-\n-        application.refresh();\n-        return application;\n-    }\n-\n-    private MonitorConfig getMonitor() {\n-        MonitorConfig monitor = configManager\n-                .getMonitor()\n-                .orElseGet(() -> {\n-                    MonitorConfig monitorConfig = new MonitorConfig();\n-                    configManager.setMonitor(monitorConfig);\n-                    return monitorConfig;\n-                });\n-\n-        monitor.refresh();\n-        return monitor;\n-    }\n-\n-    private MetricsConfig getMetrics() {\n-        MetricsConfig metrics = configManager\n-                .getMetrics()\n-                .orElseGet(() -> {\n-                    MetricsConfig metricsConfig = new MetricsConfig();\n-                    configManager.setMetrics(metricsConfig);\n-                    return metricsConfig;\n-                });\n-        metrics.refresh();\n-        return metrics;\n-    }\n-\n-    private ModuleConfig getModule() {\n-        ModuleConfig module = configManager\n-                .getModule()\n-                .orElseGet(() -> {\n-                    ModuleConfig moduleConfig = new ModuleConfig();\n-                    configManager.setModule(moduleConfig);\n-                    return moduleConfig;\n-                });\n-\n-        module.refresh();\n-        return module;\n-    }\n-\n-    private SslConfig getSsl() {\n-        SslConfig ssl = configManager\n-                .getSsl()\n-                .orElseGet(() -> {\n-                    SslConfig sslConfig = new SslConfig();\n-                    configManager.setSsl(sslConfig);\n-                    return sslConfig;\n-                });\n-\n-        ssl.refresh();\n-        return ssl;\n-    }\n-\n-    public void setReady(boolean ready) {\n-        this.ready.set(ready);\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.config.bootstrap;\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.config.Environment;\r\n+import org.apache.dubbo.common.config.configcenter.DynamicConfiguration;\r\n+import org.apache.dubbo.common.config.configcenter.DynamicConfigurationFactory;\r\n+import org.apache.dubbo.common.config.configcenter.wrapper.CompositeDynamicConfiguration;\r\n+import org.apache.dubbo.common.extension.ExtensionLoader;\r\n+import org.apache.dubbo.common.lang.ShutdownHookCallbacks;\r\n+import org.apache.dubbo.common.logger.Logger;\r\n+import org.apache.dubbo.common.logger.LoggerFactory;\r\n+import org.apache.dubbo.common.threadpool.concurrent.ScheduledCompletableFuture;\r\n+import org.apache.dubbo.common.threadpool.manager.ExecutorRepository;\r\n+import org.apache.dubbo.common.utils.ArrayUtils;\r\n+import org.apache.dubbo.common.utils.CollectionUtils;\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+import org.apache.dubbo.config.ApplicationConfig;\r\n+import org.apache.dubbo.config.ConfigCenterConfig;\r\n+import org.apache.dubbo.config.ConsumerConfig;\r\n+import org.apache.dubbo.config.DubboShutdownHook;\r\n+import org.apache.dubbo.config.MetadataReportConfig;\r\n+import org.apache.dubbo.config.MetricsConfig;\r\n+import org.apache.dubbo.config.ModuleConfig;\r\n+import org.apache.dubbo.config.MonitorConfig;\r\n+import org.apache.dubbo.config.ProtocolConfig;\r\n+import org.apache.dubbo.config.ProviderConfig;\r\n+import org.apache.dubbo.config.ReferenceConfig;\r\n+import org.apache.dubbo.config.RegistryConfig;\r\n+import org.apache.dubbo.config.ServiceConfig;\r\n+import org.apache.dubbo.config.ServiceConfigBase;\r\n+import org.apache.dubbo.config.SslConfig;\r\n+import org.apache.dubbo.config.bootstrap.builders.ApplicationBuilder;\r\n+import org.apache.dubbo.config.bootstrap.builders.ConsumerBuilder;\r\n+import org.apache.dubbo.config.bootstrap.builders.ProtocolBuilder;\r\n+import org.apache.dubbo.config.bootstrap.builders.ProviderBuilder;\r\n+import org.apache.dubbo.config.bootstrap.builders.ReferenceBuilder;\r\n+import org.apache.dubbo.config.bootstrap.builders.RegistryBuilder;\r\n+import org.apache.dubbo.config.bootstrap.builders.ServiceBuilder;\r\n+import org.apache.dubbo.config.context.ConfigManager;\r\n+import org.apache.dubbo.config.metadata.ConfigurableMetadataServiceExporter;\r\n+import org.apache.dubbo.config.utils.ConfigValidationUtils;\r\n+import org.apache.dubbo.config.utils.ReferenceConfigCache;\r\n+import org.apache.dubbo.event.EventDispatcher;\r\n+import org.apache.dubbo.event.EventListener;\r\n+import org.apache.dubbo.event.GenericEventListener;\r\n+import org.apache.dubbo.metadata.MetadataService;\r\n+import org.apache.dubbo.metadata.MetadataServiceExporter;\r\n+import org.apache.dubbo.metadata.WritableMetadataService;\r\n+import org.apache.dubbo.metadata.report.MetadataReportFactory;\r\n+import org.apache.dubbo.metadata.report.MetadataReportInstance;\r\n+import org.apache.dubbo.registry.client.DefaultServiceInstance;\r\n+import org.apache.dubbo.registry.client.ServiceInstance;\r\n+import org.apache.dubbo.registry.client.ServiceInstanceCustomizer;\r\n+import org.apache.dubbo.registry.client.metadata.MetadataUtils;\r\n+import org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils;\r\n+import org.apache.dubbo.registry.client.metadata.store.InMemoryWritableMetadataService;\r\n+import org.apache.dubbo.registry.client.metadata.store.RemoteMetadataServiceImpl;\r\n+import org.apache.dubbo.registry.support.AbstractRegistryFactory;\r\n+import org.apache.dubbo.rpc.model.ApplicationModel;\r\n+\r\n+import java.io.IOException;\r\n+import java.util.ArrayList;\r\n+import java.util.Collection;\r\n+import java.util.HashMap;\r\n+import java.util.List;\r\n+import java.util.Set;\r\n+import java.util.SortedSet;\r\n+import java.util.concurrent.CompletableFuture;\r\n+import java.util.concurrent.ExecutorService;\r\n+import java.util.concurrent.Future;\r\n+import java.util.concurrent.TimeUnit;\r\n+import java.util.concurrent.atomic.AtomicBoolean;\r\n+import java.util.concurrent.locks.Condition;\r\n+import java.util.concurrent.locks.Lock;\r\n+import java.util.concurrent.locks.ReentrantLock;\r\n+import java.util.function.Consumer;\r\n+import java.util.function.Supplier;\r\n+\r\n+import static java.lang.String.format;\r\n+import static java.util.Collections.singletonList;\r\n+import static java.util.concurrent.Executors.newSingleThreadExecutor;\r\n+import static org.apache.dubbo.common.config.ConfigurationUtils.parseProperties;\r\n+import static org.apache.dubbo.common.config.configcenter.DynamicConfiguration.getDynamicConfiguration;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_METADATA_STORAGE_TYPE;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.REGISTRY_SPLIT_PATTERN;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.REMOTE_METADATA_STORAGE_TYPE;\r\n+import static org.apache.dubbo.common.extension.ExtensionLoader.getExtensionLoader;\r\n+import static org.apache.dubbo.common.function.ThrowableAction.execute;\r\n+import static org.apache.dubbo.common.utils.StringUtils.isEmpty;\r\n+import static org.apache.dubbo.common.utils.StringUtils.isNotEmpty;\r\n+import static org.apache.dubbo.metadata.MetadataConstants.DEFAULT_METADATA_PUBLISH_DELAY;\r\n+import static org.apache.dubbo.metadata.MetadataConstants.METADATA_PUBLISH_DELAY_KEY;\r\n+import static org.apache.dubbo.metadata.WritableMetadataService.getDefaultExtension;\r\n+import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.calInstanceRevision;\r\n+import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.setMetadataStorageType;\r\n+import static org.apache.dubbo.registry.support.AbstractRegistryFactory.getServiceDiscoveries;\r\n+import static org.apache.dubbo.remoting.Constants.CLIENT_KEY;\r\n+\r\n+/**\r\n+ * See {@link ApplicationModel} and {@link ExtensionLoader} for why this class is designed to be singleton.\r\n+ * <p>\r\n+ * The bootstrap class of Dubbo\r\n+ * <p>\r\n+ * Get singleton instance by calling static method {@link #getInstance()}.\r\n+ * Designed as singleton because some classes inside Dubbo, such as ExtensionLoader, are designed only for one instance per process.\r\n+ *\r\n+ * @since 2.7.5\r\n+ */\r\n+public class DubboBootstrap extends GenericEventListener {\r\n+\r\n+    public static final String DEFAULT_REGISTRY_ID = \"REGISTRY#DEFAULT\";\r\n+\r\n+    public static final String DEFAULT_PROTOCOL_ID = \"PROTOCOL#DEFAULT\";\r\n+\r\n+    public static final String DEFAULT_SERVICE_ID = \"SERVICE#DEFAULT\";\r\n+\r\n+    public static final String DEFAULT_REFERENCE_ID = \"REFERENCE#DEFAULT\";\r\n+\r\n+    public static final String DEFAULT_PROVIDER_ID = \"PROVIDER#DEFAULT\";\r\n+\r\n+    public static final String DEFAULT_CONSUMER_ID = \"CONSUMER#DEFAULT\";\r\n+\r\n+    private static final String NAME = DubboBootstrap.class.getSimpleName();\r\n+\r\n+    private final Logger logger = LoggerFactory.getLogger(getClass());\r\n+\r\n+    private static volatile DubboBootstrap instance;\r\n+\r\n+    private final AtomicBoolean awaited = new AtomicBoolean(false);\r\n+\r\n+    private final Lock lock = new ReentrantLock();\r\n+\r\n+    private final Condition condition = lock.newCondition();\r\n+\r\n+    private final Lock destroyLock = new ReentrantLock();\r\n+\r\n+    private final ExecutorService executorService = newSingleThreadExecutor();\r\n+\r\n+    private final EventDispatcher eventDispatcher = EventDispatcher.getDefaultExtension();\r\n+\r\n+    private final ExecutorRepository executorRepository = getExtensionLoader(ExecutorRepository.class).getDefaultExtension();\r\n+\r\n+    private final ConfigManager configManager;\r\n+\r\n+    private final Environment environment;\r\n+\r\n+    private ReferenceConfigCache cache;\r\n+\r\n+    private volatile boolean exportAsync;\r\n+\r\n+    private volatile boolean referAsync;\r\n+\r\n+    private AtomicBoolean initialized = new AtomicBoolean(false);\r\n+\r\n+    private AtomicBoolean started = new AtomicBoolean(false);\r\n+\r\n+    private AtomicBoolean ready = new AtomicBoolean(false);\r\n+\r\n+    private AtomicBoolean destroyed = new AtomicBoolean(false);\r\n+\r\n+    private volatile ServiceInstance serviceInstance;\r\n+\r\n+    private volatile MetadataService metadataService;\r\n+\r\n+    private volatile MetadataServiceExporter metadataServiceExporter;\r\n+\r\n+    private List<ServiceConfigBase<?>> exportedServices = new ArrayList<>();\r\n+\r\n+    private List<Future<?>> asyncExportingFutures = new ArrayList<>();\r\n+\r\n+    private List<CompletableFuture<Object>> asyncReferringFutures = new ArrayList<>();\r\n+\r\n+    /**\r\n+     * See {@link ApplicationModel} and {@link ExtensionLoader} for why DubboBootstrap is designed to be singleton.\r\n+     */\r\n+    public static DubboBootstrap getInstance() {\r\n+        if (instance == null) {\r\n+            synchronized (DubboBootstrap.class) {\r\n+                if (instance == null) {\r\n+                    instance = new DubboBootstrap();\r\n+                }\r\n+            }\r\n+        }\r\n+        return instance;\r\n+    }\r\n+\r\n+    private DubboBootstrap() {\r\n+        configManager = ApplicationModel.getConfigManager();\r\n+        environment = ApplicationModel.getEnvironment();\r\n+\r\n+        DubboShutdownHook.getDubboShutdownHook().register();\r\n+        ShutdownHookCallbacks.INSTANCE.addCallback(DubboBootstrap.this::destroy);\r\n+    }\r\n+\r\n+    public void unRegisterShutdownHook() {\r\n+        DubboShutdownHook.getDubboShutdownHook().unregister();\r\n+    }\r\n+\r\n+    private boolean isOnlyRegisterProvider() {\r\n+        Boolean registerConsumer = getApplication().getRegisterConsumer();\r\n+        return registerConsumer == null || !registerConsumer;\r\n+    }\r\n+\r\n+    private String getMetadataType() {\r\n+        String type = getApplication().getMetadataType();\r\n+        if (StringUtils.isEmpty(type)) {\r\n+            type = DEFAULT_METADATA_STORAGE_TYPE;\r\n+        }\r\n+        return type;\r\n+    }\r\n+\r\n+    public DubboBootstrap metadataReport(MetadataReportConfig metadataReportConfig) {\r\n+        configManager.addMetadataReport(metadataReportConfig);\r\n+        return this;\r\n+    }\r\n+\r\n+    public DubboBootstrap metadataReports(List<MetadataReportConfig> metadataReportConfigs) {\r\n+        if (CollectionUtils.isEmpty(metadataReportConfigs)) {\r\n+            return this;\r\n+        }\r\n+\r\n+        configManager.addMetadataReports(metadataReportConfigs);\r\n+        return this;\r\n+    }\r\n+\r\n+    // {@link ApplicationConfig} correlative methods\r\n+\r\n+    /**\r\n+     * Set the name of application\r\n+     *\r\n+     * @param name the name of application\r\n+     * @return current {@link DubboBootstrap} instance\r\n+     */\r\n+    public DubboBootstrap application(String name) {\r\n+        return application(name, builder -> {\r\n+            // DO NOTHING\r\n+        });\r\n+    }\r\n+\r\n+    /**\r\n+     * Set the name of application and it's future build\r\n+     *\r\n+     * @param name            the name of application\r\n+     * @param consumerBuilder {@link ApplicationBuilder}\r\n+     * @return current {@link DubboBootstrap} instance\r\n+     */\r\n+    public DubboBootstrap application(String name, Consumer<ApplicationBuilder> consumerBuilder) {\r\n+        ApplicationBuilder builder = createApplicationBuilder(name);\r\n+        consumerBuilder.accept(builder);\r\n+        return application(builder.build());\r\n+    }\r\n+\r\n+    /**\r\n+     * Set the {@link ApplicationConfig}\r\n+     *\r\n+     * @param applicationConfig the {@link ApplicationConfig}\r\n+     * @return current {@link DubboBootstrap} instance\r\n+     */\r\n+    public DubboBootstrap application(ApplicationConfig applicationConfig) {\r\n+        configManager.setApplication(applicationConfig);\r\n+        return this;\r\n+    }\r\n+\r\n+\r\n+    // {@link RegistryConfig} correlative methods\r\n+\r\n+    /**\r\n+     * Add an instance of {@link RegistryConfig} with {@link #DEFAULT_REGISTRY_ID default ID}\r\n+     *\r\n+     * @param consumerBuilder the {@link Consumer} of {@link RegistryBuilder}\r\n+     * @return current {@link DubboBootstrap} instance\r\n+     */\r\n+    public DubboBootstrap registry(Consumer<RegistryBuilder> consumerBuilder) {\r\n+        return registry(DEFAULT_REGISTRY_ID, consumerBuilder);\r\n+    }\r\n+\r\n+    /**\r\n+     * Add an instance of {@link RegistryConfig} with the specified ID\r\n+     *\r\n+     * @param id              the {@link RegistryConfig#getId() id}  of {@link RegistryConfig}\r\n+     * @param consumerBuilder the {@link Consumer} of {@link RegistryBuilder}\r\n+     * @return current {@link DubboBootstrap} instance\r\n+     */\r\n+    public DubboBootstrap registry(String id, Consumer<RegistryBuilder> consumerBuilder) {\r\n+        RegistryBuilder builder = createRegistryBuilder(id);\r\n+        consumerBuilder.accept(builder);\r\n+        return registry(builder.build());\r\n+    }\r\n+\r\n+    /**\r\n+     * Add an instance of {@link RegistryConfig}\r\n+     *\r\n+     * @param registryConfig an instance of {@link RegistryConfig}\r\n+     * @return current {@link DubboBootstrap} instance\r\n+     */\r\n+    public DubboBootstrap registry(RegistryConfig registryConfig) {\r\n+        configManager.addRegistry(registryConfig);\r\n+        return this;\r\n+    }\r\n+\r\n+    /**\r\n+     * Add an instance of {@link RegistryConfig}\r\n+     *\r\n+     * @param registryConfigs the multiple instances of {@link RegistryConfig}\r\n+     * @return current {@link DubboBootstrap} instance\r\n+     */\r\n+    public DubboBootstrap registries(List<RegistryConfig> registryConfigs) {\r\n+        if (CollectionUtils.isEmpty(registryConfigs)) {\r\n+            return this;\r\n+        }\r\n+        registryConfigs.forEach(this::registry);\r\n+        return this;\r\n+    }\r\n+\r\n+\r\n+    // {@link ProtocolConfig} correlative methods\r\n+    public DubboBootstrap protocol(Consumer<ProtocolBuilder> consumerBuilder) {\r\n+        return protocol(DEFAULT_PROTOCOL_ID, consumerBuilder);\r\n+    }\r\n+\r\n+    public DubboBootstrap protocol(String id, Consumer<ProtocolBuilder> consumerBuilder) {\r\n+        ProtocolBuilder builder = createProtocolBuilder(id);\r\n+        consumerBuilder.accept(builder);\r\n+        return protocol(builder.build());\r\n+    }\r\n+\r\n+    public DubboBootstrap protocol(ProtocolConfig protocolConfig) {\r\n+        return protocols(singletonList(protocolConfig));\r\n+    }\r\n+\r\n+    public DubboBootstrap protocols(List<ProtocolConfig> protocolConfigs) {\r\n+        if (CollectionUtils.isEmpty(protocolConfigs)) {\r\n+            return this;\r\n+        }\r\n+        configManager.addProtocols(protocolConfigs);\r\n+        return this;\r\n+    }\r\n+\r\n+    // {@link ServiceConfig} correlative methods\r\n+    public <S> DubboBootstrap service(Consumer<ServiceBuilder<S>> consumerBuilder) {\r\n+        return service(DEFAULT_SERVICE_ID, consumerBuilder);\r\n+    }\r\n+\r\n+    public <S> DubboBootstrap service(String id, Consumer<ServiceBuilder<S>> consumerBuilder) {\r\n+        ServiceBuilder builder = createServiceBuilder(id);\r\n+        consumerBuilder.accept(builder);\r\n+        return service(builder.build());\r\n+    }\r\n+\r\n+    public DubboBootstrap service(ServiceConfig<?> serviceConfig) {\r\n+        configManager.addService(serviceConfig);\r\n+        return this;\r\n+    }\r\n+\r\n+    public DubboBootstrap services(List<ServiceConfig> serviceConfigs) {\r\n+        if (CollectionUtils.isEmpty(serviceConfigs)) {\r\n+            return this;\r\n+        }\r\n+        serviceConfigs.forEach(configManager::addService);\r\n+        return this;\r\n+    }\r\n+\r\n+    // {@link Reference} correlative methods\r\n+    public <S> DubboBootstrap reference(Consumer<ReferenceBuilder<S>> consumerBuilder) {\r\n+        return reference(DEFAULT_REFERENCE_ID, consumerBuilder);\r\n+    }\r\n+\r\n+    public <S> DubboBootstrap reference(String id, Consumer<ReferenceBuilder<S>> consumerBuilder) {\r\n+        ReferenceBuilder builder = createReferenceBuilder(id);\r\n+        consumerBuilder.accept(builder);\r\n+        return reference(builder.build());\r\n+    }\r\n+\r\n+    public DubboBootstrap reference(ReferenceConfig<?> referenceConfig) {\r\n+        configManager.addReference(referenceConfig);\r\n+        return this;\r\n+    }\r\n+\r\n+    public DubboBootstrap references(List<ReferenceConfig> referenceConfigs) {\r\n+        if (CollectionUtils.isEmpty(referenceConfigs)) {\r\n+            return this;\r\n+        }\r\n+\r\n+        referenceConfigs.forEach(configManager::addReference);\r\n+        return this;\r\n+    }\r\n+\r\n+    // {@link ProviderConfig} correlative methods\r\n+    public DubboBootstrap provider(Consumer<ProviderBuilder> builderConsumer) {\r\n+        return provider(DEFAULT_PROVIDER_ID, builderConsumer);\r\n+    }\r\n+\r\n+    public DubboBootstrap provider(String id, Consumer<ProviderBuilder> builderConsumer) {\r\n+        ProviderBuilder builder = createProviderBuilder(id);\r\n+        builderConsumer.accept(builder);\r\n+        return provider(builder.build());\r\n+    }\r\n+\r\n+    public DubboBootstrap provider(ProviderConfig providerConfig) {\r\n+        return providers(singletonList(providerConfig));\r\n+    }\r\n+\r\n+    public DubboBootstrap providers(List<ProviderConfig> providerConfigs) {\r\n+        if (CollectionUtils.isEmpty(providerConfigs)) {\r\n+            return this;\r\n+        }\r\n+\r\n+        providerConfigs.forEach(configManager::addProvider);\r\n+        return this;\r\n+    }\r\n+\r\n+    // {@link ConsumerConfig} correlative methods\r\n+    public DubboBootstrap consumer(Consumer<ConsumerBuilder> builderConsumer) {\r\n+        return consumer(DEFAULT_CONSUMER_ID, builderConsumer);\r\n+    }\r\n+\r\n+    public DubboBootstrap consumer(String id, Consumer<ConsumerBuilder> builderConsumer) {\r\n+        ConsumerBuilder builder = createConsumerBuilder(id);\r\n+        builderConsumer.accept(builder);\r\n+        return consumer(builder.build());\r\n+    }\r\n+\r\n+    public DubboBootstrap consumer(ConsumerConfig consumerConfig) {\r\n+        return consumers(singletonList(consumerConfig));\r\n+    }\r\n+\r\n+    public DubboBootstrap consumers(List<ConsumerConfig> consumerConfigs) {\r\n+        if (CollectionUtils.isEmpty(consumerConfigs)) {\r\n+            return this;\r\n+        }\r\n+\r\n+        consumerConfigs.forEach(configManager::addConsumer);\r\n+        return this;\r\n+    }\r\n+\r\n+    // {@link ConfigCenterConfig} correlative methods\r\n+    public DubboBootstrap configCenter(ConfigCenterConfig configCenterConfig) {\r\n+        return configCenters(singletonList(configCenterConfig));\r\n+    }\r\n+\r\n+    public DubboBootstrap configCenters(List<ConfigCenterConfig> configCenterConfigs) {\r\n+        if (CollectionUtils.isEmpty(configCenterConfigs)) {\r\n+            return this;\r\n+        }\r\n+        configManager.addConfigCenters(configCenterConfigs);\r\n+        return this;\r\n+    }\r\n+\r\n+    public DubboBootstrap monitor(MonitorConfig monitor) {\r\n+        configManager.setMonitor(monitor);\r\n+        return this;\r\n+    }\r\n+\r\n+    public DubboBootstrap metrics(MetricsConfig metrics) {\r\n+        configManager.setMetrics(metrics);\r\n+        return this;\r\n+    }\r\n+\r\n+    public DubboBootstrap module(ModuleConfig module) {\r\n+        configManager.setModule(module);\r\n+        return this;\r\n+    }\r\n+\r\n+    public DubboBootstrap ssl(SslConfig sslConfig) {\r\n+        configManager.setSsl(sslConfig);\r\n+        return this;\r\n+    }\r\n+\r\n+    public DubboBootstrap cache(ReferenceConfigCache cache) {\r\n+        this.cache = cache;\r\n+        return this;\r\n+    }\r\n+\r\n+    public ReferenceConfigCache getCache() {\r\n+        if (cache == null) {\r\n+            cache = ReferenceConfigCache.getCache();\r\n+        }\r\n+        return cache;\r\n+    }\r\n+\r\n+    public DubboBootstrap exportAsync() {\r\n+        this.exportAsync = true;\r\n+        return this;\r\n+    }\r\n+\r\n+    public DubboBootstrap referAsync() {\r\n+        this.referAsync = true;\r\n+        return this;\r\n+    }\r\n+\r\n+    @Deprecated\r\n+    public void init() {\r\n+        initialize();\r\n+    }\r\n+\r\n+    /**\r\n+     * Initialize\r\n+     */\r\n+    public void initialize() {\r\n+        if (!initialized.compareAndSet(false, true)) {\r\n+            return;\r\n+        }\r\n+\r\n+        ApplicationModel.initFrameworkExts();\r\n+\r\n+        startConfigCenter();\r\n+\r\n+        loadRemoteConfigs();\r\n+\r\n+        checkGlobalConfigs();\r\n+\r\n+        // @since 2.7.8\r\n+        startMetadataCenter();\r\n+\r\n+        initMetadataService();\r\n+\r\n+        initEventListener();\r\n+\r\n+        if (logger.isInfoEnabled()) {\r\n+            logger.info(NAME + \" has been initialized!\");\r\n+        }\r\n+    }\r\n+\r\n+    private void checkGlobalConfigs() {\r\n+        // check Application\r\n+        ConfigValidationUtils.validateApplicationConfig(getApplication());\r\n+\r\n+        // check Metadata\r\n+        Collection<MetadataReportConfig> metadatas = configManager.getMetadataConfigs();\r\n+        if (CollectionUtils.isEmpty(metadatas)) {\r\n+            MetadataReportConfig metadataReportConfig = new MetadataReportConfig();\r\n+            metadataReportConfig.refresh();\r\n+            if (metadataReportConfig.isValid()) {\r\n+                configManager.addMetadataReport(metadataReportConfig);\r\n+                metadatas = configManager.getMetadataConfigs();\r\n+            }\r\n+        }\r\n+        if (CollectionUtils.isNotEmpty(metadatas)) {\r\n+            for (MetadataReportConfig metadataReportConfig : metadatas) {\r\n+                metadataReportConfig.refresh();\r\n+                ConfigValidationUtils.validateMetadataConfig(metadataReportConfig);\r\n+            }\r\n+        }\r\n+\r\n+        // check Provider\r\n+        Collection<ProviderConfig> providers = configManager.getProviders();\r\n+        if (CollectionUtils.isEmpty(providers)) {\r\n+            configManager.getDefaultProvider().orElseGet(() -> {\r\n+                ProviderConfig providerConfig = new ProviderConfig();\r\n+                configManager.addProvider(providerConfig);\r\n+                providerConfig.refresh();\r\n+                return providerConfig;\r\n+            });\r\n+        }\r\n+        for (ProviderConfig providerConfig : configManager.getProviders()) {\r\n+            ConfigValidationUtils.validateProviderConfig(providerConfig);\r\n+        }\r\n+        // check Consumer\r\n+        Collection<ConsumerConfig> consumers = configManager.getConsumers();\r\n+        if (CollectionUtils.isEmpty(consumers)) {\r\n+            configManager.getDefaultConsumer().orElseGet(() -> {\r\n+                ConsumerConfig consumerConfig = new ConsumerConfig();\r\n+                configManager.addConsumer(consumerConfig);\r\n+                consumerConfig.refresh();\r\n+                return consumerConfig;\r\n+            });\r\n+        }\r\n+        for (ConsumerConfig consumerConfig : configManager.getConsumers()) {\r\n+            ConfigValidationUtils.validateConsumerConfig(consumerConfig);\r\n+        }\r\n+\r\n+        // check Monitor\r\n+        ConfigValidationUtils.validateMonitorConfig(getMonitor());\r\n+        // check Metrics\r\n+        ConfigValidationUtils.validateMetricsConfig(getMetrics());\r\n+        // check Module\r\n+        ConfigValidationUtils.validateModuleConfig(getModule());\r\n+        // check Ssl\r\n+        ConfigValidationUtils.validateSslConfig(getSsl());\r\n+    }\r\n+\r\n+    private void startConfigCenter() {\r\n+\r\n+        useRegistryAsConfigCenterIfNecessary();\r\n+\r\n+        Collection<ConfigCenterConfig> configCenters = configManager.getConfigCenters();\r\n+\r\n+        // check Config Center\r\n+        if (CollectionUtils.isEmpty(configCenters)) {\r\n+            ConfigCenterConfig configCenterConfig = new ConfigCenterConfig();\r\n+            configCenterConfig.refresh();\r\n+            if (configCenterConfig.isValid()) {\r\n+                configManager.addConfigCenter(configCenterConfig);\r\n+                configCenters = configManager.getConfigCenters();\r\n+            }\r\n+        } else {\r\n+            for (ConfigCenterConfig configCenterConfig : configCenters) {\r\n+                configCenterConfig.refresh();\r\n+                ConfigValidationUtils.validateConfigCenterConfig(configCenterConfig);\r\n+            }\r\n+        }\r\n+\r\n+        if (CollectionUtils.isNotEmpty(configCenters)) {\r\n+            CompositeDynamicConfiguration compositeDynamicConfiguration = new CompositeDynamicConfiguration();\r\n+            for (ConfigCenterConfig configCenter : configCenters) {\r\n+                compositeDynamicConfiguration.addConfiguration(prepareEnvironment(configCenter));\r\n+            }\r\n+            environment.setDynamicConfiguration(compositeDynamicConfiguration);\r\n+        }\r\n+        configManager.refreshAll();\r\n+    }\r\n+\r\n+    private void startMetadataCenter() {\r\n+\r\n+        useRegistryAsMetadataCenterIfNecessary();\r\n+\r\n+        ApplicationConfig applicationConfig = getApplication();\r\n+\r\n+        String metadataType = applicationConfig.getMetadataType();\r\n+        // FIXME, multiple metadata config support.\r\n+        Collection<MetadataReportConfig> metadataReportConfigs = configManager.getMetadataConfigs();\r\n+        if (CollectionUtils.isEmpty(metadataReportConfigs)) {\r\n+            if (REMOTE_METADATA_STORAGE_TYPE.equals(metadataType)) {\r\n+                throw new IllegalStateException(\"No MetadataConfig found, Metadata Center address is required when 'metadata=remote' is enabled.\");\r\n+            }\r\n+            return;\r\n+        }\r\n+\r\n+        for (MetadataReportConfig metadataReportConfig : metadataReportConfigs) {\r\n+            ConfigValidationUtils.validateMetadataConfig(metadataReportConfig);\r\n+            if (!metadataReportConfig.isValid()) {\r\n+                return;\r\n+            }\r\n+            MetadataReportInstance.init(metadataReportConfig);\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * For compatibility purpose, use registry as the default config center when\r\n+     * there's no config center specified explicitly and\r\n+     * useAsConfigCenter of registryConfig is null or true\r\n+     */\r\n+    private void useRegistryAsConfigCenterIfNecessary() {\r\n+        // we use the loading status of DynamicConfiguration to decide whether ConfigCenter has been initiated.\r\n+        if (environment.getDynamicConfiguration().isPresent()) {\r\n+            return;\r\n+        }\r\n+\r\n+        if (CollectionUtils.isNotEmpty(configManager.getConfigCenters())) {\r\n+            return;\r\n+        }\r\n+\r\n+        configManager\r\n+                .getDefaultRegistries()\r\n+                .stream()\r\n+                .filter(this::isUsedRegistryAsConfigCenter)\r\n+                .map(this::registryAsConfigCenter)\r\n+                .forEach(configManager::addConfigCenter);\r\n+    }\r\n+\r\n+    private boolean isUsedRegistryAsConfigCenter(RegistryConfig registryConfig) {\r\n+        return isUsedRegistryAsCenter(registryConfig, registryConfig::getUseAsConfigCenter, \"config\",\r\n+                DynamicConfigurationFactory.class);\r\n+    }\r\n+\r\n+    private ConfigCenterConfig registryAsConfigCenter(RegistryConfig registryConfig) {\r\n+        String protocol = registryConfig.getProtocol();\r\n+        Integer port = registryConfig.getPort();\r\n+        String id = \"config-center-\" + protocol + \"-\" + port;\r\n+        ConfigCenterConfig cc = new ConfigCenterConfig();\r\n+        cc.setId(id);\r\n+        if (cc.getParameters() == null) {\r\n+            cc.setParameters(new HashMap<>());\r\n+        }\r\n+        if (registryConfig.getParameters() != null) {\r\n+            cc.getParameters().putAll(registryConfig.getParameters()); // copy the parameters\r\n+        }\r\n+        cc.getParameters().put(CLIENT_KEY, registryConfig.getClient());\r\n+        cc.setProtocol(protocol);\r\n+        cc.setPort(port);\r\n+        if (StringUtils.isNotEmpty(registryConfig.getGroup())) {\r\n+            cc.setGroup(registryConfig.getGroup());\r\n+        }\r\n+        cc.setAddress(getRegistryCompatibleAddress(registryConfig));\r\n+        cc.setNamespace(registryConfig.getGroup());\r\n+        cc.setUsername(registryConfig.getUsername());\r\n+        cc.setPassword(registryConfig.getPassword());\r\n+        if (registryConfig.getTimeout() != null) {\r\n+            cc.setTimeout(registryConfig.getTimeout().longValue());\r\n+        }\r\n+        cc.setHighestPriority(false);\r\n+        return cc;\r\n+    }\r\n+\r\n+    private void useRegistryAsMetadataCenterIfNecessary() {\r\n+\r\n+        Collection<MetadataReportConfig> metadataConfigs = configManager.getMetadataConfigs();\r\n+\r\n+        if (CollectionUtils.isNotEmpty(metadataConfigs)) {\r\n+            return;\r\n+        }\r\n+\r\n+        configManager\r\n+                .getDefaultRegistries()\r\n+                .stream()\r\n+                .filter(this::isUsedRegistryAsMetadataCenter)\r\n+                .map(this::registryAsMetadataCenter)\r\n+                .forEach(configManager::addMetadataReport);\r\n+\r\n+    }\r\n+\r\n+    private boolean isUsedRegistryAsMetadataCenter(RegistryConfig registryConfig) {\r\n+        return isUsedRegistryAsCenter(registryConfig, registryConfig::getUseAsMetadataCenter, \"metadata\",\r\n+                MetadataReportFactory.class);\r\n+    }\r\n+\r\n+    /**\r\n+     * Is used the specified registry as a center infrastructure\r\n+     *\r\n+     * @param registryConfig       the {@link RegistryConfig}\r\n+     * @param usedRegistryAsCenter the configured value on\r\n+     * @param centerType           the type name of center\r\n+     * @param extensionClass       an extension class of a center infrastructure\r\n+     * @return\r\n+     * @since 2.7.8\r\n+     */\r\n+    private boolean isUsedRegistryAsCenter(RegistryConfig registryConfig, Supplier<Boolean> usedRegistryAsCenter,\r\n+                                           String centerType,\r\n+                                           Class<?> extensionClass) {\r\n+        final boolean supported;\r\n+\r\n+        Boolean configuredValue = usedRegistryAsCenter.get();\r\n+        if (configuredValue != null) { // If configured, take its value.\r\n+            supported = configuredValue.booleanValue();\r\n+        } else {                       // Or check the extension existence\r\n+            String protocol = registryConfig.getProtocol();\r\n+            supported = supportsExtension(extensionClass, protocol);\r\n+            if (logger.isInfoEnabled()) {\r\n+                logger.info(format(\"No value is configured in the registry, the %s extension[name : %s] %s as the %s center\"\r\n+                        , extensionClass.getSimpleName(), protocol, supported ? \"supports\" : \"does not support\", centerType));\r\n+            }\r\n+        }\r\n+\r\n+        if (logger.isInfoEnabled()) {\r\n+            logger.info(format(\"The registry[%s] will be %s as the %s center\", registryConfig,\r\n+                    supported ? \"used\" : \"not used\", centerType));\r\n+        }\r\n+        return supported;\r\n+    }\r\n+\r\n+    /**\r\n+     * Supports the extension with the specified class and name\r\n+     *\r\n+     * @param extensionClass the {@link Class} of extension\r\n+     * @param name           the name of extension\r\n+     * @return if supports, return <code>true</code>, or <code>false</code>\r\n+     * @since 2.7.8\r\n+     */\r\n+    private boolean supportsExtension(Class<?> extensionClass, String name) {\r\n+        if (isNotEmpty(name)) {\r\n+            ExtensionLoader extensionLoader = getExtensionLoader(extensionClass);\r\n+            return extensionLoader.hasExtension(name);\r\n+        }\r\n+        return false;\r\n+    }\r\n+\r\n+    private MetadataReportConfig registryAsMetadataCenter(RegistryConfig registryConfig) {\r\n+        String protocol = registryConfig.getProtocol();\r\n+        Integer port = registryConfig.getPort();\r\n+        String id = \"metadata-center-\" + protocol + \"-\" + port;\r\n+        MetadataReportConfig metadataReportConfig = new MetadataReportConfig();\r\n+        metadataReportConfig.setId(id);\r\n+        if (metadataReportConfig.getParameters() == null) {\r\n+            metadataReportConfig.setParameters(new HashMap<>());\r\n+        }\r\n+        if (registryConfig.getParameters() != null) {\r\n+            metadataReportConfig.getParameters().putAll(registryConfig.getParameters()); // copy the parameters\r\n+        }\r\n+        metadataReportConfig.getParameters().put(CLIENT_KEY, registryConfig.getClient());\r\n+        metadataReportConfig.setGroup(registryConfig.getGroup());\r\n+        metadataReportConfig.setAddress(getRegistryCompatibleAddress(registryConfig));\r\n+        metadataReportConfig.setUsername(registryConfig.getUsername());\r\n+        metadataReportConfig.setPassword(registryConfig.getPassword());\r\n+        metadataReportConfig.setTimeout(registryConfig.getTimeout());\r\n+        return metadataReportConfig;\r\n+    }\r\n+\r\n+    private String getRegistryCompatibleAddress(RegistryConfig registryConfig) {\r\n+        String registryAddress = registryConfig.getAddress();\r\n+        String[] addresses = REGISTRY_SPLIT_PATTERN.split(registryAddress);\r\n+        if (ArrayUtils.isEmpty(addresses)) {\r\n+            throw new IllegalStateException(\"Invalid registry address found.\");\r\n+        }\r\n+        String address = addresses[0];\r\n+        // since 2.7.8\r\n+        // Issue : https://github.com/apache/dubbo/issues/6476\r\n+        StringBuilder metadataAddressBuilder = new StringBuilder();\r\n+        URL url = URL.valueOf(address);\r\n+        String protocolFromAddress = url.getProtocol();\r\n+        if (isEmpty(protocolFromAddress)) {\r\n+            // If the protocol from address is missing, is like :\r\n+            // \"dubbo.registry.address = 127.0.0.1:2181\"\r\n+            String protocolFromConfig = registryConfig.getProtocol();\r\n+            metadataAddressBuilder.append(protocolFromConfig).append(\"://\");\r\n+        }\r\n+        metadataAddressBuilder.append(address);\r\n+        return metadataAddressBuilder.toString();\r\n+    }\r\n+\r\n+    private void loadRemoteConfigs() {\r\n+        // registry ids to registry configs\r\n+        List<RegistryConfig> tmpRegistries = new ArrayList<>();\r\n+        Set<String> registryIds = configManager.getRegistryIds();\r\n+        registryIds.forEach(id -> {\r\n+            if (tmpRegistries.stream().noneMatch(reg -> reg.getId().equals(id))) {\r\n+                tmpRegistries.add(configManager.getRegistry(id).orElseGet(() -> {\r\n+                    RegistryConfig registryConfig = new RegistryConfig();\r\n+                    registryConfig.setId(id);\r\n+                    registryConfig.refresh();\r\n+                    return registryConfig;\r\n+                }));\r\n+            }\r\n+        });\r\n+\r\n+        configManager.addRegistries(tmpRegistries);\r\n+\r\n+        // protocol ids to protocol configs\r\n+        List<ProtocolConfig> tmpProtocols = new ArrayList<>();\r\n+        Set<String> protocolIds = configManager.getProtocolIds();\r\n+        protocolIds.forEach(id -> {\r\n+            if (tmpProtocols.stream().noneMatch(prot -> prot.getId().equals(id))) {\r\n+                tmpProtocols.add(configManager.getProtocol(id).orElseGet(() -> {\r\n+                    ProtocolConfig protocolConfig = new ProtocolConfig();\r\n+                    protocolConfig.setId(id);\r\n+                    protocolConfig.refresh();\r\n+                    return protocolConfig;\r\n+                }));\r\n+            }\r\n+        });\r\n+\r\n+        configManager.addProtocols(tmpProtocols);\r\n+    }\r\n+\r\n+\r\n+    /**\r\n+     * Initialize {@link MetadataService} from {@link WritableMetadataService}'s extension\r\n+     */\r\n+    private void initMetadataService() {\r\n+        this.metadataService = getDefaultExtension();\r\n+        this.metadataServiceExporter = new ConfigurableMetadataServiceExporter(metadataService);\r\n+    }\r\n+\r\n+    /**\r\n+     * Initialize {@link EventListener}\r\n+     */\r\n+    private void initEventListener() {\r\n+        // Add current instance into listeners\r\n+        addEventListener(this);\r\n+    }\r\n+\r\n+    /**\r\n+     * Start the bootstrap\r\n+     */\r\n+    public DubboBootstrap start() {\r\n+        if (started.compareAndSet(false, true)) {\r\n+            ready.set(false);\r\n+            initialize();\r\n+            if (logger.isInfoEnabled()) {\r\n+                logger.info(NAME + \" is starting...\");\r\n+            }\r\n+            // 1. export Dubbo Services\r\n+            exportServices();\r\n+\r\n+            // Not only provider register\r\n+            if (!isOnlyRegisterProvider() || hasExportedServices()) {\r\n+                // 2. export MetadataService\r\n+                exportMetadataService();\r\n+                //3. Register the local ServiceInstance if required\r\n+                registerServiceInstance();\r\n+            }\r\n+\r\n+            referServices();\r\n+            if (asyncExportingFutures.size() > 0) {\r\n+                new Thread(() -> {\r\n+                    try {\r\n+                        this.awaitFinish();\r\n+                    } catch (Exception e) {\r\n+                        logger.warn(NAME + \" exportAsync occurred an exception.\");\r\n+                    }\r\n+                    ready.set(true);\r\n+                    if (logger.isInfoEnabled()) {\r\n+                        logger.info(NAME + \" is ready.\");\r\n+                    }\r\n+                    ExtensionLoader<DubboBootstrapStartStopListener> exts = getExtensionLoader(DubboBootstrapStartStopListener.class);\r\n+                    exts.getSupportedExtensionInstances().forEach(ext -> ext.onStart(this));\r\n+                }).start();\r\n+            } else {\r\n+                ready.set(true);\r\n+                if (logger.isInfoEnabled()) {\r\n+                    logger.info(NAME + \" is ready.\");\r\n+                }\r\n+                ExtensionLoader<DubboBootstrapStartStopListener> exts = getExtensionLoader(DubboBootstrapStartStopListener.class);\r\n+                exts.getSupportedExtensionInstances().forEach(ext -> ext.onStart(this));\r\n+            }\r\n+            if (logger.isInfoEnabled()) {\r\n+                logger.info(NAME + \" has started.\");\r\n+            }\r\n+        }\r\n+        return this;\r\n+    }\r\n+\r\n+    private boolean hasExportedServices() {\r\n+        return !metadataService.getExportedURLs().isEmpty();\r\n+    }\r\n+\r\n+    /**\r\n+     * Block current thread to be await.\r\n+     *\r\n+     * @return {@link DubboBootstrap}\r\n+     */\r\n+    public DubboBootstrap await() {\r\n+        // if has been waited, no need to wait again, return immediately\r\n+        if (!awaited.get()) {\r\n+            if (!executorService.isShutdown()) {\r\n+                executeMutually(() -> {\r\n+                    while (!awaited.get()) {\r\n+                        if (logger.isInfoEnabled()) {\r\n+                            logger.info(NAME + \" awaiting ...\");\r\n+                        }\r\n+                        try {\r\n+                            condition.await();\r\n+                        } catch (InterruptedException e) {\r\n+                            Thread.currentThread().interrupt();\r\n+                        }\r\n+                    }\r\n+                });\r\n+            }\r\n+        }\r\n+        return this;\r\n+    }\r\n+\r\n+    public DubboBootstrap awaitFinish() throws Exception {\r\n+        logger.info(NAME + \" waiting services exporting / referring ...\");\r\n+        if (exportAsync && asyncExportingFutures.size() > 0) {\r\n+            CompletableFuture future = CompletableFuture.allOf(asyncExportingFutures.toArray(new CompletableFuture[0]));\r\n+            future.get();\r\n+        }\r\n+        if (referAsync && asyncReferringFutures.size() > 0) {\r\n+            CompletableFuture future = CompletableFuture.allOf(asyncReferringFutures.toArray(new CompletableFuture[0]));\r\n+            future.get();\r\n+        }\r\n+\r\n+        logger.info(\"Service export / refer finished.\");\r\n+        return this;\r\n+    }\r\n+\r\n+    public boolean isInitialized() {\r\n+        return initialized.get();\r\n+    }\r\n+\r\n+    public boolean isStarted() {\r\n+        return started.get();\r\n+    }\r\n+\r\n+    public boolean isReady() {\r\n+        return ready.get();\r\n+    }\r\n+\r\n+\r\n+    public DubboBootstrap stop() throws IllegalStateException {\r\n+        destroy();\r\n+        return this;\r\n+    }\r\n+    /* serve for builder apis, begin */\r\n+\r\n+    private ApplicationBuilder createApplicationBuilder(String name) {\r\n+        return new ApplicationBuilder().name(name);\r\n+    }\r\n+\r\n+    private RegistryBuilder createRegistryBuilder(String id) {\r\n+        return new RegistryBuilder().id(id);\r\n+    }\r\n+\r\n+    private ProtocolBuilder createProtocolBuilder(String id) {\r\n+        return new ProtocolBuilder().id(id);\r\n+    }\r\n+\r\n+    private ServiceBuilder createServiceBuilder(String id) {\r\n+        return new ServiceBuilder().id(id);\r\n+    }\r\n+\r\n+    private ReferenceBuilder createReferenceBuilder(String id) {\r\n+        return new ReferenceBuilder().id(id);\r\n+    }\r\n+\r\n+    private ProviderBuilder createProviderBuilder(String id) {\r\n+        return new ProviderBuilder().id(id);\r\n+    }\r\n+\r\n+    private ConsumerBuilder createConsumerBuilder(String id) {\r\n+        return new ConsumerBuilder().id(id);\r\n+    }\r\n+    /* serve for builder apis, end */\r\n+\r\n+    private DynamicConfiguration prepareEnvironment(ConfigCenterConfig configCenter) {\r\n+        if (configCenter.isValid()) {\r\n+            if (!configCenter.checkOrUpdateInited()) {\r\n+                return null;\r\n+            }\r\n+            DynamicConfiguration dynamicConfiguration = getDynamicConfiguration(configCenter.toUrl());\r\n+            String configContent = dynamicConfiguration.getProperties(configCenter.getConfigFile(), configCenter.getGroup());\r\n+\r\n+            String appGroup = getApplication().getName();\r\n+            String appConfigContent = null;\r\n+            if (isNotEmpty(appGroup)) {\r\n+                appConfigContent = dynamicConfiguration.getProperties\r\n+                        (isNotEmpty(configCenter.getAppConfigFile()) ? configCenter.getAppConfigFile() : configCenter.getConfigFile(),\r\n+                                appGroup\r\n+                        );\r\n+            }\r\n+            try {\r\n+                environment.setConfigCenterFirst(configCenter.isHighestPriority());\r\n+                environment.updateExternalConfigurationMap(parseProperties(configContent));\r\n+                environment.updateAppExternalConfigurationMap(parseProperties(appConfigContent));\r\n+            } catch (IOException e) {\r\n+                throw new IllegalStateException(\"Failed to parse configurations from Config Center.\", e);\r\n+            }\r\n+            return dynamicConfiguration;\r\n+        }\r\n+        return null;\r\n+    }\r\n+\r\n+    /**\r\n+     * Add an instance of {@link EventListener}\r\n+     *\r\n+     * @param listener {@link EventListener}\r\n+     * @return {@link DubboBootstrap}\r\n+     */\r\n+    public DubboBootstrap addEventListener(EventListener<?> listener) {\r\n+        eventDispatcher.addEventListener(listener);\r\n+        return this;\r\n+    }\r\n+\r\n+    /**\r\n+     * export {@link MetadataService}\r\n+     */\r\n+    private void exportMetadataService() {\r\n+        metadataServiceExporter.export();\r\n+    }\r\n+\r\n+    private void unexportMetadataService() {\r\n+        if (metadataServiceExporter != null && metadataServiceExporter.isExported()) {\r\n+            metadataServiceExporter.unexport();\r\n+        }\r\n+    }\r\n+\r\n+    private void exportServices() {\r\n+        configManager.getServices().forEach(sc -> {\r\n+            // TODO, compatible with ServiceConfig.export()\r\n+            ServiceConfig serviceConfig = (ServiceConfig) sc;\r\n+            serviceConfig.setBootstrap(this);\r\n+\r\n+            if (exportAsync) {\r\n+                ExecutorService executor = executorRepository.getServiceExporterExecutor();\r\n+                Future<?> future = executor.submit(() -> {\r\n+                    sc.export();\r\n+                    exportedServices.add(sc);\r\n+                });\r\n+                asyncExportingFutures.add(future);\r\n+            } else {\r\n+                sc.export();\r\n+                exportedServices.add(sc);\r\n+            }\r\n+        });\r\n+    }\r\n+\r\n+    private void unexportServices() {\r\n+        exportedServices.forEach(sc -> {\r\n+            configManager.removeConfig(sc);\r\n+            sc.unexport();\r\n+        });\r\n+\r\n+        asyncExportingFutures.forEach(future -> {\r\n+            if (!future.isDone()) {\r\n+                future.cancel(true);\r\n+            }\r\n+        });\r\n+        asyncExportingFutures.clear();\r\n+        exportedServices.clear();\r\n+    }\r\n+\r\n+    private void referServices() {\r\n+        if (cache == null) {\r\n+            cache = ReferenceConfigCache.getCache();\r\n+        }\r\n+\r\n+        configManager.getReferences().forEach(rc -> {\r\n+            // TODO, compatible with  ReferenceConfig.refer()\r\n+            ReferenceConfig referenceConfig = (ReferenceConfig) rc;\r\n+            referenceConfig.setBootstrap(this);\r\n+\r\n+            if (rc.shouldInit()) {\r\n+                if (referAsync) {\r\n+                    CompletableFuture<Object> future = ScheduledCompletableFuture.submit(\r\n+                            executorRepository.getServiceExporterExecutor(),\r\n+                            () -> cache.get(rc)\r\n+                    );\r\n+                    asyncReferringFutures.add(future);\r\n+                } else {\r\n+                    cache.get(rc);\r\n+                }\r\n+            }\r\n+        });\r\n+    }\r\n+\r\n+    private void unreferServices() {\r\n+        if (cache == null) {\r\n+            cache = ReferenceConfigCache.getCache();\r\n+        }\r\n+\r\n+        asyncReferringFutures.forEach(future -> {\r\n+            if (!future.isDone()) {\r\n+                future.cancel(true);\r\n+            }\r\n+        });\r\n+        asyncReferringFutures.clear();\r\n+        cache.destroyAll();\r\n+    }\r\n+\r\n+    private void registerServiceInstance() {\r\n+        if (CollectionUtils.isEmpty(getServiceDiscoveries())) {\r\n+            return;\r\n+        }\r\n+\r\n+        ApplicationConfig application = getApplication();\r\n+\r\n+        String serviceName = application.getName();\r\n+\r\n+        URL exportedURL = selectMetadataServiceExportedURL();\r\n+\r\n+        String host = exportedURL.getHost();\r\n+\r\n+        int port = exportedURL.getPort();\r\n+\r\n+        ServiceInstance serviceInstance = createServiceInstance(serviceName, host, port);\r\n+\r\n+        doRegisterServiceInstance(serviceInstance);\r\n+\r\n+        // scheduled task for updating Metadata and ServiceInstance\r\n+        executorRepository.nextScheduledExecutor().scheduleAtFixedRate(() -> {\r\n+            try {\r\n+                InMemoryWritableMetadataService localMetadataService = (InMemoryWritableMetadataService) WritableMetadataService.getDefaultExtension();\r\n+                localMetadataService.blockUntilUpdated();\r\n+                ServiceInstanceMetadataUtils.refreshMetadataAndInstance();\r\n+            } catch (Throwable e) {\r\n+                logger.error(\"refresh metadata and instance failed\", e);\r\n+            }\r\n+        }, 0, ConfigurationUtils.get(METADATA_PUBLISH_DELAY_KEY, DEFAULT_METADATA_PUBLISH_DELAY), TimeUnit.MILLISECONDS);\r\n+    }\r\n+\r\n+    private void doRegisterServiceInstance(ServiceInstance serviceInstance) {\r\n+        //FIXME\r\n+        if (logger.isInfoEnabled()) {\r\n+            logger.info(\"Start publishing metadata to remote center, this only makes sense for applications enabled remote metadata center.\");\r\n+        }\r\n+        publishMetadataToRemote(serviceInstance);\r\n+\r\n+        logger.info(\"Start registering instance address to registry.\");\r\n+        getServiceDiscoveries().forEach(serviceDiscovery ->\r\n+        {\r\n+            calInstanceRevision(serviceDiscovery, serviceInstance);\r\n+            if (logger.isDebugEnabled()) {\r\n+                logger.info(\"Start registering instance address to registry\" + serviceDiscovery.getUrl() + \", instance \" + serviceInstance);\r\n+            }\r\n+            // register metadata\r\n+            serviceDiscovery.register(serviceInstance);\r\n+        });\r\n+    }\r\n+\r\n+    private void publishMetadataToRemote(ServiceInstance serviceInstance) {\r\n+//        InMemoryWritableMetadataService localMetadataService = (InMemoryWritableMetadataService)WritableMetadataService.getDefaultExtension();\r\n+//        localMetadataService.blockUntilUpdated();\r\n+        RemoteMetadataServiceImpl remoteMetadataService = MetadataUtils.getRemoteMetadataService();\r\n+        remoteMetadataService.publishMetadata(serviceInstance.getServiceName());\r\n+    }\r\n+\r\n+    private URL selectMetadataServiceExportedURL() {\r\n+\r\n+        URL selectedURL = null;\r\n+\r\n+        SortedSet<String> urlValues = metadataService.getExportedURLs();\r\n+\r\n+        for (String urlValue : urlValues) {\r\n+            URL url = URL.valueOf(urlValue);\r\n+            if (MetadataService.class.getName().equals(url.getServiceInterface())) {\r\n+                continue;\r\n+            }\r\n+            if (\"rest\".equals(url.getProtocol())) { // REST first\r\n+                selectedURL = url;\r\n+                break;\r\n+            } else {\r\n+                selectedURL = url; // If not found, take any one\r\n+            }\r\n+        }\r\n+\r\n+        if (selectedURL == null && CollectionUtils.isNotEmpty(urlValues)) {\r\n+            selectedURL = URL.valueOf(urlValues.iterator().next());\r\n+        }\r\n+\r\n+        return selectedURL;\r\n+    }\r\n+\r\n+    private void unregisterServiceInstance() {\r\n+        if (serviceInstance != null) {\r\n+            getServiceDiscoveries().forEach(serviceDiscovery -> {\r\n+                serviceDiscovery.unregister(serviceInstance);\r\n+            });\r\n+        }\r\n+    }\r\n+\r\n+    private ServiceInstance createServiceInstance(String serviceName, String host, int port) {\r\n+        this.serviceInstance = new DefaultServiceInstance(serviceName, host, port);\r\n+        setMetadataStorageType(serviceInstance, getMetadataType());\r\n+\r\n+        ExtensionLoader<ServiceInstanceCustomizer> loader =\r\n+                ExtensionLoader.getExtensionLoader(ServiceInstanceCustomizer.class);\r\n+        // FIXME, sort customizer before apply\r\n+        loader.getSupportedExtensionInstances().forEach(customizer -> {\r\n+            // customizes\r\n+            customizer.customize(this.serviceInstance);\r\n+        });\r\n+\r\n+        return this.serviceInstance;\r\n+    }\r\n+\r\n+    public void destroy() {\r\n+        if (destroyLock.tryLock()) {\r\n+            try {\r\n+                DubboShutdownHook.destroyAll();\r\n+\r\n+                if (started.compareAndSet(true, false)\r\n+                        && destroyed.compareAndSet(false, true)) {\r\n+\r\n+                    unregisterServiceInstance();\r\n+                    unexportMetadataService();\r\n+                    unexportServices();\r\n+                    unreferServices();\r\n+\r\n+                    destroyRegistries();\r\n+\r\n+                    destroyServiceDiscoveries();\r\n+                    destroyExecutorRepository();\r\n+                    clear();\r\n+                    shutdown();\r\n+                    release();\r\n+                    ExtensionLoader<DubboBootstrapStartStopListener> exts = getExtensionLoader(DubboBootstrapStartStopListener.class);\r\n+                    exts.getSupportedExtensionInstances().forEach(ext -> ext.onStop(this));\r\n+                }\r\n+            } finally {\r\n+                destroyLock.unlock();\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    private void destroyExecutorRepository() {\r\n+        ExtensionLoader.getExtensionLoader(ExecutorRepository.class).getDefaultExtension().destroyAll();\r\n+    }\r\n+\r\n+    private void destroyRegistries() {\r\n+        AbstractRegistryFactory.destroyAll();\r\n+    }\r\n+\r\n+    private void destroyServiceDiscoveries() {\r\n+        getServiceDiscoveries().forEach(serviceDiscovery -> {\r\n+            execute(serviceDiscovery::destroy);\r\n+        });\r\n+        if (logger.isDebugEnabled()) {\r\n+            logger.debug(NAME + \"'s all ServiceDiscoveries have been destroyed.\");\r\n+        }\r\n+    }\r\n+\r\n+    private void clear() {\r\n+        clearConfigs();\r\n+        clearApplicationModel();\r\n+    }\r\n+\r\n+    private void clearApplicationModel() {\r\n+\r\n+    }\r\n+\r\n+    private void clearConfigs() {\r\n+        configManager.destroy();\r\n+        if (logger.isDebugEnabled()) {\r\n+            logger.debug(NAME + \"'s configs have been clear.\");\r\n+        }\r\n+    }\r\n+\r\n+    private void release() {\r\n+        executeMutually(() -> {\r\n+            while (awaited.compareAndSet(false, true)) {\r\n+                if (logger.isInfoEnabled()) {\r\n+                    logger.info(NAME + \" is about to shutdown...\");\r\n+                }\r\n+                condition.signalAll();\r\n+            }\r\n+        });\r\n+    }\r\n+\r\n+    private void shutdown() {\r\n+        if (!executorService.isShutdown()) {\r\n+            // Shutdown executorService\r\n+            executorService.shutdown();\r\n+        }\r\n+    }\r\n+\r\n+    private void executeMutually(Runnable runnable) {\r\n+        try {\r\n+            lock.lock();\r\n+            runnable.run();\r\n+        } finally {\r\n+            lock.unlock();\r\n+        }\r\n+    }\r\n+\r\n+    public ApplicationConfig getApplication() {\r\n+        ApplicationConfig application = configManager\r\n+                .getApplication()\r\n+                .orElseGet(() -> {\r\n+                    ApplicationConfig applicationConfig = new ApplicationConfig();\r\n+                    configManager.setApplication(applicationConfig);\r\n+                    return applicationConfig;\r\n+                });\r\n+\r\n+        application.refresh();\r\n+        return application;\r\n+    }\r\n+\r\n+    private MonitorConfig getMonitor() {\r\n+        MonitorConfig monitor = configManager\r\n+                .getMonitor()\r\n+                .orElseGet(() -> {\r\n+                    MonitorConfig monitorConfig = new MonitorConfig();\r\n+                    configManager.setMonitor(monitorConfig);\r\n+                    return monitorConfig;\r\n+                });\r\n+\r\n+        monitor.refresh();\r\n+        return monitor;\r\n+    }\r\n+\r\n+    private MetricsConfig getMetrics() {\r\n+        MetricsConfig metrics = configManager\r\n+                .getMetrics()\r\n+                .orElseGet(() -> {\r\n+                    MetricsConfig metricsConfig = new MetricsConfig();\r\n+                    configManager.setMetrics(metricsConfig);\r\n+                    return metricsConfig;\r\n+                });\r\n+        metrics.refresh();\r\n+        return metrics;\r\n+    }\r\n+\r\n+    private ModuleConfig getModule() {\r\n+        ModuleConfig module = configManager\r\n+                .getModule()\r\n+                .orElseGet(() -> {\r\n+                    ModuleConfig moduleConfig = new ModuleConfig();\r\n+                    configManager.setModule(moduleConfig);\r\n+                    return moduleConfig;\r\n+                });\r\n+\r\n+        module.refresh();\r\n+        return module;\r\n+    }\r\n+\r\n+    private SslConfig getSsl() {\r\n+        SslConfig ssl = configManager\r\n+                .getSsl()\r\n+                .orElseGet(() -> {\r\n+                    SslConfig sslConfig = new SslConfig();\r\n+                    configManager.setSsl(sslConfig);\r\n+                    return sslConfig;\r\n+                });\r\n+\r\n+        ssl.refresh();\r\n+        return ssl;\r\n+    }\r\n+\r\n+    public void setReady(boolean ready) {\r\n+        this.ready.set(ready);\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/bootstrap/DubboBootstrapStartStopListener.java", "source2": "org/apache/dubbo/config/bootstrap/DubboBootstrapStartStopListener.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,34 +1,34 @@\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-\n-package org.apache.dubbo.config.bootstrap;\n-\n-import org.apache.dubbo.common.extension.SPI;\n-\n-/**\n- * call on DubboBootstrap start or stop.\n- *\n- * @scene 2.7.9\n- * @see DubboBootstrap\n- */\n-@SPI\n-public interface DubboBootstrapStartStopListener {\n-\n-    void onStart(DubboBootstrap bootstrap);\n-\n-    void onStop(DubboBootstrap bootstrap);\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+\r\n+package org.apache.dubbo.config.bootstrap;\r\n+\r\n+import org.apache.dubbo.common.extension.SPI;\r\n+\r\n+/**\r\n+ * call on DubboBootstrap start or stop.\r\n+ *\r\n+ * @scene 2.7.9\r\n+ * @see DubboBootstrap\r\n+ */\r\n+@SPI\r\n+public interface DubboBootstrapStartStopListener {\r\n+\r\n+    void onStart(DubboBootstrap bootstrap);\r\n+\r\n+    void onStop(DubboBootstrap bootstrap);\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/bootstrap/builders/AbstractBuilder.java", "source2": "org/apache/dubbo/config/bootstrap/builders/AbstractBuilder.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,82 +1,82 @@\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.config.bootstrap.builders;\n-\n-import org.apache.dubbo.common.utils.StringUtils;\n-import org.apache.dubbo.config.AbstractConfig;\n-\n-import java.util.HashMap;\n-import java.util.Map;\n-\n-/**\n- * AbstractBuilder\n- *\n- * @param <C> The type of {@link AbstractConfig Config}\n- * @param <B> The type of {@link AbstractBuilder Builder}\n- * @since 2.7\n- */\n-public abstract class AbstractBuilder<C extends AbstractConfig, B extends AbstractBuilder> {\n-    /**\n-     * The config id\n-     */\n-    protected String id;\n-    protected String prefix;\n-\n-    public B id(String id) {\n-        this.id = id;\n-        return getThis();\n-    }\n-\n-    protected B prefix(String prefix) {\n-        this.prefix = prefix;\n-        return getThis();\n-    }\n-\n-    protected abstract B getThis();\n-\n-    protected static Map<String, String> appendParameter(Map<String, String> parameters, String key, String value) {\n-        if (parameters == null) {\n-            parameters = new HashMap<>();\n-        }\n-        parameters.put(key, value);\n-        return parameters;\n-    }\n-\n-    protected static Map<String, String> appendParameters(Map<String, String> parameters, Map<String, String> appendParameters) {\n-        if (parameters == null) {\n-            parameters = new HashMap<>();\n-        }\n-        parameters.putAll(appendParameters);\n-        return parameters;\n-    }\n-\n-    protected void build(C instance) {\n-        if (!StringUtils.isEmpty(id)) {\n-            instance.setId(id);\n-        }\n-        if (!StringUtils.isEmpty(prefix)) {\n-            instance.setPrefix(prefix);\n-        }\n-    }\n-\n-    /**\n-     * Build an instance of {@link AbstractConfig config}\n-     *\n-     * @return an instance of {@link AbstractConfig config}\n-     */\n-    public abstract C build();\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.config.bootstrap.builders;\r\n+\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+import org.apache.dubbo.config.AbstractConfig;\r\n+\r\n+import java.util.HashMap;\r\n+import java.util.Map;\r\n+\r\n+/**\r\n+ * AbstractBuilder\r\n+ *\r\n+ * @param <C> The type of {@link AbstractConfig Config}\r\n+ * @param <B> The type of {@link AbstractBuilder Builder}\r\n+ * @since 2.7\r\n+ */\r\n+public abstract class AbstractBuilder<C extends AbstractConfig, B extends AbstractBuilder> {\r\n+    /**\r\n+     * The config id\r\n+     */\r\n+    protected String id;\r\n+    protected String prefix;\r\n+\r\n+    public B id(String id) {\r\n+        this.id = id;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    protected B prefix(String prefix) {\r\n+        this.prefix = prefix;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    protected abstract B getThis();\r\n+\r\n+    protected static Map<String, String> appendParameter(Map<String, String> parameters, String key, String value) {\r\n+        if (parameters == null) {\r\n+            parameters = new HashMap<>();\r\n+        }\r\n+        parameters.put(key, value);\r\n+        return parameters;\r\n+    }\r\n+\r\n+    protected static Map<String, String> appendParameters(Map<String, String> parameters, Map<String, String> appendParameters) {\r\n+        if (parameters == null) {\r\n+            parameters = new HashMap<>();\r\n+        }\r\n+        parameters.putAll(appendParameters);\r\n+        return parameters;\r\n+    }\r\n+\r\n+    protected void build(C instance) {\r\n+        if (!StringUtils.isEmpty(id)) {\r\n+            instance.setId(id);\r\n+        }\r\n+        if (!StringUtils.isEmpty(prefix)) {\r\n+            instance.setPrefix(prefix);\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * Build an instance of {@link AbstractConfig config}\r\n+     *\r\n+     * @return an instance of {@link AbstractConfig config}\r\n+     */\r\n+    public abstract C build();\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/bootstrap/builders/AbstractInterfaceBuilder.java", "source2": "org/apache/dubbo/config/bootstrap/builders/AbstractInterfaceBuilder.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,345 +1,345 @@\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.config.bootstrap.builders;\n-\n-import org.apache.dubbo.common.utils.StringUtils;\n-import org.apache.dubbo.config.AbstractInterfaceConfig;\n-import org.apache.dubbo.config.ApplicationConfig;\n-import org.apache.dubbo.config.ConfigCenterConfig;\n-import org.apache.dubbo.config.MetadataReportConfig;\n-import org.apache.dubbo.config.ModuleConfig;\n-import org.apache.dubbo.config.MonitorConfig;\n-import org.apache.dubbo.config.RegistryConfig;\n-import org.apache.dubbo.rpc.Filter;\n-\n-import java.util.ArrayList;\n-import java.util.List;\n-\n-/**\n- * AbstractBuilder\n- *\n- * @since 2.7\n- */\n-public abstract class AbstractInterfaceBuilder<T extends AbstractInterfaceConfig, B extends AbstractInterfaceBuilder<T, B>>\n-        extends AbstractMethodBuilder<T, B> {\n-    /**\n-     * Local impl class name for the service interface\n-     */\n-    protected String local;\n-\n-    /**\n-     * Local stub class name for the service interface\n-     */\n-    protected String stub;\n-\n-    /**\n-     * Service monitor\n-     */\n-    protected MonitorConfig monitor;\n-\n-    /**\n-     * Strategies for generating dynamic agents\uff0cthere are two strategies can be choosed: jdk and javassist\n-     */\n-    protected String proxy;\n-\n-    /**\n-     * Cluster type\n-     */\n-    protected String cluster;\n-\n-    /**\n-     * The {@link Filter} when the provider side exposed a service or the customer side references a remote service used,\n-     * if there are more than one, you can use commas to separate them\n-     */\n-    protected String filter;\n-\n-    /**\n-     * The Listener when the provider side exposes a service or the customer side references a remote service used\n-     * if there are more than one, you can use commas to separate them\n-     */\n-    protected String listener;\n-\n-    /**\n-     * The owner of the service providers\n-     */\n-    protected String owner;\n-\n-    /**\n-     * Connection limits, 0 means shared connection, otherwise it defines the connections delegated to the current service\n-     */\n-    protected Integer connections;\n-\n-    /**\n-     * The layer of service providers\n-     */\n-    protected String layer;\n-\n-    /**\n-     * The application info\n-     */\n-    protected ApplicationConfig application;\n-\n-    /**\n-     * The module info\n-     */\n-    protected ModuleConfig module;\n-\n-    /**\n-     * Registry centers\n-     */\n-    protected List<RegistryConfig> registries;\n-\n-    protected String registryIds;\n-\n-    // connection events\n-    protected String onconnect;\n-\n-    /**\n-     * Disconnection events\n-     */\n-    protected String ondisconnect;\n-    protected MetadataReportConfig metadataReportConfig;\n-\n-    protected ConfigCenterConfig configCenter;\n-\n-    // callback limits\n-    private Integer callbacks;\n-    // the scope for referring/exporting a service, if it's local, it means searching in current JVM only.\n-    private String scope;\n-\n-    private String tag;\n-\n-    /**\n-     * @param local\n-     * @see AbstractInterfaceBuilder#stub(String)\n-     * @deprecated Replace to <code>stub(String)</code>\n-     */\n-    @Deprecated\n-    public B local(String local) {\n-        this.local = local;\n-        return getThis();\n-    }\n-\n-    /**\n-     * @param local\n-     * @see AbstractInterfaceBuilder#stub(Boolean)\n-     * @deprecated Replace to <code>stub(Boolean)</code>\n-     */\n-    @Deprecated\n-    public B local(Boolean local) {\n-        if (local != null) {\n-            this.local = local.toString();\n-        } else {\n-            this.local = null;\n-        }\n-        return getThis();\n-    }\n-\n-    public B stub(String stub) {\n-        this.stub = stub;\n-        return getThis();\n-    }\n-\n-    public B stub(Boolean stub) {\n-        if (stub != null) {\n-            this.stub = stub.toString();\n-        } else {\n-            this.stub = null;\n-        }\n-        return getThis();\n-    }\n-\n-    public B monitor(MonitorConfig monitor) {\n-        this.monitor = monitor;\n-        return getThis();\n-    }\n-\n-    public B monitor(String monitor) {\n-        this.monitor = new MonitorConfig(monitor);\n-        return getThis();\n-    }\n-\n-    public B proxy(String proxy) {\n-        this.proxy = proxy;\n-        return getThis();\n-    }\n-\n-    public B cluster(String cluster) {\n-        this.cluster = cluster;\n-        return getThis();\n-    }\n-\n-    public B filter(String filter) {\n-        this.filter = filter;\n-        return getThis();\n-    }\n-\n-    public B listener(String listener) {\n-        this.listener = listener;\n-        return getThis();\n-    }\n-\n-    public B owner(String owner) {\n-        this.owner = owner;\n-        return getThis();\n-    }\n-\n-    public B connections(Integer connections) {\n-        this.connections = connections;\n-        return getThis();\n-    }\n-\n-    public B layer(String layer) {\n-        this.layer = layer;\n-        return getThis();\n-    }\n-\n-    public B application(ApplicationConfig application) {\n-        this.application = application;\n-        return getThis();\n-    }\n-\n-    public B module(ModuleConfig module) {\n-        this.module = module;\n-        return getThis();\n-    }\n-\n-    public B addRegistries(List<RegistryConfig> registries) {\n-        if (this.registries == null) {\n-            this.registries = new ArrayList<>();\n-        }\n-        this.registries.addAll(registries);\n-        return getThis();\n-    }\n-\n-    public B addRegistry(RegistryConfig registry) {\n-        if (this.registries == null) {\n-            this.registries = new ArrayList<>();\n-        }\n-        this.registries.add(registry);\n-        return getThis();\n-    }\n-\n-    public B registryIds(String registryIds) {\n-        this.registryIds = registryIds;\n-        return getThis();\n-    }\n-\n-    public B onconnect(String onconnect) {\n-        this.onconnect = onconnect;\n-        return getThis();\n-    }\n-\n-    public B ondisconnect(String ondisconnect) {\n-        this.ondisconnect = ondisconnect;\n-        return getThis();\n-    }\n-\n-    public B metadataReportConfig(MetadataReportConfig metadataReportConfig) {\n-        this.metadataReportConfig = metadataReportConfig;\n-        return getThis();\n-    }\n-\n-    public B configCenter(ConfigCenterConfig configCenter) {\n-        this.configCenter = configCenter;\n-        return getThis();\n-    }\n-\n-    public B callbacks(Integer callbacks) {\n-        this.callbacks = callbacks;\n-        return getThis();\n-    }\n-\n-    public B scope(String scope) {\n-        this.scope = scope;\n-        return getThis();\n-    }\n-\n-    public B tag(String tag) {\n-        this.tag = tag;\n-        return getThis();\n-    }\n-\n-    @Override\n-    public void build(T instance) {\n-        super.build(instance);\n-\n-        if (!StringUtils.isEmpty(local)) {\n-            instance.setLocal(local);\n-        }\n-        if (!StringUtils.isEmpty(stub)) {\n-            instance.setStub(stub);\n-        }\n-        if (monitor != null) {\n-            instance.setMonitor(monitor);\n-        }\n-        if (!StringUtils.isEmpty(proxy)) {\n-            instance.setProxy(proxy);\n-        }\n-        if (!StringUtils.isEmpty(cluster)) {\n-            instance.setCluster(cluster);\n-        }\n-        if (!StringUtils.isEmpty(filter)) {\n-            instance.setFilter(filter);\n-        }\n-        if (!StringUtils.isEmpty(listener)) {\n-            instance.setListener(listener);\n-        }\n-        if (!StringUtils.isEmpty(owner)) {\n-            instance.setOwner(owner);\n-        }\n-        if (connections != null) {\n-            instance.setConnections(connections);\n-        }\n-        if (!StringUtils.isEmpty(layer)) {\n-            instance.setLayer(layer);\n-        }\n-        if (application != null) {\n-            instance.setApplication(application);\n-        }\n-        if (module != null) {\n-            instance.setModule(module);\n-        }\n-        if (registries != null) {\n-            instance.setRegistries(registries);\n-        }\n-        if (!StringUtils.isEmpty(registryIds)) {\n-            instance.setRegistryIds(registryIds);\n-        }\n-        if (!StringUtils.isEmpty(onconnect)) {\n-            instance.setOnconnect(onconnect);\n-        }\n-        if (!StringUtils.isEmpty(ondisconnect)) {\n-            instance.setOndisconnect(ondisconnect);\n-        }\n-        if (metadataReportConfig != null) {\n-            instance.setMetadataReportConfig(metadataReportConfig);\n-        }\n-        if (configCenter != null) {\n-            instance.setConfigCenter(configCenter);\n-        }\n-        if (callbacks != null) {\n-            instance.setCallbacks(callbacks);\n-        }\n-        if (!StringUtils.isEmpty(scope)) {\n-            instance.setScope(scope);\n-        }\n-        if (StringUtils.isNotEmpty(tag)) {\n-            instance.setTag(tag);\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.config.bootstrap.builders;\r\n+\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+import org.apache.dubbo.config.AbstractInterfaceConfig;\r\n+import org.apache.dubbo.config.ApplicationConfig;\r\n+import org.apache.dubbo.config.ConfigCenterConfig;\r\n+import org.apache.dubbo.config.MetadataReportConfig;\r\n+import org.apache.dubbo.config.ModuleConfig;\r\n+import org.apache.dubbo.config.MonitorConfig;\r\n+import org.apache.dubbo.config.RegistryConfig;\r\n+import org.apache.dubbo.rpc.Filter;\r\n+\r\n+import java.util.ArrayList;\r\n+import java.util.List;\r\n+\r\n+/**\r\n+ * AbstractBuilder\r\n+ *\r\n+ * @since 2.7\r\n+ */\r\n+public abstract class AbstractInterfaceBuilder<T extends AbstractInterfaceConfig, B extends AbstractInterfaceBuilder<T, B>>\r\n+        extends AbstractMethodBuilder<T, B> {\r\n+    /**\r\n+     * Local impl class name for the service interface\r\n+     */\r\n+    protected String local;\r\n+\r\n+    /**\r\n+     * Local stub class name for the service interface\r\n+     */\r\n+    protected String stub;\r\n+\r\n+    /**\r\n+     * Service monitor\r\n+     */\r\n+    protected MonitorConfig monitor;\r\n+\r\n+    /**\r\n+     * Strategies for generating dynamic agents\uff0cthere are two strategies can be choosed: jdk and javassist\r\n+     */\r\n+    protected String proxy;\r\n+\r\n+    /**\r\n+     * Cluster type\r\n+     */\r\n+    protected String cluster;\r\n+\r\n+    /**\r\n+     * The {@link Filter} when the provider side exposed a service or the customer side references a remote service used,\r\n+     * if there are more than one, you can use commas to separate them\r\n+     */\r\n+    protected String filter;\r\n+\r\n+    /**\r\n+     * The Listener when the provider side exposes a service or the customer side references a remote service used\r\n+     * if there are more than one, you can use commas to separate them\r\n+     */\r\n+    protected String listener;\r\n+\r\n+    /**\r\n+     * The owner of the service providers\r\n+     */\r\n+    protected String owner;\r\n+\r\n+    /**\r\n+     * Connection limits, 0 means shared connection, otherwise it defines the connections delegated to the current service\r\n+     */\r\n+    protected Integer connections;\r\n+\r\n+    /**\r\n+     * The layer of service providers\r\n+     */\r\n+    protected String layer;\r\n+\r\n+    /**\r\n+     * The application info\r\n+     */\r\n+    protected ApplicationConfig application;\r\n+\r\n+    /**\r\n+     * The module info\r\n+     */\r\n+    protected ModuleConfig module;\r\n+\r\n+    /**\r\n+     * Registry centers\r\n+     */\r\n+    protected List<RegistryConfig> registries;\r\n+\r\n+    protected String registryIds;\r\n+\r\n+    // connection events\r\n+    protected String onconnect;\r\n+\r\n+    /**\r\n+     * Disconnection events\r\n+     */\r\n+    protected String ondisconnect;\r\n+    protected MetadataReportConfig metadataReportConfig;\r\n+\r\n+    protected ConfigCenterConfig configCenter;\r\n+\r\n+    // callback limits\r\n+    private Integer callbacks;\r\n+    // the scope for referring/exporting a service, if it's local, it means searching in current JVM only.\r\n+    private String scope;\r\n+\r\n+    private String tag;\r\n+\r\n+    /**\r\n+     * @param local\r\n+     * @see AbstractInterfaceBuilder#stub(String)\r\n+     * @deprecated Replace to <code>stub(String)</code>\r\n+     */\r\n+    @Deprecated\r\n+    public B local(String local) {\r\n+        this.local = local;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    /**\r\n+     * @param local\r\n+     * @see AbstractInterfaceBuilder#stub(Boolean)\r\n+     * @deprecated Replace to <code>stub(Boolean)</code>\r\n+     */\r\n+    @Deprecated\r\n+    public B local(Boolean local) {\r\n+        if (local != null) {\r\n+            this.local = local.toString();\r\n+        } else {\r\n+            this.local = null;\r\n+        }\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B stub(String stub) {\r\n+        this.stub = stub;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B stub(Boolean stub) {\r\n+        if (stub != null) {\r\n+            this.stub = stub.toString();\r\n+        } else {\r\n+            this.stub = null;\r\n+        }\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B monitor(MonitorConfig monitor) {\r\n+        this.monitor = monitor;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B monitor(String monitor) {\r\n+        this.monitor = new MonitorConfig(monitor);\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B proxy(String proxy) {\r\n+        this.proxy = proxy;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B cluster(String cluster) {\r\n+        this.cluster = cluster;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B filter(String filter) {\r\n+        this.filter = filter;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B listener(String listener) {\r\n+        this.listener = listener;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B owner(String owner) {\r\n+        this.owner = owner;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B connections(Integer connections) {\r\n+        this.connections = connections;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B layer(String layer) {\r\n+        this.layer = layer;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B application(ApplicationConfig application) {\r\n+        this.application = application;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B module(ModuleConfig module) {\r\n+        this.module = module;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B addRegistries(List<RegistryConfig> registries) {\r\n+        if (this.registries == null) {\r\n+            this.registries = new ArrayList<>();\r\n+        }\r\n+        this.registries.addAll(registries);\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B addRegistry(RegistryConfig registry) {\r\n+        if (this.registries == null) {\r\n+            this.registries = new ArrayList<>();\r\n+        }\r\n+        this.registries.add(registry);\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B registryIds(String registryIds) {\r\n+        this.registryIds = registryIds;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B onconnect(String onconnect) {\r\n+        this.onconnect = onconnect;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B ondisconnect(String ondisconnect) {\r\n+        this.ondisconnect = ondisconnect;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B metadataReportConfig(MetadataReportConfig metadataReportConfig) {\r\n+        this.metadataReportConfig = metadataReportConfig;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B configCenter(ConfigCenterConfig configCenter) {\r\n+        this.configCenter = configCenter;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B callbacks(Integer callbacks) {\r\n+        this.callbacks = callbacks;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B scope(String scope) {\r\n+        this.scope = scope;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B tag(String tag) {\r\n+        this.tag = tag;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    @Override\r\n+    public void build(T instance) {\r\n+        super.build(instance);\r\n+\r\n+        if (!StringUtils.isEmpty(local)) {\r\n+            instance.setLocal(local);\r\n+        }\r\n+        if (!StringUtils.isEmpty(stub)) {\r\n+            instance.setStub(stub);\r\n+        }\r\n+        if (monitor != null) {\r\n+            instance.setMonitor(monitor);\r\n+        }\r\n+        if (!StringUtils.isEmpty(proxy)) {\r\n+            instance.setProxy(proxy);\r\n+        }\r\n+        if (!StringUtils.isEmpty(cluster)) {\r\n+            instance.setCluster(cluster);\r\n+        }\r\n+        if (!StringUtils.isEmpty(filter)) {\r\n+            instance.setFilter(filter);\r\n+        }\r\n+        if (!StringUtils.isEmpty(listener)) {\r\n+            instance.setListener(listener);\r\n+        }\r\n+        if (!StringUtils.isEmpty(owner)) {\r\n+            instance.setOwner(owner);\r\n+        }\r\n+        if (connections != null) {\r\n+            instance.setConnections(connections);\r\n+        }\r\n+        if (!StringUtils.isEmpty(layer)) {\r\n+            instance.setLayer(layer);\r\n+        }\r\n+        if (application != null) {\r\n+            instance.setApplication(application);\r\n+        }\r\n+        if (module != null) {\r\n+            instance.setModule(module);\r\n+        }\r\n+        if (registries != null) {\r\n+            instance.setRegistries(registries);\r\n+        }\r\n+        if (!StringUtils.isEmpty(registryIds)) {\r\n+            instance.setRegistryIds(registryIds);\r\n+        }\r\n+        if (!StringUtils.isEmpty(onconnect)) {\r\n+            instance.setOnconnect(onconnect);\r\n+        }\r\n+        if (!StringUtils.isEmpty(ondisconnect)) {\r\n+            instance.setOndisconnect(ondisconnect);\r\n+        }\r\n+        if (metadataReportConfig != null) {\r\n+            instance.setMetadataReportConfig(metadataReportConfig);\r\n+        }\r\n+        if (configCenter != null) {\r\n+            instance.setConfigCenter(configCenter);\r\n+        }\r\n+        if (callbacks != null) {\r\n+            instance.setCallbacks(callbacks);\r\n+        }\r\n+        if (!StringUtils.isEmpty(scope)) {\r\n+            instance.setScope(scope);\r\n+        }\r\n+        if (StringUtils.isNotEmpty(tag)) {\r\n+            instance.setTag(tag);\r\n+        }\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/bootstrap/builders/AbstractMethodBuilder.java", "source2": "org/apache/dubbo/config/bootstrap/builders/AbstractMethodBuilder.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,213 +1,213 @@\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.config.bootstrap.builders;\n-\n-import org.apache.dubbo.common.utils.StringUtils;\n-import org.apache.dubbo.config.AbstractMethodConfig;\n-\n-import java.util.Map;\n-\n-/**\n- * AbstractBuilder\n- *\n- * @since 2.7\n- */\n-public abstract class AbstractMethodBuilder<T extends AbstractMethodConfig, B extends AbstractMethodBuilder<T, B>>\n-        extends AbstractBuilder<T, B> {\n-    /**\n-     * The timeout for remote invocation in milliseconds\n-     */\n-    protected Integer timeout;\n-\n-    /**\n-     * The retry times\n-     */\n-    protected Integer retries;\n-\n-    /**\n-     * max concurrent invocations\n-     */\n-    protected Integer actives;\n-\n-    /**\n-     * The load balance\n-     */\n-    protected String loadbalance;\n-\n-    /**\n-     * Whether to async\n-     * note that: it is an unreliable asynchronism that ignores return values and does not block threads.\n-     */\n-    protected Boolean async;\n-\n-    /**\n-     * Whether to ack async-sent\n-     */\n-    protected Boolean sent;\n-\n-    /**\n-     * The name of mock class which gets called when a service fails to execute\n-     *\n-     * note that: the mock doesn't support on the provider side\uff0cand the mock is executed when a non-business exception\n-     * occurs after a remote service call\n-     */\n-    protected String mock;\n-\n-    /**\n-     * Merger\n-     */\n-    protected String merger;\n-\n-    /**\n-     * Cache the return result with the call parameter as key, the following options are available: lru, threadlocal,\n-     * jcache, etc.\n-     */\n-    protected String cache;\n-\n-    /**\n-     * Whether JSR303 standard annotation validation is enabled or not, if enabled, annotations on method parameters will\n-     * be validated\n-     */\n-    protected String validation;\n-\n-    /**\n-     * The customized parameters\n-     */\n-    protected Map<String, String> parameters;\n-\n-    /**\n-     * Forks for forking cluster\n-     */\n-    protected Integer forks;\n-\n-    public B timeout(Integer timeout) {\n-        this.timeout = timeout;\n-        return getThis();\n-    }\n-\n-    public B retries(Integer retries) {\n-        this.retries = retries;\n-        return getThis();\n-    }\n-\n-    public B actives(Integer actives) {\n-        this.actives = actives;\n-        return getThis();\n-    }\n-\n-    public B loadbalance(String loadbalance) {\n-        this.loadbalance = loadbalance;\n-        return getThis();\n-    }\n-\n-    public B async(Boolean async) {\n-        this.async = async;\n-        return getThis();\n-    }\n-\n-    public B sent(Boolean sent) {\n-        this.sent = sent;\n-        return getThis();\n-    }\n-\n-    public B mock(String mock) {\n-        this.mock = mock;\n-        return getThis();\n-    }\n-\n-    public B mock(Boolean mock) {\n-        if (mock != null) {\n-            this.mock = mock.toString();\n-        } else {\n-            this.mock = null;\n-        }\n-        return getThis();\n-    }\n-\n-    public B merger(String merger) {\n-        this.merger = merger;\n-        return getThis();\n-    }\n-\n-    public B cache(String cache) {\n-        this.cache = cache;\n-        return getThis();\n-    }\n-\n-    public B validation(String validation) {\n-        this.validation = validation;\n-        return getThis();\n-    }\n-\n-    public B appendParameters(Map<String, String> appendParameters) {\n-        this.parameters = appendParameters(parameters, appendParameters);\n-        return getThis();\n-    }\n-\n-    public B appendParameter(String key, String value) {\n-        this.parameters = appendParameter(parameters, key, value);\n-        return getThis();\n-    }\n-\n-    public B forks(Integer forks) {\n-        this.forks = forks;\n-        return getThis();\n-    }\n-\n-    @Override\n-    @SuppressWarnings(\"unchecked\")\n-    public void build(T instance) {\n-        super.build(instance);\n-\n-        if (actives != null) {\n-            instance.setActives(actives);\n-        }\n-        if (async != null) {\n-            instance.setAsync(async);\n-        }\n-        if (!StringUtils.isEmpty(cache)) {\n-            instance.setCache(cache);\n-        }\n-        if (forks != null) {\n-            instance.setForks(forks);\n-        }\n-        if (!StringUtils.isEmpty(loadbalance)) {\n-            instance.setLoadbalance(loadbalance);\n-        }\n-        if (!StringUtils.isEmpty(merger)) {\n-            instance.setMerger(merger);\n-        }\n-        if(!StringUtils.isEmpty(mock)) {\n-            instance.setMock(mock);\n-        }\n-        if (retries != null) {\n-            instance.setRetries(retries);\n-        }\n-        if (sent != null) {\n-            instance.setSent(sent);\n-        }\n-        if (timeout != null) {\n-            instance.setTimeout(timeout);\n-        }\n-        if (!StringUtils.isEmpty(validation)) {\n-            instance.setValidation(validation);\n-        }\n-        if (parameters != null) {\n-            instance.setParameters(parameters);\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.config.bootstrap.builders;\r\n+\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+import org.apache.dubbo.config.AbstractMethodConfig;\r\n+\r\n+import java.util.Map;\r\n+\r\n+/**\r\n+ * AbstractBuilder\r\n+ *\r\n+ * @since 2.7\r\n+ */\r\n+public abstract class AbstractMethodBuilder<T extends AbstractMethodConfig, B extends AbstractMethodBuilder<T, B>>\r\n+        extends AbstractBuilder<T, B> {\r\n+    /**\r\n+     * The timeout for remote invocation in milliseconds\r\n+     */\r\n+    protected Integer timeout;\r\n+\r\n+    /**\r\n+     * The retry times\r\n+     */\r\n+    protected Integer retries;\r\n+\r\n+    /**\r\n+     * max concurrent invocations\r\n+     */\r\n+    protected Integer actives;\r\n+\r\n+    /**\r\n+     * The load balance\r\n+     */\r\n+    protected String loadbalance;\r\n+\r\n+    /**\r\n+     * Whether to async\r\n+     * note that: it is an unreliable asynchronism that ignores return values and does not block threads.\r\n+     */\r\n+    protected Boolean async;\r\n+\r\n+    /**\r\n+     * Whether to ack async-sent\r\n+     */\r\n+    protected Boolean sent;\r\n+\r\n+    /**\r\n+     * The name of mock class which gets called when a service fails to execute\r\n+     *\r\n+     * note that: the mock doesn't support on the provider side\uff0cand the mock is executed when a non-business exception\r\n+     * occurs after a remote service call\r\n+     */\r\n+    protected String mock;\r\n+\r\n+    /**\r\n+     * Merger\r\n+     */\r\n+    protected String merger;\r\n+\r\n+    /**\r\n+     * Cache the return result with the call parameter as key, the following options are available: lru, threadlocal,\r\n+     * jcache, etc.\r\n+     */\r\n+    protected String cache;\r\n+\r\n+    /**\r\n+     * Whether JSR303 standard annotation validation is enabled or not, if enabled, annotations on method parameters will\r\n+     * be validated\r\n+     */\r\n+    protected String validation;\r\n+\r\n+    /**\r\n+     * The customized parameters\r\n+     */\r\n+    protected Map<String, String> parameters;\r\n+\r\n+    /**\r\n+     * Forks for forking cluster\r\n+     */\r\n+    protected Integer forks;\r\n+\r\n+    public B timeout(Integer timeout) {\r\n+        this.timeout = timeout;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B retries(Integer retries) {\r\n+        this.retries = retries;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B actives(Integer actives) {\r\n+        this.actives = actives;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B loadbalance(String loadbalance) {\r\n+        this.loadbalance = loadbalance;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B async(Boolean async) {\r\n+        this.async = async;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B sent(Boolean sent) {\r\n+        this.sent = sent;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B mock(String mock) {\r\n+        this.mock = mock;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B mock(Boolean mock) {\r\n+        if (mock != null) {\r\n+            this.mock = mock.toString();\r\n+        } else {\r\n+            this.mock = null;\r\n+        }\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B merger(String merger) {\r\n+        this.merger = merger;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B cache(String cache) {\r\n+        this.cache = cache;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B validation(String validation) {\r\n+        this.validation = validation;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B appendParameters(Map<String, String> appendParameters) {\r\n+        this.parameters = appendParameters(parameters, appendParameters);\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B appendParameter(String key, String value) {\r\n+        this.parameters = appendParameter(parameters, key, value);\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B forks(Integer forks) {\r\n+        this.forks = forks;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    @Override\r\n+    @SuppressWarnings(\"unchecked\")\r\n+    public void build(T instance) {\r\n+        super.build(instance);\r\n+\r\n+        if (actives != null) {\r\n+            instance.setActives(actives);\r\n+        }\r\n+        if (async != null) {\r\n+            instance.setAsync(async);\r\n+        }\r\n+        if (!StringUtils.isEmpty(cache)) {\r\n+            instance.setCache(cache);\r\n+        }\r\n+        if (forks != null) {\r\n+            instance.setForks(forks);\r\n+        }\r\n+        if (!StringUtils.isEmpty(loadbalance)) {\r\n+            instance.setLoadbalance(loadbalance);\r\n+        }\r\n+        if (!StringUtils.isEmpty(merger)) {\r\n+            instance.setMerger(merger);\r\n+        }\r\n+        if(!StringUtils.isEmpty(mock)) {\r\n+            instance.setMock(mock);\r\n+        }\r\n+        if (retries != null) {\r\n+            instance.setRetries(retries);\r\n+        }\r\n+        if (sent != null) {\r\n+            instance.setSent(sent);\r\n+        }\r\n+        if (timeout != null) {\r\n+            instance.setTimeout(timeout);\r\n+        }\r\n+        if (!StringUtils.isEmpty(validation)) {\r\n+            instance.setValidation(validation);\r\n+        }\r\n+        if (parameters != null) {\r\n+            instance.setParameters(parameters);\r\n+        }\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/bootstrap/builders/AbstractReferenceBuilder.java", "source2": "org/apache/dubbo/config/bootstrap/builders/AbstractReferenceBuilder.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,161 +1,161 @@\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.config.bootstrap.builders;\n-\n-import org.apache.dubbo.common.utils.StringUtils;\n-import org.apache.dubbo.config.AbstractReferenceConfig;\n-\n-/**\n- * AbstractBuilder\n- *\n- * @since 2.7\n- */\n-public abstract class AbstractReferenceBuilder<T extends AbstractReferenceConfig, B extends AbstractReferenceBuilder<T, B>>\n-        extends AbstractInterfaceBuilder<T, B> {\n-\n-    /**\n-     * Check if service provider exists, if not exists, it will be fast fail\n-     */\n-    protected Boolean check;\n-\n-    /**\n-     * Whether to eagle-init\n-     */\n-    protected Boolean init;\n-\n-    /**\n-     * Whether to use generic interface\n-     */\n-    protected String generic;\n-\n-    /**\n-     * Whether to find reference's instance from the current JVM\n-     */\n-    protected Boolean injvm;\n-\n-    /**\n-     * Lazy create connection\n-     */\n-    protected Boolean lazy;\n-\n-    protected String reconnect;\n-\n-    protected Boolean sticky;\n-\n-    /**\n-     * The remote service version the customer side will reference\n-     */\n-    protected String version;\n-\n-    /**\n-     * The remote service group the customer side will reference\n-     */\n-    protected String group;\n-\n-    public B check(Boolean check) {\n-        this.check = check;\n-        return getThis();\n-    }\n-\n-    public B init(Boolean init) {\n-        this.init = init;\n-        return getThis();\n-    }\n-\n-    public B generic(String generic) {\n-        this.generic = generic;\n-        return getThis();\n-    }\n-\n-    public B generic(Boolean generic) {\n-        if (generic != null) {\n-            this.generic = generic.toString();\n-        } else {\n-            this.generic = null;\n-        }\n-        return getThis();\n-    }\n-\n-    /**\n-     * @param injvm\n-     * @see AbstractInterfaceBuilder#scope(String)\n-     * @deprecated instead, use the parameter <b>scope</b> to judge if it's in jvm, scope=local\n-     */\n-    @Deprecated\n-    public B injvm(Boolean injvm) {\n-        this.injvm = injvm;\n-        return getThis();\n-    }\n-\n-    public B lazy(Boolean lazy) {\n-        this.lazy = lazy;\n-        return getThis();\n-    }\n-\n-    public B reconnect(String reconnect) {\n-        this.reconnect = reconnect;\n-        return getThis();\n-    }\n-\n-    public B sticky(Boolean sticky) {\n-        this.sticky = sticky;\n-        return getThis();\n-    }\n-\n-    public B version(String version) {\n-        this.version = version;\n-        return getThis();\n-    }\n-\n-    public B group(String group) {\n-        this.group = group;\n-        return getThis();\n-    }\n-\n-    @Override\n-    public void build(T instance) {\n-        super.build(instance);\n-\n-        if (check != null) {\n-            instance.setCheck(check);\n-        }\n-        if (init != null) {\n-            instance.setInit(init);\n-        }\n-        if (!StringUtils.isEmpty(generic)) {\n-            instance.setGeneric(generic);\n-        }\n-        if (injvm != null) {\n-            instance.setInjvm(injvm);\n-        }\n-        if (lazy != null) {\n-            instance.setLazy(lazy);\n-        }\n-        if (!StringUtils.isEmpty(reconnect)) {\n-            instance.setReconnect(reconnect);\n-        }\n-        if (sticky != null) {\n-            instance.setSticky(sticky);\n-        }\n-        if (!StringUtils.isEmpty(version)) {\n-            instance.setVersion(version);\n-        }\n-        if (!StringUtils.isEmpty(group)) {\n-            instance.setGroup(group);\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.config.bootstrap.builders;\r\n+\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+import org.apache.dubbo.config.AbstractReferenceConfig;\r\n+\r\n+/**\r\n+ * AbstractBuilder\r\n+ *\r\n+ * @since 2.7\r\n+ */\r\n+public abstract class AbstractReferenceBuilder<T extends AbstractReferenceConfig, B extends AbstractReferenceBuilder<T, B>>\r\n+        extends AbstractInterfaceBuilder<T, B> {\r\n+\r\n+    /**\r\n+     * Check if service provider exists, if not exists, it will be fast fail\r\n+     */\r\n+    protected Boolean check;\r\n+\r\n+    /**\r\n+     * Whether to eagle-init\r\n+     */\r\n+    protected Boolean init;\r\n+\r\n+    /**\r\n+     * Whether to use generic interface\r\n+     */\r\n+    protected String generic;\r\n+\r\n+    /**\r\n+     * Whether to find reference's instance from the current JVM\r\n+     */\r\n+    protected Boolean injvm;\r\n+\r\n+    /**\r\n+     * Lazy create connection\r\n+     */\r\n+    protected Boolean lazy;\r\n+\r\n+    protected String reconnect;\r\n+\r\n+    protected Boolean sticky;\r\n+\r\n+    /**\r\n+     * The remote service version the customer side will reference\r\n+     */\r\n+    protected String version;\r\n+\r\n+    /**\r\n+     * The remote service group the customer side will reference\r\n+     */\r\n+    protected String group;\r\n+\r\n+    public B check(Boolean check) {\r\n+        this.check = check;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B init(Boolean init) {\r\n+        this.init = init;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B generic(String generic) {\r\n+        this.generic = generic;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B generic(Boolean generic) {\r\n+        if (generic != null) {\r\n+            this.generic = generic.toString();\r\n+        } else {\r\n+            this.generic = null;\r\n+        }\r\n+        return getThis();\r\n+    }\r\n+\r\n+    /**\r\n+     * @param injvm\r\n+     * @see AbstractInterfaceBuilder#scope(String)\r\n+     * @deprecated instead, use the parameter <b>scope</b> to judge if it's in jvm, scope=local\r\n+     */\r\n+    @Deprecated\r\n+    public B injvm(Boolean injvm) {\r\n+        this.injvm = injvm;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B lazy(Boolean lazy) {\r\n+        this.lazy = lazy;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B reconnect(String reconnect) {\r\n+        this.reconnect = reconnect;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B sticky(Boolean sticky) {\r\n+        this.sticky = sticky;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B version(String version) {\r\n+        this.version = version;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B group(String group) {\r\n+        this.group = group;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    @Override\r\n+    public void build(T instance) {\r\n+        super.build(instance);\r\n+\r\n+        if (check != null) {\r\n+            instance.setCheck(check);\r\n+        }\r\n+        if (init != null) {\r\n+            instance.setInit(init);\r\n+        }\r\n+        if (!StringUtils.isEmpty(generic)) {\r\n+            instance.setGeneric(generic);\r\n+        }\r\n+        if (injvm != null) {\r\n+            instance.setInjvm(injvm);\r\n+        }\r\n+        if (lazy != null) {\r\n+            instance.setLazy(lazy);\r\n+        }\r\n+        if (!StringUtils.isEmpty(reconnect)) {\r\n+            instance.setReconnect(reconnect);\r\n+        }\r\n+        if (sticky != null) {\r\n+            instance.setSticky(sticky);\r\n+        }\r\n+        if (!StringUtils.isEmpty(version)) {\r\n+            instance.setVersion(version);\r\n+        }\r\n+        if (!StringUtils.isEmpty(group)) {\r\n+            instance.setGroup(group);\r\n+        }\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/bootstrap/builders/AbstractServiceBuilder.java", "source2": "org/apache/dubbo/config/bootstrap/builders/AbstractServiceBuilder.java", "comments": ["Line-ending 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.config.bootstrap.builders;\n-\n-import org.apache.dubbo.common.utils.StringUtils;\n-import org.apache.dubbo.config.AbstractServiceConfig;\n-import org.apache.dubbo.config.ProtocolConfig;\n-\n-import java.util.ArrayList;\n-import java.util.List;\n-\n-/**\n- * AbstractBuilder\n- *\n- * @since 2.7\n- */\n-public abstract class AbstractServiceBuilder<T extends AbstractServiceConfig, B extends AbstractServiceBuilder<T, B>>\n-        extends AbstractInterfaceBuilder<T, B> {\n-\n-    /**\n-     * The service version\n-     */\n-    protected String version;\n-\n-    /**\n-     * The service group\n-     */\n-    protected String group;\n-\n-    /**\n-     * whether the service is deprecated\n-     */\n-    protected Boolean deprecated;\n-\n-    /**\n-     * The time delay register service (milliseconds)\n-     */\n-    protected Integer delay;\n-\n-    /**\n-     * Whether to export the service\n-     */\n-    protected Boolean export;\n-\n-    /**\n-     * The service weight\n-     */\n-    protected Integer weight;\n-\n-    /**\n-     * Document center\n-     */\n-    protected String document;\n-\n-    /**\n-     * Whether to register as a dynamic service or not on register center, it the value is false, the status will be disabled\n-     * after the service registered,and it needs to be enabled manually; if you want to disable the service, you also need\n-     * manual processing\n-     */\n-    protected Boolean dynamic;\n-\n-    /**\n-     * Whether to use token\n-     */\n-    protected String token;\n-\n-    /**\n-     * Whether to export access logs to logs\n-     */\n-    protected String accesslog;\n-\n-    /**\n-     * The protocol list the service will export with\n-     */\n-    protected List<ProtocolConfig> protocols;\n-    protected String protocolIds;\n-\n-    // max allowed execute times\n-    private Integer executes;\n-\n-    /**\n-     * Whether to register\n-     */\n-    private Boolean register;\n-\n-    /**\n-     * Warm up period\n-     */\n-    private Integer warmup;\n-\n-    /**\n-     * The serialization type\n-     */\n-    private String serialization;\n-\n-    public B version(String version) {\n-        this.version = version;\n-        return getThis();\n-    }\n-\n-    public B group(String group) {\n-        this.group = group;\n-        return getThis();\n-    }\n-\n-    public B deprecated(Boolean deprecated) {\n-        this.deprecated = deprecated;\n-        return getThis();\n-    }\n-\n-    public B delay(Integer delay) {\n-        this.delay = delay;\n-        return getThis();\n-    }\n-\n-    public B export(Boolean export) {\n-        this.export = export;\n-        return getThis();\n-    }\n-\n-    public B weight(Integer weight) {\n-        this.weight = weight;\n-        return getThis();\n-    }\n-\n-    public B document(String document) {\n-        this.document = document;\n-        return getThis();\n-    }\n-\n-    public B dynamic(Boolean dynamic) {\n-        this.dynamic = dynamic;\n-        return getThis();\n-    }\n-\n-    public B token(String token) {\n-        this.token = token;\n-        return getThis();\n-    }\n-\n-    public B token(Boolean token) {\n-        if (token != null) {\n-            this.token = token.toString();\n-        } else {\n-            this.token = null;\n-        }\n-        return getThis();\n-    }\n-\n-    public B accesslog(String accesslog) {\n-        this.accesslog = accesslog;\n-        return getThis();\n-    }\n-\n-    public B accesslog(Boolean accesslog) {\n-        if (accesslog != null) {\n-            this.accesslog = accesslog.toString();\n-        } else {\n-            this.accesslog = null;\n-        }\n-        return getThis();\n-    }\n-\n-    public B addProtocols(List<ProtocolConfig> protocols) {\n-        if (this.protocols == null) {\n-            this.protocols = new ArrayList<>();\n-        }\n-        this.protocols.addAll(protocols);\n-        return getThis();\n-    }\n-\n-    public B addProtocol(ProtocolConfig protocol) {\n-        if (this.protocols == null) {\n-            this.protocols = new ArrayList<>();\n-        }\n-        this.protocols.add(protocol);\n-        return getThis();\n-    }\n-\n-    public B protocolIds(String protocolIds) {\n-        this.protocolIds = protocolIds;\n-        return getThis();\n-    }\n-\n-    public B executes(Integer executes) {\n-        this.executes = executes;\n-        return getThis();\n-    }\n-\n-    public B register(Boolean register) {\n-        this.register = register;\n-        return getThis();\n-    }\n-\n-    public B warmup(Integer warmup) {\n-        this.warmup = warmup;\n-        return getThis();\n-    }\n-\n-    public  B serialization(String serialization) {\n-        this.serialization = serialization;\n-        return getThis();\n-    }\n-\n-    @Override\n-    public void build(T instance) {\n-        super.build(instance);\n-\n-        if (!StringUtils.isEmpty(version)) {\n-            instance.setVersion(version);\n-        }\n-        if (!StringUtils.isEmpty(group)) {\n-            instance.setGroup(group);\n-        }\n-        if (deprecated != null) {\n-            instance.setDeprecated(deprecated);\n-        }\n-        if (delay != null) {\n-            instance.setDelay(delay);\n-        }\n-        if (export != null) {\n-            instance.setExport(export);\n-        }\n-        if (weight != null) {\n-            instance.setWeight(weight);\n-        }\n-        if (!StringUtils.isEmpty(document)) {\n-            instance.setDocument(document);\n-        }\n-        if (dynamic != null) {\n-            instance.setDynamic(dynamic);\n-        }\n-        if (!StringUtils.isEmpty(token)) {\n-            instance.setToken(token);\n-        }\n-        if (!StringUtils.isEmpty(accesslog)) {\n-            instance.setAccesslog(accesslog);\n-        }\n-        if (protocols != null) {\n-            instance.setProtocols(protocols);\n-        }\n-        if (!StringUtils.isEmpty(protocolIds)) {\n-            instance.setProtocolIds(protocolIds);\n-        }\n-        if (executes != null) {\n-            instance.setExecutes(executes);\n-        }\n-        if (register != null) {\n-            instance.setRegister(register);\n-        }\n-        if (warmup != null) {\n-            instance.setWarmup(warmup);\n-        }\n-        if (!StringUtils.isEmpty(serialization)) {\n-            instance.setSerialization(serialization);\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.config.bootstrap.builders;\r\n+\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+import org.apache.dubbo.config.AbstractServiceConfig;\r\n+import org.apache.dubbo.config.ProtocolConfig;\r\n+\r\n+import java.util.ArrayList;\r\n+import java.util.List;\r\n+\r\n+/**\r\n+ * AbstractBuilder\r\n+ *\r\n+ * @since 2.7\r\n+ */\r\n+public abstract class AbstractServiceBuilder<T extends AbstractServiceConfig, B extends AbstractServiceBuilder<T, B>>\r\n+        extends AbstractInterfaceBuilder<T, B> {\r\n+\r\n+    /**\r\n+     * The service version\r\n+     */\r\n+    protected String version;\r\n+\r\n+    /**\r\n+     * The service group\r\n+     */\r\n+    protected String group;\r\n+\r\n+    /**\r\n+     * whether the service is deprecated\r\n+     */\r\n+    protected Boolean deprecated;\r\n+\r\n+    /**\r\n+     * The time delay register service (milliseconds)\r\n+     */\r\n+    protected Integer delay;\r\n+\r\n+    /**\r\n+     * Whether to export the service\r\n+     */\r\n+    protected Boolean export;\r\n+\r\n+    /**\r\n+     * The service weight\r\n+     */\r\n+    protected Integer weight;\r\n+\r\n+    /**\r\n+     * Document center\r\n+     */\r\n+    protected String document;\r\n+\r\n+    /**\r\n+     * Whether to register as a dynamic service or not on register center, it the value is false, the status will be disabled\r\n+     * after the service registered,and it needs to be enabled manually; if you want to disable the service, you also need\r\n+     * manual processing\r\n+     */\r\n+    protected Boolean dynamic;\r\n+\r\n+    /**\r\n+     * Whether to use token\r\n+     */\r\n+    protected String token;\r\n+\r\n+    /**\r\n+     * Whether to export access logs to logs\r\n+     */\r\n+    protected String accesslog;\r\n+\r\n+    /**\r\n+     * The protocol list the service will export with\r\n+     */\r\n+    protected List<ProtocolConfig> protocols;\r\n+    protected String protocolIds;\r\n+\r\n+    // max allowed execute times\r\n+    private Integer executes;\r\n+\r\n+    /**\r\n+     * Whether to register\r\n+     */\r\n+    private Boolean register;\r\n+\r\n+    /**\r\n+     * Warm up period\r\n+     */\r\n+    private Integer warmup;\r\n+\r\n+    /**\r\n+     * The serialization type\r\n+     */\r\n+    private String serialization;\r\n+\r\n+    public B version(String version) {\r\n+        this.version = version;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B group(String group) {\r\n+        this.group = group;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B deprecated(Boolean deprecated) {\r\n+        this.deprecated = deprecated;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B delay(Integer delay) {\r\n+        this.delay = delay;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B export(Boolean export) {\r\n+        this.export = export;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B weight(Integer weight) {\r\n+        this.weight = weight;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B document(String document) {\r\n+        this.document = document;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B dynamic(Boolean dynamic) {\r\n+        this.dynamic = dynamic;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B token(String token) {\r\n+        this.token = token;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B token(Boolean token) {\r\n+        if (token != null) {\r\n+            this.token = token.toString();\r\n+        } else {\r\n+            this.token = null;\r\n+        }\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B accesslog(String accesslog) {\r\n+        this.accesslog = accesslog;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B accesslog(Boolean accesslog) {\r\n+        if (accesslog != null) {\r\n+            this.accesslog = accesslog.toString();\r\n+        } else {\r\n+            this.accesslog = null;\r\n+        }\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B addProtocols(List<ProtocolConfig> protocols) {\r\n+        if (this.protocols == null) {\r\n+            this.protocols = new ArrayList<>();\r\n+        }\r\n+        this.protocols.addAll(protocols);\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B addProtocol(ProtocolConfig protocol) {\r\n+        if (this.protocols == null) {\r\n+            this.protocols = new ArrayList<>();\r\n+        }\r\n+        this.protocols.add(protocol);\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B protocolIds(String protocolIds) {\r\n+        this.protocolIds = protocolIds;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B executes(Integer executes) {\r\n+        this.executes = executes;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B register(Boolean register) {\r\n+        this.register = register;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public B warmup(Integer warmup) {\r\n+        this.warmup = warmup;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public  B serialization(String serialization) {\r\n+        this.serialization = serialization;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    @Override\r\n+    public void build(T instance) {\r\n+        super.build(instance);\r\n+\r\n+        if (!StringUtils.isEmpty(version)) {\r\n+            instance.setVersion(version);\r\n+        }\r\n+        if (!StringUtils.isEmpty(group)) {\r\n+            instance.setGroup(group);\r\n+        }\r\n+        if (deprecated != null) {\r\n+            instance.setDeprecated(deprecated);\r\n+        }\r\n+        if (delay != null) {\r\n+            instance.setDelay(delay);\r\n+        }\r\n+        if (export != null) {\r\n+            instance.setExport(export);\r\n+        }\r\n+        if (weight != null) {\r\n+            instance.setWeight(weight);\r\n+        }\r\n+        if (!StringUtils.isEmpty(document)) {\r\n+            instance.setDocument(document);\r\n+        }\r\n+        if (dynamic != null) {\r\n+            instance.setDynamic(dynamic);\r\n+        }\r\n+        if (!StringUtils.isEmpty(token)) {\r\n+            instance.setToken(token);\r\n+        }\r\n+        if (!StringUtils.isEmpty(accesslog)) {\r\n+            instance.setAccesslog(accesslog);\r\n+        }\r\n+        if (protocols != null) {\r\n+            instance.setProtocols(protocols);\r\n+        }\r\n+        if (!StringUtils.isEmpty(protocolIds)) {\r\n+            instance.setProtocolIds(protocolIds);\r\n+        }\r\n+        if (executes != null) {\r\n+            instance.setExecutes(executes);\r\n+        }\r\n+        if (register != null) {\r\n+            instance.setRegister(register);\r\n+        }\r\n+        if (warmup != null) {\r\n+            instance.setWarmup(warmup);\r\n+        }\r\n+        if (!StringUtils.isEmpty(serialization)) {\r\n+            instance.setSerialization(serialization);\r\n+        }\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/bootstrap/builders/ApplicationBuilder.java", "source2": "org/apache/dubbo/config/bootstrap/builders/ApplicationBuilder.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,214 +1,214 @@\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.config.bootstrap.builders;\n-\n-import org.apache.dubbo.common.utils.StringUtils;\n-import org.apache.dubbo.config.ApplicationConfig;\n-import org.apache.dubbo.config.MonitorConfig;\n-import org.apache.dubbo.config.RegistryConfig;\n-\n-import java.util.ArrayList;\n-import java.util.List;\n-import java.util.Map;\n-\n-import static org.apache.dubbo.config.Constants.PRODUCTION_ENVIRONMENT;\n-\n-/**\n- * This is a builder for build {@link ApplicationConfig}.\n- * @since 2.7\n- */\n-public class ApplicationBuilder extends AbstractBuilder<ApplicationConfig, ApplicationBuilder> {\n-    private String name;\n-    private String metadata;\n-    private String version;\n-    private String owner;\n-    private String organization;\n-    private String architecture;\n-    private String environment = PRODUCTION_ENVIRONMENT;\n-    private String compiler;\n-    private String logger;\n-    private List<RegistryConfig> registries;\n-    private String registryIds;\n-    private MonitorConfig monitor;\n-    private Boolean isDefault;\n-    private String dumpDirectory;\n-    private Boolean qosEnable;\n-    private Integer qosPort;\n-    private Boolean qosAcceptForeignIp;\n-    private Map<String, String> parameters;\n-    private String shutwait;\n-    private Integer metadataServicePort;\n-\n-    public static ApplicationBuilder newBuilder() {\n-        return new ApplicationBuilder();\n-    }\n-\n-    public ApplicationBuilder name(String name) {\n-        this.name = name;\n-        return getThis();\n-    }\n-\n-    public ApplicationBuilder metadata(String metadata) {\n-        this.metadata = metadata;\n-        return getThis();\n-    }\n-\n-    public ApplicationBuilder version(String version) {\n-        this.version = version;\n-        return getThis();\n-    }\n-\n-    public ApplicationBuilder owner(String owner) {\n-        this.owner = owner;\n-        return getThis();\n-    }\n-\n-    public ApplicationBuilder organization(String organization) {\n-        this.organization = organization;\n-        return getThis();\n-    }\n-\n-    public ApplicationBuilder architecture(String architecture) {\n-        this.architecture = architecture;\n-        return getThis();\n-    }\n-\n-    public ApplicationBuilder environment(String environment) {\n-        this.environment = environment;\n-        return getThis();\n-    }\n-\n-    public ApplicationBuilder compiler(String compiler) {\n-        this.compiler = compiler;\n-        return getThis();\n-    }\n-\n-    public ApplicationBuilder logger(String logger) {\n-        this.logger = logger;\n-        return getThis();\n-    }\n-\n-    public ApplicationBuilder addRegistry(RegistryConfig registry) {\n-        if (this.registries == null) {\n-            this.registries = new ArrayList<>();\n-        }\n-        this.registries.add(registry);\n-        return getThis();\n-    }\n-\n-    public ApplicationBuilder addRegistries(List<? extends RegistryConfig> registries) {\n-        if (this.registries == null) {\n-            this.registries = new ArrayList<>();\n-        }\n-        this.registries.addAll(registries);\n-        return getThis();\n-    }\n-\n-    public ApplicationBuilder registryIds(String registryIds) {\n-        this.registryIds = registryIds;\n-        return getThis();\n-    }\n-\n-    public ApplicationBuilder monitor(MonitorConfig monitor) {\n-        this.monitor = monitor;\n-        return getThis();\n-    }\n-\n-    public ApplicationBuilder monitor(String monitor) {\n-        this.monitor = new MonitorConfig(monitor);\n-        return getThis();\n-    }\n-\n-    public ApplicationBuilder isDefault(Boolean isDefault) {\n-        this.isDefault = isDefault;\n-        return getThis();\n-    }\n-\n-    public ApplicationBuilder dumpDirectory(String dumpDirectory) {\n-        this.dumpDirectory = dumpDirectory;\n-        return getThis();\n-    }\n-\n-    public ApplicationBuilder qosEnable(Boolean qosEnable) {\n-        this.qosEnable = qosEnable;\n-        return getThis();\n-    }\n-\n-    public ApplicationBuilder qosPort(Integer qosPort) {\n-        this.qosPort = qosPort;\n-        return getThis();\n-    }\n-\n-    public ApplicationBuilder qosAcceptForeignIp(Boolean qosAcceptForeignIp) {\n-        this.qosAcceptForeignIp = qosAcceptForeignIp;\n-        return getThis();\n-    }\n-\n-    public ApplicationBuilder shutwait(String shutwait) {\n-        this.shutwait = shutwait;\n-        return getThis();\n-    }\n-\n-    public ApplicationBuilder appendParameter(String key, String value) {\n-        this.parameters = appendParameter(parameters, key, value);\n-        return getThis();\n-    }\n-\n-    public ApplicationBuilder appendParameters(Map<String, String> appendParameters) {\n-        this.parameters = appendParameters(parameters, appendParameters);\n-        return getThis();\n-    }\n-\n-    public ApplicationBuilder metadataServicePort(Integer metadataServicePort) {\n-        this.metadataServicePort = metadataServicePort;\n-        return getThis();\n-    }\n-\n-    public ApplicationConfig build() {\n-        ApplicationConfig config = new ApplicationConfig();\n-        super.build(config);\n-\n-        config.setName(name);\n-        config.setMetadataType(metadata);\n-        config.setVersion(this.version);\n-        config.setOwner(this.owner);\n-        config.setOrganization(this.organization);\n-        config.setArchitecture(this.architecture);\n-        config.setEnvironment(this.environment);\n-        config.setCompiler(this.compiler);\n-        config.setLogger(this.logger);\n-        config.setRegistries(this.registries);\n-        config.setRegistryIds(this.registryIds);\n-        config.setMonitor(this.monitor);\n-        config.setDefault(this.isDefault);\n-        config.setDumpDirectory(this.dumpDirectory);\n-        config.setQosEnable(this.qosEnable);\n-        config.setQosPort(this.qosPort);\n-        config.setQosAcceptForeignIp(this.qosAcceptForeignIp);\n-        config.setMetadataServicePort(this.metadataServicePort);\n-        config.setParameters(this.parameters);\n-        if (!StringUtils.isEmpty(shutwait)) {\n-            config.setShutwait(shutwait);\n-        }\n-        return config;\n-    }\n-\n-    @Override\n-    protected ApplicationBuilder getThis() {\n-        return this;\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.config.bootstrap.builders;\r\n+\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+import org.apache.dubbo.config.ApplicationConfig;\r\n+import org.apache.dubbo.config.MonitorConfig;\r\n+import org.apache.dubbo.config.RegistryConfig;\r\n+\r\n+import java.util.ArrayList;\r\n+import java.util.List;\r\n+import java.util.Map;\r\n+\r\n+import static org.apache.dubbo.config.Constants.PRODUCTION_ENVIRONMENT;\r\n+\r\n+/**\r\n+ * This is a builder for build {@link ApplicationConfig}.\r\n+ * @since 2.7\r\n+ */\r\n+public class ApplicationBuilder extends AbstractBuilder<ApplicationConfig, ApplicationBuilder> {\r\n+    private String name;\r\n+    private String metadata;\r\n+    private String version;\r\n+    private String owner;\r\n+    private String organization;\r\n+    private String architecture;\r\n+    private String environment = PRODUCTION_ENVIRONMENT;\r\n+    private String compiler;\r\n+    private String logger;\r\n+    private List<RegistryConfig> registries;\r\n+    private String registryIds;\r\n+    private MonitorConfig monitor;\r\n+    private Boolean isDefault;\r\n+    private String dumpDirectory;\r\n+    private Boolean qosEnable;\r\n+    private Integer qosPort;\r\n+    private Boolean qosAcceptForeignIp;\r\n+    private Map<String, String> parameters;\r\n+    private String shutwait;\r\n+    private Integer metadataServicePort;\r\n+\r\n+    public static ApplicationBuilder newBuilder() {\r\n+        return new ApplicationBuilder();\r\n+    }\r\n+\r\n+    public ApplicationBuilder name(String name) {\r\n+        this.name = name;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ApplicationBuilder metadata(String metadata) {\r\n+        this.metadata = metadata;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ApplicationBuilder version(String version) {\r\n+        this.version = version;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ApplicationBuilder owner(String owner) {\r\n+        this.owner = owner;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ApplicationBuilder organization(String organization) {\r\n+        this.organization = organization;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ApplicationBuilder architecture(String architecture) {\r\n+        this.architecture = architecture;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ApplicationBuilder environment(String environment) {\r\n+        this.environment = environment;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ApplicationBuilder compiler(String compiler) {\r\n+        this.compiler = compiler;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ApplicationBuilder logger(String logger) {\r\n+        this.logger = logger;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ApplicationBuilder addRegistry(RegistryConfig registry) {\r\n+        if (this.registries == null) {\r\n+            this.registries = new ArrayList<>();\r\n+        }\r\n+        this.registries.add(registry);\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ApplicationBuilder addRegistries(List<? extends RegistryConfig> registries) {\r\n+        if (this.registries == null) {\r\n+            this.registries = new ArrayList<>();\r\n+        }\r\n+        this.registries.addAll(registries);\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ApplicationBuilder registryIds(String registryIds) {\r\n+        this.registryIds = registryIds;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ApplicationBuilder monitor(MonitorConfig monitor) {\r\n+        this.monitor = monitor;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ApplicationBuilder monitor(String monitor) {\r\n+        this.monitor = new MonitorConfig(monitor);\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ApplicationBuilder isDefault(Boolean isDefault) {\r\n+        this.isDefault = isDefault;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ApplicationBuilder dumpDirectory(String dumpDirectory) {\r\n+        this.dumpDirectory = dumpDirectory;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ApplicationBuilder qosEnable(Boolean qosEnable) {\r\n+        this.qosEnable = qosEnable;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ApplicationBuilder qosPort(Integer qosPort) {\r\n+        this.qosPort = qosPort;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ApplicationBuilder qosAcceptForeignIp(Boolean qosAcceptForeignIp) {\r\n+        this.qosAcceptForeignIp = qosAcceptForeignIp;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ApplicationBuilder shutwait(String shutwait) {\r\n+        this.shutwait = shutwait;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ApplicationBuilder appendParameter(String key, String value) {\r\n+        this.parameters = appendParameter(parameters, key, value);\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ApplicationBuilder appendParameters(Map<String, String> appendParameters) {\r\n+        this.parameters = appendParameters(parameters, appendParameters);\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ApplicationBuilder metadataServicePort(Integer metadataServicePort) {\r\n+        this.metadataServicePort = metadataServicePort;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ApplicationConfig build() {\r\n+        ApplicationConfig config = new ApplicationConfig();\r\n+        super.build(config);\r\n+\r\n+        config.setName(name);\r\n+        config.setMetadataType(metadata);\r\n+        config.setVersion(this.version);\r\n+        config.setOwner(this.owner);\r\n+        config.setOrganization(this.organization);\r\n+        config.setArchitecture(this.architecture);\r\n+        config.setEnvironment(this.environment);\r\n+        config.setCompiler(this.compiler);\r\n+        config.setLogger(this.logger);\r\n+        config.setRegistries(this.registries);\r\n+        config.setRegistryIds(this.registryIds);\r\n+        config.setMonitor(this.monitor);\r\n+        config.setDefault(this.isDefault);\r\n+        config.setDumpDirectory(this.dumpDirectory);\r\n+        config.setQosEnable(this.qosEnable);\r\n+        config.setQosPort(this.qosPort);\r\n+        config.setQosAcceptForeignIp(this.qosAcceptForeignIp);\r\n+        config.setMetadataServicePort(this.metadataServicePort);\r\n+        config.setParameters(this.parameters);\r\n+        if (!StringUtils.isEmpty(shutwait)) {\r\n+            config.setShutwait(shutwait);\r\n+        }\r\n+        return config;\r\n+    }\r\n+\r\n+    @Override\r\n+    protected ApplicationBuilder getThis() {\r\n+        return this;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/bootstrap/builders/ArgumentBuilder.java", "source2": "org/apache/dubbo/config/bootstrap/builders/ArgumentBuilder.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,63 +1,63 @@\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.config.bootstrap.builders;\n-\n-import org.apache.dubbo.config.ArgumentConfig;\n-\n-/**\n- * This is a builder for build {@link ArgumentConfig}.\n- * @since 2.7\n- */\n-public class ArgumentBuilder {\n-    /**\n-     * The argument index: index -1 represents not set\n-     */\n-    private Integer index = -1;\n-\n-    /**\n-     * Argument type\n-     */\n-    private String type;\n-\n-    /**\n-     * Whether the argument is the callback interface\n-     */\n-    private Boolean callback;\n-\n-    public ArgumentBuilder index(Integer index) {\n-        this.index = index;\n-        return this;\n-    }\n-\n-    public ArgumentBuilder type(String type) {\n-        this.type = type;\n-        return this;\n-    }\n-\n-    public ArgumentBuilder callback(Boolean callback) {\n-        this.callback = callback;\n-        return this;\n-    }\n-\n-    public ArgumentConfig build() {\n-        ArgumentConfig argumentConfig = new ArgumentConfig();\n-        argumentConfig.setIndex(index);\n-        argumentConfig.setType(type);\n-        argumentConfig.setCallback(callback);\n-        return argumentConfig;\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.config.bootstrap.builders;\r\n+\r\n+import org.apache.dubbo.config.ArgumentConfig;\r\n+\r\n+/**\r\n+ * This is a builder for build {@link ArgumentConfig}.\r\n+ * @since 2.7\r\n+ */\r\n+public class ArgumentBuilder {\r\n+    /**\r\n+     * The argument index: index -1 represents not set\r\n+     */\r\n+    private Integer index = -1;\r\n+\r\n+    /**\r\n+     * Argument type\r\n+     */\r\n+    private String type;\r\n+\r\n+    /**\r\n+     * Whether the argument is the callback interface\r\n+     */\r\n+    private Boolean callback;\r\n+\r\n+    public ArgumentBuilder index(Integer index) {\r\n+        this.index = index;\r\n+        return this;\r\n+    }\r\n+\r\n+    public ArgumentBuilder type(String type) {\r\n+        this.type = type;\r\n+        return this;\r\n+    }\r\n+\r\n+    public ArgumentBuilder callback(Boolean callback) {\r\n+        this.callback = callback;\r\n+        return this;\r\n+    }\r\n+\r\n+    public ArgumentConfig build() {\r\n+        ArgumentConfig argumentConfig = new ArgumentConfig();\r\n+        argumentConfig.setIndex(index);\r\n+        argumentConfig.setType(type);\r\n+        argumentConfig.setCallback(callback);\r\n+        return argumentConfig;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/bootstrap/builders/ConfigCenterBuilder.java", "source2": "org/apache/dubbo/config/bootstrap/builders/ConfigCenterBuilder.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,141 +1,141 @@\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.config.bootstrap.builders;\n-\n-import org.apache.dubbo.config.ConfigCenterConfig;\n-\n-import java.util.Map;\n-\n-/**\n- * This is a builder for build {@link ConfigCenterConfig}.\n- *\n- * @since 2.7\n- */\n-public class ConfigCenterBuilder extends AbstractBuilder<ConfigCenterConfig, ConfigCenterBuilder> {\n-\n-    private String protocol;\n-    private String address;\n-    private String cluster;\n-    private String namespace = \"dubbo\";\n-    private String group = \"dubbo\";\n-    private String username;\n-    private String password;\n-    private Long timeout = 3000L;\n-    private Boolean highestPriority = true;\n-    private Boolean check = true;\n-\n-    private String configFile = \"dubbo.properties\";\n-    private String appConfigFile;\n-\n-    private Map<String, String> parameters;\n-\n-    public ConfigCenterBuilder protocol(String protocol) {\n-        this.protocol = protocol;\n-        return getThis();\n-    }\n-\n-\tpublic ConfigCenterBuilder address(String address) {\n-        this.address = address;\n-        return getThis();\n-    }\n-\n-    public ConfigCenterBuilder cluster(String cluster) {\n-        this.cluster = cluster;\n-        return getThis();\n-    }\n-\n-    public ConfigCenterBuilder namespace(String namespace) {\n-        this.namespace = namespace;\n-        return getThis();\n-    }\n-\n-    public ConfigCenterBuilder group(String group) {\n-        this.group = group;\n-        return getThis();\n-    }\n-\n-    public ConfigCenterBuilder username(String username) {\n-        this.username = username;\n-        return getThis();\n-    }\n-\n-    public ConfigCenterBuilder password(String password) {\n-        this.password = password;\n-        return getThis();\n-    }\n-\n-    public ConfigCenterBuilder timeout(Long timeout) {\n-        this.timeout = timeout;\n-        return getThis();\n-    }\n-\n-    public ConfigCenterBuilder highestPriority(Boolean highestPriority) {\n-        this.highestPriority = highestPriority;\n-        return getThis();\n-    }\n-\n-    public ConfigCenterBuilder check(Boolean check) {\n-        this.check = check;\n-        return getThis();\n-    }\n-\n-    public ConfigCenterBuilder configFile(String configFile) {\n-        this.configFile = configFile;\n-        return getThis();\n-    }\n-\n-    public ConfigCenterBuilder appConfigFile(String appConfigFile) {\n-        this.appConfigFile = appConfigFile;\n-        return getThis();\n-    }\n-\n-    public ConfigCenterBuilder appendParameters(Map<String, String> appendParameters) {\n-        this.parameters = appendParameters(this.parameters, appendParameters);\n-        return getThis();\n-    }\n-\n-    public ConfigCenterBuilder appendParameter(String key, String value) {\n-        this.parameters = appendParameter(this.parameters, key, value);\n-        return getThis();\n-    }\n-\n-    public ConfigCenterConfig build() {\n-        ConfigCenterConfig configCenter = new ConfigCenterConfig();\n-        super.build(configCenter);\n-\n-        configCenter.setProtocol(protocol);\n-        configCenter.setAddress(address);\n-        configCenter.setCluster(cluster);\n-        configCenter.setNamespace(namespace);\n-        configCenter.setGroup(group);\n-        configCenter.setUsername(username);\n-        configCenter.setPassword(password);\n-        configCenter.setTimeout(timeout);\n-        configCenter.setHighestPriority(highestPriority);\n-        configCenter.setCheck(check);\n-        configCenter.setConfigFile(configFile);\n-        configCenter.setAppConfigFile(appConfigFile);\n-        configCenter.setParameters(parameters);\n-\n-        return configCenter;\n-    }\n-\n-    @Override\n-    protected ConfigCenterBuilder getThis() {\n-        return this;\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.config.bootstrap.builders;\r\n+\r\n+import org.apache.dubbo.config.ConfigCenterConfig;\r\n+\r\n+import java.util.Map;\r\n+\r\n+/**\r\n+ * This is a builder for build {@link ConfigCenterConfig}.\r\n+ *\r\n+ * @since 2.7\r\n+ */\r\n+public class ConfigCenterBuilder extends AbstractBuilder<ConfigCenterConfig, ConfigCenterBuilder> {\r\n+\r\n+    private String protocol;\r\n+    private String address;\r\n+    private String cluster;\r\n+    private String namespace = \"dubbo\";\r\n+    private String group = \"dubbo\";\r\n+    private String username;\r\n+    private String password;\r\n+    private Long timeout = 3000L;\r\n+    private Boolean highestPriority = true;\r\n+    private Boolean check = true;\r\n+\r\n+    private String configFile = \"dubbo.properties\";\r\n+    private String appConfigFile;\r\n+\r\n+    private Map<String, String> parameters;\r\n+\r\n+    public ConfigCenterBuilder protocol(String protocol) {\r\n+        this.protocol = protocol;\r\n+        return getThis();\r\n+    }\r\n+\r\n+\tpublic ConfigCenterBuilder address(String address) {\r\n+        this.address = address;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ConfigCenterBuilder cluster(String cluster) {\r\n+        this.cluster = cluster;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ConfigCenterBuilder namespace(String namespace) {\r\n+        this.namespace = namespace;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ConfigCenterBuilder group(String group) {\r\n+        this.group = group;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ConfigCenterBuilder username(String username) {\r\n+        this.username = username;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ConfigCenterBuilder password(String password) {\r\n+        this.password = password;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ConfigCenterBuilder timeout(Long timeout) {\r\n+        this.timeout = timeout;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ConfigCenterBuilder highestPriority(Boolean highestPriority) {\r\n+        this.highestPriority = highestPriority;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ConfigCenterBuilder check(Boolean check) {\r\n+        this.check = check;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ConfigCenterBuilder configFile(String configFile) {\r\n+        this.configFile = configFile;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ConfigCenterBuilder appConfigFile(String appConfigFile) {\r\n+        this.appConfigFile = appConfigFile;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ConfigCenterBuilder appendParameters(Map<String, String> appendParameters) {\r\n+        this.parameters = appendParameters(this.parameters, appendParameters);\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ConfigCenterBuilder appendParameter(String key, String value) {\r\n+        this.parameters = appendParameter(this.parameters, key, value);\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ConfigCenterConfig build() {\r\n+        ConfigCenterConfig configCenter = new ConfigCenterConfig();\r\n+        super.build(configCenter);\r\n+\r\n+        configCenter.setProtocol(protocol);\r\n+        configCenter.setAddress(address);\r\n+        configCenter.setCluster(cluster);\r\n+        configCenter.setNamespace(namespace);\r\n+        configCenter.setGroup(group);\r\n+        configCenter.setUsername(username);\r\n+        configCenter.setPassword(password);\r\n+        configCenter.setTimeout(timeout);\r\n+        configCenter.setHighestPriority(highestPriority);\r\n+        configCenter.setCheck(check);\r\n+        configCenter.setConfigFile(configFile);\r\n+        configCenter.setAppConfigFile(appConfigFile);\r\n+        configCenter.setParameters(parameters);\r\n+\r\n+        return configCenter;\r\n+    }\r\n+\r\n+    @Override\r\n+    protected ConfigCenterBuilder getThis() {\r\n+        return this;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/bootstrap/builders/ConsumerBuilder.java", "source2": "org/apache/dubbo/config/bootstrap/builders/ConsumerBuilder.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,118 +1,118 @@\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.config.bootstrap.builders;\n-\n-import org.apache.dubbo.config.ConsumerConfig;\n-\n-/**\n- * This is a builder for build {@link ConsumerConfig}.\n- *\n- * @since 2.7\n- */\n-public class ConsumerBuilder extends AbstractReferenceBuilder<ConsumerConfig, ConsumerBuilder> {\n-\n-    /**\n-     * Whether to use the default protocol\n-     */\n-    private Boolean isDefault;\n-\n-    /**\n-     * Networking framework client uses: netty, mina, etc.\n-     */\n-    private String client;\n-\n-    /**\n-     * Consumer thread pool type: cached, fixed, limit, eager\n-     */\n-    private String threadpool;\n-\n-    /**\n-     * Consumer threadpool core thread size\n-     */\n-    private Integer corethreads;\n-\n-    /**\n-     * Consumer threadpool thread size\n-     */\n-    private Integer threads;\n-\n-    /**\n-     * Consumer threadpool queue size\n-     */\n-    private Integer queues;\n-\n-    /**\n-     * By default, a TCP long-connection communication is shared between the consumer process and the provider process.\n-     * This property can be set to share multiple TCP long-connection communications. Note that only the dubbo protocol takes effect.\n-     */\n-    private Integer shareconnections;\n-\n-    public ConsumerBuilder isDefault(Boolean isDefault) {\n-        this.isDefault = isDefault;\n-        return getThis();\n-    }\n-\n-    public ConsumerBuilder client(String client) {\n-        this.client = client;\n-        return getThis();\n-    }\n-\n-    public ConsumerBuilder threadPool(String threadPool) {\n-        this.threadpool = threadPool;\n-        return getThis();\n-    }\n-\n-    public ConsumerBuilder coreThreads(Integer coreThreads) {\n-        this.corethreads = coreThreads;\n-        return getThis();\n-    }\n-\n-    public ConsumerBuilder threads(Integer threads) {\n-        this.threads = threads;\n-        return getThis();\n-    }\n-\n-    public ConsumerBuilder queues(Integer queues) {\n-        this.queues = queues;\n-        return getThis();\n-    }\n-\n-    public ConsumerBuilder shareConnections(Integer shareConnections) {\n-        this.shareconnections = shareConnections;\n-        return getThis();\n-    }\n-\n-    public ConsumerConfig build() {\n-        ConsumerConfig consumer = new ConsumerConfig();\n-        super.build(consumer);\n-\n-        consumer.setDefault(isDefault);\n-        consumer.setClient(client);\n-        consumer.setThreadpool(threadpool);\n-        consumer.setCorethreads(corethreads);\n-        consumer.setThreads(threads);\n-        consumer.setQueues(queues);\n-        consumer.setShareconnections(shareconnections);\n-\n-        return consumer;\n-    }\n-\n-    @Override\n-    protected ConsumerBuilder getThis() {\n-        return this;\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.config.bootstrap.builders;\r\n+\r\n+import org.apache.dubbo.config.ConsumerConfig;\r\n+\r\n+/**\r\n+ * This is a builder for build {@link ConsumerConfig}.\r\n+ *\r\n+ * @since 2.7\r\n+ */\r\n+public class ConsumerBuilder extends AbstractReferenceBuilder<ConsumerConfig, ConsumerBuilder> {\r\n+\r\n+    /**\r\n+     * Whether to use the default protocol\r\n+     */\r\n+    private Boolean isDefault;\r\n+\r\n+    /**\r\n+     * Networking framework client uses: netty, mina, etc.\r\n+     */\r\n+    private String client;\r\n+\r\n+    /**\r\n+     * Consumer thread pool type: cached, fixed, limit, eager\r\n+     */\r\n+    private String threadpool;\r\n+\r\n+    /**\r\n+     * Consumer threadpool core thread size\r\n+     */\r\n+    private Integer corethreads;\r\n+\r\n+    /**\r\n+     * Consumer threadpool thread size\r\n+     */\r\n+    private Integer threads;\r\n+\r\n+    /**\r\n+     * Consumer threadpool queue size\r\n+     */\r\n+    private Integer queues;\r\n+\r\n+    /**\r\n+     * By default, a TCP long-connection communication is shared between the consumer process and the provider process.\r\n+     * This property can be set to share multiple TCP long-connection communications. Note that only the dubbo protocol takes effect.\r\n+     */\r\n+    private Integer shareconnections;\r\n+\r\n+    public ConsumerBuilder isDefault(Boolean isDefault) {\r\n+        this.isDefault = isDefault;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ConsumerBuilder client(String client) {\r\n+        this.client = client;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ConsumerBuilder threadPool(String threadPool) {\r\n+        this.threadpool = threadPool;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ConsumerBuilder coreThreads(Integer coreThreads) {\r\n+        this.corethreads = coreThreads;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ConsumerBuilder threads(Integer threads) {\r\n+        this.threads = threads;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ConsumerBuilder queues(Integer queues) {\r\n+        this.queues = queues;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ConsumerBuilder shareConnections(Integer shareConnections) {\r\n+        this.shareconnections = shareConnections;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ConsumerConfig build() {\r\n+        ConsumerConfig consumer = new ConsumerConfig();\r\n+        super.build(consumer);\r\n+\r\n+        consumer.setDefault(isDefault);\r\n+        consumer.setClient(client);\r\n+        consumer.setThreadpool(threadpool);\r\n+        consumer.setCorethreads(corethreads);\r\n+        consumer.setThreads(threads);\r\n+        consumer.setQueues(queues);\r\n+        consumer.setShareconnections(shareconnections);\r\n+\r\n+        return consumer;\r\n+    }\r\n+\r\n+    @Override\r\n+    protected ConsumerBuilder getThis() {\r\n+        return this;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/bootstrap/builders/MetadataReportBuilder.java", "source2": "org/apache/dubbo/config/bootstrap/builders/MetadataReportBuilder.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,144 +1,144 @@\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.config.bootstrap.builders;\n-\n-import org.apache.dubbo.config.MetadataReportConfig;\n-\n-import java.util.Map;\n-\n-/**\n- * This is a builder for build {@link MetadataReportConfig}.\n- *\n- * @since 2.7\n- */\n-public class MetadataReportBuilder extends AbstractBuilder<MetadataReportConfig, MetadataReportBuilder> {\n-\n-    // Register center address\n-    private String address;\n-\n-    // Username to login register center\n-    private String username;\n-\n-    // Password to login register center\n-    private String password;\n-\n-    // Request timeout in milliseconds for register center\n-    private Integer timeout;\n-\n-    /**\n-     * The group the metadata in . It is the same as registry\n-     */\n-    private String group;\n-\n-    // Customized parameters\n-    private Map<String, String> parameters;\n-\n-    private Integer retryTimes;\n-\n-    private Integer retryPeriod;\n-    /**\n-     * By default the metadatastore will store full metadata repeatedly every day .\n-     */\n-    private Boolean cycleReport;\n-\n-    /**\n-     * Sync report, default async\n-     */\n-    private Boolean syncReport;\n-\n-    public static MetadataReportBuilder newBuilder() {\n-        return new MetadataReportBuilder();\n-    }\n-\n-    public MetadataReportBuilder address(String address) {\n-        this.address = address;\n-        return getThis();\n-    }\n-\n-    public MetadataReportBuilder username(String username) {\n-        this.username = username;\n-        return getThis();\n-    }\n-\n-    public MetadataReportBuilder password(String password) {\n-        this.password = password;\n-        return getThis();\n-    }\n-\n-    public MetadataReportBuilder timeout(Integer timeout) {\n-        this.timeout = timeout;\n-        return getThis();\n-    }\n-\n-    public MetadataReportBuilder group(String group) {\n-        this.group = group;\n-        return getThis();\n-    }\n-\n-    public MetadataReportBuilder appendParameters(Map<String, String> appendParameters) {\n-        this.parameters = appendParameters(this.parameters, appendParameters);\n-        return getThis();\n-    }\n-\n-    public MetadataReportBuilder appendParameter(String key, String value) {\n-        this.parameters = appendParameter(this.parameters, key, value);\n-        return getThis();\n-    }\n-\n-    public MetadataReportBuilder retryTimes(Integer retryTimes) {\n-        this.retryTimes = retryTimes;\n-        return getThis();\n-    }\n-\n-    public MetadataReportBuilder retryPeriod(Integer retryPeriod) {\n-        this.retryPeriod = retryPeriod;\n-        return getThis();\n-    }\n-\n-    public MetadataReportBuilder cycleReport(Boolean cycleReport) {\n-        this.cycleReport = cycleReport;\n-        return getThis();\n-    }\n-\n-    public MetadataReportBuilder syncReport(Boolean syncReport) {\n-        this.syncReport = syncReport;\n-        return getThis();\n-    }\n-\n-    public MetadataReportConfig build() {\n-        MetadataReportConfig metadataReport = new MetadataReportConfig();\n-        super.build(metadataReport);\n-\n-        metadataReport.setAddress(address);\n-        metadataReport.setUsername(username);\n-        metadataReport.setPassword(password);\n-        metadataReport.setTimeout(timeout);\n-        metadataReport.setGroup(group);\n-        metadataReport.setParameters(parameters);\n-        metadataReport.setRetryTimes(retryTimes);\n-        metadataReport.setRetryPeriod(retryPeriod);\n-        metadataReport.setCycleReport(cycleReport);\n-        metadataReport.setSyncReport(syncReport);\n-\n-        return metadataReport;\n-    }\n-\n-    @Override\n-    protected MetadataReportBuilder getThis() {\n-        return this;\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.config.bootstrap.builders;\r\n+\r\n+import org.apache.dubbo.config.MetadataReportConfig;\r\n+\r\n+import java.util.Map;\r\n+\r\n+/**\r\n+ * This is a builder for build {@link MetadataReportConfig}.\r\n+ *\r\n+ * @since 2.7\r\n+ */\r\n+public class MetadataReportBuilder extends AbstractBuilder<MetadataReportConfig, MetadataReportBuilder> {\r\n+\r\n+    // Register center address\r\n+    private String address;\r\n+\r\n+    // Username to login register center\r\n+    private String username;\r\n+\r\n+    // Password to login register center\r\n+    private String password;\r\n+\r\n+    // Request timeout in milliseconds for register center\r\n+    private Integer timeout;\r\n+\r\n+    /**\r\n+     * The group the metadata in . It is the same as registry\r\n+     */\r\n+    private String group;\r\n+\r\n+    // Customized parameters\r\n+    private Map<String, String> parameters;\r\n+\r\n+    private Integer retryTimes;\r\n+\r\n+    private Integer retryPeriod;\r\n+    /**\r\n+     * By default the metadatastore will store full metadata repeatedly every day .\r\n+     */\r\n+    private Boolean cycleReport;\r\n+\r\n+    /**\r\n+     * Sync report, default async\r\n+     */\r\n+    private Boolean syncReport;\r\n+\r\n+    public static MetadataReportBuilder newBuilder() {\r\n+        return new MetadataReportBuilder();\r\n+    }\r\n+\r\n+    public MetadataReportBuilder address(String address) {\r\n+        this.address = address;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MetadataReportBuilder username(String username) {\r\n+        this.username = username;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MetadataReportBuilder password(String password) {\r\n+        this.password = password;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MetadataReportBuilder timeout(Integer timeout) {\r\n+        this.timeout = timeout;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MetadataReportBuilder group(String group) {\r\n+        this.group = group;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MetadataReportBuilder appendParameters(Map<String, String> appendParameters) {\r\n+        this.parameters = appendParameters(this.parameters, appendParameters);\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MetadataReportBuilder appendParameter(String key, String value) {\r\n+        this.parameters = appendParameter(this.parameters, key, value);\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MetadataReportBuilder retryTimes(Integer retryTimes) {\r\n+        this.retryTimes = retryTimes;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MetadataReportBuilder retryPeriod(Integer retryPeriod) {\r\n+        this.retryPeriod = retryPeriod;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MetadataReportBuilder cycleReport(Boolean cycleReport) {\r\n+        this.cycleReport = cycleReport;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MetadataReportBuilder syncReport(Boolean syncReport) {\r\n+        this.syncReport = syncReport;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MetadataReportConfig build() {\r\n+        MetadataReportConfig metadataReport = new MetadataReportConfig();\r\n+        super.build(metadataReport);\r\n+\r\n+        metadataReport.setAddress(address);\r\n+        metadataReport.setUsername(username);\r\n+        metadataReport.setPassword(password);\r\n+        metadataReport.setTimeout(timeout);\r\n+        metadataReport.setGroup(group);\r\n+        metadataReport.setParameters(parameters);\r\n+        metadataReport.setRetryTimes(retryTimes);\r\n+        metadataReport.setRetryPeriod(retryPeriod);\r\n+        metadataReport.setCycleReport(cycleReport);\r\n+        metadataReport.setSyncReport(syncReport);\r\n+\r\n+        return metadataReport;\r\n+    }\r\n+\r\n+    @Override\r\n+    protected MetadataReportBuilder getThis() {\r\n+        return this;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/bootstrap/builders/MethodBuilder.java", "source2": "org/apache/dubbo/config/bootstrap/builders/MethodBuilder.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,237 +1,237 @@\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.config.bootstrap.builders;\n-\n-import org.apache.dubbo.config.ArgumentConfig;\n-import org.apache.dubbo.config.MethodConfig;\n-\n-import java.util.ArrayList;\n-import java.util.List;\n-\n-/**\n- * This is a builder for build {@link MethodConfig}.\n- *\n- * @since 2.7\n- */\n-public class MethodBuilder extends AbstractMethodBuilder<MethodConfig, MethodBuilder> {\n-    /**\n-     * The method name\n-     */\n-    private String name;\n-\n-    /**\n-     * Stat\n-     */\n-    private Integer stat;\n-\n-    /**\n-     * Whether to retry\n-     */\n-    private Boolean retry;\n-\n-    /**\n-     * If it's reliable\n-     */\n-    private Boolean reliable;\n-\n-    /**\n-     * Thread limits for method invocations\n-     */\n-    private Integer executes;\n-\n-    /**\n-     * If it's deprecated\n-     */\n-    private Boolean deprecated;\n-\n-    /**\n-     * Whether to enable sticky\n-     */\n-    private Boolean sticky;\n-\n-    /**\n-     * Whether need to return\n-     */\n-    private Boolean isReturn;\n-\n-    /**\n-     * Callback instance when async-call is invoked\n-     */\n-    private Object oninvoke;\n-\n-    /**\n-     * Callback method when async-call is invoked\n-     */\n-    private String oninvokeMethod;\n-\n-    /**\n-     * Callback instance when async-call is returned\n-     */\n-    private Object onreturn;\n-\n-    /**\n-     * Callback method when async-call is returned\n-     */\n-    private String onreturnMethod;\n-\n-    /**\n-     * Callback instance when async-call has exception thrown\n-     */\n-    private Object onthrow;\n-\n-    /**\n-     * Callback method when async-call has exception thrown\n-     */\n-    private String onthrowMethod;\n-\n-    /**\n-     * The method arguments\n-     */\n-    private List<ArgumentConfig> arguments;\n-\n-    /**\n-     * These properties come from MethodConfig's parent Config module, they will neither be collected directly from xml or API nor be delivered to url\n-     */\n-    private String service;\n-    private String serviceId;\n-\n-    public MethodBuilder name(String name) {\n-        this.name = name;\n-        return getThis();\n-    }\n-\n-    public MethodBuilder stat(Integer stat) {\n-        this.stat = stat;\n-        return getThis();\n-    }\n-\n-    public MethodBuilder retry(Boolean retry) {\n-        this.retry = retry;\n-        return getThis();\n-    }\n-\n-    public MethodBuilder reliable(Boolean reliable) {\n-        this.reliable = reliable;\n-        return getThis();\n-    }\n-\n-    public MethodBuilder executes(Integer executes) {\n-        this.executes = executes;\n-        return getThis();\n-    }\n-\n-    public MethodBuilder deprecated(Boolean deprecated) {\n-        this.deprecated = deprecated;\n-        return getThis();\n-    }\n-\n-    public MethodBuilder sticky(Boolean sticky) {\n-        this.sticky = sticky;\n-        return getThis();\n-    }\n-\n-    public MethodBuilder isReturn(Boolean isReturn) {\n-        this.isReturn = isReturn;\n-        return getThis();\n-    }\n-\n-    public MethodBuilder oninvoke(Object oninvoke) {\n-        this.oninvoke = oninvoke;\n-        return getThis();\n-    }\n-\n-    public MethodBuilder oninvokeMethod(String oninvokeMethod) {\n-        this.oninvokeMethod = oninvokeMethod;\n-        return getThis();\n-    }\n-\n-    public MethodBuilder onreturn(Object onreturn) {\n-        this.onreturn = onreturn;\n-        return getThis();\n-    }\n-\n-    public MethodBuilder onreturnMethod(String onreturnMethod) {\n-        this.onreturnMethod = onreturnMethod;\n-        return getThis();\n-    }\n-\n-    public MethodBuilder onthrow(Object onthrow) {\n-        this.onthrow = onthrow;\n-        return getThis();\n-    }\n-\n-    public MethodBuilder onthrowMethod(String onthrowMethod) {\n-        this.onthrowMethod = onthrowMethod;\n-        return getThis();\n-    }\n-\n-    public MethodBuilder addArguments(List<? extends ArgumentConfig> arguments) {\n-        if (this.arguments == null) {\n-            this.arguments = new ArrayList<>();\n-        }\n-        this.arguments.addAll(arguments);\n-        return getThis();\n-    }\n-\n-    public MethodBuilder addArgument(ArgumentConfig argument) {\n-        if (this.arguments == null) {\n-            this.arguments = new ArrayList<>();\n-        }\n-        this.arguments.add(argument);\n-        return getThis();\n-    }\n-\n-    public MethodBuilder service(String service) {\n-        this.service = service;\n-        return getThis();\n-    }\n-\n-    public MethodBuilder serviceId(String serviceId) {\n-        this.serviceId = serviceId;\n-        return getThis();\n-    }\n-\n-    public MethodConfig build() {\n-        MethodConfig methodConfig = new MethodConfig();\n-        super.build(methodConfig);\n-\n-        methodConfig.setArguments(arguments);\n-        methodConfig.setDeprecated(deprecated);\n-        methodConfig.setExecutes(executes);\n-        methodConfig.setName(name);\n-        methodConfig.setOninvoke(oninvoke);\n-        methodConfig.setOninvokeMethod(oninvokeMethod);\n-        methodConfig.setOnreturn(onreturn);\n-        methodConfig.setOnreturnMethod(onreturnMethod);\n-        methodConfig.setOnthrow(onthrow);\n-        methodConfig.setOnthrowMethod(onthrowMethod);\n-        methodConfig.setReturn(isReturn);\n-        methodConfig.setService(service);\n-        methodConfig.setServiceId(serviceId);\n-        methodConfig.setSticky(sticky);\n-        methodConfig.setReliable(reliable);\n-        methodConfig.setStat(stat);\n-        methodConfig.setRetry(retry);\n-\n-        return methodConfig;\n-    }\n-\n-    @Override\n-    protected MethodBuilder getThis() {\n-        return this;\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.config.bootstrap.builders;\r\n+\r\n+import org.apache.dubbo.config.ArgumentConfig;\r\n+import org.apache.dubbo.config.MethodConfig;\r\n+\r\n+import java.util.ArrayList;\r\n+import java.util.List;\r\n+\r\n+/**\r\n+ * This is a builder for build {@link MethodConfig}.\r\n+ *\r\n+ * @since 2.7\r\n+ */\r\n+public class MethodBuilder extends AbstractMethodBuilder<MethodConfig, MethodBuilder> {\r\n+    /**\r\n+     * The method name\r\n+     */\r\n+    private String name;\r\n+\r\n+    /**\r\n+     * Stat\r\n+     */\r\n+    private Integer stat;\r\n+\r\n+    /**\r\n+     * Whether to retry\r\n+     */\r\n+    private Boolean retry;\r\n+\r\n+    /**\r\n+     * If it's reliable\r\n+     */\r\n+    private Boolean reliable;\r\n+\r\n+    /**\r\n+     * Thread limits for method invocations\r\n+     */\r\n+    private Integer executes;\r\n+\r\n+    /**\r\n+     * If it's deprecated\r\n+     */\r\n+    private Boolean deprecated;\r\n+\r\n+    /**\r\n+     * Whether to enable sticky\r\n+     */\r\n+    private Boolean sticky;\r\n+\r\n+    /**\r\n+     * Whether need to return\r\n+     */\r\n+    private Boolean isReturn;\r\n+\r\n+    /**\r\n+     * Callback instance when async-call is invoked\r\n+     */\r\n+    private Object oninvoke;\r\n+\r\n+    /**\r\n+     * Callback method when async-call is invoked\r\n+     */\r\n+    private String oninvokeMethod;\r\n+\r\n+    /**\r\n+     * Callback instance when async-call is returned\r\n+     */\r\n+    private Object onreturn;\r\n+\r\n+    /**\r\n+     * Callback method when async-call is returned\r\n+     */\r\n+    private String onreturnMethod;\r\n+\r\n+    /**\r\n+     * Callback instance when async-call has exception thrown\r\n+     */\r\n+    private Object onthrow;\r\n+\r\n+    /**\r\n+     * Callback method when async-call has exception thrown\r\n+     */\r\n+    private String onthrowMethod;\r\n+\r\n+    /**\r\n+     * The method arguments\r\n+     */\r\n+    private List<ArgumentConfig> arguments;\r\n+\r\n+    /**\r\n+     * These properties come from MethodConfig's parent Config module, they will neither be collected directly from xml or API nor be delivered to url\r\n+     */\r\n+    private String service;\r\n+    private String serviceId;\r\n+\r\n+    public MethodBuilder name(String name) {\r\n+        this.name = name;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MethodBuilder stat(Integer stat) {\r\n+        this.stat = stat;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MethodBuilder retry(Boolean retry) {\r\n+        this.retry = retry;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MethodBuilder reliable(Boolean reliable) {\r\n+        this.reliable = reliable;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MethodBuilder executes(Integer executes) {\r\n+        this.executes = executes;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MethodBuilder deprecated(Boolean deprecated) {\r\n+        this.deprecated = deprecated;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MethodBuilder sticky(Boolean sticky) {\r\n+        this.sticky = sticky;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MethodBuilder isReturn(Boolean isReturn) {\r\n+        this.isReturn = isReturn;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MethodBuilder oninvoke(Object oninvoke) {\r\n+        this.oninvoke = oninvoke;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MethodBuilder oninvokeMethod(String oninvokeMethod) {\r\n+        this.oninvokeMethod = oninvokeMethod;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MethodBuilder onreturn(Object onreturn) {\r\n+        this.onreturn = onreturn;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MethodBuilder onreturnMethod(String onreturnMethod) {\r\n+        this.onreturnMethod = onreturnMethod;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MethodBuilder onthrow(Object onthrow) {\r\n+        this.onthrow = onthrow;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MethodBuilder onthrowMethod(String onthrowMethod) {\r\n+        this.onthrowMethod = onthrowMethod;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MethodBuilder addArguments(List<? extends ArgumentConfig> arguments) {\r\n+        if (this.arguments == null) {\r\n+            this.arguments = new ArrayList<>();\r\n+        }\r\n+        this.arguments.addAll(arguments);\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MethodBuilder addArgument(ArgumentConfig argument) {\r\n+        if (this.arguments == null) {\r\n+            this.arguments = new ArrayList<>();\r\n+        }\r\n+        this.arguments.add(argument);\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MethodBuilder service(String service) {\r\n+        this.service = service;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MethodBuilder serviceId(String serviceId) {\r\n+        this.serviceId = serviceId;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MethodConfig build() {\r\n+        MethodConfig methodConfig = new MethodConfig();\r\n+        super.build(methodConfig);\r\n+\r\n+        methodConfig.setArguments(arguments);\r\n+        methodConfig.setDeprecated(deprecated);\r\n+        methodConfig.setExecutes(executes);\r\n+        methodConfig.setName(name);\r\n+        methodConfig.setOninvoke(oninvoke);\r\n+        methodConfig.setOninvokeMethod(oninvokeMethod);\r\n+        methodConfig.setOnreturn(onreturn);\r\n+        methodConfig.setOnreturnMethod(onreturnMethod);\r\n+        methodConfig.setOnthrow(onthrow);\r\n+        methodConfig.setOnthrowMethod(onthrowMethod);\r\n+        methodConfig.setReturn(isReturn);\r\n+        methodConfig.setService(service);\r\n+        methodConfig.setServiceId(serviceId);\r\n+        methodConfig.setSticky(sticky);\r\n+        methodConfig.setReliable(reliable);\r\n+        methodConfig.setStat(stat);\r\n+        methodConfig.setRetry(retry);\r\n+\r\n+        return methodConfig;\r\n+    }\r\n+\r\n+    @Override\r\n+    protected MethodBuilder getThis() {\r\n+        return this;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/bootstrap/builders/ModuleBuilder.java", "source2": "org/apache/dubbo/config/bootstrap/builders/ModuleBuilder.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,132 +1,132 @@\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.config.bootstrap.builders;\n-\n-import org.apache.dubbo.config.ModuleConfig;\n-import org.apache.dubbo.config.MonitorConfig;\n-import org.apache.dubbo.config.RegistryConfig;\n-\n-import java.util.ArrayList;\n-import java.util.List;\n-\n-/**\n- * This is a builder for build {@link ModuleConfig}.\n- *\n- * @since 2.7\n- */\n-public class ModuleBuilder extends AbstractBuilder<ModuleConfig, ModuleBuilder> {\n-    /**\n-     * Module name\n-     */\n-    private String name;\n-\n-    /**\n-     * Module version\n-     */\n-    private String version;\n-\n-    /**\n-     * Module owner\n-     */\n-    private String owner;\n-\n-    /**\n-     * Module's organization\n-     */\n-    private String organization;\n-\n-    /**\n-     * Registry centers\n-     */\n-    private List<RegistryConfig> registries;\n-\n-    /**\n-     * Monitor center\n-     */\n-    private MonitorConfig monitor;\n-\n-    /**\n-     * If it's default\n-     */\n-    private Boolean isDefault;\n-\n-    public ModuleBuilder name(String name) {\n-        this.name = name;\n-        return getThis();\n-    }\n-\n-    public ModuleBuilder version(String version) {\n-        this.version = version;\n-        return getThis();\n-    }\n-\n-    public ModuleBuilder owner(String owner) {\n-        this.owner = owner;\n-        return getThis();\n-    }\n-\n-    public ModuleBuilder organization(String organization) {\n-        this.organization = organization;\n-        return getThis();\n-    }\n-\n-    public ModuleBuilder addRegistries(List<? extends RegistryConfig> registries) {\n-        if (this.registries == null) {\n-            this.registries = new ArrayList<>();\n-        }\n-        this.registries.addAll(registries);\n-        return getThis();\n-    }\n-\n-    public ModuleBuilder addRegistry(RegistryConfig registry) {\n-        if (this.registries == null) {\n-            this.registries = new ArrayList<>();\n-        }\n-        this.registries.add(registry);\n-        return getThis();\n-    }\n-\n-    public ModuleBuilder monitor(MonitorConfig monitor) {\n-        this.monitor = monitor;\n-        return getThis();\n-    }\n-\n-    public ModuleBuilder isDefault(Boolean isDefault) {\n-        this.isDefault = isDefault;\n-        return getThis();\n-    }\n-\n-    public ModuleConfig build() {\n-        ModuleConfig moduleConfig = new ModuleConfig();\n-        super.build(moduleConfig);\n-\n-        moduleConfig.setDefault(isDefault);\n-        moduleConfig.setMonitor(monitor);\n-        moduleConfig.setName(name);\n-        moduleConfig.setOrganization(organization);\n-        moduleConfig.setOwner(owner);\n-        moduleConfig.setRegistries(registries);\n-        moduleConfig.setVersion(version);\n-\n-        return moduleConfig;\n-    }\n-\n-    @Override\n-    protected ModuleBuilder getThis() {\n-        return this;\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.config.bootstrap.builders;\r\n+\r\n+import org.apache.dubbo.config.ModuleConfig;\r\n+import org.apache.dubbo.config.MonitorConfig;\r\n+import org.apache.dubbo.config.RegistryConfig;\r\n+\r\n+import java.util.ArrayList;\r\n+import java.util.List;\r\n+\r\n+/**\r\n+ * This is a builder for build {@link ModuleConfig}.\r\n+ *\r\n+ * @since 2.7\r\n+ */\r\n+public class ModuleBuilder extends AbstractBuilder<ModuleConfig, ModuleBuilder> {\r\n+    /**\r\n+     * Module name\r\n+     */\r\n+    private String name;\r\n+\r\n+    /**\r\n+     * Module version\r\n+     */\r\n+    private String version;\r\n+\r\n+    /**\r\n+     * Module owner\r\n+     */\r\n+    private String owner;\r\n+\r\n+    /**\r\n+     * Module's organization\r\n+     */\r\n+    private String organization;\r\n+\r\n+    /**\r\n+     * Registry centers\r\n+     */\r\n+    private List<RegistryConfig> registries;\r\n+\r\n+    /**\r\n+     * Monitor center\r\n+     */\r\n+    private MonitorConfig monitor;\r\n+\r\n+    /**\r\n+     * If it's default\r\n+     */\r\n+    private Boolean isDefault;\r\n+\r\n+    public ModuleBuilder name(String name) {\r\n+        this.name = name;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ModuleBuilder version(String version) {\r\n+        this.version = version;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ModuleBuilder owner(String owner) {\r\n+        this.owner = owner;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ModuleBuilder organization(String organization) {\r\n+        this.organization = organization;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ModuleBuilder addRegistries(List<? extends RegistryConfig> registries) {\r\n+        if (this.registries == null) {\r\n+            this.registries = new ArrayList<>();\r\n+        }\r\n+        this.registries.addAll(registries);\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ModuleBuilder addRegistry(RegistryConfig registry) {\r\n+        if (this.registries == null) {\r\n+            this.registries = new ArrayList<>();\r\n+        }\r\n+        this.registries.add(registry);\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ModuleBuilder monitor(MonitorConfig monitor) {\r\n+        this.monitor = monitor;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ModuleBuilder isDefault(Boolean isDefault) {\r\n+        this.isDefault = isDefault;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ModuleConfig build() {\r\n+        ModuleConfig moduleConfig = new ModuleConfig();\r\n+        super.build(moduleConfig);\r\n+\r\n+        moduleConfig.setDefault(isDefault);\r\n+        moduleConfig.setMonitor(monitor);\r\n+        moduleConfig.setName(name);\r\n+        moduleConfig.setOrganization(organization);\r\n+        moduleConfig.setOwner(owner);\r\n+        moduleConfig.setRegistries(registries);\r\n+        moduleConfig.setVersion(version);\r\n+\r\n+        return moduleConfig;\r\n+    }\r\n+\r\n+    @Override\r\n+    protected ModuleBuilder getThis() {\r\n+        return this;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/bootstrap/builders/MonitorBuilder.java", "source2": "org/apache/dubbo/config/bootstrap/builders/MonitorBuilder.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,137 +1,137 @@\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.config.bootstrap.builders;\n-\n-import org.apache.dubbo.config.MonitorConfig;\n-\n-import java.util.Map;\n-\n-/**\n- * This is a builder for build {@link MonitorConfig}.\n- *\n- * @since 2.7\n- */\n-public class MonitorBuilder extends AbstractBuilder<MonitorConfig, MonitorBuilder> {\n-    /**\n-     * The protocol of the monitor, if the value is registry, it will search the monitor address from the registry center,\n-     * otherwise, it will directly connect to the monitor center\n-     */\n-    private String protocol;\n-\n-    /**\n-     * The monitor address\n-     */\n-    private String address;\n-\n-    /**\n-     * The monitor user name\n-     */\n-    private String username;\n-\n-    /**\n-     * The password\n-     */\n-    private String password;\n-\n-    private String group;\n-\n-    private String version;\n-\n-    private String interval;\n-\n-    /**\n-     * customized parameters\n-     */\n-    private Map<String, String> parameters;\n-\n-    /**\n-     * If it's default\n-     */\n-    private Boolean isDefault;\n-\n-    public MonitorBuilder protocol(String protocol) {\n-        this.protocol = protocol;\n-        return getThis();\n-    }\n-\n-    public MonitorBuilder address(String address) {\n-        this.address = address;\n-        return getThis();\n-    }\n-\n-    public MonitorBuilder username(String username) {\n-        this.username = username;\n-        return getThis();\n-    }\n-\n-    public MonitorBuilder password(String password) {\n-        this.password = password;\n-        return getThis();\n-    }\n-\n-    public MonitorBuilder group(String group) {\n-        this.group = group;\n-        return getThis();\n-    }\n-\n-    public MonitorBuilder version(String version) {\n-        this.version = version;\n-        return getThis();\n-    }\n-\n-    public MonitorBuilder interval(String interval) {\n-        this.interval = interval;\n-        return getThis();\n-    }\n-\n-    public MonitorBuilder isDefault(Boolean isDefault) {\n-        this.isDefault = isDefault;\n-        return getThis();\n-    }\n-\n-    public MonitorBuilder appendParameter(String key, String value) {\n-        this.parameters = appendParameter(parameters, key, value);\n-        return getThis();\n-    }\n-\n-    public MonitorBuilder appendParameters(Map<String, String> appendParameters) {\n-        this.parameters = appendParameters(parameters, appendParameters);\n-        return getThis();\n-    }\n-\n-    public MonitorConfig build() {\n-        MonitorConfig monitorConfig = new MonitorConfig();\n-        super.build(monitorConfig);\n-\n-        monitorConfig.setProtocol(protocol);\n-        monitorConfig.setAddress(address);\n-        monitorConfig.setUsername(username);\n-        monitorConfig.setPassword(password);\n-        monitorConfig.setGroup(group);\n-        monitorConfig.setVersion(version);\n-        monitorConfig.setInterval(interval);\n-        monitorConfig.setParameters(parameters);\n-        monitorConfig.setDefault(isDefault);\n-\n-        return monitorConfig;\n-    }\n-\n-    @Override\n-    protected MonitorBuilder getThis() {\n-        return this;\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.config.bootstrap.builders;\r\n+\r\n+import org.apache.dubbo.config.MonitorConfig;\r\n+\r\n+import java.util.Map;\r\n+\r\n+/**\r\n+ * This is a builder for build {@link MonitorConfig}.\r\n+ *\r\n+ * @since 2.7\r\n+ */\r\n+public class MonitorBuilder extends AbstractBuilder<MonitorConfig, MonitorBuilder> {\r\n+    /**\r\n+     * The protocol of the monitor, if the value is registry, it will search the monitor address from the registry center,\r\n+     * otherwise, it will directly connect to the monitor center\r\n+     */\r\n+    private String protocol;\r\n+\r\n+    /**\r\n+     * The monitor address\r\n+     */\r\n+    private String address;\r\n+\r\n+    /**\r\n+     * The monitor user name\r\n+     */\r\n+    private String username;\r\n+\r\n+    /**\r\n+     * The password\r\n+     */\r\n+    private String password;\r\n+\r\n+    private String group;\r\n+\r\n+    private String version;\r\n+\r\n+    private String interval;\r\n+\r\n+    /**\r\n+     * customized parameters\r\n+     */\r\n+    private Map<String, String> parameters;\r\n+\r\n+    /**\r\n+     * If it's default\r\n+     */\r\n+    private Boolean isDefault;\r\n+\r\n+    public MonitorBuilder protocol(String protocol) {\r\n+        this.protocol = protocol;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MonitorBuilder address(String address) {\r\n+        this.address = address;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MonitorBuilder username(String username) {\r\n+        this.username = username;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MonitorBuilder password(String password) {\r\n+        this.password = password;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MonitorBuilder group(String group) {\r\n+        this.group = group;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MonitorBuilder version(String version) {\r\n+        this.version = version;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MonitorBuilder interval(String interval) {\r\n+        this.interval = interval;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MonitorBuilder isDefault(Boolean isDefault) {\r\n+        this.isDefault = isDefault;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MonitorBuilder appendParameter(String key, String value) {\r\n+        this.parameters = appendParameter(parameters, key, value);\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MonitorBuilder appendParameters(Map<String, String> appendParameters) {\r\n+        this.parameters = appendParameters(parameters, appendParameters);\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public MonitorConfig build() {\r\n+        MonitorConfig monitorConfig = new MonitorConfig();\r\n+        super.build(monitorConfig);\r\n+\r\n+        monitorConfig.setProtocol(protocol);\r\n+        monitorConfig.setAddress(address);\r\n+        monitorConfig.setUsername(username);\r\n+        monitorConfig.setPassword(password);\r\n+        monitorConfig.setGroup(group);\r\n+        monitorConfig.setVersion(version);\r\n+        monitorConfig.setInterval(interval);\r\n+        monitorConfig.setParameters(parameters);\r\n+        monitorConfig.setDefault(isDefault);\r\n+\r\n+        return monitorConfig;\r\n+    }\r\n+\r\n+    @Override\r\n+    protected MonitorBuilder getThis() {\r\n+        return this;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/bootstrap/builders/ProtocolBuilder.java", "source2": "org/apache/dubbo/config/bootstrap/builders/ProtocolBuilder.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,427 +1,427 @@\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.config.bootstrap.builders;\n-\n-import org.apache.dubbo.config.ProtocolConfig;\n-\n-import java.util.Map;\n-\n-/**\n- * This is a builder for build {@link ProtocolConfig}.\n- *\n- * @since 2.7\n- */\n-public class ProtocolBuilder extends AbstractBuilder<ProtocolConfig, ProtocolBuilder> {\n-    /**\n-     * Protocol name\n-     */\n-    private String name;\n-\n-    /**\n-     * Service ip address (when there are multiple network cards available)\n-     */\n-    private String host;\n-\n-    /**\n-     * Service port\n-     */\n-    private Integer port;\n-\n-    /**\n-     * Context path\n-     */\n-    private String contextpath;\n-\n-    /**\n-     * Thread pool\n-     */\n-    private String threadpool;\n-\n-    /**\n-     * Thread pool core thread size\n-     */\n-    private Integer corethreads;\n-\n-    /**\n-     * Thread pool size (fixed size)\n-     */\n-    private Integer threads;\n-\n-    /**\n-     * IO thread pool size (fixed size)\n-     */\n-    private Integer iothreads;\n-\n-    /**\n-     * Thread pool's queue length\n-     */\n-    private Integer queues;\n-\n-    /**\n-     * Max acceptable connections\n-     */\n-    private Integer accepts;\n-\n-    /**\n-     * Protocol codec\n-     */\n-    private String codec;\n-\n-    /**\n-     * Serialization\n-     */\n-    private String serialization;\n-\n-    /**\n-     * Charset\n-     */\n-    private String charset;\n-\n-    /**\n-     * Payload max length\n-     */\n-    private Integer payload;\n-\n-    /**\n-     * Buffer size\n-     */\n-    private Integer buffer;\n-\n-    /**\n-     * Heartbeat interval\n-     */\n-    private Integer heartbeat;\n-\n-    /**\n-     * Access log\n-     */\n-    private String accesslog;\n-\n-    /**\n-     * Transporter\n-     */\n-    private String transporter;\n-\n-    /**\n-     * How information is exchanged\n-     */\n-    private String exchanger;\n-\n-    /**\n-     * Thread dispatch mode\n-     */\n-    private String dispatcher;\n-\n-    /**\n-     * Networker\n-     */\n-    private String networker;\n-\n-    /**\n-     * Sever impl\n-     */\n-    private String server;\n-\n-    /**\n-     * Client impl\n-     */\n-    private String client;\n-\n-    /**\n-     * Supported telnet commands, separated with comma.\n-     */\n-    private String telnet;\n-\n-    /**\n-     * Command line prompt\n-     */\n-    private String prompt;\n-\n-    /**\n-     * Status check\n-     */\n-    private String status;\n-\n-    /**\n-     * Whether to register\n-     */\n-    private Boolean register;\n-\n-    /**\n-     * whether it is a persistent connection\n-     */\n-    //TODO add this to provider config\n-    private Boolean keepAlive;\n-\n-    // TODO add this to provider config\n-    private String optimizer;\n-\n-    /**\n-     * The extension\n-     */\n-    private String extension;\n-\n-    /**\n-     * The customized parameters\n-     */\n-    private Map<String, String> parameters;\n-\n-    /**\n-     * If it's default\n-     */\n-    private Boolean isDefault;\n-\n-    public static ProtocolBuilder newBuilder() {\n-        return new ProtocolBuilder();\n-    }\n-\n-    public ProtocolBuilder id(String id) {\n-        return super.id(id);\n-    }\n-\n-    public ProtocolBuilder name(String name) {\n-        this.name = name;\n-        return getThis();\n-    }\n-\n-    public ProtocolBuilder host(String host) {\n-        this.host = host;\n-        return getThis();\n-    }\n-\n-    public ProtocolBuilder port(Integer port) {\n-        this.port = port;\n-        return getThis();\n-    }\n-\n-    public ProtocolBuilder contextpath(String contextpath) {\n-        this.contextpath = contextpath;\n-        return getThis();\n-    }\n-\n-    /**\n-     * @param path\n-     * @return ProtocolBuilder\n-     * @see ProtocolBuilder#contextpath(String)\n-     */\n-    @Deprecated\n-    public ProtocolBuilder path(String path) {\n-        this.contextpath = path;\n-        return getThis();\n-    }\n-\n-    public ProtocolBuilder threadpool(String threadpool) {\n-        this.threadpool = threadpool;\n-        return getThis();\n-    }\n-\n-    public ProtocolBuilder corethreads(Integer corethreads) {\n-        this.corethreads = corethreads;\n-        return getThis();\n-    }\n-\n-    public ProtocolBuilder threads(Integer threads) {\n-        this.threads = threads;\n-        return getThis();\n-    }\n-\n-    public ProtocolBuilder iothreads(Integer iothreads) {\n-        this.iothreads = iothreads;\n-        return getThis();\n-    }\n-\n-    public ProtocolBuilder queues(Integer queues) {\n-        this.queues = queues;\n-        return getThis();\n-    }\n-\n-    public ProtocolBuilder accepts(Integer accepts) {\n-        this.accepts = accepts;\n-        return getThis();\n-    }\n-\n-    public ProtocolBuilder codec(String codec) {\n-        this.codec = codec;\n-        return getThis();\n-    }\n-\n-    public ProtocolBuilder serialization(String serialization) {\n-        this.serialization = serialization;\n-        return getThis();\n-    }\n-\n-    public ProtocolBuilder charset(String charset) {\n-        this.charset = charset;\n-        return getThis();\n-    }\n-\n-    public ProtocolBuilder payload(Integer payload) {\n-        this.payload = payload;\n-        return getThis();\n-    }\n-\n-    public ProtocolBuilder buffer(Integer buffer) {\n-        this.buffer = buffer;\n-        return getThis();\n-    }\n-\n-    public ProtocolBuilder heartbeat(Integer heartbeat) {\n-        this.heartbeat = heartbeat;\n-        return getThis();\n-    }\n-\n-    public ProtocolBuilder accesslog(String accesslog) {\n-        this.accesslog = accesslog;\n-        return getThis();\n-    }\n-\n-    public ProtocolBuilder transporter(String transporter) {\n-        this.transporter = transporter;\n-        return getThis();\n-    }\n-\n-    public ProtocolBuilder exchanger(String exchanger) {\n-        this.exchanger = exchanger;\n-        return getThis();\n-    }\n-\n-    public ProtocolBuilder dispatcher(String dispatcher) {\n-        this.dispatcher = dispatcher;\n-        return getThis();\n-    }\n-\n-    /**\n-     * @param dispather\n-     * @return ProtocolBuilder\n-     * @see ProtocolBuilder#dispatcher(String)\n-     */\n-    @Deprecated\n-    public ProtocolBuilder dispather(String dispather) {\n-        this.dispatcher = dispather;\n-        return getThis();\n-    }\n-\n-    public ProtocolBuilder networker(String networker) {\n-        this.networker = networker;\n-        return getThis();\n-    }\n-\n-    public ProtocolBuilder server(String server) {\n-        this.server = server;\n-        return getThis();\n-    }\n-\n-    public ProtocolBuilder client(String client) {\n-        this.client = client;\n-        return getThis();\n-    }\n-\n-    public ProtocolBuilder telnet(String telnet) {\n-        this.telnet = telnet;\n-        return getThis();\n-    }\n-\n-    public ProtocolBuilder prompt(String prompt) {\n-        this.prompt = prompt;\n-        return getThis();\n-    }\n-\n-    public ProtocolBuilder status(String status) {\n-        this.status = status;\n-        return getThis();\n-    }\n-\n-    public ProtocolBuilder register(Boolean register) {\n-        this.register = register;\n-        return getThis();\n-    }\n-\n-    public ProtocolBuilder keepAlive(Boolean keepAlive) {\n-        this.keepAlive = keepAlive;\n-        return getThis();\n-    }\n-\n-    public ProtocolBuilder optimizer(String optimizer) {\n-        this.optimizer = optimizer;\n-        return getThis();\n-    }\n-\n-    public ProtocolBuilder extension(String extension) {\n-        this.extension = extension;\n-        return getThis();\n-    }\n-\n-    public ProtocolBuilder appendParameter(String key, String value) {\n-        this.parameters = appendParameter(parameters, key, value);\n-        return getThis();\n-    }\n-\n-    public ProtocolBuilder appendParameters(Map<String, String> appendParameters) {\n-        this.parameters = appendParameters(parameters, appendParameters);\n-        return getThis();\n-    }\n-\n-    public ProtocolBuilder isDefault(Boolean isDefault) {\n-        this.isDefault = isDefault;\n-        return getThis();\n-    }\n-\n-    public ProtocolConfig build() {\n-        ProtocolConfig protocolConfig = new ProtocolConfig();\n-        super.build(protocolConfig);\n-\n-        protocolConfig.setAccepts(accepts);\n-        protocolConfig.setAccesslog(accesslog);\n-        protocolConfig.setBuffer(buffer);\n-        protocolConfig.setCharset(charset);\n-        protocolConfig.setClient(client);\n-        protocolConfig.setCodec(codec);\n-        protocolConfig.setContextpath(contextpath);\n-        protocolConfig.setCorethreads(corethreads);\n-        protocolConfig.setDefault(isDefault);\n-        protocolConfig.setDispatcher(dispatcher);\n-        protocolConfig.setExchanger(exchanger);\n-        protocolConfig.setExtension(extension);\n-        protocolConfig.setHeartbeat(heartbeat);\n-        protocolConfig.setHost(host);\n-        protocolConfig.setIothreads(iothreads);\n-        protocolConfig.setKeepAlive(keepAlive);\n-        protocolConfig.setName(name);\n-        protocolConfig.setNetworker(networker);\n-        protocolConfig.setOptimizer(optimizer);\n-        protocolConfig.setParameters(parameters);\n-        protocolConfig.setPayload(payload);\n-        protocolConfig.setPort(port);\n-        protocolConfig.setPrompt(prompt);\n-        protocolConfig.setQueues(queues);\n-        protocolConfig.setRegister(register);\n-        protocolConfig.setSerialization(serialization);\n-        protocolConfig.setServer(server);\n-        protocolConfig.setStatus(status);\n-        protocolConfig.setTelnet(telnet);\n-        protocolConfig.setThreadpool(threadpool);\n-        protocolConfig.setThreads(threads);\n-        protocolConfig.setTransporter(transporter);\n-\n-        return protocolConfig;\n-    }\n-\n-    @Override\n-    protected ProtocolBuilder getThis() {\n-        return this;\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.config.bootstrap.builders;\r\n+\r\n+import org.apache.dubbo.config.ProtocolConfig;\r\n+\r\n+import java.util.Map;\r\n+\r\n+/**\r\n+ * This is a builder for build {@link ProtocolConfig}.\r\n+ *\r\n+ * @since 2.7\r\n+ */\r\n+public class ProtocolBuilder extends AbstractBuilder<ProtocolConfig, ProtocolBuilder> {\r\n+    /**\r\n+     * Protocol name\r\n+     */\r\n+    private String name;\r\n+\r\n+    /**\r\n+     * Service ip address (when there are multiple network cards available)\r\n+     */\r\n+    private String host;\r\n+\r\n+    /**\r\n+     * Service port\r\n+     */\r\n+    private Integer port;\r\n+\r\n+    /**\r\n+     * Context path\r\n+     */\r\n+    private String contextpath;\r\n+\r\n+    /**\r\n+     * Thread pool\r\n+     */\r\n+    private String threadpool;\r\n+\r\n+    /**\r\n+     * Thread pool core thread size\r\n+     */\r\n+    private Integer corethreads;\r\n+\r\n+    /**\r\n+     * Thread pool size (fixed size)\r\n+     */\r\n+    private Integer threads;\r\n+\r\n+    /**\r\n+     * IO thread pool size (fixed size)\r\n+     */\r\n+    private Integer iothreads;\r\n+\r\n+    /**\r\n+     * Thread pool's queue length\r\n+     */\r\n+    private Integer queues;\r\n+\r\n+    /**\r\n+     * Max acceptable connections\r\n+     */\r\n+    private Integer accepts;\r\n+\r\n+    /**\r\n+     * Protocol codec\r\n+     */\r\n+    private String codec;\r\n+\r\n+    /**\r\n+     * Serialization\r\n+     */\r\n+    private String serialization;\r\n+\r\n+    /**\r\n+     * Charset\r\n+     */\r\n+    private String charset;\r\n+\r\n+    /**\r\n+     * Payload max length\r\n+     */\r\n+    private Integer payload;\r\n+\r\n+    /**\r\n+     * Buffer size\r\n+     */\r\n+    private Integer buffer;\r\n+\r\n+    /**\r\n+     * Heartbeat interval\r\n+     */\r\n+    private Integer heartbeat;\r\n+\r\n+    /**\r\n+     * Access log\r\n+     */\r\n+    private String accesslog;\r\n+\r\n+    /**\r\n+     * Transporter\r\n+     */\r\n+    private String transporter;\r\n+\r\n+    /**\r\n+     * How information is exchanged\r\n+     */\r\n+    private String exchanger;\r\n+\r\n+    /**\r\n+     * Thread dispatch mode\r\n+     */\r\n+    private String dispatcher;\r\n+\r\n+    /**\r\n+     * Networker\r\n+     */\r\n+    private String networker;\r\n+\r\n+    /**\r\n+     * Sever impl\r\n+     */\r\n+    private String server;\r\n+\r\n+    /**\r\n+     * Client impl\r\n+     */\r\n+    private String client;\r\n+\r\n+    /**\r\n+     * Supported telnet commands, separated with comma.\r\n+     */\r\n+    private String telnet;\r\n+\r\n+    /**\r\n+     * Command line prompt\r\n+     */\r\n+    private String prompt;\r\n+\r\n+    /**\r\n+     * Status check\r\n+     */\r\n+    private String status;\r\n+\r\n+    /**\r\n+     * Whether to register\r\n+     */\r\n+    private Boolean register;\r\n+\r\n+    /**\r\n+     * whether it is a persistent connection\r\n+     */\r\n+    //TODO add this to provider config\r\n+    private Boolean keepAlive;\r\n+\r\n+    // TODO add this to provider config\r\n+    private String optimizer;\r\n+\r\n+    /**\r\n+     * The extension\r\n+     */\r\n+    private String extension;\r\n+\r\n+    /**\r\n+     * The customized parameters\r\n+     */\r\n+    private Map<String, String> parameters;\r\n+\r\n+    /**\r\n+     * If it's default\r\n+     */\r\n+    private Boolean isDefault;\r\n+\r\n+    public static ProtocolBuilder newBuilder() {\r\n+        return new ProtocolBuilder();\r\n+    }\r\n+\r\n+    public ProtocolBuilder id(String id) {\r\n+        return super.id(id);\r\n+    }\r\n+\r\n+    public ProtocolBuilder name(String name) {\r\n+        this.name = name;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProtocolBuilder host(String host) {\r\n+        this.host = host;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProtocolBuilder port(Integer port) {\r\n+        this.port = port;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProtocolBuilder contextpath(String contextpath) {\r\n+        this.contextpath = contextpath;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    /**\r\n+     * @param path\r\n+     * @return ProtocolBuilder\r\n+     * @see ProtocolBuilder#contextpath(String)\r\n+     */\r\n+    @Deprecated\r\n+    public ProtocolBuilder path(String path) {\r\n+        this.contextpath = path;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProtocolBuilder threadpool(String threadpool) {\r\n+        this.threadpool = threadpool;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProtocolBuilder corethreads(Integer corethreads) {\r\n+        this.corethreads = corethreads;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProtocolBuilder threads(Integer threads) {\r\n+        this.threads = threads;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProtocolBuilder iothreads(Integer iothreads) {\r\n+        this.iothreads = iothreads;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProtocolBuilder queues(Integer queues) {\r\n+        this.queues = queues;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProtocolBuilder accepts(Integer accepts) {\r\n+        this.accepts = accepts;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProtocolBuilder codec(String codec) {\r\n+        this.codec = codec;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProtocolBuilder serialization(String serialization) {\r\n+        this.serialization = serialization;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProtocolBuilder charset(String charset) {\r\n+        this.charset = charset;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProtocolBuilder payload(Integer payload) {\r\n+        this.payload = payload;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProtocolBuilder buffer(Integer buffer) {\r\n+        this.buffer = buffer;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProtocolBuilder heartbeat(Integer heartbeat) {\r\n+        this.heartbeat = heartbeat;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProtocolBuilder accesslog(String accesslog) {\r\n+        this.accesslog = accesslog;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProtocolBuilder transporter(String transporter) {\r\n+        this.transporter = transporter;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProtocolBuilder exchanger(String exchanger) {\r\n+        this.exchanger = exchanger;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProtocolBuilder dispatcher(String dispatcher) {\r\n+        this.dispatcher = dispatcher;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    /**\r\n+     * @param dispather\r\n+     * @return ProtocolBuilder\r\n+     * @see ProtocolBuilder#dispatcher(String)\r\n+     */\r\n+    @Deprecated\r\n+    public ProtocolBuilder dispather(String dispather) {\r\n+        this.dispatcher = dispather;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProtocolBuilder networker(String networker) {\r\n+        this.networker = networker;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProtocolBuilder server(String server) {\r\n+        this.server = server;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProtocolBuilder client(String client) {\r\n+        this.client = client;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProtocolBuilder telnet(String telnet) {\r\n+        this.telnet = telnet;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProtocolBuilder prompt(String prompt) {\r\n+        this.prompt = prompt;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProtocolBuilder status(String status) {\r\n+        this.status = status;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProtocolBuilder register(Boolean register) {\r\n+        this.register = register;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProtocolBuilder keepAlive(Boolean keepAlive) {\r\n+        this.keepAlive = keepAlive;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProtocolBuilder optimizer(String optimizer) {\r\n+        this.optimizer = optimizer;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProtocolBuilder extension(String extension) {\r\n+        this.extension = extension;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProtocolBuilder appendParameter(String key, String value) {\r\n+        this.parameters = appendParameter(parameters, key, value);\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProtocolBuilder appendParameters(Map<String, String> appendParameters) {\r\n+        this.parameters = appendParameters(parameters, appendParameters);\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProtocolBuilder isDefault(Boolean isDefault) {\r\n+        this.isDefault = isDefault;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProtocolConfig build() {\r\n+        ProtocolConfig protocolConfig = new ProtocolConfig();\r\n+        super.build(protocolConfig);\r\n+\r\n+        protocolConfig.setAccepts(accepts);\r\n+        protocolConfig.setAccesslog(accesslog);\r\n+        protocolConfig.setBuffer(buffer);\r\n+        protocolConfig.setCharset(charset);\r\n+        protocolConfig.setClient(client);\r\n+        protocolConfig.setCodec(codec);\r\n+        protocolConfig.setContextpath(contextpath);\r\n+        protocolConfig.setCorethreads(corethreads);\r\n+        protocolConfig.setDefault(isDefault);\r\n+        protocolConfig.setDispatcher(dispatcher);\r\n+        protocolConfig.setExchanger(exchanger);\r\n+        protocolConfig.setExtension(extension);\r\n+        protocolConfig.setHeartbeat(heartbeat);\r\n+        protocolConfig.setHost(host);\r\n+        protocolConfig.setIothreads(iothreads);\r\n+        protocolConfig.setKeepAlive(keepAlive);\r\n+        protocolConfig.setName(name);\r\n+        protocolConfig.setNetworker(networker);\r\n+        protocolConfig.setOptimizer(optimizer);\r\n+        protocolConfig.setParameters(parameters);\r\n+        protocolConfig.setPayload(payload);\r\n+        protocolConfig.setPort(port);\r\n+        protocolConfig.setPrompt(prompt);\r\n+        protocolConfig.setQueues(queues);\r\n+        protocolConfig.setRegister(register);\r\n+        protocolConfig.setSerialization(serialization);\r\n+        protocolConfig.setServer(server);\r\n+        protocolConfig.setStatus(status);\r\n+        protocolConfig.setTelnet(telnet);\r\n+        protocolConfig.setThreadpool(threadpool);\r\n+        protocolConfig.setThreads(threads);\r\n+        protocolConfig.setTransporter(transporter);\r\n+\r\n+        return protocolConfig;\r\n+    }\r\n+\r\n+    @Override\r\n+    protected ProtocolBuilder getThis() {\r\n+        return this;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/bootstrap/builders/ProviderBuilder.java", "source2": "org/apache/dubbo/config/bootstrap/builders/ProviderBuilder.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,293 +1,293 @@\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.config.bootstrap.builders;\n-\n-import org.apache.dubbo.config.ProviderConfig;\n-\n-/**\n- * This is a builder for build {@link ProviderConfig}.\n- *\n- * @since 2.7\n- */\n-public class ProviderBuilder extends AbstractServiceBuilder<ProviderConfig, ProviderBuilder> {\n-\n-    /**\n-     * Service ip addresses (used when there are multiple network cards available)\n-     */\n-    private String host;\n-\n-    /**\n-     * Service port\n-     */\n-    private Integer port;\n-\n-    /**\n-     * Context path\n-     */\n-    private String contextpath;\n-\n-    /**\n-     * Thread pool\n-     */\n-    private String threadpool;\n-\n-    /**\n-     * Thread pool size (fixed size)\n-     */\n-    private Integer threads;\n-\n-    /**\n-     * IO thread pool size (fixed size)\n-     */\n-    private Integer iothreads;\n-\n-    /**\n-     * Thread pool queue length\n-     */\n-    private Integer queues;\n-\n-    /**\n-     * Max acceptable connections\n-     */\n-    private Integer accepts;\n-\n-    /**\n-     * Protocol codec\n-     */\n-    private String codec;\n-\n-    /**\n-     * The serialization charset\n-     */\n-    private String charset;\n-\n-    /**\n-     * Payload max length\n-     */\n-    private Integer payload;\n-\n-    /**\n-     * The network io buffer size\n-     */\n-    private Integer buffer;\n-\n-    /**\n-     * Transporter\n-     */\n-    private String transporter;\n-\n-    /**\n-     * How information gets exchanged\n-     */\n-    private String exchanger;\n-\n-    /**\n-     * Thread dispatching mode\n-     */\n-    private String dispatcher;\n-\n-    /**\n-     * Networker\n-     */\n-    private String networker;\n-\n-    /**\n-     * The server-side implementation model of the protocol\n-     */\n-    private String server;\n-\n-    /**\n-     * The client-side implementation model of the protocol\n-     */\n-    private String client;\n-\n-    /**\n-     * Supported telnet commands, separated with comma.\n-     */\n-    private String telnet;\n-\n-    /**\n-     * Command line prompt\n-     */\n-    private String prompt;\n-\n-    /**\n-     * Status check\n-     */\n-    private String status;\n-\n-    /**\n-     * Wait time when stop\n-     */\n-    private Integer wait;\n-\n-    /**\n-     * Whether to use the default protocol\n-     */\n-    private Boolean isDefault;\n-\n-    public ProviderBuilder host(String host) {\n-        this.host = host;\n-        return getThis();\n-    }\n-\n-    public ProviderBuilder port(Integer port) {\n-        this.port = port;\n-        return getThis();\n-    }\n-\n-    public ProviderBuilder contextPath(String contextPath) {\n-        this.contextpath = contextPath;\n-        return getThis();\n-    }\n-\n-    public ProviderBuilder threadPool(String threadPool) {\n-        this.threadpool = threadPool;\n-        return getThis();\n-    }\n-\n-    public ProviderBuilder threads(Integer threads) {\n-        this.threads = threads;\n-        return getThis();\n-    }\n-\n-    public ProviderBuilder ioThreads(Integer ioThreads) {\n-        this.iothreads = ioThreads;\n-        return getThis();\n-    }\n-\n-    public ProviderBuilder queues(Integer queues) {\n-        this.queues = queues;\n-        return getThis();\n-    }\n-\n-    public ProviderBuilder accepts(Integer accepts) {\n-        this.accepts = accepts;\n-        return getThis();\n-    }\n-\n-    public ProviderBuilder codec(String codec) {\n-        this.codec = codec;\n-        return getThis();\n-    }\n-\n-    public ProviderBuilder charset(String charset) {\n-        this.charset = charset;\n-        return getThis();\n-    }\n-\n-    public ProviderBuilder payload(Integer payload) {\n-        this.payload = payload;\n-        return getThis();\n-    }\n-\n-    public ProviderBuilder buffer(Integer buffer) {\n-        this.buffer = buffer;\n-        return getThis();\n-    }\n-\n-    public ProviderBuilder transporter(String transporter) {\n-        this.transporter = transporter;\n-        return getThis();\n-    }\n-\n-    public ProviderBuilder exchanger(String exchanger) {\n-        this.exchanger = exchanger;\n-        return getThis();\n-    }\n-\n-    public ProviderBuilder dispatcher(String dispatcher) {\n-        this.dispatcher = dispatcher;\n-        return getThis();\n-    }\n-\n-    public ProviderBuilder networker(String networker) {\n-        this.networker = networker;\n-        return getThis();\n-    }\n-\n-    public ProviderBuilder server(String server) {\n-        this.server = server;\n-        return getThis();\n-    }\n-\n-    public ProviderBuilder client(String client) {\n-        this.client = client;\n-        return getThis();\n-    }\n-\n-    public ProviderBuilder telnet(String telnet) {\n-        this.telnet = telnet;\n-        return getThis();\n-    }\n-\n-    public ProviderBuilder prompt(String prompt) {\n-        this.prompt = prompt;\n-        return getThis();\n-    }\n-\n-    public ProviderBuilder status(String status) {\n-        this.status = status;\n-        return getThis();\n-    }\n-\n-    public ProviderBuilder wait(Integer wait) {\n-        this.wait = wait;\n-        return getThis();\n-    }\n-\n-    public ProviderBuilder isDefault(Boolean isDefault) {\n-        this.isDefault = isDefault;\n-        return getThis();\n-    }\n-\n-    public ProviderConfig build() {\n-        ProviderConfig provider = new ProviderConfig();\n-        super.build(provider);\n-\n-        provider.setHost(host);\n-        provider.setPort(port);\n-        provider.setContextpath(contextpath);\n-        provider.setThreadpool(threadpool);\n-        provider.setThreads(threads);\n-        provider.setIothreads(iothreads);\n-        provider.setQueues(queues);\n-        provider.setAccepts(accepts);\n-        provider.setCodec(codec);\n-        provider.setPayload(payload);\n-        provider.setCharset(charset);\n-        provider.setBuffer(buffer);\n-        provider.setTransporter(transporter);\n-        provider.setExchanger(exchanger);\n-        provider.setDispatcher(dispatcher);\n-        provider.setNetworker(networker);\n-        provider.setServer(server);\n-        provider.setClient(client);\n-        provider.setTelnet(telnet);\n-        provider.setPrompt(prompt);\n-        provider.setStatus(status);\n-        provider.setWait(wait);\n-        provider.setDefault(isDefault);\n-\n-        return provider;\n-    }\n-\n-    @Override\n-    protected ProviderBuilder getThis() {\n-        return this;\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.config.bootstrap.builders;\r\n+\r\n+import org.apache.dubbo.config.ProviderConfig;\r\n+\r\n+/**\r\n+ * This is a builder for build {@link ProviderConfig}.\r\n+ *\r\n+ * @since 2.7\r\n+ */\r\n+public class ProviderBuilder extends AbstractServiceBuilder<ProviderConfig, ProviderBuilder> {\r\n+\r\n+    /**\r\n+     * Service ip addresses (used when there are multiple network cards available)\r\n+     */\r\n+    private String host;\r\n+\r\n+    /**\r\n+     * Service port\r\n+     */\r\n+    private Integer port;\r\n+\r\n+    /**\r\n+     * Context path\r\n+     */\r\n+    private String contextpath;\r\n+\r\n+    /**\r\n+     * Thread pool\r\n+     */\r\n+    private String threadpool;\r\n+\r\n+    /**\r\n+     * Thread pool size (fixed size)\r\n+     */\r\n+    private Integer threads;\r\n+\r\n+    /**\r\n+     * IO thread pool size (fixed size)\r\n+     */\r\n+    private Integer iothreads;\r\n+\r\n+    /**\r\n+     * Thread pool queue length\r\n+     */\r\n+    private Integer queues;\r\n+\r\n+    /**\r\n+     * Max acceptable connections\r\n+     */\r\n+    private Integer accepts;\r\n+\r\n+    /**\r\n+     * Protocol codec\r\n+     */\r\n+    private String codec;\r\n+\r\n+    /**\r\n+     * The serialization charset\r\n+     */\r\n+    private String charset;\r\n+\r\n+    /**\r\n+     * Payload max length\r\n+     */\r\n+    private Integer payload;\r\n+\r\n+    /**\r\n+     * The network io buffer size\r\n+     */\r\n+    private Integer buffer;\r\n+\r\n+    /**\r\n+     * Transporter\r\n+     */\r\n+    private String transporter;\r\n+\r\n+    /**\r\n+     * How information gets exchanged\r\n+     */\r\n+    private String exchanger;\r\n+\r\n+    /**\r\n+     * Thread dispatching mode\r\n+     */\r\n+    private String dispatcher;\r\n+\r\n+    /**\r\n+     * Networker\r\n+     */\r\n+    private String networker;\r\n+\r\n+    /**\r\n+     * The server-side implementation model of the protocol\r\n+     */\r\n+    private String server;\r\n+\r\n+    /**\r\n+     * The client-side implementation model of the protocol\r\n+     */\r\n+    private String client;\r\n+\r\n+    /**\r\n+     * Supported telnet commands, separated with comma.\r\n+     */\r\n+    private String telnet;\r\n+\r\n+    /**\r\n+     * Command line prompt\r\n+     */\r\n+    private String prompt;\r\n+\r\n+    /**\r\n+     * Status check\r\n+     */\r\n+    private String status;\r\n+\r\n+    /**\r\n+     * Wait time when stop\r\n+     */\r\n+    private Integer wait;\r\n+\r\n+    /**\r\n+     * Whether to use the default protocol\r\n+     */\r\n+    private Boolean isDefault;\r\n+\r\n+    public ProviderBuilder host(String host) {\r\n+        this.host = host;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProviderBuilder port(Integer port) {\r\n+        this.port = port;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProviderBuilder contextPath(String contextPath) {\r\n+        this.contextpath = contextPath;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProviderBuilder threadPool(String threadPool) {\r\n+        this.threadpool = threadPool;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProviderBuilder threads(Integer threads) {\r\n+        this.threads = threads;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProviderBuilder ioThreads(Integer ioThreads) {\r\n+        this.iothreads = ioThreads;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProviderBuilder queues(Integer queues) {\r\n+        this.queues = queues;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProviderBuilder accepts(Integer accepts) {\r\n+        this.accepts = accepts;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProviderBuilder codec(String codec) {\r\n+        this.codec = codec;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProviderBuilder charset(String charset) {\r\n+        this.charset = charset;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProviderBuilder payload(Integer payload) {\r\n+        this.payload = payload;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProviderBuilder buffer(Integer buffer) {\r\n+        this.buffer = buffer;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProviderBuilder transporter(String transporter) {\r\n+        this.transporter = transporter;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProviderBuilder exchanger(String exchanger) {\r\n+        this.exchanger = exchanger;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProviderBuilder dispatcher(String dispatcher) {\r\n+        this.dispatcher = dispatcher;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProviderBuilder networker(String networker) {\r\n+        this.networker = networker;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProviderBuilder server(String server) {\r\n+        this.server = server;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProviderBuilder client(String client) {\r\n+        this.client = client;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProviderBuilder telnet(String telnet) {\r\n+        this.telnet = telnet;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProviderBuilder prompt(String prompt) {\r\n+        this.prompt = prompt;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProviderBuilder status(String status) {\r\n+        this.status = status;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProviderBuilder wait(Integer wait) {\r\n+        this.wait = wait;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProviderBuilder isDefault(Boolean isDefault) {\r\n+        this.isDefault = isDefault;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ProviderConfig build() {\r\n+        ProviderConfig provider = new ProviderConfig();\r\n+        super.build(provider);\r\n+\r\n+        provider.setHost(host);\r\n+        provider.setPort(port);\r\n+        provider.setContextpath(contextpath);\r\n+        provider.setThreadpool(threadpool);\r\n+        provider.setThreads(threads);\r\n+        provider.setIothreads(iothreads);\r\n+        provider.setQueues(queues);\r\n+        provider.setAccepts(accepts);\r\n+        provider.setCodec(codec);\r\n+        provider.setPayload(payload);\r\n+        provider.setCharset(charset);\r\n+        provider.setBuffer(buffer);\r\n+        provider.setTransporter(transporter);\r\n+        provider.setExchanger(exchanger);\r\n+        provider.setDispatcher(dispatcher);\r\n+        provider.setNetworker(networker);\r\n+        provider.setServer(server);\r\n+        provider.setClient(client);\r\n+        provider.setTelnet(telnet);\r\n+        provider.setPrompt(prompt);\r\n+        provider.setStatus(status);\r\n+        provider.setWait(wait);\r\n+        provider.setDefault(isDefault);\r\n+\r\n+        return provider;\r\n+    }\r\n+\r\n+    @Override\r\n+    protected ProviderBuilder getThis() {\r\n+        return this;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/bootstrap/builders/ReferenceBuilder.java", "source2": "org/apache/dubbo/config/bootstrap/builders/ReferenceBuilder.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,165 +1,165 @@\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.config.bootstrap.builders;\n-\n-import org.apache.dubbo.config.ConsumerConfig;\n-import org.apache.dubbo.config.MethodConfig;\n-import org.apache.dubbo.config.ReferenceConfig;\n-import org.apache.dubbo.config.ReferenceConfigBase;\n-\n-import java.util.ArrayList;\n-import java.util.List;\n-\n-import static org.apache.dubbo.common.utils.StringUtils.toCommaDelimitedString;\n-\n-/**\n- * This is a builder for build {@link ReferenceConfigBase}.\n- *\n- * @since 2.7\n- */\n-public class ReferenceBuilder<T> extends AbstractReferenceBuilder<ReferenceConfig, ReferenceBuilder<T>> {\n-    /**\n-     * The interface name of the reference service\n-     */\n-    private String interfaceName;\n-\n-    /**\n-     * The interface class of the reference service\n-     */\n-    private Class<?> interfaceClass;\n-\n-    /**\n-     * client type\n-     */\n-    private String client;\n-\n-    /**\n-     * The url for peer-to-peer invocation\n-     */\n-    private String url;\n-\n-    /**\n-     * The method configs\n-     */\n-    private List<MethodConfig> methods;\n-\n-    /**\n-     * The consumer config (default)\n-     */\n-    private ConsumerConfig consumer;\n-\n-    /**\n-     * Only the service provider of the specified protocol is invoked, and other protocols are ignored.\n-     */\n-    private String protocol;\n-\n-    /**\n-     * The string presenting the service names that the Dubbo interface subscribed\n-     *\n-     * @since 2.7.8\n-     */\n-    private String services;\n-\n-    public static ReferenceBuilder newBuilder() {\n-        return new ReferenceBuilder();\n-    }\n-\n-    public ReferenceBuilder<T> id(String id) {\n-        return super.id(id);\n-    }\n-\n-    public ReferenceBuilder<T> interfaceName(String interfaceName) {\n-        this.interfaceName = interfaceName;\n-        return getThis();\n-    }\n-\n-    public ReferenceBuilder<T> interfaceClass(Class<?> interfaceClass) {\n-        this.interfaceClass = interfaceClass;\n-        return getThis();\n-    }\n-\n-    public ReferenceBuilder<T> client(String client) {\n-        this.client = client;\n-        return getThis();\n-    }\n-\n-    public ReferenceBuilder<T> url(String url) {\n-        this.url = url;\n-        return getThis();\n-    }\n-\n-    public ReferenceBuilder<T> addMethods(List<MethodConfig> methods) {\n-        if (this.methods == null) {\n-            this.methods = new ArrayList<>();\n-        }\n-        this.methods.addAll(methods);\n-        return getThis();\n-    }\n-\n-    public ReferenceBuilder<T> addMethod(MethodConfig method) {\n-        if (this.methods == null) {\n-            this.methods = new ArrayList<>();\n-        }\n-        this.methods.add(method);\n-        return getThis();\n-    }\n-\n-    public ReferenceBuilder<T> consumer(ConsumerConfig consumer) {\n-        this.consumer = consumer;\n-        return getThis();\n-    }\n-\n-    public ReferenceBuilder<T> protocol(String protocol) {\n-        this.protocol = protocol;\n-        return getThis();\n-    }\n-\n-    /**\n-     * @param service       one service name\n-     * @param otherServices other service names\n-     * @return {@link ReferenceBuilder}\n-     * @since 2.7.8\n-     */\n-    public ReferenceBuilder<T> services(String service, String... otherServices) {\n-        this.services = toCommaDelimitedString(service, otherServices);\n-        return getThis();\n-    }\n-\n-    public ReferenceConfig<T> build() {\n-        ReferenceConfig<T> reference = new ReferenceConfig<>();\n-        super.build(reference);\n-\n-        reference.setInterface(interfaceName);\n-        if (interfaceClass != null) {\n-            reference.setInterface(interfaceClass);\n-        }\n-        reference.setClient(client);\n-        reference.setUrl(url);\n-        reference.setMethods(methods);\n-        reference.setConsumer(consumer);\n-        reference.setProtocol(protocol);\n-        // @since 2.7.8\n-        reference.setServices(services);\n-\n-        return reference;\n-    }\n-\n-    @Override\n-    protected ReferenceBuilder<T> getThis() {\n-        return this;\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.config.bootstrap.builders;\r\n+\r\n+import org.apache.dubbo.config.ConsumerConfig;\r\n+import org.apache.dubbo.config.MethodConfig;\r\n+import org.apache.dubbo.config.ReferenceConfig;\r\n+import org.apache.dubbo.config.ReferenceConfigBase;\r\n+\r\n+import java.util.ArrayList;\r\n+import java.util.List;\r\n+\r\n+import static org.apache.dubbo.common.utils.StringUtils.toCommaDelimitedString;\r\n+\r\n+/**\r\n+ * This is a builder for build {@link ReferenceConfigBase}.\r\n+ *\r\n+ * @since 2.7\r\n+ */\r\n+public class ReferenceBuilder<T> extends AbstractReferenceBuilder<ReferenceConfig, ReferenceBuilder<T>> {\r\n+    /**\r\n+     * The interface name of the reference service\r\n+     */\r\n+    private String interfaceName;\r\n+\r\n+    /**\r\n+     * The interface class of the reference service\r\n+     */\r\n+    private Class<?> interfaceClass;\r\n+\r\n+    /**\r\n+     * client type\r\n+     */\r\n+    private String client;\r\n+\r\n+    /**\r\n+     * The url for peer-to-peer invocation\r\n+     */\r\n+    private String url;\r\n+\r\n+    /**\r\n+     * The method configs\r\n+     */\r\n+    private List<MethodConfig> methods;\r\n+\r\n+    /**\r\n+     * The consumer config (default)\r\n+     */\r\n+    private ConsumerConfig consumer;\r\n+\r\n+    /**\r\n+     * Only the service provider of the specified protocol is invoked, and other protocols are ignored.\r\n+     */\r\n+    private String protocol;\r\n+\r\n+    /**\r\n+     * The string presenting the service names that the Dubbo interface subscribed\r\n+     *\r\n+     * @since 2.7.8\r\n+     */\r\n+    private String services;\r\n+\r\n+    public static ReferenceBuilder newBuilder() {\r\n+        return new ReferenceBuilder();\r\n+    }\r\n+\r\n+    public ReferenceBuilder<T> id(String id) {\r\n+        return super.id(id);\r\n+    }\r\n+\r\n+    public ReferenceBuilder<T> interfaceName(String interfaceName) {\r\n+        this.interfaceName = interfaceName;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ReferenceBuilder<T> interfaceClass(Class<?> interfaceClass) {\r\n+        this.interfaceClass = interfaceClass;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ReferenceBuilder<T> client(String client) {\r\n+        this.client = client;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ReferenceBuilder<T> url(String url) {\r\n+        this.url = url;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ReferenceBuilder<T> addMethods(List<MethodConfig> methods) {\r\n+        if (this.methods == null) {\r\n+            this.methods = new ArrayList<>();\r\n+        }\r\n+        this.methods.addAll(methods);\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ReferenceBuilder<T> addMethod(MethodConfig method) {\r\n+        if (this.methods == null) {\r\n+            this.methods = new ArrayList<>();\r\n+        }\r\n+        this.methods.add(method);\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ReferenceBuilder<T> consumer(ConsumerConfig consumer) {\r\n+        this.consumer = consumer;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ReferenceBuilder<T> protocol(String protocol) {\r\n+        this.protocol = protocol;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    /**\r\n+     * @param service       one service name\r\n+     * @param otherServices other service names\r\n+     * @return {@link ReferenceBuilder}\r\n+     * @since 2.7.8\r\n+     */\r\n+    public ReferenceBuilder<T> services(String service, String... otherServices) {\r\n+        this.services = toCommaDelimitedString(service, otherServices);\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ReferenceConfig<T> build() {\r\n+        ReferenceConfig<T> reference = new ReferenceConfig<>();\r\n+        super.build(reference);\r\n+\r\n+        reference.setInterface(interfaceName);\r\n+        if (interfaceClass != null) {\r\n+            reference.setInterface(interfaceClass);\r\n+        }\r\n+        reference.setClient(client);\r\n+        reference.setUrl(url);\r\n+        reference.setMethods(methods);\r\n+        reference.setConsumer(consumer);\r\n+        reference.setProtocol(protocol);\r\n+        // @since 2.7.8\r\n+        reference.setServices(services);\r\n+\r\n+        return reference;\r\n+    }\r\n+\r\n+    @Override\r\n+    protected ReferenceBuilder<T> getThis() {\r\n+        return this;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/bootstrap/builders/RegistryBuilder.java", "source2": "org/apache/dubbo/config/bootstrap/builders/RegistryBuilder.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,383 +1,383 @@\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.config.bootstrap.builders;\n-\n-import org.apache.dubbo.config.RegistryConfig;\n-\n-import java.util.Map;\n-\n-/**\n- * This is a builder for build {@link RegistryConfig}.\n- *\n- * @since 2.7\n- */\n-public class RegistryBuilder extends AbstractBuilder<RegistryConfig, RegistryBuilder> {\n-    /**\n-     * Register center address\n-     */\n-    private String address;\n-\n-    /**\n-     * Username to login register center\n-     */\n-    private String username;\n-\n-    /**\n-     * Password to login register center\n-     */\n-    private String password;\n-\n-    /**\n-     * Default port for register center\n-     */\n-    private Integer port;\n-\n-    /**\n-     * Protocol for register center\n-     */\n-    private String protocol;\n-\n-    /**\n-     * Network transmission type\n-     */\n-    private String transporter;\n-\n-    private String server;\n-\n-    private String client;\n-\n-    private String cluster;\n-\n-    /**\n-     * The group the services registry in\n-     */\n-    private String group;\n-\n-    private String version;\n-\n-    /**\n-     * Request timeout in milliseconds for register center\n-     */\n-    private Integer timeout;\n-\n-    /**\n-     * Session timeout in milliseconds for register center\n-     */\n-    private Integer session;\n-\n-    /**\n-     * File for saving register center dynamic list\n-     */\n-    private String file;\n-\n-    /**\n-     * Wait time before stop\n-     */\n-    private Integer wait;\n-\n-    /**\n-     * Whether to check if register center is available when boot up\n-     */\n-    private Boolean check;\n-\n-    /**\n-     * Whether to allow dynamic service to register on the register center\n-     */\n-    private Boolean dynamic;\n-\n-    /**\n-     * Whether to export service on the register center\n-     */\n-    private Boolean register;\n-\n-    /**\n-     * Whether allow to subscribe service on the register center\n-     */\n-    private Boolean subscribe;\n-\n-    /**\n-     * The customized parameters\n-     */\n-    private Map<String, String> parameters;\n-\n-    /**\n-     * Whether it's default\n-     */\n-    private Boolean isDefault;\n-\n-    /**\n-     * Simple the registry. both useful for provider and consumer\n-     *\n-     * @since 2.7.0\n-     */\n-    private Boolean simplified;\n-    /**\n-     * After simplify the registry, should add some parameter individually. just for provider.\n-     * <p>\n-     * such as: extra-keys = A,b,c,d\n-     *\n-     * @since 2.7.0\n-     */\n-    private String extraKeys;\n-\n-    /**\n-     * the address work as config center or not\n-     */\n-    private Boolean useAsConfigCenter;\n-\n-    /**\n-     * the address work as remote metadata center or not\n-     */\n-    private Boolean useAsMetadataCenter;\n-\n-    /**\n-     * list of rpc protocols accepted by this registry, for example, \"dubbo,rest\"\n-     */\n-    private String accepts;\n-\n-    /**\n-     * Always use this registry first if set to true, useful when subscribe to multiple registries\n-     */\n-    private Boolean preferred;\n-\n-    /**\n-     * Affects traffic distribution among registries, useful when subscribe to multiple registries\n-     * Take effect only when no preferred registry is specified.\n-     */\n-    private Integer weight;\n-\n-    public static RegistryBuilder newBuilder() {\n-        return new RegistryBuilder();\n-    }\n-\n-    public RegistryBuilder id(String id) {\n-        return super.id(id);\n-    }\n-\n-    public RegistryBuilder address(String address) {\n-        this.address = address;\n-        return getThis();\n-    }\n-\n-    public RegistryBuilder username(String username) {\n-        this.username = username;\n-        return getThis();\n-    }\n-\n-    public RegistryBuilder password(String password) {\n-        this.password = password;\n-        return getThis();\n-    }\n-\n-    public RegistryBuilder port(Integer port) {\n-        this.port = port;\n-        return getThis();\n-    }\n-\n-    public RegistryBuilder protocol(String protocol) {\n-        this.protocol = protocol;\n-        return getThis();\n-    }\n-\n-    public RegistryBuilder transporter(String transporter) {\n-        this.transporter = transporter;\n-        return getThis();\n-    }\n-\n-    /**\n-     * @param transport\n-     * @see #transporter(String)\n-     * @deprecated\n-     */\n-    @Deprecated\n-    public RegistryBuilder transport(String transport) {\n-        this.transporter = transport;\n-        return getThis();\n-    }\n-\n-    public RegistryBuilder server(String server) {\n-        this.server = server;\n-        return getThis();\n-    }\n-\n-    public RegistryBuilder client(String client) {\n-        this.client = client;\n-        return getThis();\n-    }\n-\n-    public RegistryBuilder cluster(String cluster) {\n-        this.cluster = cluster;\n-        return getThis();\n-    }\n-\n-    public RegistryBuilder group(String group) {\n-        this.group = group;\n-        return getThis();\n-    }\n-\n-    public RegistryBuilder version(String version) {\n-        this.version = version;\n-        return getThis();\n-    }\n-\n-    public RegistryBuilder timeout(Integer timeout) {\n-        this.timeout = timeout;\n-        return getThis();\n-    }\n-\n-    public RegistryBuilder session(Integer session) {\n-        this.session = session;\n-        return getThis();\n-    }\n-\n-    public RegistryBuilder file(String file) {\n-        this.file = file;\n-        return getThis();\n-    }\n-\n-    /**\n-     * @param wait\n-     * @see ProviderBuilder#wait(Integer)\n-     * @deprecated\n-     */\n-    @Deprecated\n-    public RegistryBuilder wait(Integer wait) {\n-        this.wait = wait;\n-        return getThis();\n-    }\n-\n-    public RegistryBuilder isCheck(Boolean check) {\n-        this.check = check;\n-        return getThis();\n-    }\n-\n-    public RegistryBuilder isDynamic(Boolean dynamic) {\n-        this.dynamic = dynamic;\n-        return getThis();\n-    }\n-\n-    public RegistryBuilder register(Boolean register) {\n-        this.register = register;\n-        return getThis();\n-    }\n-\n-    public RegistryBuilder subscribe(Boolean subscribe) {\n-        this.subscribe = subscribe;\n-        return getThis();\n-    }\n-\n-    public RegistryBuilder appendParameter(String key, String value) {\n-        this.parameters = appendParameter(parameters, key, value);\n-        return getThis();\n-    }\n-\n-    /**\n-     * @param name   the parameter name\n-     * @param value the parameter value\n-     * @return {@link RegistryBuilder}\n-     * @since 2.7.8\n-     */\n-    public RegistryBuilder parameter(String name, String value) {\n-        return appendParameter(name, value);\n-    }\n-\n-    public RegistryBuilder appendParameters(Map<String, String> appendParameters) {\n-        this.parameters = appendParameters(parameters, appendParameters);\n-        return getThis();\n-    }\n-\n-    public RegistryBuilder isDefault(Boolean isDefault) {\n-        this.isDefault = isDefault;\n-        return getThis();\n-    }\n-\n-    public RegistryBuilder simplified(Boolean simplified) {\n-        this.simplified = simplified;\n-        return getThis();\n-    }\n-\n-    public RegistryBuilder extraKeys(String extraKeys) {\n-        this.extraKeys = extraKeys;\n-        return getThis();\n-    }\n-\n-    public RegistryBuilder useAsConfigCenter(Boolean useAsConfigCenter) {\n-        this.useAsConfigCenter = useAsConfigCenter;\n-        return getThis();\n-    }\n-\n-    public RegistryBuilder useAsMetadataCenter(Boolean useAsMetadataCenter) {\n-        this.useAsMetadataCenter = useAsMetadataCenter;\n-        return getThis();\n-    }\n-\n-    public RegistryBuilder preferred(Boolean preferred) {\n-        this.preferred = preferred;\n-        return getThis();\n-    }\n-\n-    public RegistryBuilder accepts(String accepts) {\n-        this.accepts = accepts;\n-        return getThis();\n-    }\n-\n-    public RegistryBuilder weight(Integer weight) {\n-        this.weight = weight;\n-        return getThis();\n-    }\n-\n-    public RegistryConfig build() {\n-        RegistryConfig registry = new RegistryConfig();\n-        super.build(registry);\n-\n-        registry.setCheck(check);\n-        registry.setClient(client);\n-        registry.setCluster(cluster);\n-        registry.setDefault(isDefault);\n-        registry.setDynamic(dynamic);\n-        registry.setExtraKeys(extraKeys);\n-        registry.setFile(file);\n-        registry.setGroup(group);\n-        registry.setParameters(parameters);\n-        registry.setPassword(password);\n-        registry.setPort(port);\n-        registry.setProtocol(protocol);\n-        registry.setRegister(register);\n-        registry.setServer(server);\n-        registry.setSession(session);\n-        registry.setSimplified(simplified);\n-        registry.setSubscribe(subscribe);\n-        registry.setTimeout(timeout);\n-        registry.setTransporter(transporter);\n-        registry.setUsername(username);\n-        registry.setVersion(version);\n-        registry.setWait(wait);\n-        registry.setUseAsConfigCenter(useAsConfigCenter);\n-        registry.setUseAsMetadataCenter(useAsMetadataCenter);\n-        registry.setAccepts(accepts);\n-        registry.setPreferred(preferred);\n-        registry.setWeight(weight);\n-        registry.setAddress(address);\n-\n-        return registry;\n-    }\n-\n-    @Override\n-    protected RegistryBuilder getThis() {\n-        return this;\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.config.bootstrap.builders;\r\n+\r\n+import org.apache.dubbo.config.RegistryConfig;\r\n+\r\n+import java.util.Map;\r\n+\r\n+/**\r\n+ * This is a builder for build {@link RegistryConfig}.\r\n+ *\r\n+ * @since 2.7\r\n+ */\r\n+public class RegistryBuilder extends AbstractBuilder<RegistryConfig, RegistryBuilder> {\r\n+    /**\r\n+     * Register center address\r\n+     */\r\n+    private String address;\r\n+\r\n+    /**\r\n+     * Username to login register center\r\n+     */\r\n+    private String username;\r\n+\r\n+    /**\r\n+     * Password to login register center\r\n+     */\r\n+    private String password;\r\n+\r\n+    /**\r\n+     * Default port for register center\r\n+     */\r\n+    private Integer port;\r\n+\r\n+    /**\r\n+     * Protocol for register center\r\n+     */\r\n+    private String protocol;\r\n+\r\n+    /**\r\n+     * Network transmission type\r\n+     */\r\n+    private String transporter;\r\n+\r\n+    private String server;\r\n+\r\n+    private String client;\r\n+\r\n+    private String cluster;\r\n+\r\n+    /**\r\n+     * The group the services registry in\r\n+     */\r\n+    private String group;\r\n+\r\n+    private String version;\r\n+\r\n+    /**\r\n+     * Request timeout in milliseconds for register center\r\n+     */\r\n+    private Integer timeout;\r\n+\r\n+    /**\r\n+     * Session timeout in milliseconds for register center\r\n+     */\r\n+    private Integer session;\r\n+\r\n+    /**\r\n+     * File for saving register center dynamic list\r\n+     */\r\n+    private String file;\r\n+\r\n+    /**\r\n+     * Wait time before stop\r\n+     */\r\n+    private Integer wait;\r\n+\r\n+    /**\r\n+     * Whether to check if register center is available when boot up\r\n+     */\r\n+    private Boolean check;\r\n+\r\n+    /**\r\n+     * Whether to allow dynamic service to register on the register center\r\n+     */\r\n+    private Boolean dynamic;\r\n+\r\n+    /**\r\n+     * Whether to export service on the register center\r\n+     */\r\n+    private Boolean register;\r\n+\r\n+    /**\r\n+     * Whether allow to subscribe service on the register center\r\n+     */\r\n+    private Boolean subscribe;\r\n+\r\n+    /**\r\n+     * The customized parameters\r\n+     */\r\n+    private Map<String, String> parameters;\r\n+\r\n+    /**\r\n+     * Whether it's default\r\n+     */\r\n+    private Boolean isDefault;\r\n+\r\n+    /**\r\n+     * Simple the registry. both useful for provider and consumer\r\n+     *\r\n+     * @since 2.7.0\r\n+     */\r\n+    private Boolean simplified;\r\n+    /**\r\n+     * After simplify the registry, should add some parameter individually. just for provider.\r\n+     * <p>\r\n+     * such as: extra-keys = A,b,c,d\r\n+     *\r\n+     * @since 2.7.0\r\n+     */\r\n+    private String extraKeys;\r\n+\r\n+    /**\r\n+     * the address work as config center or not\r\n+     */\r\n+    private Boolean useAsConfigCenter;\r\n+\r\n+    /**\r\n+     * the address work as remote metadata center or not\r\n+     */\r\n+    private Boolean useAsMetadataCenter;\r\n+\r\n+    /**\r\n+     * list of rpc protocols accepted by this registry, for example, \"dubbo,rest\"\r\n+     */\r\n+    private String accepts;\r\n+\r\n+    /**\r\n+     * Always use this registry first if set to true, useful when subscribe to multiple registries\r\n+     */\r\n+    private Boolean preferred;\r\n+\r\n+    /**\r\n+     * Affects traffic distribution among registries, useful when subscribe to multiple registries\r\n+     * Take effect only when no preferred registry is specified.\r\n+     */\r\n+    private Integer weight;\r\n+\r\n+    public static RegistryBuilder newBuilder() {\r\n+        return new RegistryBuilder();\r\n+    }\r\n+\r\n+    public RegistryBuilder id(String id) {\r\n+        return super.id(id);\r\n+    }\r\n+\r\n+    public RegistryBuilder address(String address) {\r\n+        this.address = address;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public RegistryBuilder username(String username) {\r\n+        this.username = username;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public RegistryBuilder password(String password) {\r\n+        this.password = password;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public RegistryBuilder port(Integer port) {\r\n+        this.port = port;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public RegistryBuilder protocol(String protocol) {\r\n+        this.protocol = protocol;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public RegistryBuilder transporter(String transporter) {\r\n+        this.transporter = transporter;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    /**\r\n+     * @param transport\r\n+     * @see #transporter(String)\r\n+     * @deprecated\r\n+     */\r\n+    @Deprecated\r\n+    public RegistryBuilder transport(String transport) {\r\n+        this.transporter = transport;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public RegistryBuilder server(String server) {\r\n+        this.server = server;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public RegistryBuilder client(String client) {\r\n+        this.client = client;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public RegistryBuilder cluster(String cluster) {\r\n+        this.cluster = cluster;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public RegistryBuilder group(String group) {\r\n+        this.group = group;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public RegistryBuilder version(String version) {\r\n+        this.version = version;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public RegistryBuilder timeout(Integer timeout) {\r\n+        this.timeout = timeout;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public RegistryBuilder session(Integer session) {\r\n+        this.session = session;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public RegistryBuilder file(String file) {\r\n+        this.file = file;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    /**\r\n+     * @param wait\r\n+     * @see ProviderBuilder#wait(Integer)\r\n+     * @deprecated\r\n+     */\r\n+    @Deprecated\r\n+    public RegistryBuilder wait(Integer wait) {\r\n+        this.wait = wait;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public RegistryBuilder isCheck(Boolean check) {\r\n+        this.check = check;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public RegistryBuilder isDynamic(Boolean dynamic) {\r\n+        this.dynamic = dynamic;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public RegistryBuilder register(Boolean register) {\r\n+        this.register = register;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public RegistryBuilder subscribe(Boolean subscribe) {\r\n+        this.subscribe = subscribe;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public RegistryBuilder appendParameter(String key, String value) {\r\n+        this.parameters = appendParameter(parameters, key, value);\r\n+        return getThis();\r\n+    }\r\n+\r\n+    /**\r\n+     * @param name   the parameter name\r\n+     * @param value the parameter value\r\n+     * @return {@link RegistryBuilder}\r\n+     * @since 2.7.8\r\n+     */\r\n+    public RegistryBuilder parameter(String name, String value) {\r\n+        return appendParameter(name, value);\r\n+    }\r\n+\r\n+    public RegistryBuilder appendParameters(Map<String, String> appendParameters) {\r\n+        this.parameters = appendParameters(parameters, appendParameters);\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public RegistryBuilder isDefault(Boolean isDefault) {\r\n+        this.isDefault = isDefault;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public RegistryBuilder simplified(Boolean simplified) {\r\n+        this.simplified = simplified;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public RegistryBuilder extraKeys(String extraKeys) {\r\n+        this.extraKeys = extraKeys;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public RegistryBuilder useAsConfigCenter(Boolean useAsConfigCenter) {\r\n+        this.useAsConfigCenter = useAsConfigCenter;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public RegistryBuilder useAsMetadataCenter(Boolean useAsMetadataCenter) {\r\n+        this.useAsMetadataCenter = useAsMetadataCenter;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public RegistryBuilder preferred(Boolean preferred) {\r\n+        this.preferred = preferred;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public RegistryBuilder accepts(String accepts) {\r\n+        this.accepts = accepts;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public RegistryBuilder weight(Integer weight) {\r\n+        this.weight = weight;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public RegistryConfig build() {\r\n+        RegistryConfig registry = new RegistryConfig();\r\n+        super.build(registry);\r\n+\r\n+        registry.setCheck(check);\r\n+        registry.setClient(client);\r\n+        registry.setCluster(cluster);\r\n+        registry.setDefault(isDefault);\r\n+        registry.setDynamic(dynamic);\r\n+        registry.setExtraKeys(extraKeys);\r\n+        registry.setFile(file);\r\n+        registry.setGroup(group);\r\n+        registry.setParameters(parameters);\r\n+        registry.setPassword(password);\r\n+        registry.setPort(port);\r\n+        registry.setProtocol(protocol);\r\n+        registry.setRegister(register);\r\n+        registry.setServer(server);\r\n+        registry.setSession(session);\r\n+        registry.setSimplified(simplified);\r\n+        registry.setSubscribe(subscribe);\r\n+        registry.setTimeout(timeout);\r\n+        registry.setTransporter(transporter);\r\n+        registry.setUsername(username);\r\n+        registry.setVersion(version);\r\n+        registry.setWait(wait);\r\n+        registry.setUseAsConfigCenter(useAsConfigCenter);\r\n+        registry.setUseAsMetadataCenter(useAsMetadataCenter);\r\n+        registry.setAccepts(accepts);\r\n+        registry.setPreferred(preferred);\r\n+        registry.setWeight(weight);\r\n+        registry.setAddress(address);\r\n+\r\n+        return registry;\r\n+    }\r\n+\r\n+    @Override\r\n+    protected RegistryBuilder getThis() {\r\n+        return this;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/bootstrap/builders/ServiceBuilder.java", "source2": "org/apache/dubbo/config/bootstrap/builders/ServiceBuilder.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,161 +1,161 @@\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.config.bootstrap.builders;\n-\n-import org.apache.dubbo.config.MethodConfig;\n-import org.apache.dubbo.config.ProviderConfig;\n-import org.apache.dubbo.config.ServiceConfig;\n-import org.apache.dubbo.config.ServiceConfigBase;\n-\n-import java.util.ArrayList;\n-import java.util.List;\n-\n-/**\n- * This is a builder for build {@link ServiceConfigBase}.\n- *\n- * @since 2.7\n- */\n-public class ServiceBuilder<U> extends AbstractServiceBuilder<ServiceConfig, ServiceBuilder<U>> {\n-    /**\n-     * The interface name of the exported service\n-     */\n-    private String interfaceName;\n-\n-    /**\n-     * The interface class of the exported service\n-     */\n-    private Class<?> interfaceClass;\n-\n-    /**\n-     * The reference of the interface implementation\n-     */\n-    private U ref;\n-\n-    /**\n-     * The service name\n-     */\n-    private String path;\n-\n-    /**\n-     * The method configuration\n-     */\n-    private List<MethodConfig> methods;\n-\n-    /**\n-     * The provider configuration\n-     */\n-    private ProviderConfig provider;\n-\n-    /**\n-     * The providerIds\n-     */\n-    private String providerIds;\n-    /**\n-     * whether it is a GenericService\n-     */\n-    private String generic;\n-\n-    public static ServiceBuilder newBuilder() {\n-        return new ServiceBuilder();\n-    }\n-\n-    public ServiceBuilder id(String id) {\n-        return super.id(id);\n-    }\n-\n-    public ServiceBuilder<U> interfaceName(String interfaceName) {\n-        this.interfaceName = interfaceName;\n-        return getThis();\n-    }\n-\n-    public ServiceBuilder<U> interfaceClass(Class<?> interfaceClass) {\n-        this.interfaceClass = interfaceClass;\n-        return getThis();\n-    }\n-\n-    public ServiceBuilder<U> ref(U ref) {\n-        this.ref = ref;\n-        return getThis();\n-    }\n-\n-    public ServiceBuilder<U> path(String path) {\n-        this.path = path;\n-        return getThis();\n-    }\n-\n-    public ServiceBuilder<U> addMethod(MethodConfig method) {\n-        if (this.methods == null) {\n-            this.methods = new ArrayList<>();\n-        }\n-        this.methods.add(method);\n-        return getThis();\n-    }\n-\n-    public ServiceBuilder<U> addMethods(List<? extends MethodConfig> methods) {\n-        if (this.methods == null) {\n-            this.methods = new ArrayList<>();\n-        }\n-        this.methods.addAll(methods);\n-        return getThis();\n-    }\n-\n-    public ServiceBuilder<U> provider(ProviderConfig provider) {\n-        this.provider = provider;\n-        return getThis();\n-    }\n-\n-    public ServiceBuilder<U> providerIds(String providerIds) {\n-        this.providerIds = providerIds;\n-        return getThis();\n-    }\n-\n-    public ServiceBuilder<U> generic(String generic) {\n-        this.generic = generic;\n-        return getThis();\n-    }\n-\n-//    @Override\n-//    public ServiceBuilder<U> mock(String mock) {\n-//        throw new IllegalArgumentException(\"mock doesn't support on provider side\");\n-//    }\n-\n-//    @Override\n-//    public ServiceBuilder<U> mock(Boolean mock) {\n-//        throw new IllegalArgumentException(\"mock doesn't support on provider side\");\n-//    }\n-\n-    public ServiceConfig<U> build() {\n-        ServiceConfig<U> serviceConfig = new ServiceConfig<>();\n-        super.build(serviceConfig);\n-\n-        serviceConfig.setInterface(interfaceName);\n-        serviceConfig.setInterface(interfaceClass);\n-        serviceConfig.setRef(ref);\n-        serviceConfig.setPath(path);\n-        serviceConfig.setMethods(methods);\n-        serviceConfig.setProvider(provider);\n-        serviceConfig.setProviderIds(providerIds);\n-        serviceConfig.setGeneric(generic);\n-\n-        return serviceConfig;\n-    }\n-\n-    @Override\n-    protected ServiceBuilder<U> getThis() {\n-        return this;\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.config.bootstrap.builders;\r\n+\r\n+import org.apache.dubbo.config.MethodConfig;\r\n+import org.apache.dubbo.config.ProviderConfig;\r\n+import org.apache.dubbo.config.ServiceConfig;\r\n+import org.apache.dubbo.config.ServiceConfigBase;\r\n+\r\n+import java.util.ArrayList;\r\n+import java.util.List;\r\n+\r\n+/**\r\n+ * This is a builder for build {@link ServiceConfigBase}.\r\n+ *\r\n+ * @since 2.7\r\n+ */\r\n+public class ServiceBuilder<U> extends AbstractServiceBuilder<ServiceConfig, ServiceBuilder<U>> {\r\n+    /**\r\n+     * The interface name of the exported service\r\n+     */\r\n+    private String interfaceName;\r\n+\r\n+    /**\r\n+     * The interface class of the exported service\r\n+     */\r\n+    private Class<?> interfaceClass;\r\n+\r\n+    /**\r\n+     * The reference of the interface implementation\r\n+     */\r\n+    private U ref;\r\n+\r\n+    /**\r\n+     * The service name\r\n+     */\r\n+    private String path;\r\n+\r\n+    /**\r\n+     * The method configuration\r\n+     */\r\n+    private List<MethodConfig> methods;\r\n+\r\n+    /**\r\n+     * The provider configuration\r\n+     */\r\n+    private ProviderConfig provider;\r\n+\r\n+    /**\r\n+     * The providerIds\r\n+     */\r\n+    private String providerIds;\r\n+    /**\r\n+     * whether it is a GenericService\r\n+     */\r\n+    private String generic;\r\n+\r\n+    public static ServiceBuilder newBuilder() {\r\n+        return new ServiceBuilder();\r\n+    }\r\n+\r\n+    public ServiceBuilder id(String id) {\r\n+        return super.id(id);\r\n+    }\r\n+\r\n+    public ServiceBuilder<U> interfaceName(String interfaceName) {\r\n+        this.interfaceName = interfaceName;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ServiceBuilder<U> interfaceClass(Class<?> interfaceClass) {\r\n+        this.interfaceClass = interfaceClass;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ServiceBuilder<U> ref(U ref) {\r\n+        this.ref = ref;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ServiceBuilder<U> path(String path) {\r\n+        this.path = path;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ServiceBuilder<U> addMethod(MethodConfig method) {\r\n+        if (this.methods == null) {\r\n+            this.methods = new ArrayList<>();\r\n+        }\r\n+        this.methods.add(method);\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ServiceBuilder<U> addMethods(List<? extends MethodConfig> methods) {\r\n+        if (this.methods == null) {\r\n+            this.methods = new ArrayList<>();\r\n+        }\r\n+        this.methods.addAll(methods);\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ServiceBuilder<U> provider(ProviderConfig provider) {\r\n+        this.provider = provider;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ServiceBuilder<U> providerIds(String providerIds) {\r\n+        this.providerIds = providerIds;\r\n+        return getThis();\r\n+    }\r\n+\r\n+    public ServiceBuilder<U> generic(String generic) {\r\n+        this.generic = generic;\r\n+        return getThis();\r\n+    }\r\n+\r\n+//    @Override\r\n+//    public ServiceBuilder<U> mock(String mock) {\r\n+//        throw new IllegalArgumentException(\"mock doesn't support on provider side\");\r\n+//    }\r\n+\r\n+//    @Override\r\n+//    public ServiceBuilder<U> mock(Boolean mock) {\r\n+//        throw new IllegalArgumentException(\"mock doesn't support on provider side\");\r\n+//    }\r\n+\r\n+    public ServiceConfig<U> build() {\r\n+        ServiceConfig<U> serviceConfig = new ServiceConfig<>();\r\n+        super.build(serviceConfig);\r\n+\r\n+        serviceConfig.setInterface(interfaceName);\r\n+        serviceConfig.setInterface(interfaceClass);\r\n+        serviceConfig.setRef(ref);\r\n+        serviceConfig.setPath(path);\r\n+        serviceConfig.setMethods(methods);\r\n+        serviceConfig.setProvider(provider);\r\n+        serviceConfig.setProviderIds(providerIds);\r\n+        serviceConfig.setGeneric(generic);\r\n+\r\n+        return serviceConfig;\r\n+    }\r\n+\r\n+    @Override\r\n+    protected ServiceBuilder<U> getThis() {\r\n+        return this;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/bootstrap/builders/package-info.java", "source2": "org/apache/dubbo/config/bootstrap/builders/package-info.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,21 +1,21 @@\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-/**\n- * A bunch of builder classes to facilitate programming of raw API.\n- * TODO, these are experimental APIs and are possible to change at any time before marked as production.\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+/**\r\n+ * A bunch of builder classes to facilitate programming of raw API.\r\n+ * TODO, these are experimental APIs and are possible to change at any time before marked as production.\r\n+ */\r\n package org.apache.dubbo.config.bootstrap.builders;\n"}, {"source1": "org/apache/dubbo/config/event/DubboServiceDestroyedEvent.java", "source2": "org/apache/dubbo/config/event/DubboServiceDestroyedEvent.java", "comments": ["Line-ending 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.config.event;\n-\n-import org.apache.dubbo.event.Event;\n-\n-/**\n- * An {@link Event Dubbo event} when the Dubbo service is about to be destroyed.\n- *\n- * @see Event\n- * @since 2.7.5\n- */\n-public class DubboServiceDestroyedEvent extends Event {\n-\n-    public DubboServiceDestroyedEvent(Object source) {\n-        super(source);\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.config.event;\r\n+\r\n+import org.apache.dubbo.event.Event;\r\n+\r\n+/**\r\n+ * An {@link Event Dubbo event} when the Dubbo service is about to be destroyed.\r\n+ *\r\n+ * @see Event\r\n+ * @since 2.7.5\r\n+ */\r\n+public class DubboServiceDestroyedEvent extends Event {\r\n+\r\n+    public DubboServiceDestroyedEvent(Object source) {\r\n+        super(source);\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/event/DubboShutdownHookRegisteredEvent.java", "source2": "org/apache/dubbo/config/event/DubboShutdownHookRegisteredEvent.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,46 +1,46 @@\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.config.event;\n-\n-import org.apache.dubbo.config.DubboShutdownHook;\n-import org.apache.dubbo.event.Event;\n-\n-/**\n- * An event raised when the {@link DubboShutdownHook} {@link Runtime#addShutdownHook(Thread) registered} on\n- * {@link ApplicationShutdownHooks JVM ShutdownHooks}\n- *\n- * @see DubboShutdownHook\n- * @see ApplicationShutdownHooks\n- * @since 2.7.5\n- */\n-public class DubboShutdownHookRegisteredEvent extends Event {\n-\n-    /**\n-     * Constructs a prototypical Event.\n-     *\n-     * @param dubboShutdownHook The object on which the Event initially occurred.\n-     * @throws IllegalArgumentException if source is null.\n-     */\n-    public DubboShutdownHookRegisteredEvent(DubboShutdownHook dubboShutdownHook) {\n-        super(dubboShutdownHook);\n-    }\n-\n-    public DubboShutdownHook getDubboShutdownHook() {\n-        return (DubboShutdownHook) getSource();\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.config.event;\r\n+\r\n+import org.apache.dubbo.config.DubboShutdownHook;\r\n+import org.apache.dubbo.event.Event;\r\n+\r\n+/**\r\n+ * An event raised when the {@link DubboShutdownHook} {@link Runtime#addShutdownHook(Thread) registered} on\r\n+ * {@link ApplicationShutdownHooks JVM ShutdownHooks}\r\n+ *\r\n+ * @see DubboShutdownHook\r\n+ * @see ApplicationShutdownHooks\r\n+ * @since 2.7.5\r\n+ */\r\n+public class DubboShutdownHookRegisteredEvent extends Event {\r\n+\r\n+    /**\r\n+     * Constructs a prototypical Event.\r\n+     *\r\n+     * @param dubboShutdownHook The object on which the Event initially occurred.\r\n+     * @throws IllegalArgumentException if source is null.\r\n+     */\r\n+    public DubboShutdownHookRegisteredEvent(DubboShutdownHook dubboShutdownHook) {\r\n+        super(dubboShutdownHook);\r\n+    }\r\n+\r\n+    public DubboShutdownHook getDubboShutdownHook() {\r\n+        return (DubboShutdownHook) getSource();\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/event/DubboShutdownHookUnregisteredEvent.java", "source2": "org/apache/dubbo/config/event/DubboShutdownHookUnregisteredEvent.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,45 +1,45 @@\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.config.event;\n-\n-import org.apache.dubbo.config.DubboShutdownHook;\n-import org.apache.dubbo.event.Event;\n-\n-/**\n- * An event raised when the {@link DubboShutdownHook} {@link Runtime#removeShutdownHook(Thread) unregistered} on\n- * {@link ApplicationShutdownHooks JVM ShutdownHooks}\n- *\n- * @see DubboShutdownHook\n- * @see ApplicationShutdownHooks\n- * @since 2.7.5\n- */\n-public class DubboShutdownHookUnregisteredEvent extends Event {\n-\n-    /**\n-     * Constructs a prototypical Event.\n-     *\n-     * @param dubboShutdownHook The object on which the Event initially occurred.\n-     * @throws IllegalArgumentException if source is null.\n-     */\n-    public DubboShutdownHookUnregisteredEvent(DubboShutdownHook dubboShutdownHook) {\n-        super(dubboShutdownHook);\n-    }\n-\n-    public DubboShutdownHook getDubboShutdownHook() {\n-        return (DubboShutdownHook) getSource();\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.config.event;\r\n+\r\n+import org.apache.dubbo.config.DubboShutdownHook;\r\n+import org.apache.dubbo.event.Event;\r\n+\r\n+/**\r\n+ * An event raised when the {@link DubboShutdownHook} {@link Runtime#removeShutdownHook(Thread) unregistered} on\r\n+ * {@link ApplicationShutdownHooks JVM ShutdownHooks}\r\n+ *\r\n+ * @see DubboShutdownHook\r\n+ * @see ApplicationShutdownHooks\r\n+ * @since 2.7.5\r\n+ */\r\n+public class DubboShutdownHookUnregisteredEvent extends Event {\r\n+\r\n+    /**\r\n+     * Constructs a prototypical Event.\r\n+     *\r\n+     * @param dubboShutdownHook The object on which the Event initially occurred.\r\n+     * @throws IllegalArgumentException if source is null.\r\n+     */\r\n+    public DubboShutdownHookUnregisteredEvent(DubboShutdownHook dubboShutdownHook) {\r\n+        super(dubboShutdownHook);\r\n+    }\r\n+\r\n+    public DubboShutdownHook getDubboShutdownHook() {\r\n+        return (DubboShutdownHook) getSource();\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/event/ReferenceConfigDestroyedEvent.java", "source2": "org/apache/dubbo/config/event/ReferenceConfigDestroyedEvent.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,41 +1,41 @@\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.config.event;\n-\n-import org.apache.dubbo.config.ReferenceConfig;\n-import org.apache.dubbo.config.annotation.Reference;\n-import org.apache.dubbo.event.Event;\n-\n-/**\n- * The {@link ReferenceConfig Dubbo service ReferenceConfig} destroyed {@link Event event}\n- *\n- * @see Reference\n- * @see ReferenceConfig#destroy()\n- * @see Event\n- * @since 2.7.5\n- */\n-public class ReferenceConfigDestroyedEvent extends Event {\n-\n-    public ReferenceConfigDestroyedEvent(ReferenceConfig referenceConfig) {\n-        super(referenceConfig);\n-    }\n-\n-    public ReferenceConfig getReferenceConfig() {\n-        return (ReferenceConfig) getSource();\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.config.event;\r\n+\r\n+import org.apache.dubbo.config.ReferenceConfig;\r\n+import org.apache.dubbo.config.annotation.Reference;\r\n+import org.apache.dubbo.event.Event;\r\n+\r\n+/**\r\n+ * The {@link ReferenceConfig Dubbo service ReferenceConfig} destroyed {@link Event event}\r\n+ *\r\n+ * @see Reference\r\n+ * @see ReferenceConfig#destroy()\r\n+ * @see Event\r\n+ * @since 2.7.5\r\n+ */\r\n+public class ReferenceConfigDestroyedEvent extends Event {\r\n+\r\n+    public ReferenceConfigDestroyedEvent(ReferenceConfig referenceConfig) {\r\n+        super(referenceConfig);\r\n+    }\r\n+\r\n+    public ReferenceConfig getReferenceConfig() {\r\n+        return (ReferenceConfig) getSource();\r\n+    }\r\n+\r\n }\n"}, {"source1": "org/apache/dubbo/config/event/ReferenceConfigInitializedEvent.java", "source2": "org/apache/dubbo/config/event/ReferenceConfigInitializedEvent.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,48 +1,48 @@\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.config.event;\n-\n-import org.apache.dubbo.config.ReferenceConfig;\n-import org.apache.dubbo.config.annotation.Reference;\n-import org.apache.dubbo.event.Event;\n-import org.apache.dubbo.rpc.Invoker;\n-\n-/**\n- * The {@link ReferenceConfig Dubbo service ReferenceConfig} initialized {@link Event event}\n- *\n- * @see Reference\n- * @see ReferenceConfig#get()\n- * @see Event\n- * @since 2.7.5\n- */\n-public class ReferenceConfigInitializedEvent extends Event {\n-\n-    private final Invoker<?> invoker;\n-\n-    public ReferenceConfigInitializedEvent(ReferenceConfig referenceConfig, Invoker<?> invoker) {\n-        super(referenceConfig);\n-        this.invoker = invoker;\n-    }\n-\n-    public ReferenceConfig getReferenceConfig() {\n-        return (ReferenceConfig) getSource();\n-    }\n-\n-    public Invoker<?> getInvoker() {\n-        return invoker;\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.config.event;\r\n+\r\n+import org.apache.dubbo.config.ReferenceConfig;\r\n+import org.apache.dubbo.config.annotation.Reference;\r\n+import org.apache.dubbo.event.Event;\r\n+import org.apache.dubbo.rpc.Invoker;\r\n+\r\n+/**\r\n+ * The {@link ReferenceConfig Dubbo service ReferenceConfig} initialized {@link Event event}\r\n+ *\r\n+ * @see Reference\r\n+ * @see ReferenceConfig#get()\r\n+ * @see Event\r\n+ * @since 2.7.5\r\n+ */\r\n+public class ReferenceConfigInitializedEvent extends Event {\r\n+\r\n+    private final Invoker<?> invoker;\r\n+\r\n+    public ReferenceConfigInitializedEvent(ReferenceConfig referenceConfig, Invoker<?> invoker) {\r\n+        super(referenceConfig);\r\n+        this.invoker = invoker;\r\n+    }\r\n+\r\n+    public ReferenceConfig getReferenceConfig() {\r\n+        return (ReferenceConfig) getSource();\r\n+    }\r\n+\r\n+    public Invoker<?> getInvoker() {\r\n+        return invoker;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/event/ServiceConfigExportedEvent.java", "source2": "org/apache/dubbo/config/event/ServiceConfigExportedEvent.java", "comments": ["Line-ending 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.config.event;\n-\n-import org.apache.dubbo.config.ServiceConfig;\n-import org.apache.dubbo.event.Event;\n-\n-/**\n- * {@link ServiceConfig} event post-{@link ServiceConfig#export() export}\n- *\n- * @since 2.7.5\n- */\n-public class ServiceConfigExportedEvent extends Event {\n-\n-    public ServiceConfigExportedEvent(ServiceConfig source) {\n-        super(source);\n-    }\n-\n-    public ServiceConfig getServiceConfig() {\n-        return (ServiceConfig) getSource();\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.config.event;\r\n+\r\n+import org.apache.dubbo.config.ServiceConfig;\r\n+import org.apache.dubbo.event.Event;\r\n+\r\n+/**\r\n+ * {@link ServiceConfig} event post-{@link ServiceConfig#export() export}\r\n+ *\r\n+ * @since 2.7.5\r\n+ */\r\n+public class ServiceConfigExportedEvent extends Event {\r\n+\r\n+    public ServiceConfigExportedEvent(ServiceConfig source) {\r\n+        super(source);\r\n+    }\r\n+\r\n+    public ServiceConfig getServiceConfig() {\r\n+        return (ServiceConfig) getSource();\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/event/ServiceConfigUnexportedEvent.java", "source2": "org/apache/dubbo/config/event/ServiceConfigUnexportedEvent.java", "comments": ["Line-ending 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.config.event;\n-\n-import org.apache.dubbo.config.ServiceConfig;\n-import org.apache.dubbo.event.Event;\n-\n-/**\n- * {@link ServiceConfig} event post-{@link ServiceConfig#unexport() unexport}\n- *\n- * @since 2.7.5\n- */\n-public class ServiceConfigUnexportedEvent extends Event {\n-\n-    public ServiceConfigUnexportedEvent(ServiceConfig source) {\n-        super(source);\n-    }\n-\n-    public ServiceConfig getServiceConfig() {\n-        return (ServiceConfig) getSource();\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.config.event;\r\n+\r\n+import org.apache.dubbo.config.ServiceConfig;\r\n+import org.apache.dubbo.event.Event;\r\n+\r\n+/**\r\n+ * {@link ServiceConfig} event post-{@link ServiceConfig#unexport() unexport}\r\n+ *\r\n+ * @since 2.7.5\r\n+ */\r\n+public class ServiceConfigUnexportedEvent extends Event {\r\n+\r\n+    public ServiceConfigUnexportedEvent(ServiceConfig source) {\r\n+        super(source);\r\n+    }\r\n+\r\n+    public ServiceConfig getServiceConfig() {\r\n+        return (ServiceConfig) getSource();\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/event/listener/LoggingEventListener.java", "source2": "org/apache/dubbo/config/event/listener/LoggingEventListener.java", "comments": ["Line-ending 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.config.event.listener;\n-\n-import org.apache.dubbo.common.logger.Logger;\n-import org.apache.dubbo.common.logger.LoggerFactory;\n-import org.apache.dubbo.config.event.DubboServiceDestroyedEvent;\n-import org.apache.dubbo.config.event.ServiceConfigExportedEvent;\n-import org.apache.dubbo.event.Event;\n-import org.apache.dubbo.event.GenericEventListener;\n-\n-import static java.lang.String.format;\n-\n-/**\n- * A listener for logging the {@link Event Dubbo event}\n- *\n- * @see ServiceConfigExportedEvent\n- * @since 2.7.5\n- */\n-public class LoggingEventListener extends GenericEventListener {\n-\n-    private static final String NAME = \"Dubbo Service\";\n-\n-    private final Logger logger = LoggerFactory.getLogger(getClass());\n-\n-    public void onEvent(DubboServiceDestroyedEvent event) {\n-        if (logger.isInfoEnabled()) {\n-            logger.info(NAME + \" has been destroyed.\");\n-        }\n-    }\n-\n-    private void debug(String pattern, Object... args) {\n-        if (logger.isDebugEnabled()) {\n-            logger.debug(format(pattern, args));\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.config.event.listener;\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.config.event.DubboServiceDestroyedEvent;\r\n+import org.apache.dubbo.config.event.ServiceConfigExportedEvent;\r\n+import org.apache.dubbo.event.Event;\r\n+import org.apache.dubbo.event.GenericEventListener;\r\n+\r\n+import static java.lang.String.format;\r\n+\r\n+/**\r\n+ * A listener for logging the {@link Event Dubbo event}\r\n+ *\r\n+ * @see ServiceConfigExportedEvent\r\n+ * @since 2.7.5\r\n+ */\r\n+public class LoggingEventListener extends GenericEventListener {\r\n+\r\n+    private static final String NAME = \"Dubbo Service\";\r\n+\r\n+    private final Logger logger = LoggerFactory.getLogger(getClass());\r\n+\r\n+    public void onEvent(DubboServiceDestroyedEvent event) {\r\n+        if (logger.isInfoEnabled()) {\r\n+            logger.info(NAME + \" has been destroyed.\");\r\n+        }\r\n+    }\r\n+\r\n+    private void debug(String pattern, Object... args) {\r\n+        if (logger.isDebugEnabled()) {\r\n+            logger.debug(format(pattern, args));\r\n+        }\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/invoker/DelegateProviderMetaDataInvoker.java", "source2": "org/apache/dubbo/config/invoker/DelegateProviderMetaDataInvoker.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,67 +1,67 @@\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.config.invoker;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.config.ServiceConfig;\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-\n-/**\n- *\n- * A Invoker wrapper that wrap the invoker and all the metadata (ServiceConfig)\n- */\n-public class DelegateProviderMetaDataInvoker<T> implements Invoker {\n-    protected final Invoker<T> invoker;\n-    private ServiceConfig<?> metadata;\n-\n-    public DelegateProviderMetaDataInvoker(Invoker<T> invoker, ServiceConfig<?> metadata) {\n-        this.invoker = invoker;\n-        this.metadata = metadata;\n-    }\n-\n-    @Override\n-    public Class<T> getInterface() {\n-        return invoker.getInterface();\n-    }\n-\n-    @Override\n-    public URL getUrl() {\n-        return invoker.getUrl();\n-    }\n-\n-    @Override\n-    public boolean isAvailable() {\n-        return invoker.isAvailable();\n-    }\n-\n-    @Override\n-    public Result invoke(Invocation invocation) throws RpcException {\n-        return invoker.invoke(invocation);\n-    }\n-\n-    @Override\n-    public void destroy() {\n-        invoker.destroy();\n-    }\n-\n-    public ServiceConfig<?> getMetadata() {\n-        return metadata;\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.config.invoker;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.config.ServiceConfig;\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+\r\n+/**\r\n+ *\r\n+ * A Invoker wrapper that wrap the invoker and all the metadata (ServiceConfig)\r\n+ */\r\n+public class DelegateProviderMetaDataInvoker<T> implements Invoker {\r\n+    protected final Invoker<T> invoker;\r\n+    private ServiceConfig<?> metadata;\r\n+\r\n+    public DelegateProviderMetaDataInvoker(Invoker<T> invoker, ServiceConfig<?> metadata) {\r\n+        this.invoker = invoker;\r\n+        this.metadata = metadata;\r\n+    }\r\n+\r\n+    @Override\r\n+    public Class<T> getInterface() {\r\n+        return invoker.getInterface();\r\n+    }\r\n+\r\n+    @Override\r\n+    public URL getUrl() {\r\n+        return invoker.getUrl();\r\n+    }\r\n+\r\n+    @Override\r\n+    public boolean isAvailable() {\r\n+        return invoker.isAvailable();\r\n+    }\r\n+\r\n+    @Override\r\n+    public Result invoke(Invocation invocation) throws RpcException {\r\n+        return invoker.invoke(invocation);\r\n+    }\r\n+\r\n+    @Override\r\n+    public void destroy() {\r\n+        invoker.destroy();\r\n+    }\r\n+\r\n+    public ServiceConfig<?> getMetadata() {\r\n+        return metadata;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/metadata/ConfigurableMetadataServiceExporter.java", "source2": "org/apache/dubbo/config/metadata/ConfigurableMetadataServiceExporter.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,129 +1,129 @@\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.config.metadata;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.logger.Logger;\n-import org.apache.dubbo.common.logger.LoggerFactory;\n-import org.apache.dubbo.config.ApplicationConfig;\n-import org.apache.dubbo.config.ProtocolConfig;\n-import org.apache.dubbo.config.RegistryConfig;\n-import org.apache.dubbo.config.ServiceConfig;\n-import org.apache.dubbo.config.context.ConfigManager;\n-import org.apache.dubbo.metadata.MetadataService;\n-import org.apache.dubbo.metadata.MetadataServiceExporter;\n-import org.apache.dubbo.rpc.model.ApplicationModel;\n-\n-import java.util.ArrayList;\n-import java.util.List;\n-\n-import static java.util.Collections.emptyList;\n-import static org.apache.dubbo.common.constants.CommonConstants.DUBBO;\n-\n-/**\n- * {@link MetadataServiceExporter} implementation based on {@link ConfigManager Dubbo configurations}, the clients\n- * should make sure the {@link ApplicationConfig}, {@link RegistryConfig} and {@link ProtocolConfig} are ready before\n- * {@link #export()}.\n- * <p>\n- * Typically, do not worry about their ready status, because they are initialized before\n- * any {@link ServiceConfig} exports, or The Dubbo export will be failed.\n- * <p>\n- * Being aware of it's not a thread-safe implementation.\n- *\n- * @see MetadataServiceExporter\n- * @see ServiceConfig\n- * @see ConfigManager\n- * @since 2.7.5\n- */\n-public class ConfigurableMetadataServiceExporter implements MetadataServiceExporter {\n-\n-    private final Logger logger = LoggerFactory.getLogger(getClass());\n-\n-    private final MetadataService metadataService;\n-\n-    private volatile ServiceConfig<MetadataService> serviceConfig;\n-\n-    public ConfigurableMetadataServiceExporter(MetadataService metadataService) {\n-        this.metadataService = metadataService;\n-    }\n-\n-    @Override\n-    public ConfigurableMetadataServiceExporter export() {\n-\n-        if (!isExported()) {\n-\n-            ServiceConfig<MetadataService> serviceConfig = new ServiceConfig<>();\n-            serviceConfig.setApplication(getApplicationConfig());\n-            serviceConfig.setRegistries(getRegistries());\n-            serviceConfig.setProtocol(generateMetadataProtocol());\n-            serviceConfig.setInterface(MetadataService.class);\n-            serviceConfig.setRef(metadataService);\n-            serviceConfig.setGroup(getApplicationConfig().getName());\n-            serviceConfig.setVersion(metadataService.version());\n-\n-            // export\n-            serviceConfig.export();\n-\n-            if (logger.isInfoEnabled()) {\n-                logger.info(\"The MetadataService exports urls : \" + serviceConfig.getExportedUrls());\n-            }\n-\n-            this.serviceConfig = serviceConfig;\n-\n-        } else {\n-            if (logger.isWarnEnabled()) {\n-                logger.warn(\"The MetadataService has been exported : \" + serviceConfig.getExportedUrls());\n-            }\n-        }\n-\n-        return this;\n-    }\n-\n-    @Override\n-    public ConfigurableMetadataServiceExporter unexport() {\n-        if (isExported()) {\n-            serviceConfig.unexport();\n-        }\n-        return this;\n-    }\n-\n-    @Override\n-    public List<URL> getExportedURLs() {\n-        return serviceConfig != null ? serviceConfig.getExportedUrls() : emptyList();\n-    }\n-\n-    public boolean isExported() {\n-        return serviceConfig != null && serviceConfig.isExported();\n-    }\n-\n-    private ApplicationConfig getApplicationConfig() {\n-        return ApplicationModel.getConfigManager().getApplication().get();\n-    }\n-\n-    private List<RegistryConfig> getRegistries() {\n-        return new ArrayList<>(ApplicationModel.getConfigManager().getRegistries());\n-    }\n-\n-    private ProtocolConfig generateMetadataProtocol() {\n-        ProtocolConfig defaultProtocol = new ProtocolConfig();\n-        defaultProtocol.setName(DUBBO);\n-        // defaultProtocol.setHost() ?\n-        // auto-increment port\n-        defaultProtocol.setPort(-1);\n-        return defaultProtocol;\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.config.metadata;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.logger.Logger;\r\n+import org.apache.dubbo.common.logger.LoggerFactory;\r\n+import org.apache.dubbo.config.ApplicationConfig;\r\n+import org.apache.dubbo.config.ProtocolConfig;\r\n+import org.apache.dubbo.config.RegistryConfig;\r\n+import org.apache.dubbo.config.ServiceConfig;\r\n+import org.apache.dubbo.config.context.ConfigManager;\r\n+import org.apache.dubbo.metadata.MetadataService;\r\n+import org.apache.dubbo.metadata.MetadataServiceExporter;\r\n+import org.apache.dubbo.rpc.model.ApplicationModel;\r\n+\r\n+import java.util.ArrayList;\r\n+import java.util.List;\r\n+\r\n+import static java.util.Collections.emptyList;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.DUBBO;\r\n+\r\n+/**\r\n+ * {@link MetadataServiceExporter} implementation based on {@link ConfigManager Dubbo configurations}, the clients\r\n+ * should make sure the {@link ApplicationConfig}, {@link RegistryConfig} and {@link ProtocolConfig} are ready before\r\n+ * {@link #export()}.\r\n+ * <p>\r\n+ * Typically, do not worry about their ready status, because they are initialized before\r\n+ * any {@link ServiceConfig} exports, or The Dubbo export will be failed.\r\n+ * <p>\r\n+ * Being aware of it's not a thread-safe implementation.\r\n+ *\r\n+ * @see MetadataServiceExporter\r\n+ * @see ServiceConfig\r\n+ * @see ConfigManager\r\n+ * @since 2.7.5\r\n+ */\r\n+public class ConfigurableMetadataServiceExporter implements MetadataServiceExporter {\r\n+\r\n+    private final Logger logger = LoggerFactory.getLogger(getClass());\r\n+\r\n+    private final MetadataService metadataService;\r\n+\r\n+    private volatile ServiceConfig<MetadataService> serviceConfig;\r\n+\r\n+    public ConfigurableMetadataServiceExporter(MetadataService metadataService) {\r\n+        this.metadataService = metadataService;\r\n+    }\r\n+\r\n+    @Override\r\n+    public ConfigurableMetadataServiceExporter export() {\r\n+\r\n+        if (!isExported()) {\r\n+\r\n+            ServiceConfig<MetadataService> serviceConfig = new ServiceConfig<>();\r\n+            serviceConfig.setApplication(getApplicationConfig());\r\n+            serviceConfig.setRegistries(getRegistries());\r\n+            serviceConfig.setProtocol(generateMetadataProtocol());\r\n+            serviceConfig.setInterface(MetadataService.class);\r\n+            serviceConfig.setRef(metadataService);\r\n+            serviceConfig.setGroup(getApplicationConfig().getName());\r\n+            serviceConfig.setVersion(metadataService.version());\r\n+\r\n+            // export\r\n+            serviceConfig.export();\r\n+\r\n+            if (logger.isInfoEnabled()) {\r\n+                logger.info(\"The MetadataService exports urls : \" + serviceConfig.getExportedUrls());\r\n+            }\r\n+\r\n+            this.serviceConfig = serviceConfig;\r\n+\r\n+        } else {\r\n+            if (logger.isWarnEnabled()) {\r\n+                logger.warn(\"The MetadataService has been exported : \" + serviceConfig.getExportedUrls());\r\n+            }\r\n+        }\r\n+\r\n+        return this;\r\n+    }\r\n+\r\n+    @Override\r\n+    public ConfigurableMetadataServiceExporter unexport() {\r\n+        if (isExported()) {\r\n+            serviceConfig.unexport();\r\n+        }\r\n+        return this;\r\n+    }\r\n+\r\n+    @Override\r\n+    public List<URL> getExportedURLs() {\r\n+        return serviceConfig != null ? serviceConfig.getExportedUrls() : emptyList();\r\n+    }\r\n+\r\n+    public boolean isExported() {\r\n+        return serviceConfig != null && serviceConfig.isExported();\r\n+    }\r\n+\r\n+    private ApplicationConfig getApplicationConfig() {\r\n+        return ApplicationModel.getConfigManager().getApplication().get();\r\n+    }\r\n+\r\n+    private List<RegistryConfig> getRegistries() {\r\n+        return new ArrayList<>(ApplicationModel.getConfigManager().getRegistries());\r\n+    }\r\n+\r\n+    private ProtocolConfig generateMetadataProtocol() {\r\n+        ProtocolConfig defaultProtocol = new ProtocolConfig();\r\n+        defaultProtocol.setName(DUBBO);\r\n+        // defaultProtocol.setHost() ?\r\n+        // auto-increment port\r\n+        defaultProtocol.setPort(-1);\r\n+        return defaultProtocol;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/metadata/ServiceInstancePortCustomizer.java", "source2": "org/apache/dubbo/config/metadata/ServiceInstancePortCustomizer.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,64 +1,64 @@\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.config.metadata;\n-\n-import org.apache.dubbo.common.utils.CollectionUtils;\n-import org.apache.dubbo.config.ProtocolConfig;\n-import org.apache.dubbo.registry.client.DefaultServiceInstance;\n-import org.apache.dubbo.registry.client.ServiceInstance;\n-import org.apache.dubbo.registry.client.ServiceInstanceCustomizer;\n-import org.apache.dubbo.rpc.model.ApplicationModel;\n-\n-import java.util.Collection;\n-import java.util.stream.Stream;\n-\n-/**\n- * The {@link ServiceInstanceCustomizer} to customize the {@link ServiceInstance#getPort() port} of service instance.\n- *\n- * @since 2.7.5\n- */\n-public class ServiceInstancePortCustomizer implements ServiceInstanceCustomizer {\n-\n-    @Override\n-    public void customize(ServiceInstance serviceInstance) {\n-\n-        if (serviceInstance.getPort() != null) {\n-            return;\n-        }\n-\n-        Collection<ProtocolConfig> protocols = ApplicationModel.getConfigManager()\n-                .getProtocols();\n-\n-        if (CollectionUtils.isEmpty(protocols)) {\n-            throw new IllegalStateException(\"We should have at least one protocol configured at this point.\");\n-        }\n-\n-        Stream<ProtocolConfig> protocolStream = protocols.stream();\n-        ProtocolConfig protocolConfig = protocolStream\n-                // use rest as service instance's default protocol.\n-                .filter(protocol -> \"rest\".equals(protocol.getName()))\n-                .findFirst()\n-                .orElseGet(() -> protocolStream.findFirst().get());\n-\n-        if (serviceInstance instanceof DefaultServiceInstance) {\n-            DefaultServiceInstance instance = (DefaultServiceInstance) serviceInstance;\n-            if (protocolConfig.getPort() != null) {\n-                instance.setPort(protocolConfig.getPort());\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.config.metadata;\r\n+\r\n+import org.apache.dubbo.common.utils.CollectionUtils;\r\n+import org.apache.dubbo.config.ProtocolConfig;\r\n+import org.apache.dubbo.registry.client.DefaultServiceInstance;\r\n+import org.apache.dubbo.registry.client.ServiceInstance;\r\n+import org.apache.dubbo.registry.client.ServiceInstanceCustomizer;\r\n+import org.apache.dubbo.rpc.model.ApplicationModel;\r\n+\r\n+import java.util.Collection;\r\n+import java.util.stream.Stream;\r\n+\r\n+/**\r\n+ * The {@link ServiceInstanceCustomizer} to customize the {@link ServiceInstance#getPort() port} of service instance.\r\n+ *\r\n+ * @since 2.7.5\r\n+ */\r\n+public class ServiceInstancePortCustomizer implements ServiceInstanceCustomizer {\r\n+\r\n+    @Override\r\n+    public void customize(ServiceInstance serviceInstance) {\r\n+\r\n+        if (serviceInstance.getPort() != null) {\r\n+            return;\r\n+        }\r\n+\r\n+        Collection<ProtocolConfig> protocols = ApplicationModel.getConfigManager()\r\n+                .getProtocols();\r\n+\r\n+        if (CollectionUtils.isEmpty(protocols)) {\r\n+            throw new IllegalStateException(\"We should have at least one protocol configured at this point.\");\r\n+        }\r\n+\r\n+        Stream<ProtocolConfig> protocolStream = protocols.stream();\r\n+        ProtocolConfig protocolConfig = protocolStream\r\n+                // use rest as service instance's default protocol.\r\n+                .filter(protocol -> \"rest\".equals(protocol.getName()))\r\n+                .findFirst()\r\n+                .orElseGet(() -> protocolStream.findFirst().get());\r\n+\r\n+        if (serviceInstance instanceof DefaultServiceInstance) {\r\n+            DefaultServiceInstance instance = (DefaultServiceInstance) serviceInstance;\r\n+            if (protocolConfig.getPort() != null) {\r\n+                instance.setPort(protocolConfig.getPort());\r\n+            }\r\n+        }\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/utils/ConfigValidationUtils.java", "source2": "org/apache/dubbo/config/utils/ConfigValidationUtils.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,658 +1,658 @@\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.config.utils;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.URLBuilder;\n-import org.apache.dubbo.common.config.ConfigurationUtils;\n-import org.apache.dubbo.common.extension.ExtensionLoader;\n-import org.apache.dubbo.common.logger.Logger;\n-import org.apache.dubbo.common.logger.LoggerFactory;\n-import org.apache.dubbo.common.serialize.Serialization;\n-import org.apache.dubbo.common.status.StatusChecker;\n-import org.apache.dubbo.common.threadpool.ThreadPool;\n-import org.apache.dubbo.common.utils.CollectionUtils;\n-import org.apache.dubbo.common.utils.ConfigUtils;\n-import org.apache.dubbo.common.utils.NetUtils;\n-import org.apache.dubbo.common.utils.StringUtils;\n-import org.apache.dubbo.common.utils.UrlUtils;\n-import org.apache.dubbo.config.AbstractConfig;\n-import org.apache.dubbo.config.AbstractInterfaceConfig;\n-import org.apache.dubbo.config.ApplicationConfig;\n-import org.apache.dubbo.config.ConfigCenterConfig;\n-import org.apache.dubbo.config.ConsumerConfig;\n-import org.apache.dubbo.config.MetadataReportConfig;\n-import org.apache.dubbo.config.MethodConfig;\n-import org.apache.dubbo.config.MetricsConfig;\n-import org.apache.dubbo.config.ModuleConfig;\n-import org.apache.dubbo.config.MonitorConfig;\n-import org.apache.dubbo.config.ProtocolConfig;\n-import org.apache.dubbo.config.ProviderConfig;\n-import org.apache.dubbo.config.ReferenceConfig;\n-import org.apache.dubbo.config.RegistryConfig;\n-import org.apache.dubbo.config.ServiceConfig;\n-import org.apache.dubbo.config.SslConfig;\n-import org.apache.dubbo.monitor.MonitorFactory;\n-import org.apache.dubbo.monitor.MonitorService;\n-import org.apache.dubbo.registry.RegistryService;\n-import org.apache.dubbo.remoting.Codec2;\n-import org.apache.dubbo.remoting.Dispatcher;\n-import org.apache.dubbo.remoting.Transporter;\n-import org.apache.dubbo.remoting.exchange.Exchanger;\n-import org.apache.dubbo.remoting.telnet.TelnetHandler;\n-import org.apache.dubbo.rpc.ExporterListener;\n-import org.apache.dubbo.rpc.Filter;\n-import org.apache.dubbo.rpc.InvokerListener;\n-import org.apache.dubbo.rpc.ProxyFactory;\n-import org.apache.dubbo.rpc.cluster.Cluster;\n-import org.apache.dubbo.rpc.cluster.LoadBalance;\n-import org.apache.dubbo.rpc.support.MockInvoker;\n-\n-import java.net.InetAddress;\n-import java.net.UnknownHostException;\n-import java.util.ArrayList;\n-import java.util.Arrays;\n-import java.util.HashMap;\n-import java.util.List;\n-import java.util.Map;\n-import java.util.regex.Matcher;\n-import java.util.regex.Pattern;\n-\n-import static org.apache.dubbo.common.constants.CommonConstants.ANYHOST_VALUE;\n-import static org.apache.dubbo.common.constants.CommonConstants.CLUSTER_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.DUBBO_PROTOCOL;\n-import static org.apache.dubbo.common.constants.CommonConstants.FILE_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.HOST_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.INTERFACE_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.LOADBALANCE_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.PASSWORD_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.PATH_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.PROTOCOL_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.REMOVE_VALUE_PREFIX;\n-import static org.apache.dubbo.common.constants.CommonConstants.SHUTDOWN_WAIT_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.SHUTDOWN_WAIT_SECONDS_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.THREADPOOL_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.USERNAME_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.VERSION_KEY;\n-import static org.apache.dubbo.common.constants.RegistryConstants.DUBBO_PUBLISH_INTERFACE_DEFAULT_KEY;\n-import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_KEY;\n-import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_PROTOCOL;\n-import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_PUBLISH_INTERFACE_KEY;\n-import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_TYPE_KEY;\n-import static org.apache.dubbo.common.constants.RegistryConstants.SERVICE_REGISTRY_PROTOCOL;\n-import static org.apache.dubbo.common.constants.RemotingConstants.BACKUP_KEY;\n-import static org.apache.dubbo.common.extension.ExtensionLoader.getExtensionLoader;\n-import static org.apache.dubbo.common.utils.UrlUtils.isServiceDiscoveryRegistryType;\n-import static org.apache.dubbo.config.Constants.ARCHITECTURE;\n-import static org.apache.dubbo.config.Constants.CONTEXTPATH_KEY;\n-import static org.apache.dubbo.config.Constants.DUBBO_IP_TO_REGISTRY;\n-import static org.apache.dubbo.config.Constants.ENVIRONMENT;\n-import static org.apache.dubbo.config.Constants.IGNORE_CHECK_KEYS;\n-import static org.apache.dubbo.config.Constants.LAYER_KEY;\n-import static org.apache.dubbo.config.Constants.NAME;\n-import static org.apache.dubbo.config.Constants.ORGANIZATION;\n-import static org.apache.dubbo.config.Constants.OWNER;\n-import static org.apache.dubbo.config.Constants.STATUS_KEY;\n-import static org.apache.dubbo.monitor.Constants.LOGSTAT_PROTOCOL;\n-import static org.apache.dubbo.registry.Constants.REGISTER_IP_KEY;\n-import static org.apache.dubbo.registry.Constants.REGISTER_KEY;\n-import static org.apache.dubbo.registry.Constants.SUBSCRIBE_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.DISPATCHER_KEY;\n-import static org.apache.dubbo.remoting.Constants.EXCHANGER_KEY;\n-import static org.apache.dubbo.remoting.Constants.SERIALIZATION_KEY;\n-import static org.apache.dubbo.remoting.Constants.SERVER_KEY;\n-import static org.apache.dubbo.remoting.Constants.TELNET;\n-import static org.apache.dubbo.remoting.Constants.TRANSPORTER_KEY;\n-import static org.apache.dubbo.rpc.Constants.FAIL_PREFIX;\n-import static org.apache.dubbo.rpc.Constants.FORCE_PREFIX;\n-import static org.apache.dubbo.rpc.Constants.LOCAL_KEY;\n-import static org.apache.dubbo.rpc.Constants.MOCK_KEY;\n-import static org.apache.dubbo.rpc.Constants.PROXY_KEY;\n-import static org.apache.dubbo.rpc.Constants.RETURN_PREFIX;\n-import static org.apache.dubbo.rpc.Constants.THROW_PREFIX;\n-import static org.apache.dubbo.rpc.Constants.TOKEN_KEY;\n-import static org.apache.dubbo.rpc.cluster.Constants.REFER_KEY;\n-\n-public class ConfigValidationUtils {\n-    private static final Logger logger = LoggerFactory.getLogger(ConfigValidationUtils.class);\n-    /**\n-     * The maximum length of a <b>parameter's value</b>\n-     */\n-    private static final int MAX_LENGTH = 200;\n-\n-    /**\n-     * The maximum length of a <b>path</b>\n-     */\n-    private static final int MAX_PATH_LENGTH = 200;\n-\n-    /**\n-     * The rule qualification for <b>name</b>\n-     */\n-    private static final Pattern PATTERN_NAME = Pattern.compile(\"[\\\\-._0-9a-zA-Z]+\");\n-\n-    /**\n-     * The rule qualification for <b>multiply name</b>\n-     */\n-    private static final Pattern PATTERN_MULTI_NAME = Pattern.compile(\"[,\\\\-._0-9a-zA-Z]+\");\n-\n-    /**\n-     * The rule qualification for <b>method names</b>\n-     */\n-    private static final Pattern PATTERN_METHOD_NAME = Pattern.compile(\"[a-zA-Z][0-9a-zA-Z]*\");\n-\n-    /**\n-     * The rule qualification for <b>path</b>\n-     */\n-    private static final Pattern PATTERN_PATH = Pattern.compile(\"[/\\\\-$._0-9a-zA-Z]+\");\n-\n-    /**\n-     * The pattern matches a value who has a symbol\n-     */\n-    private static final Pattern PATTERN_NAME_HAS_SYMBOL = Pattern.compile(\"[:*,\\\\s/\\\\-._0-9a-zA-Z]+\");\n-\n-    /**\n-     * The pattern matches a property key\n-     */\n-    private static final Pattern PATTERN_KEY = Pattern.compile(\"[*,\\\\-._0-9a-zA-Z]+\");\n-\n-    public static final String IPV6_START_MARK = \"[\";\n-\n-    public static final String IPV6_END_MARK = \"]\";\n-\n-\n-    public static List<URL> loadRegistries(AbstractInterfaceConfig interfaceConfig, boolean provider) {\n-        // check && override if necessary\n-        List<URL> registryList = new ArrayList<URL>();\n-        ApplicationConfig application = interfaceConfig.getApplication();\n-        List<RegistryConfig> registries = interfaceConfig.getRegistries();\n-        if (CollectionUtils.isNotEmpty(registries)) {\n-            for (RegistryConfig config : registries) {\n-                String address = config.getAddress();\n-                if (StringUtils.isEmpty(address)) {\n-                    address = ANYHOST_VALUE;\n-                }\n-                if (!RegistryConfig.NO_AVAILABLE.equalsIgnoreCase(address)) {\n-                    Map<String, String> map = new HashMap<String, String>();\n-                    AbstractConfig.appendParameters(map, application);\n-                    AbstractConfig.appendParameters(map, config);\n-                    map.put(PATH_KEY, RegistryService.class.getName());\n-                    AbstractInterfaceConfig.appendRuntimeParameters(map);\n-                    if (!map.containsKey(PROTOCOL_KEY)) {\n-                        map.put(PROTOCOL_KEY, DUBBO_PROTOCOL);\n-                    }\n-                    List<URL> urls = UrlUtils.parseURLs(address, map);\n-\n-                    for (URL url : urls) {\n-\n-                        url = URLBuilder.from(url)\n-                                .addParameter(REGISTRY_KEY, url.getProtocol())\n-                                .setProtocol(extractRegistryType(url))\n-                                .build();\n-                        if ((provider && url.getParameter(REGISTER_KEY, true))\n-                                || (!provider && url.getParameter(SUBSCRIBE_KEY, true))) {\n-                            registryList.add(url);\n-                        }\n-                    }\n-                }\n-            }\n-        }\n-        return genCompatibleRegistries(registryList, provider);\n-    }\n-\n-    private static List<URL> genCompatibleRegistries(List<URL> registryList, boolean provider) {\n-        List<URL> result = new ArrayList<>(registryList.size());\n-        registryList.forEach(registryURL -> {\n-            result.add(registryURL);\n-            if (provider) {\n-                // for registries enabled service discovery, automatically register interface compatible addresses.\n-                if (SERVICE_REGISTRY_PROTOCOL.equals(registryURL.getProtocol())\n-                        && registryURL.getParameter(REGISTRY_PUBLISH_INTERFACE_KEY, ConfigurationUtils.getDynamicGlobalConfiguration().getBoolean(DUBBO_PUBLISH_INTERFACE_DEFAULT_KEY, false))\n-                        && registryNotExists(registryURL, registryList, REGISTRY_PROTOCOL)) {\n-                    URL interfaceCompatibleRegistryURL = URLBuilder.from(registryURL)\n-                            .setProtocol(REGISTRY_PROTOCOL)\n-                            .removeParameter(REGISTRY_TYPE_KEY)\n-                            .build();\n-                    result.add(interfaceCompatibleRegistryURL);\n-                }\n-            }\n-        });\n-        return result;\n-    }\n-\n-    private static boolean registryNotExists(URL registryURL, List<URL> registryList, String registryType) {\n-        return registryList.stream().noneMatch(\n-                url -> registryType.equals(url.getProtocol()) && registryURL.getBackupAddress().equals(url.getBackupAddress())\n-        );\n-    }\n-\n-    public static URL loadMonitor(AbstractInterfaceConfig interfaceConfig, URL registryURL) {\n-        Map<String, String> map = new HashMap<String, String>();\n-        map.put(INTERFACE_KEY, MonitorService.class.getName());\n-        AbstractInterfaceConfig.appendRuntimeParameters(map);\n-        //set ip\n-        String hostToRegistry = ConfigUtils.getSystemProperty(DUBBO_IP_TO_REGISTRY);\n-        if (StringUtils.isEmpty(hostToRegistry)) {\n-            hostToRegistry = NetUtils.getLocalHost();\n-        } else if (NetUtils.isInvalidLocalHost(hostToRegistry)) {\n-            throw new IllegalArgumentException(\"Specified invalid registry ip from property:\" +\n-                    DUBBO_IP_TO_REGISTRY + \", value:\" + hostToRegistry);\n-        }\n-        map.put(REGISTER_IP_KEY, hostToRegistry);\n-\n-        MonitorConfig monitor = interfaceConfig.getMonitor();\n-        ApplicationConfig application = interfaceConfig.getApplication();\n-        AbstractConfig.appendParameters(map, monitor);\n-        AbstractConfig.appendParameters(map, application);\n-        String address = null;\n-        String sysaddress = System.getProperty(\"dubbo.monitor.address\");\n-        if (sysaddress != null && sysaddress.length() > 0) {\n-            address = sysaddress;\n-        } else if (monitor != null) {\n-            address = monitor.getAddress();\n-        }\n-        if (ConfigUtils.isNotEmpty(address)) {\n-            if (!map.containsKey(PROTOCOL_KEY)) {\n-                if (getExtensionLoader(MonitorFactory.class).hasExtension(LOGSTAT_PROTOCOL)) {\n-                    map.put(PROTOCOL_KEY, LOGSTAT_PROTOCOL);\n-                } else {\n-                    map.put(PROTOCOL_KEY, DUBBO_PROTOCOL);\n-                }\n-            }\n-            return UrlUtils.parseURL(address, map);\n-        } else if (monitor != null &&\n-                (REGISTRY_PROTOCOL.equals(monitor.getProtocol()) || SERVICE_REGISTRY_PROTOCOL.equals(monitor.getProtocol()))\n-                && registryURL != null) {\n-            return URLBuilder.from(registryURL)\n-                    .setProtocol(DUBBO_PROTOCOL)\n-                    .addParameter(PROTOCOL_KEY, monitor.getProtocol())\n-                    .addParameterAndEncoded(REFER_KEY, StringUtils.toQueryString(map))\n-                    .build();\n-        }\n-        return null;\n-    }\n-\n-    /**\n-     * Legitimacy check and setup of local simulated operations. The operations can be a string with Simple operation or\n-     * a classname whose {@link Class} implements a particular function\n-     *\n-     * @param interfaceClass for provider side, it is the {@link Class} of the service that will be exported; for consumer\n-     *                       side, it is the {@link Class} of the remote service interface that will be referenced\n-     */\n-    public static void checkMock(Class<?> interfaceClass, AbstractInterfaceConfig config) {\n-        String mock = config.getMock();\n-        if (ConfigUtils.isEmpty(mock)) {\n-            return;\n-        }\n-\n-        String normalizedMock = MockInvoker.normalizeMock(mock);\n-        if (normalizedMock.startsWith(RETURN_PREFIX)) {\n-            normalizedMock = normalizedMock.substring(RETURN_PREFIX.length()).trim();\n-            try {\n-                //Check whether the mock value is legal, if it is illegal, throw exception\n-                MockInvoker.parseMockValue(normalizedMock);\n-            } catch (Exception e) {\n-                throw new IllegalStateException(\"Illegal mock return in <dubbo:service/reference ... \" +\n-                        \"mock=\\\"\" + mock + \"\\\" />\");\n-            }\n-        } else if (normalizedMock.startsWith(THROW_PREFIX)) {\n-            normalizedMock = normalizedMock.substring(THROW_PREFIX.length()).trim();\n-            if (ConfigUtils.isNotEmpty(normalizedMock)) {\n-                try {\n-                    //Check whether the mock value is legal\n-                    MockInvoker.getThrowable(normalizedMock);\n-                } catch (Exception e) {\n-                    throw new IllegalStateException(\"Illegal mock throw in <dubbo:service/reference ... \" +\n-                            \"mock=\\\"\" + mock + \"\\\" />\");\n-                }\n-            }\n-        } else {\n-            //Check whether the mock class is a implementation of the interfaceClass, and if it has a default constructor\n-            MockInvoker.getMockObject(normalizedMock, interfaceClass);\n-        }\n-    }\n-\n-    public static void validateAbstractInterfaceConfig(AbstractInterfaceConfig config) {\n-        checkName(LOCAL_KEY, config.getLocal());\n-        checkName(\"stub\", config.getStub());\n-        checkMultiName(\"owner\", config.getOwner());\n-\n-        checkExtension(ProxyFactory.class, PROXY_KEY, config.getProxy());\n-        checkExtension(Cluster.class, CLUSTER_KEY, config.getCluster());\n-        checkMultiExtension(Filter.class, FILE_KEY, config.getFilter());\n-        checkNameHasSymbol(LAYER_KEY, config.getLayer());\n-\n-        List<MethodConfig> methods = config.getMethods();\n-        if (CollectionUtils.isNotEmpty(methods)) {\n-            methods.forEach(ConfigValidationUtils::validateMethodConfig);\n-        }\n-    }\n-\n-    public static void validateServiceConfig(ServiceConfig config) {\n-        checkKey(VERSION_KEY, config.getVersion());\n-        checkKey(GROUP_KEY, config.getGroup());\n-        checkName(TOKEN_KEY, config.getToken());\n-        checkPathName(PATH_KEY, config.getPath());\n-\n-        checkMultiExtension(ExporterListener.class, \"listener\", config.getListener());\n-\n-        validateAbstractInterfaceConfig(config);\n-\n-        List<RegistryConfig> registries = config.getRegistries();\n-        if (registries != null) {\n-            for (RegistryConfig registry : registries) {\n-                validateRegistryConfig(registry);\n-            }\n-        }\n-\n-        List<ProtocolConfig> protocols = config.getProtocols();\n-        if (protocols != null) {\n-            for (ProtocolConfig protocol : protocols) {\n-                validateProtocolConfig(protocol);\n-            }\n-        }\n-\n-        ProviderConfig providerConfig = config.getProvider();\n-        if (providerConfig != null) {\n-            validateProviderConfig(providerConfig);\n-        }\n-    }\n-\n-    public static void validateReferenceConfig(ReferenceConfig config) {\n-        checkMultiExtension(InvokerListener.class, \"listener\", config.getListener());\n-        checkKey(VERSION_KEY, config.getVersion());\n-        checkKey(GROUP_KEY, config.getGroup());\n-        checkName(CLIENT_KEY, config.getClient());\n-\n-        validateAbstractInterfaceConfig(config);\n-\n-        List<RegistryConfig> registries = config.getRegistries();\n-        if (registries != null) {\n-            for (RegistryConfig registry : registries) {\n-                validateRegistryConfig(registry);\n-            }\n-        }\n-\n-        ConsumerConfig consumerConfig = config.getConsumer();\n-        if (consumerConfig != null) {\n-            validateConsumerConfig(consumerConfig);\n-        }\n-    }\n-\n-    public static void validateConfigCenterConfig(ConfigCenterConfig config) {\n-        if (config != null) {\n-            checkParameterName(config.getParameters());\n-        }\n-    }\n-\n-    public static void validateApplicationConfig(ApplicationConfig config) {\n-        if (config == null) {\n-            return;\n-        }\n-\n-        if (!config.isValid()) {\n-            throw new IllegalStateException(\"No application config found or it's not a valid config! \" +\n-                    \"Please add <dubbo:application name=\\\"...\\\" /> to your spring config.\");\n-        }\n-\n-        // backward compatibility\n-        String wait = ConfigUtils.getProperty(SHUTDOWN_WAIT_KEY);\n-        if (wait != null && wait.trim().length() > 0) {\n-            System.setProperty(SHUTDOWN_WAIT_KEY, wait.trim());\n-        } else {\n-            wait = ConfigUtils.getProperty(SHUTDOWN_WAIT_SECONDS_KEY);\n-            if (wait != null && wait.trim().length() > 0) {\n-                System.setProperty(SHUTDOWN_WAIT_SECONDS_KEY, wait.trim());\n-            }\n-        }\n-\n-        checkName(NAME, config.getName());\n-        checkMultiName(OWNER, config.getOwner());\n-        checkName(ORGANIZATION, config.getOrganization());\n-        checkName(ARCHITECTURE, config.getArchitecture());\n-        checkName(ENVIRONMENT, config.getEnvironment());\n-        checkParameterName(config.getParameters());\n-    }\n-\n-    public static void validateModuleConfig(ModuleConfig config) {\n-        if (config != null) {\n-            checkName(NAME, config.getName());\n-            checkName(OWNER, config.getOwner());\n-            checkName(ORGANIZATION, config.getOrganization());\n-        }\n-    }\n-\n-    public static void validateMetadataConfig(MetadataReportConfig metadataReportConfig) {\n-        if (metadataReportConfig == null) {\n-            return;\n-        }\n-    }\n-\n-    public static void validateMetricsConfig(MetricsConfig metricsConfig) {\n-        if (metricsConfig == null) {\n-            return;\n-        }\n-    }\n-\n-    public static void validateSslConfig(SslConfig sslConfig) {\n-        if (sslConfig == null) {\n-            return;\n-        }\n-    }\n-\n-    public static void validateMonitorConfig(MonitorConfig config) {\n-        if (config != null) {\n-            if (!config.isValid()) {\n-                logger.info(\"There's no valid monitor config found, if you want to open monitor statistics for Dubbo, \" +\n-                        \"please make sure your monitor is configured properly.\");\n-            }\n-\n-            checkParameterName(config.getParameters());\n-        }\n-    }\n-\n-    public static void validateProtocolConfig(ProtocolConfig config) {\n-        if (config != null) {\n-            String name = config.getName();\n-            checkName(\"name\", name);\n-            checkHost(HOST_KEY, config.getHost());\n-            checkPathName(\"contextpath\", config.getContextpath());\n-\n-\n-            if (DUBBO_PROTOCOL.equals(name)) {\n-                checkMultiExtension(Codec2.class, CODEC_KEY, config.getCodec());\n-                checkMultiExtension(Serialization.class, SERIALIZATION_KEY, config.getSerialization());\n-                checkMultiExtension(Transporter.class, SERVER_KEY, config.getServer());\n-                checkMultiExtension(Transporter.class, CLIENT_KEY, config.getClient());\n-            }\n-\n-            checkMultiExtension(TelnetHandler.class, TELNET, config.getTelnet());\n-            checkMultiExtension(StatusChecker.class, \"status\", config.getStatus());\n-            checkExtension(Transporter.class, TRANSPORTER_KEY, config.getTransporter());\n-            checkExtension(Exchanger.class, EXCHANGER_KEY, config.getExchanger());\n-            checkExtension(Dispatcher.class, DISPATCHER_KEY, config.getDispatcher());\n-            checkExtension(Dispatcher.class, \"dispather\", config.getDispather());\n-            checkExtension(ThreadPool.class, THREADPOOL_KEY, config.getThreadpool());\n-        }\n-    }\n-\n-    public static void validateProviderConfig(ProviderConfig config) {\n-        checkPathName(CONTEXTPATH_KEY, config.getContextpath());\n-        checkExtension(ThreadPool.class, THREADPOOL_KEY, config.getThreadpool());\n-        checkMultiExtension(TelnetHandler.class, TELNET, config.getTelnet());\n-        checkMultiExtension(StatusChecker.class, STATUS_KEY, config.getStatus());\n-        checkExtension(Transporter.class, TRANSPORTER_KEY, config.getTransporter());\n-        checkExtension(Exchanger.class, EXCHANGER_KEY, config.getExchanger());\n-    }\n-\n-    public static void validateConsumerConfig(ConsumerConfig config) {\n-        if (config == null) {\n-            return;\n-        }\n-    }\n-\n-    public static void validateRegistryConfig(RegistryConfig config) {\n-        checkName(PROTOCOL_KEY, config.getProtocol());\n-        checkName(USERNAME_KEY, config.getUsername());\n-        checkLength(PASSWORD_KEY, config.getPassword());\n-        checkPathLength(FILE_KEY, config.getFile());\n-        checkName(TRANSPORTER_KEY, config.getTransporter());\n-        checkName(SERVER_KEY, config.getServer());\n-        checkName(CLIENT_KEY, config.getClient());\n-        checkParameterName(config.getParameters());\n-    }\n-\n-    public static void validateMethodConfig(MethodConfig config) {\n-        checkExtension(LoadBalance.class, LOADBALANCE_KEY, config.getLoadbalance());\n-        checkParameterName(config.getParameters());\n-        checkMethodName(\"name\", config.getName());\n-\n-        String mock = config.getMock();\n-        if (StringUtils.isNotEmpty(mock)) {\n-            if (mock.startsWith(RETURN_PREFIX) || mock.startsWith(THROW_PREFIX + \" \")) {\n-                checkLength(MOCK_KEY, mock);\n-            } else if (mock.startsWith(FAIL_PREFIX) || mock.startsWith(FORCE_PREFIX)) {\n-                checkNameHasSymbol(MOCK_KEY, mock);\n-            } else {\n-                checkName(MOCK_KEY, mock);\n-            }\n-        }\n-    }\n-\n-    private static String extractRegistryType(URL url) {\n-        return isServiceDiscoveryRegistryType(url) ? SERVICE_REGISTRY_PROTOCOL : REGISTRY_PROTOCOL;\n-    }\n-\n-    public static void checkExtension(Class<?> type, String property, String value) {\n-        checkName(property, value);\n-        if (StringUtils.isNotEmpty(value)\n-                && !ExtensionLoader.getExtensionLoader(type).hasExtension(value)) {\n-            throw new IllegalStateException(\"No such extension \" + value + \" for \" + property + \"/\" + type.getName());\n-        }\n-    }\n-\n-    /**\n-     * Check whether there is a <code>Extension</code> who's name (property) is <code>value</code> (special treatment is\n-     * required)\n-     *\n-     * @param type     The Extension type\n-     * @param property The extension key\n-     * @param value    The Extension name\n-     */\n-    public static void checkMultiExtension(Class<?> type, String property, String value) {\n-        checkMultiName(property, value);\n-        if (StringUtils.isNotEmpty(value)) {\n-            String[] values = value.split(\"\\\\s*[,]+\\\\s*\");\n-            for (String v : values) {\n-                if (v.startsWith(REMOVE_VALUE_PREFIX)) {\n-                    v = v.substring(1);\n-                }\n-                if (DEFAULT_KEY.equals(v)) {\n-                    continue;\n-                }\n-                if (!ExtensionLoader.getExtensionLoader(type).hasExtension(v)) {\n-                    throw new IllegalStateException(\"No such extension \" + v + \" for \" + property + \"/\" + type.getName());\n-                }\n-            }\n-        }\n-    }\n-\n-    public static void checkLength(String property, String value) {\n-        checkProperty(property, value, MAX_LENGTH, null);\n-    }\n-\n-    public static void checkPathLength(String property, String value) {\n-        checkProperty(property, value, MAX_PATH_LENGTH, null);\n-    }\n-\n-    public static void checkName(String property, String value) {\n-        checkProperty(property, value, MAX_LENGTH, PATTERN_NAME);\n-    }\n-\n-    public static void checkHost(String property, String value) {\n-        if (StringUtils.isEmpty(value)) {\n-            return;\n-        }\n-        if (value.startsWith(IPV6_START_MARK) && value.endsWith(IPV6_END_MARK)) {\n-            // if the value start with \"[\" and end with \"]\", check whether it is IPV6\n-            try {\n-                InetAddress.getByName(value);\n-                return;\n-            } catch (UnknownHostException e) {\n-                // not a IPv6 string, do nothing, go on to checkName\n-            }\n-        }\n-        checkName(property, value);\n-    }\n-\n-    public static void checkNameHasSymbol(String property, String value) {\n-        checkProperty(property, value, MAX_LENGTH, PATTERN_NAME_HAS_SYMBOL);\n-    }\n-\n-    public static void checkKey(String property, String value) {\n-        checkProperty(property, value, MAX_LENGTH, PATTERN_KEY);\n-    }\n-\n-    public static void checkMultiName(String property, String value) {\n-        checkProperty(property, value, MAX_LENGTH, PATTERN_MULTI_NAME);\n-    }\n-\n-    public static void checkPathName(String property, String value) {\n-        checkProperty(property, value, MAX_PATH_LENGTH, PATTERN_PATH);\n-    }\n-\n-    public static void checkMethodName(String property, String value) {\n-        checkProperty(property, value, MAX_LENGTH, PATTERN_METHOD_NAME);\n-    }\n-\n-    public static void checkParameterName(Map<String, String> parameters) {\n-        if (CollectionUtils.isEmptyMap(parameters)) {\n-            return;\n-        }\n-        List<String> ignoreCheckKeys = new ArrayList<>();\n-        ignoreCheckKeys.add(BACKUP_KEY);\n-        String ignoreCheckKeysStr = parameters.get(IGNORE_CHECK_KEYS);\n-        if (!StringUtils.isBlank(ignoreCheckKeysStr)) {\n-            ignoreCheckKeys.addAll(Arrays.asList(ignoreCheckKeysStr.split(\",\")));\n-        }\n-        for (Map.Entry<String, String> entry : parameters.entrySet()) {\n-            if (!ignoreCheckKeys.contains(entry.getKey())) {\n-                checkNameHasSymbol(entry.getKey(), entry.getValue());\n-            }\n-        }\n-    }\n-\n-    public static void checkProperty(String property, String value, int maxlength, Pattern pattern) {\n-        if (StringUtils.isEmpty(value)) {\n-            return;\n-        }\n-        if (value.length() > maxlength) {\n-            throw new IllegalStateException(\"Invalid \" + property + \"=\\\"\" + value + \"\\\" is longer than \" + maxlength);\n-        }\n-        if (pattern != null) {\n-            Matcher matcher = pattern.matcher(value);\n-            if (!matcher.matches()) {\n-                throw new IllegalStateException(\"Invalid \" + property + \"=\\\"\" + value + \"\\\" contains illegal \" +\n-                        \"character, only digit, letter, '-', '_' or '.' is legal.\");\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.config.utils;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.URLBuilder;\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.logger.Logger;\r\n+import org.apache.dubbo.common.logger.LoggerFactory;\r\n+import org.apache.dubbo.common.serialize.Serialization;\r\n+import org.apache.dubbo.common.status.StatusChecker;\r\n+import org.apache.dubbo.common.threadpool.ThreadPool;\r\n+import org.apache.dubbo.common.utils.CollectionUtils;\r\n+import org.apache.dubbo.common.utils.ConfigUtils;\r\n+import org.apache.dubbo.common.utils.NetUtils;\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+import org.apache.dubbo.common.utils.UrlUtils;\r\n+import org.apache.dubbo.config.AbstractConfig;\r\n+import org.apache.dubbo.config.AbstractInterfaceConfig;\r\n+import org.apache.dubbo.config.ApplicationConfig;\r\n+import org.apache.dubbo.config.ConfigCenterConfig;\r\n+import org.apache.dubbo.config.ConsumerConfig;\r\n+import org.apache.dubbo.config.MetadataReportConfig;\r\n+import org.apache.dubbo.config.MethodConfig;\r\n+import org.apache.dubbo.config.MetricsConfig;\r\n+import org.apache.dubbo.config.ModuleConfig;\r\n+import org.apache.dubbo.config.MonitorConfig;\r\n+import org.apache.dubbo.config.ProtocolConfig;\r\n+import org.apache.dubbo.config.ProviderConfig;\r\n+import org.apache.dubbo.config.ReferenceConfig;\r\n+import org.apache.dubbo.config.RegistryConfig;\r\n+import org.apache.dubbo.config.ServiceConfig;\r\n+import org.apache.dubbo.config.SslConfig;\r\n+import org.apache.dubbo.monitor.MonitorFactory;\r\n+import org.apache.dubbo.monitor.MonitorService;\r\n+import org.apache.dubbo.registry.RegistryService;\r\n+import org.apache.dubbo.remoting.Codec2;\r\n+import org.apache.dubbo.remoting.Dispatcher;\r\n+import org.apache.dubbo.remoting.Transporter;\r\n+import org.apache.dubbo.remoting.exchange.Exchanger;\r\n+import org.apache.dubbo.remoting.telnet.TelnetHandler;\r\n+import org.apache.dubbo.rpc.ExporterListener;\r\n+import org.apache.dubbo.rpc.Filter;\r\n+import org.apache.dubbo.rpc.InvokerListener;\r\n+import org.apache.dubbo.rpc.ProxyFactory;\r\n+import org.apache.dubbo.rpc.cluster.Cluster;\r\n+import org.apache.dubbo.rpc.cluster.LoadBalance;\r\n+import org.apache.dubbo.rpc.support.MockInvoker;\r\n+\r\n+import java.net.InetAddress;\r\n+import java.net.UnknownHostException;\r\n+import java.util.ArrayList;\r\n+import java.util.Arrays;\r\n+import java.util.HashMap;\r\n+import java.util.List;\r\n+import java.util.Map;\r\n+import java.util.regex.Matcher;\r\n+import java.util.regex.Pattern;\r\n+\r\n+import static org.apache.dubbo.common.constants.CommonConstants.ANYHOST_VALUE;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.CLUSTER_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.DUBBO_PROTOCOL;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.FILE_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.HOST_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.INTERFACE_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.LOADBALANCE_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.PASSWORD_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.PATH_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.PROTOCOL_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.REMOVE_VALUE_PREFIX;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.SHUTDOWN_WAIT_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.SHUTDOWN_WAIT_SECONDS_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.THREADPOOL_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.USERNAME_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.VERSION_KEY;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.DUBBO_PUBLISH_INTERFACE_DEFAULT_KEY;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_KEY;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_PROTOCOL;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_PUBLISH_INTERFACE_KEY;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_TYPE_KEY;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.SERVICE_REGISTRY_PROTOCOL;\r\n+import static org.apache.dubbo.common.constants.RemotingConstants.BACKUP_KEY;\r\n+import static org.apache.dubbo.common.extension.ExtensionLoader.getExtensionLoader;\r\n+import static org.apache.dubbo.common.utils.UrlUtils.isServiceDiscoveryRegistryType;\r\n+import static org.apache.dubbo.config.Constants.ARCHITECTURE;\r\n+import static org.apache.dubbo.config.Constants.CONTEXTPATH_KEY;\r\n+import static org.apache.dubbo.config.Constants.DUBBO_IP_TO_REGISTRY;\r\n+import static org.apache.dubbo.config.Constants.ENVIRONMENT;\r\n+import static org.apache.dubbo.config.Constants.IGNORE_CHECK_KEYS;\r\n+import static org.apache.dubbo.config.Constants.LAYER_KEY;\r\n+import static org.apache.dubbo.config.Constants.NAME;\r\n+import static org.apache.dubbo.config.Constants.ORGANIZATION;\r\n+import static org.apache.dubbo.config.Constants.OWNER;\r\n+import static org.apache.dubbo.config.Constants.STATUS_KEY;\r\n+import static org.apache.dubbo.monitor.Constants.LOGSTAT_PROTOCOL;\r\n+import static org.apache.dubbo.registry.Constants.REGISTER_IP_KEY;\r\n+import static org.apache.dubbo.registry.Constants.REGISTER_KEY;\r\n+import static org.apache.dubbo.registry.Constants.SUBSCRIBE_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.DISPATCHER_KEY;\r\n+import static org.apache.dubbo.remoting.Constants.EXCHANGER_KEY;\r\n+import static org.apache.dubbo.remoting.Constants.SERIALIZATION_KEY;\r\n+import static org.apache.dubbo.remoting.Constants.SERVER_KEY;\r\n+import static org.apache.dubbo.remoting.Constants.TELNET;\r\n+import static org.apache.dubbo.remoting.Constants.TRANSPORTER_KEY;\r\n+import static org.apache.dubbo.rpc.Constants.FAIL_PREFIX;\r\n+import static org.apache.dubbo.rpc.Constants.FORCE_PREFIX;\r\n+import static org.apache.dubbo.rpc.Constants.LOCAL_KEY;\r\n+import static org.apache.dubbo.rpc.Constants.MOCK_KEY;\r\n+import static org.apache.dubbo.rpc.Constants.PROXY_KEY;\r\n+import static org.apache.dubbo.rpc.Constants.RETURN_PREFIX;\r\n+import static org.apache.dubbo.rpc.Constants.THROW_PREFIX;\r\n+import static org.apache.dubbo.rpc.Constants.TOKEN_KEY;\r\n+import static org.apache.dubbo.rpc.cluster.Constants.REFER_KEY;\r\n+\r\n+public class ConfigValidationUtils {\r\n+    private static final Logger logger = LoggerFactory.getLogger(ConfigValidationUtils.class);\r\n+    /**\r\n+     * The maximum length of a <b>parameter's value</b>\r\n+     */\r\n+    private static final int MAX_LENGTH = 200;\r\n+\r\n+    /**\r\n+     * The maximum length of a <b>path</b>\r\n+     */\r\n+    private static final int MAX_PATH_LENGTH = 200;\r\n+\r\n+    /**\r\n+     * The rule qualification for <b>name</b>\r\n+     */\r\n+    private static final Pattern PATTERN_NAME = Pattern.compile(\"[\\\\-._0-9a-zA-Z]+\");\r\n+\r\n+    /**\r\n+     * The rule qualification for <b>multiply name</b>\r\n+     */\r\n+    private static final Pattern PATTERN_MULTI_NAME = Pattern.compile(\"[,\\\\-._0-9a-zA-Z]+\");\r\n+\r\n+    /**\r\n+     * The rule qualification for <b>method names</b>\r\n+     */\r\n+    private static final Pattern PATTERN_METHOD_NAME = Pattern.compile(\"[a-zA-Z][0-9a-zA-Z]*\");\r\n+\r\n+    /**\r\n+     * The rule qualification for <b>path</b>\r\n+     */\r\n+    private static final Pattern PATTERN_PATH = Pattern.compile(\"[/\\\\-$._0-9a-zA-Z]+\");\r\n+\r\n+    /**\r\n+     * The pattern matches a value who has a symbol\r\n+     */\r\n+    private static final Pattern PATTERN_NAME_HAS_SYMBOL = Pattern.compile(\"[:*,\\\\s/\\\\-._0-9a-zA-Z]+\");\r\n+\r\n+    /**\r\n+     * The pattern matches a property key\r\n+     */\r\n+    private static final Pattern PATTERN_KEY = Pattern.compile(\"[*,\\\\-._0-9a-zA-Z]+\");\r\n+\r\n+    public static final String IPV6_START_MARK = \"[\";\r\n+\r\n+    public static final String IPV6_END_MARK = \"]\";\r\n+\r\n+\r\n+    public static List<URL> loadRegistries(AbstractInterfaceConfig interfaceConfig, boolean provider) {\r\n+        // check && override if necessary\r\n+        List<URL> registryList = new ArrayList<URL>();\r\n+        ApplicationConfig application = interfaceConfig.getApplication();\r\n+        List<RegistryConfig> registries = interfaceConfig.getRegistries();\r\n+        if (CollectionUtils.isNotEmpty(registries)) {\r\n+            for (RegistryConfig config : registries) {\r\n+                String address = config.getAddress();\r\n+                if (StringUtils.isEmpty(address)) {\r\n+                    address = ANYHOST_VALUE;\r\n+                }\r\n+                if (!RegistryConfig.NO_AVAILABLE.equalsIgnoreCase(address)) {\r\n+                    Map<String, String> map = new HashMap<String, String>();\r\n+                    AbstractConfig.appendParameters(map, application);\r\n+                    AbstractConfig.appendParameters(map, config);\r\n+                    map.put(PATH_KEY, RegistryService.class.getName());\r\n+                    AbstractInterfaceConfig.appendRuntimeParameters(map);\r\n+                    if (!map.containsKey(PROTOCOL_KEY)) {\r\n+                        map.put(PROTOCOL_KEY, DUBBO_PROTOCOL);\r\n+                    }\r\n+                    List<URL> urls = UrlUtils.parseURLs(address, map);\r\n+\r\n+                    for (URL url : urls) {\r\n+\r\n+                        url = URLBuilder.from(url)\r\n+                                .addParameter(REGISTRY_KEY, url.getProtocol())\r\n+                                .setProtocol(extractRegistryType(url))\r\n+                                .build();\r\n+                        if ((provider && url.getParameter(REGISTER_KEY, true))\r\n+                                || (!provider && url.getParameter(SUBSCRIBE_KEY, true))) {\r\n+                            registryList.add(url);\r\n+                        }\r\n+                    }\r\n+                }\r\n+            }\r\n+        }\r\n+        return genCompatibleRegistries(registryList, provider);\r\n+    }\r\n+\r\n+    private static List<URL> genCompatibleRegistries(List<URL> registryList, boolean provider) {\r\n+        List<URL> result = new ArrayList<>(registryList.size());\r\n+        registryList.forEach(registryURL -> {\r\n+            result.add(registryURL);\r\n+            if (provider) {\r\n+                // for registries enabled service discovery, automatically register interface compatible addresses.\r\n+                if (SERVICE_REGISTRY_PROTOCOL.equals(registryURL.getProtocol())\r\n+                        && registryURL.getParameter(REGISTRY_PUBLISH_INTERFACE_KEY, ConfigurationUtils.getDynamicGlobalConfiguration().getBoolean(DUBBO_PUBLISH_INTERFACE_DEFAULT_KEY, false))\r\n+                        && registryNotExists(registryURL, registryList, REGISTRY_PROTOCOL)) {\r\n+                    URL interfaceCompatibleRegistryURL = URLBuilder.from(registryURL)\r\n+                            .setProtocol(REGISTRY_PROTOCOL)\r\n+                            .removeParameter(REGISTRY_TYPE_KEY)\r\n+                            .build();\r\n+                    result.add(interfaceCompatibleRegistryURL);\r\n+                }\r\n+            }\r\n+        });\r\n+        return result;\r\n+    }\r\n+\r\n+    private static boolean registryNotExists(URL registryURL, List<URL> registryList, String registryType) {\r\n+        return registryList.stream().noneMatch(\r\n+                url -> registryType.equals(url.getProtocol()) && registryURL.getBackupAddress().equals(url.getBackupAddress())\r\n+        );\r\n+    }\r\n+\r\n+    public static URL loadMonitor(AbstractInterfaceConfig interfaceConfig, URL registryURL) {\r\n+        Map<String, String> map = new HashMap<String, String>();\r\n+        map.put(INTERFACE_KEY, MonitorService.class.getName());\r\n+        AbstractInterfaceConfig.appendRuntimeParameters(map);\r\n+        //set ip\r\n+        String hostToRegistry = ConfigUtils.getSystemProperty(DUBBO_IP_TO_REGISTRY);\r\n+        if (StringUtils.isEmpty(hostToRegistry)) {\r\n+            hostToRegistry = NetUtils.getLocalHost();\r\n+        } else if (NetUtils.isInvalidLocalHost(hostToRegistry)) {\r\n+            throw new IllegalArgumentException(\"Specified invalid registry ip from property:\" +\r\n+                    DUBBO_IP_TO_REGISTRY + \", value:\" + hostToRegistry);\r\n+        }\r\n+        map.put(REGISTER_IP_KEY, hostToRegistry);\r\n+\r\n+        MonitorConfig monitor = interfaceConfig.getMonitor();\r\n+        ApplicationConfig application = interfaceConfig.getApplication();\r\n+        AbstractConfig.appendParameters(map, monitor);\r\n+        AbstractConfig.appendParameters(map, application);\r\n+        String address = null;\r\n+        String sysaddress = System.getProperty(\"dubbo.monitor.address\");\r\n+        if (sysaddress != null && sysaddress.length() > 0) {\r\n+            address = sysaddress;\r\n+        } else if (monitor != null) {\r\n+            address = monitor.getAddress();\r\n+        }\r\n+        if (ConfigUtils.isNotEmpty(address)) {\r\n+            if (!map.containsKey(PROTOCOL_KEY)) {\r\n+                if (getExtensionLoader(MonitorFactory.class).hasExtension(LOGSTAT_PROTOCOL)) {\r\n+                    map.put(PROTOCOL_KEY, LOGSTAT_PROTOCOL);\r\n+                } else {\r\n+                    map.put(PROTOCOL_KEY, DUBBO_PROTOCOL);\r\n+                }\r\n+            }\r\n+            return UrlUtils.parseURL(address, map);\r\n+        } else if (monitor != null &&\r\n+                (REGISTRY_PROTOCOL.equals(monitor.getProtocol()) || SERVICE_REGISTRY_PROTOCOL.equals(monitor.getProtocol()))\r\n+                && registryURL != null) {\r\n+            return URLBuilder.from(registryURL)\r\n+                    .setProtocol(DUBBO_PROTOCOL)\r\n+                    .addParameter(PROTOCOL_KEY, monitor.getProtocol())\r\n+                    .addParameterAndEncoded(REFER_KEY, StringUtils.toQueryString(map))\r\n+                    .build();\r\n+        }\r\n+        return null;\r\n+    }\r\n+\r\n+    /**\r\n+     * Legitimacy check and setup of local simulated operations. The operations can be a string with Simple operation or\r\n+     * a classname whose {@link Class} implements a particular function\r\n+     *\r\n+     * @param interfaceClass for provider side, it is the {@link Class} of the service that will be exported; for consumer\r\n+     *                       side, it is the {@link Class} of the remote service interface that will be referenced\r\n+     */\r\n+    public static void checkMock(Class<?> interfaceClass, AbstractInterfaceConfig config) {\r\n+        String mock = config.getMock();\r\n+        if (ConfigUtils.isEmpty(mock)) {\r\n+            return;\r\n+        }\r\n+\r\n+        String normalizedMock = MockInvoker.normalizeMock(mock);\r\n+        if (normalizedMock.startsWith(RETURN_PREFIX)) {\r\n+            normalizedMock = normalizedMock.substring(RETURN_PREFIX.length()).trim();\r\n+            try {\r\n+                //Check whether the mock value is legal, if it is illegal, throw exception\r\n+                MockInvoker.parseMockValue(normalizedMock);\r\n+            } catch (Exception e) {\r\n+                throw new IllegalStateException(\"Illegal mock return in <dubbo:service/reference ... \" +\r\n+                        \"mock=\\\"\" + mock + \"\\\" />\");\r\n+            }\r\n+        } else if (normalizedMock.startsWith(THROW_PREFIX)) {\r\n+            normalizedMock = normalizedMock.substring(THROW_PREFIX.length()).trim();\r\n+            if (ConfigUtils.isNotEmpty(normalizedMock)) {\r\n+                try {\r\n+                    //Check whether the mock value is legal\r\n+                    MockInvoker.getThrowable(normalizedMock);\r\n+                } catch (Exception e) {\r\n+                    throw new IllegalStateException(\"Illegal mock throw in <dubbo:service/reference ... \" +\r\n+                            \"mock=\\\"\" + mock + \"\\\" />\");\r\n+                }\r\n+            }\r\n+        } else {\r\n+            //Check whether the mock class is a implementation of the interfaceClass, and if it has a default constructor\r\n+            MockInvoker.getMockObject(normalizedMock, interfaceClass);\r\n+        }\r\n+    }\r\n+\r\n+    public static void validateAbstractInterfaceConfig(AbstractInterfaceConfig config) {\r\n+        checkName(LOCAL_KEY, config.getLocal());\r\n+        checkName(\"stub\", config.getStub());\r\n+        checkMultiName(\"owner\", config.getOwner());\r\n+\r\n+        checkExtension(ProxyFactory.class, PROXY_KEY, config.getProxy());\r\n+        checkExtension(Cluster.class, CLUSTER_KEY, config.getCluster());\r\n+        checkMultiExtension(Filter.class, FILE_KEY, config.getFilter());\r\n+        checkNameHasSymbol(LAYER_KEY, config.getLayer());\r\n+\r\n+        List<MethodConfig> methods = config.getMethods();\r\n+        if (CollectionUtils.isNotEmpty(methods)) {\r\n+            methods.forEach(ConfigValidationUtils::validateMethodConfig);\r\n+        }\r\n+    }\r\n+\r\n+    public static void validateServiceConfig(ServiceConfig config) {\r\n+        checkKey(VERSION_KEY, config.getVersion());\r\n+        checkKey(GROUP_KEY, config.getGroup());\r\n+        checkName(TOKEN_KEY, config.getToken());\r\n+        checkPathName(PATH_KEY, config.getPath());\r\n+\r\n+        checkMultiExtension(ExporterListener.class, \"listener\", config.getListener());\r\n+\r\n+        validateAbstractInterfaceConfig(config);\r\n+\r\n+        List<RegistryConfig> registries = config.getRegistries();\r\n+        if (registries != null) {\r\n+            for (RegistryConfig registry : registries) {\r\n+                validateRegistryConfig(registry);\r\n+            }\r\n+        }\r\n+\r\n+        List<ProtocolConfig> protocols = config.getProtocols();\r\n+        if (protocols != null) {\r\n+            for (ProtocolConfig protocol : protocols) {\r\n+                validateProtocolConfig(protocol);\r\n+            }\r\n+        }\r\n+\r\n+        ProviderConfig providerConfig = config.getProvider();\r\n+        if (providerConfig != null) {\r\n+            validateProviderConfig(providerConfig);\r\n+        }\r\n+    }\r\n+\r\n+    public static void validateReferenceConfig(ReferenceConfig config) {\r\n+        checkMultiExtension(InvokerListener.class, \"listener\", config.getListener());\r\n+        checkKey(VERSION_KEY, config.getVersion());\r\n+        checkKey(GROUP_KEY, config.getGroup());\r\n+        checkName(CLIENT_KEY, config.getClient());\r\n+\r\n+        validateAbstractInterfaceConfig(config);\r\n+\r\n+        List<RegistryConfig> registries = config.getRegistries();\r\n+        if (registries != null) {\r\n+            for (RegistryConfig registry : registries) {\r\n+                validateRegistryConfig(registry);\r\n+            }\r\n+        }\r\n+\r\n+        ConsumerConfig consumerConfig = config.getConsumer();\r\n+        if (consumerConfig != null) {\r\n+            validateConsumerConfig(consumerConfig);\r\n+        }\r\n+    }\r\n+\r\n+    public static void validateConfigCenterConfig(ConfigCenterConfig config) {\r\n+        if (config != null) {\r\n+            checkParameterName(config.getParameters());\r\n+        }\r\n+    }\r\n+\r\n+    public static void validateApplicationConfig(ApplicationConfig config) {\r\n+        if (config == null) {\r\n+            return;\r\n+        }\r\n+\r\n+        if (!config.isValid()) {\r\n+            throw new IllegalStateException(\"No application config found or it's not a valid config! \" +\r\n+                    \"Please add <dubbo:application name=\\\"...\\\" /> to your spring config.\");\r\n+        }\r\n+\r\n+        // backward compatibility\r\n+        String wait = ConfigUtils.getProperty(SHUTDOWN_WAIT_KEY);\r\n+        if (wait != null && wait.trim().length() > 0) {\r\n+            System.setProperty(SHUTDOWN_WAIT_KEY, wait.trim());\r\n+        } else {\r\n+            wait = ConfigUtils.getProperty(SHUTDOWN_WAIT_SECONDS_KEY);\r\n+            if (wait != null && wait.trim().length() > 0) {\r\n+                System.setProperty(SHUTDOWN_WAIT_SECONDS_KEY, wait.trim());\r\n+            }\r\n+        }\r\n+\r\n+        checkName(NAME, config.getName());\r\n+        checkMultiName(OWNER, config.getOwner());\r\n+        checkName(ORGANIZATION, config.getOrganization());\r\n+        checkName(ARCHITECTURE, config.getArchitecture());\r\n+        checkName(ENVIRONMENT, config.getEnvironment());\r\n+        checkParameterName(config.getParameters());\r\n+    }\r\n+\r\n+    public static void validateModuleConfig(ModuleConfig config) {\r\n+        if (config != null) {\r\n+            checkName(NAME, config.getName());\r\n+            checkName(OWNER, config.getOwner());\r\n+            checkName(ORGANIZATION, config.getOrganization());\r\n+        }\r\n+    }\r\n+\r\n+    public static void validateMetadataConfig(MetadataReportConfig metadataReportConfig) {\r\n+        if (metadataReportConfig == null) {\r\n+            return;\r\n+        }\r\n+    }\r\n+\r\n+    public static void validateMetricsConfig(MetricsConfig metricsConfig) {\r\n+        if (metricsConfig == null) {\r\n+            return;\r\n+        }\r\n+    }\r\n+\r\n+    public static void validateSslConfig(SslConfig sslConfig) {\r\n+        if (sslConfig == null) {\r\n+            return;\r\n+        }\r\n+    }\r\n+\r\n+    public static void validateMonitorConfig(MonitorConfig config) {\r\n+        if (config != null) {\r\n+            if (!config.isValid()) {\r\n+                logger.info(\"There's no valid monitor config found, if you want to open monitor statistics for Dubbo, \" +\r\n+                        \"please make sure your monitor is configured properly.\");\r\n+            }\r\n+\r\n+            checkParameterName(config.getParameters());\r\n+        }\r\n+    }\r\n+\r\n+    public static void validateProtocolConfig(ProtocolConfig config) {\r\n+        if (config != null) {\r\n+            String name = config.getName();\r\n+            checkName(\"name\", name);\r\n+            checkHost(HOST_KEY, config.getHost());\r\n+            checkPathName(\"contextpath\", config.getContextpath());\r\n+\r\n+\r\n+            if (DUBBO_PROTOCOL.equals(name)) {\r\n+                checkMultiExtension(Codec2.class, CODEC_KEY, config.getCodec());\r\n+                checkMultiExtension(Serialization.class, SERIALIZATION_KEY, config.getSerialization());\r\n+                checkMultiExtension(Transporter.class, SERVER_KEY, config.getServer());\r\n+                checkMultiExtension(Transporter.class, CLIENT_KEY, config.getClient());\r\n+            }\r\n+\r\n+            checkMultiExtension(TelnetHandler.class, TELNET, config.getTelnet());\r\n+            checkMultiExtension(StatusChecker.class, \"status\", config.getStatus());\r\n+            checkExtension(Transporter.class, TRANSPORTER_KEY, config.getTransporter());\r\n+            checkExtension(Exchanger.class, EXCHANGER_KEY, config.getExchanger());\r\n+            checkExtension(Dispatcher.class, DISPATCHER_KEY, config.getDispatcher());\r\n+            checkExtension(Dispatcher.class, \"dispather\", config.getDispather());\r\n+            checkExtension(ThreadPool.class, THREADPOOL_KEY, config.getThreadpool());\r\n+        }\r\n+    }\r\n+\r\n+    public static void validateProviderConfig(ProviderConfig config) {\r\n+        checkPathName(CONTEXTPATH_KEY, config.getContextpath());\r\n+        checkExtension(ThreadPool.class, THREADPOOL_KEY, config.getThreadpool());\r\n+        checkMultiExtension(TelnetHandler.class, TELNET, config.getTelnet());\r\n+        checkMultiExtension(StatusChecker.class, STATUS_KEY, config.getStatus());\r\n+        checkExtension(Transporter.class, TRANSPORTER_KEY, config.getTransporter());\r\n+        checkExtension(Exchanger.class, EXCHANGER_KEY, config.getExchanger());\r\n+    }\r\n+\r\n+    public static void validateConsumerConfig(ConsumerConfig config) {\r\n+        if (config == null) {\r\n+            return;\r\n+        }\r\n+    }\r\n+\r\n+    public static void validateRegistryConfig(RegistryConfig config) {\r\n+        checkName(PROTOCOL_KEY, config.getProtocol());\r\n+        checkName(USERNAME_KEY, config.getUsername());\r\n+        checkLength(PASSWORD_KEY, config.getPassword());\r\n+        checkPathLength(FILE_KEY, config.getFile());\r\n+        checkName(TRANSPORTER_KEY, config.getTransporter());\r\n+        checkName(SERVER_KEY, config.getServer());\r\n+        checkName(CLIENT_KEY, config.getClient());\r\n+        checkParameterName(config.getParameters());\r\n+    }\r\n+\r\n+    public static void validateMethodConfig(MethodConfig config) {\r\n+        checkExtension(LoadBalance.class, LOADBALANCE_KEY, config.getLoadbalance());\r\n+        checkParameterName(config.getParameters());\r\n+        checkMethodName(\"name\", config.getName());\r\n+\r\n+        String mock = config.getMock();\r\n+        if (StringUtils.isNotEmpty(mock)) {\r\n+            if (mock.startsWith(RETURN_PREFIX) || mock.startsWith(THROW_PREFIX + \" \")) {\r\n+                checkLength(MOCK_KEY, mock);\r\n+            } else if (mock.startsWith(FAIL_PREFIX) || mock.startsWith(FORCE_PREFIX)) {\r\n+                checkNameHasSymbol(MOCK_KEY, mock);\r\n+            } else {\r\n+                checkName(MOCK_KEY, mock);\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    private static String extractRegistryType(URL url) {\r\n+        return isServiceDiscoveryRegistryType(url) ? SERVICE_REGISTRY_PROTOCOL : REGISTRY_PROTOCOL;\r\n+    }\r\n+\r\n+    public static void checkExtension(Class<?> type, String property, String value) {\r\n+        checkName(property, value);\r\n+        if (StringUtils.isNotEmpty(value)\r\n+                && !ExtensionLoader.getExtensionLoader(type).hasExtension(value)) {\r\n+            throw new IllegalStateException(\"No such extension \" + value + \" for \" + property + \"/\" + type.getName());\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * Check whether there is a <code>Extension</code> who's name (property) is <code>value</code> (special treatment is\r\n+     * required)\r\n+     *\r\n+     * @param type     The Extension type\r\n+     * @param property The extension key\r\n+     * @param value    The Extension name\r\n+     */\r\n+    public static void checkMultiExtension(Class<?> type, String property, String value) {\r\n+        checkMultiName(property, value);\r\n+        if (StringUtils.isNotEmpty(value)) {\r\n+            String[] values = value.split(\"\\\\s*[,]+\\\\s*\");\r\n+            for (String v : values) {\r\n+                if (v.startsWith(REMOVE_VALUE_PREFIX)) {\r\n+                    v = v.substring(1);\r\n+                }\r\n+                if (DEFAULT_KEY.equals(v)) {\r\n+                    continue;\r\n+                }\r\n+                if (!ExtensionLoader.getExtensionLoader(type).hasExtension(v)) {\r\n+                    throw new IllegalStateException(\"No such extension \" + v + \" for \" + property + \"/\" + type.getName());\r\n+                }\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    public static void checkLength(String property, String value) {\r\n+        checkProperty(property, value, MAX_LENGTH, null);\r\n+    }\r\n+\r\n+    public static void checkPathLength(String property, String value) {\r\n+        checkProperty(property, value, MAX_PATH_LENGTH, null);\r\n+    }\r\n+\r\n+    public static void checkName(String property, String value) {\r\n+        checkProperty(property, value, MAX_LENGTH, PATTERN_NAME);\r\n+    }\r\n+\r\n+    public static void checkHost(String property, String value) {\r\n+        if (StringUtils.isEmpty(value)) {\r\n+            return;\r\n+        }\r\n+        if (value.startsWith(IPV6_START_MARK) && value.endsWith(IPV6_END_MARK)) {\r\n+            // if the value start with \"[\" and end with \"]\", check whether it is IPV6\r\n+            try {\r\n+                InetAddress.getByName(value);\r\n+                return;\r\n+            } catch (UnknownHostException e) {\r\n+                // not a IPv6 string, do nothing, go on to checkName\r\n+            }\r\n+        }\r\n+        checkName(property, value);\r\n+    }\r\n+\r\n+    public static void checkNameHasSymbol(String property, String value) {\r\n+        checkProperty(property, value, MAX_LENGTH, PATTERN_NAME_HAS_SYMBOL);\r\n+    }\r\n+\r\n+    public static void checkKey(String property, String value) {\r\n+        checkProperty(property, value, MAX_LENGTH, PATTERN_KEY);\r\n+    }\r\n+\r\n+    public static void checkMultiName(String property, String value) {\r\n+        checkProperty(property, value, MAX_LENGTH, PATTERN_MULTI_NAME);\r\n+    }\r\n+\r\n+    public static void checkPathName(String property, String value) {\r\n+        checkProperty(property, value, MAX_PATH_LENGTH, PATTERN_PATH);\r\n+    }\r\n+\r\n+    public static void checkMethodName(String property, String value) {\r\n+        checkProperty(property, value, MAX_LENGTH, PATTERN_METHOD_NAME);\r\n+    }\r\n+\r\n+    public static void checkParameterName(Map<String, String> parameters) {\r\n+        if (CollectionUtils.isEmptyMap(parameters)) {\r\n+            return;\r\n+        }\r\n+        List<String> ignoreCheckKeys = new ArrayList<>();\r\n+        ignoreCheckKeys.add(BACKUP_KEY);\r\n+        String ignoreCheckKeysStr = parameters.get(IGNORE_CHECK_KEYS);\r\n+        if (!StringUtils.isBlank(ignoreCheckKeysStr)) {\r\n+            ignoreCheckKeys.addAll(Arrays.asList(ignoreCheckKeysStr.split(\",\")));\r\n+        }\r\n+        for (Map.Entry<String, String> entry : parameters.entrySet()) {\r\n+            if (!ignoreCheckKeys.contains(entry.getKey())) {\r\n+                checkNameHasSymbol(entry.getKey(), entry.getValue());\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    public static void checkProperty(String property, String value, int maxlength, Pattern pattern) {\r\n+        if (StringUtils.isEmpty(value)) {\r\n+            return;\r\n+        }\r\n+        if (value.length() > maxlength) {\r\n+            throw new IllegalStateException(\"Invalid \" + property + \"=\\\"\" + value + \"\\\" is longer than \" + maxlength);\r\n+        }\r\n+        if (pattern != null) {\r\n+            Matcher matcher = pattern.matcher(value);\r\n+            if (!matcher.matches()) {\r\n+                throw new IllegalStateException(\"Invalid \" + property + \"=\\\"\" + value + \"\\\" contains illegal \" +\r\n+                        \"character, only digit, letter, '-', '_' or '.' is legal.\");\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/config/utils/ReferenceConfigCache.java", "source2": "org/apache/dubbo/config/utils/ReferenceConfigCache.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,252 +1,252 @@\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.config.utils;\n-\n-import org.apache.dubbo.common.utils.CollectionUtils;\n-import org.apache.dubbo.common.utils.StringUtils;\n-import org.apache.dubbo.config.ReferenceConfigBase;\n-import org.apache.dubbo.rpc.model.ApplicationModel;\n-import org.apache.dubbo.rpc.service.Destroyable;\n-\n-import java.util.ArrayList;\n-import java.util.Collections;\n-import java.util.List;\n-import java.util.Map;\n-import java.util.concurrent.ConcurrentHashMap;\n-import java.util.concurrent.ConcurrentMap;\n-\n-/**\n- * A simple util class for cache {@link ReferenceConfigBase}.\n- * <p>\n- * {@link ReferenceConfigBase} is a heavy Object, it's necessary to cache these object\n- * for the framework which create {@link ReferenceConfigBase} frequently.\n- * <p>\n- * You can implement and use your own {@link ReferenceConfigBase} cache if you need use complicate strategy.\n- */\n-public class ReferenceConfigCache {\n-    public static final String DEFAULT_NAME = \"_DEFAULT_\";\n-    /**\n-     * Create the key with the <b>Group</b>, <b>Interface</b> and <b>version</b> attribute of {@link ReferenceConfigBase}.\n-     * <p>\n-     * key example: <code>group1/org.apache.dubbo.foo.FooService:1.0.0</code>.\n-     */\n-    public static final KeyGenerator DEFAULT_KEY_GENERATOR = referenceConfig -> {\n-        String iName = referenceConfig.getInterface();\n-        if (StringUtils.isBlank(iName)) {\n-            Class<?> clazz = referenceConfig.getInterfaceClass();\n-            iName = clazz.getName();\n-        }\n-        if (StringUtils.isBlank(iName)) {\n-            throw new IllegalArgumentException(\"No interface info in ReferenceConfig\" + referenceConfig);\n-        }\n-\n-        StringBuilder ret = new StringBuilder();\n-        if (!StringUtils.isBlank(referenceConfig.getGroup())) {\n-            ret.append(referenceConfig.getGroup()).append(\"/\");\n-        }\n-        ret.append(iName);\n-        if (!StringUtils.isBlank(referenceConfig.getVersion())) {\n-            ret.append(\":\").append(referenceConfig.getVersion());\n-        }\n-        return ret.toString();\n-    };\n-\n-    static final ConcurrentMap<String, ReferenceConfigCache> CACHE_HOLDER = new ConcurrentHashMap<String, ReferenceConfigCache>();\n-    private final String name;\n-    private final KeyGenerator generator;\n-\n-    private final ConcurrentMap<String, ReferenceConfigBase<?>> referredReferences = new ConcurrentHashMap<>();\n-\n-    private final ConcurrentMap<Class<?>, ConcurrentMap<String, Object>> proxies = new ConcurrentHashMap<>();\n-\n-    private ReferenceConfigCache(String name, KeyGenerator generator) {\n-        this.name = name;\n-        this.generator = generator;\n-    }\n-\n-    /**\n-     * Get the cache use default name and {@link #DEFAULT_KEY_GENERATOR} to generate cache key.\n-     * Create cache if not existed yet.\n-     */\n-    public static ReferenceConfigCache getCache() {\n-        return getCache(DEFAULT_NAME);\n-    }\n-\n-    /**\n-     * Get the cache use specified name and {@link KeyGenerator}.\n-     * Create cache if not existed yet.\n-     */\n-    public static ReferenceConfigCache getCache(String name) {\n-        return getCache(name, DEFAULT_KEY_GENERATOR);\n-    }\n-\n-    /**\n-     * Get the cache use specified {@link KeyGenerator}.\n-     * Create cache if not existed yet.\n-     */\n-    public static ReferenceConfigCache getCache(String name, KeyGenerator keyGenerator) {\n-        return CACHE_HOLDER.computeIfAbsent(name, k -> new ReferenceConfigCache(k, keyGenerator));\n-    }\n-\n-    @SuppressWarnings(\"unchecked\")\n-    public <T> T get(ReferenceConfigBase<T> referenceConfig) {\n-        String key = generator.generateKey(referenceConfig);\n-        Class<?> type = referenceConfig.getInterfaceClass();\n-\n-        proxies.computeIfAbsent(type, _t -> new ConcurrentHashMap<>());\n-\n-        ConcurrentMap<String, Object> proxiesOfType = proxies.get(type);\n-        proxiesOfType.computeIfAbsent(key, _k -> {\n-            Object proxy = referenceConfig.get();\n-            referredReferences.put(key, referenceConfig);\n-            return proxy;\n-        });\n-\n-        return (T) proxiesOfType.get(key);\n-    }\n-\n-    /**\n-     * Fetch cache with the specified key. The key is decided by KeyGenerator passed-in. If the default KeyGenerator is\n-     * used, then the key is in the format of <code>group/interfaceClass:version</code>\n-     *\n-     * @param key  cache key\n-     * @param type object class\n-     * @param <T>  object type\n-     * @return object from the cached ReferenceConfigBase\n-     * @see KeyGenerator#generateKey(ReferenceConfigBase)\n-     */\n-    @SuppressWarnings(\"unchecked\")\n-    public <T> T get(String key, Class<T> type) {\n-        Map<String, Object> proxiesOfType = proxies.get(type);\n-        if (CollectionUtils.isEmptyMap(proxiesOfType)) {\n-            return null;\n-        }\n-        return (T) proxiesOfType.get(key);\n-    }\n-\n-    @SuppressWarnings(\"unchecked\")\n-    public <T> T get(String key) {\n-        ReferenceConfigBase<?> rc = referredReferences.get(key);\n-        if (rc == null) {\n-            return null;\n-        }\n-\n-        return (T) get(key, rc.getInterfaceClass());\n-    }\n-\n-    @SuppressWarnings(\"unchecked\")\n-    public <T> List<T> getAll(Class<T> type) {\n-        Map<String, Object> proxiesOfType = proxies.get(type);\n-        if (CollectionUtils.isEmptyMap(proxiesOfType)) {\n-            return Collections.emptyList();\n-        }\n-\n-        List<T> proxySet = new ArrayList<>();\n-        proxiesOfType.values().forEach(obj -> proxySet.add((T) obj));\n-        return proxySet;\n-    }\n-\n-    @SuppressWarnings(\"unchecked\")\n-    public <T> T get(Class<T> type) {\n-        Map<String, Object> proxiesOfType = proxies.get(type);\n-        if (CollectionUtils.isEmptyMap(proxiesOfType)) {\n-            return null;\n-        }\n-\n-        return (T) proxiesOfType.values().iterator().next();\n-    }\n-\n-    public void destroy(String key, Class<?> type) {\n-        ReferenceConfigBase<?> rc = referredReferences.remove(key);\n-        if (rc == null) {\n-            return;\n-        }\n-\n-        ApplicationModel.getConfigManager().removeConfig(rc);\n-        rc.destroy();\n-\n-        Map<String, Object> proxiesOftype = proxies.get(type);\n-        if (CollectionUtils.isNotEmptyMap(proxiesOftype)) {\n-            proxiesOftype.remove(key);\n-            if (proxiesOftype.isEmpty()) {\n-                proxies.remove(type);\n-            }\n-        }\n-    }\n-\n-    public void destroy(Class<?> type) {\n-        Map<String, Object> proxiesOfType = proxies.remove(type);\n-        proxiesOfType.forEach((k, v) -> {\n-            ReferenceConfigBase rc = referredReferences.remove(k);\n-            rc.destroy();\n-        });\n-    }\n-\n-    /**\n-     * clear and destroy one {@link ReferenceConfigBase} in the cache.\n-     *\n-     * @param referenceConfig use for create key.\n-     */\n-    public <T> void destroy(ReferenceConfigBase<T> referenceConfig) {\n-        String key = generator.generateKey(referenceConfig);\n-        Class<?> type = referenceConfig.getInterfaceClass();\n-\n-        destroy(key, type);\n-    }\n-\n-    /**\n-     * clear and destroy all {@link ReferenceConfigBase} in the cache.\n-     */\n-    public void destroyAll() {\n-        if (CollectionUtils.isEmptyMap(referredReferences)) {\n-            return;\n-        }\n-\n-        referredReferences.forEach((_k, referenceConfig) -> {\n-            referenceConfig.destroy();\n-            ApplicationModel.getConfigManager().removeConfig(referenceConfig);\n-        });\n-\n-        proxies.forEach((_type, proxiesOfType) -> {\n-            proxiesOfType.forEach((_k, v) -> {\n-                Destroyable proxy = (Destroyable) v;\n-                proxy.$destroy();\n-            });\n-        });\n-\n-        referredReferences.clear();\n-        proxies.clear();\n-    }\n-\n-    public ConcurrentMap<String, ReferenceConfigBase<?>> getReferredReferences() {\n-        return referredReferences;\n-    }\n-\n-    public ConcurrentMap<Class<?>, ConcurrentMap<String, Object>> getProxies() {\n-        return proxies;\n-    }\n-\n-    @Override\n-    public String toString() {\n-        return \"ReferenceConfigCache(name: \" + name\n-                + \")\";\n-    }\n-\n-    public interface KeyGenerator {\n-        String generateKey(ReferenceConfigBase<?> referenceConfig);\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.config.utils;\r\n+\r\n+import org.apache.dubbo.common.utils.CollectionUtils;\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+import org.apache.dubbo.config.ReferenceConfigBase;\r\n+import org.apache.dubbo.rpc.model.ApplicationModel;\r\n+import org.apache.dubbo.rpc.service.Destroyable;\r\n+\r\n+import java.util.ArrayList;\r\n+import java.util.Collections;\r\n+import java.util.List;\r\n+import java.util.Map;\r\n+import java.util.concurrent.ConcurrentHashMap;\r\n+import java.util.concurrent.ConcurrentMap;\r\n+\r\n+/**\r\n+ * A simple util class for cache {@link ReferenceConfigBase}.\r\n+ * <p>\r\n+ * {@link ReferenceConfigBase} is a heavy Object, it's necessary to cache these object\r\n+ * for the framework which create {@link ReferenceConfigBase} frequently.\r\n+ * <p>\r\n+ * You can implement and use your own {@link ReferenceConfigBase} cache if you need use complicate strategy.\r\n+ */\r\n+public class ReferenceConfigCache {\r\n+    public static final String DEFAULT_NAME = \"_DEFAULT_\";\r\n+    /**\r\n+     * Create the key with the <b>Group</b>, <b>Interface</b> and <b>version</b> attribute of {@link ReferenceConfigBase}.\r\n+     * <p>\r\n+     * key example: <code>group1/org.apache.dubbo.foo.FooService:1.0.0</code>.\r\n+     */\r\n+    public static final KeyGenerator DEFAULT_KEY_GENERATOR = referenceConfig -> {\r\n+        String iName = referenceConfig.getInterface();\r\n+        if (StringUtils.isBlank(iName)) {\r\n+            Class<?> clazz = referenceConfig.getInterfaceClass();\r\n+            iName = clazz.getName();\r\n+        }\r\n+        if (StringUtils.isBlank(iName)) {\r\n+            throw new IllegalArgumentException(\"No interface info in ReferenceConfig\" + referenceConfig);\r\n+        }\r\n+\r\n+        StringBuilder ret = new StringBuilder();\r\n+        if (!StringUtils.isBlank(referenceConfig.getGroup())) {\r\n+            ret.append(referenceConfig.getGroup()).append(\"/\");\r\n+        }\r\n+        ret.append(iName);\r\n+        if (!StringUtils.isBlank(referenceConfig.getVersion())) {\r\n+            ret.append(\":\").append(referenceConfig.getVersion());\r\n+        }\r\n+        return ret.toString();\r\n+    };\r\n+\r\n+    static final ConcurrentMap<String, ReferenceConfigCache> CACHE_HOLDER = new ConcurrentHashMap<String, ReferenceConfigCache>();\r\n+    private final String name;\r\n+    private final KeyGenerator generator;\r\n+\r\n+    private final ConcurrentMap<String, ReferenceConfigBase<?>> referredReferences = new ConcurrentHashMap<>();\r\n+\r\n+    private final ConcurrentMap<Class<?>, ConcurrentMap<String, Object>> proxies = new ConcurrentHashMap<>();\r\n+\r\n+    private ReferenceConfigCache(String name, KeyGenerator generator) {\r\n+        this.name = name;\r\n+        this.generator = generator;\r\n+    }\r\n+\r\n+    /**\r\n+     * Get the cache use default name and {@link #DEFAULT_KEY_GENERATOR} to generate cache key.\r\n+     * Create cache if not existed yet.\r\n+     */\r\n+    public static ReferenceConfigCache getCache() {\r\n+        return getCache(DEFAULT_NAME);\r\n+    }\r\n+\r\n+    /**\r\n+     * Get the cache use specified name and {@link KeyGenerator}.\r\n+     * Create cache if not existed yet.\r\n+     */\r\n+    public static ReferenceConfigCache getCache(String name) {\r\n+        return getCache(name, DEFAULT_KEY_GENERATOR);\r\n+    }\r\n+\r\n+    /**\r\n+     * Get the cache use specified {@link KeyGenerator}.\r\n+     * Create cache if not existed yet.\r\n+     */\r\n+    public static ReferenceConfigCache getCache(String name, KeyGenerator keyGenerator) {\r\n+        return CACHE_HOLDER.computeIfAbsent(name, k -> new ReferenceConfigCache(k, keyGenerator));\r\n+    }\r\n+\r\n+    @SuppressWarnings(\"unchecked\")\r\n+    public <T> T get(ReferenceConfigBase<T> referenceConfig) {\r\n+        String key = generator.generateKey(referenceConfig);\r\n+        Class<?> type = referenceConfig.getInterfaceClass();\r\n+\r\n+        proxies.computeIfAbsent(type, _t -> new ConcurrentHashMap<>());\r\n+\r\n+        ConcurrentMap<String, Object> proxiesOfType = proxies.get(type);\r\n+        proxiesOfType.computeIfAbsent(key, _k -> {\r\n+            Object proxy = referenceConfig.get();\r\n+            referredReferences.put(key, referenceConfig);\r\n+            return proxy;\r\n+        });\r\n+\r\n+        return (T) proxiesOfType.get(key);\r\n+    }\r\n+\r\n+    /**\r\n+     * Fetch cache with the specified key. The key is decided by KeyGenerator passed-in. If the default KeyGenerator is\r\n+     * used, then the key is in the format of <code>group/interfaceClass:version</code>\r\n+     *\r\n+     * @param key  cache key\r\n+     * @param type object class\r\n+     * @param <T>  object type\r\n+     * @return object from the cached ReferenceConfigBase\r\n+     * @see KeyGenerator#generateKey(ReferenceConfigBase)\r\n+     */\r\n+    @SuppressWarnings(\"unchecked\")\r\n+    public <T> T get(String key, Class<T> type) {\r\n+        Map<String, Object> proxiesOfType = proxies.get(type);\r\n+        if (CollectionUtils.isEmptyMap(proxiesOfType)) {\r\n+            return null;\r\n+        }\r\n+        return (T) proxiesOfType.get(key);\r\n+    }\r\n+\r\n+    @SuppressWarnings(\"unchecked\")\r\n+    public <T> T get(String key) {\r\n+        ReferenceConfigBase<?> rc = referredReferences.get(key);\r\n+        if (rc == null) {\r\n+            return null;\r\n+        }\r\n+\r\n+        return (T) get(key, rc.getInterfaceClass());\r\n+    }\r\n+\r\n+    @SuppressWarnings(\"unchecked\")\r\n+    public <T> List<T> getAll(Class<T> type) {\r\n+        Map<String, Object> proxiesOfType = proxies.get(type);\r\n+        if (CollectionUtils.isEmptyMap(proxiesOfType)) {\r\n+            return Collections.emptyList();\r\n+        }\r\n+\r\n+        List<T> proxySet = new ArrayList<>();\r\n+        proxiesOfType.values().forEach(obj -> proxySet.add((T) obj));\r\n+        return proxySet;\r\n+    }\r\n+\r\n+    @SuppressWarnings(\"unchecked\")\r\n+    public <T> T get(Class<T> type) {\r\n+        Map<String, Object> proxiesOfType = proxies.get(type);\r\n+        if (CollectionUtils.isEmptyMap(proxiesOfType)) {\r\n+            return null;\r\n+        }\r\n+\r\n+        return (T) proxiesOfType.values().iterator().next();\r\n+    }\r\n+\r\n+    public void destroy(String key, Class<?> type) {\r\n+        ReferenceConfigBase<?> rc = referredReferences.remove(key);\r\n+        if (rc == null) {\r\n+            return;\r\n+        }\r\n+\r\n+        ApplicationModel.getConfigManager().removeConfig(rc);\r\n+        rc.destroy();\r\n+\r\n+        Map<String, Object> proxiesOftype = proxies.get(type);\r\n+        if (CollectionUtils.isNotEmptyMap(proxiesOftype)) {\r\n+            proxiesOftype.remove(key);\r\n+            if (proxiesOftype.isEmpty()) {\r\n+                proxies.remove(type);\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    public void destroy(Class<?> type) {\r\n+        Map<String, Object> proxiesOfType = proxies.remove(type);\r\n+        proxiesOfType.forEach((k, v) -> {\r\n+            ReferenceConfigBase rc = referredReferences.remove(k);\r\n+            rc.destroy();\r\n+        });\r\n+    }\r\n+\r\n+    /**\r\n+     * clear and destroy one {@link ReferenceConfigBase} in the cache.\r\n+     *\r\n+     * @param referenceConfig use for create key.\r\n+     */\r\n+    public <T> void destroy(ReferenceConfigBase<T> referenceConfig) {\r\n+        String key = generator.generateKey(referenceConfig);\r\n+        Class<?> type = referenceConfig.getInterfaceClass();\r\n+\r\n+        destroy(key, type);\r\n+    }\r\n+\r\n+    /**\r\n+     * clear and destroy all {@link ReferenceConfigBase} in the cache.\r\n+     */\r\n+    public void destroyAll() {\r\n+        if (CollectionUtils.isEmptyMap(referredReferences)) {\r\n+            return;\r\n+        }\r\n+\r\n+        referredReferences.forEach((_k, referenceConfig) -> {\r\n+            referenceConfig.destroy();\r\n+            ApplicationModel.getConfigManager().removeConfig(referenceConfig);\r\n+        });\r\n+\r\n+        proxies.forEach((_type, proxiesOfType) -> {\r\n+            proxiesOfType.forEach((_k, v) -> {\r\n+                Destroyable proxy = (Destroyable) v;\r\n+                proxy.$destroy();\r\n+            });\r\n+        });\r\n+\r\n+        referredReferences.clear();\r\n+        proxies.clear();\r\n+    }\r\n+\r\n+    public ConcurrentMap<String, ReferenceConfigBase<?>> getReferredReferences() {\r\n+        return referredReferences;\r\n+    }\r\n+\r\n+    public ConcurrentMap<Class<?>, ConcurrentMap<String, Object>> getProxies() {\r\n+        return proxies;\r\n+    }\r\n+\r\n+    @Override\r\n+    public String toString() {\r\n+        return \"ReferenceConfigCache(name: \" + name\r\n+                + \")\";\r\n+    }\r\n+\r\n+    public interface KeyGenerator {\r\n+        String generateKey(ReferenceConfigBase<?> referenceConfig);\r\n+    }\r\n+}\r\n"}]}
