diff --git a/.travis.yml b/.travis.yml index 02dd854c..d8e265d4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,5 @@ language: objective-c -osx_image: xcode8.3 +osx_image: xcode10 xcode_workspace: ShadowsocksX-NG.xcworkspace xcode_scheme: ShadowsocksX-NG script: set -o pipefail && xcodebuild test -workspace ShadowsocksX-NG.xcworkspace -scheme ShadowsocksX-NG -sdk macosx10.12 CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO|xcpretty diff --git a/Podfile b/Podfile index 4dfad19e..f2d60087 100644 --- a/Podfile +++ b/Podfile @@ -23,7 +23,7 @@ end post_install do |installer| installer.pods_project.targets.each do |target| target.build_configurations.each do |config| - config.build_settings['SWIFT_VERSION'] = '3.0' + config.build_settings['SWIFT_VERSION'] = '4.2' end end end diff --git a/Podfile.lock b/Podfile.lock index d43d1e33..453e037f 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -1,20 +1,26 @@ PODS: - Alamofire (4.2.0) - BRLOptionParser (0.3.1) - - GCDWebServer (3.3.3): - - GCDWebServer/Core (= 3.3.3) - - GCDWebServer/Core (3.3.3) + - GCDWebServer (3.4.2): + - GCDWebServer/Core (= 3.4.2) + - GCDWebServer/Core (3.4.2) DEPENDENCIES: - Alamofire (~> 4.2.0) - BRLOptionParser (~> 0.3.1) - GCDWebServer (~> 3.0) +SPEC REPOS: + https://github.com/cocoapods/specs.git: + - Alamofire + - BRLOptionParser + - GCDWebServer + SPEC CHECKSUMS: Alamofire: aa2e09d871c9160ac53c90e83c68064a94e3dfbe BRLOptionParser: a03256a8ff003ca1f5376c55f55f210e085a3958 - GCDWebServer: 1c39a1f0763e4eb492bee021e4270fce097d3555 + GCDWebServer: 8d67ee9f634b4bb91eb4b8aee440318a5fc6debd -PODFILE CHECKSUM: 8e98b2fb2d6be56882a44b2ff9241a800101e1d4 +PODFILE CHECKSUM: 6b485731eac897a000e5b608b7849ad661fe16da -COCOAPODS: 1.1.1 +COCOAPODS: 1.5.3 diff --git a/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServer.h b/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServer.h index 78fb4c0b..59572bab 100644 --- a/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServer.h +++ b/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServer.h @@ -30,6 +30,8 @@ #import "GCDWebServerRequest.h" #import "GCDWebServerResponse.h" +NS_ASSUME_NONNULL_BEGIN + /** * The GCDWebServerMatchBlock is called for every handler added to the * GCDWebServer whenever a new HTTP request has started (i.e. HTTP headers have @@ -40,7 +42,7 @@ * GCDWebServerRequest instance created with the same basic info. * Otherwise, it simply returns nil. */ -typedef GCDWebServerRequest* (^GCDWebServerMatchBlock)(NSString* requestMethod, NSURL* requestURL, NSDictionary* requestHeaders, NSString* urlPath, NSDictionary* urlQuery); +typedef GCDWebServerRequest* _Nullable (^GCDWebServerMatchBlock)(NSString* requestMethod, NSURL* requestURL, NSDictionary* requestHeaders, NSString* urlPath, NSDictionary* urlQuery); /** * The GCDWebServerProcessBlock is called after the HTTP request has been fully @@ -52,7 +54,7 @@ typedef GCDWebServerRequest* (^GCDWebServerMatchBlock)(NSString* requestMethod, * recommended to return a GCDWebServerErrorResponse on error so more useful * information can be returned to the client. */ -typedef GCDWebServerResponse* (^GCDWebServerProcessBlock)(__kindof GCDWebServerRequest* request); +typedef GCDWebServerResponse* _Nullable (^GCDWebServerProcessBlock)(__kindof GCDWebServerRequest* request); /** * The GCDWebServerAsynchronousProcessBlock works like the GCDWebServerProcessBlock @@ -64,7 +66,7 @@ typedef GCDWebServerResponse* (^GCDWebServerProcessBlock)(__kindof GCDWebServerR * It's however recommended to return a GCDWebServerErrorResponse on error so more * useful information can be returned to the client. */ -typedef void (^GCDWebServerCompletionBlock)(GCDWebServerResponse* response); +typedef void (^GCDWebServerCompletionBlock)(GCDWebServerResponse* _Nullable response); typedef void (^GCDWebServerAsyncProcessBlock)(__kindof GCDWebServerRequest* request, GCDWebServerCompletionBlock completionBlock); /** @@ -295,7 +297,7 @@ extern NSString* const GCDWebServerAuthenticationMethod_DigestAccess; /** * Sets the delegate for the server. */ -@property(nonatomic, assign) id delegate; +@property(nonatomic, weak, nullable) id delegate; /** * Returns YES if the server is currently running. @@ -315,7 +317,7 @@ extern NSString* const GCDWebServerAuthenticationMethod_DigestAccess; * @warning This property is only valid if the server is running and Bonjour * registration has successfully completed, which can take up to a few seconds. */ -@property(nonatomic, readonly) NSString* bonjourName; +@property(nonatomic, readonly, nullable) NSString* bonjourName; /** * Returns the Bonjour service type used by the server. @@ -323,7 +325,7 @@ extern NSString* const GCDWebServerAuthenticationMethod_DigestAccess; * @warning This property is only valid if the server is running and Bonjour * registration has successfully completed, which can take up to a few seconds. */ -@property(nonatomic, readonly) NSString* bonjourType; +@property(nonatomic, readonly, nullable) NSString* bonjourType; /** * This method is the designated initializer for the class. @@ -363,7 +365,7 @@ extern NSString* const GCDWebServerAuthenticationMethod_DigestAccess; * * Returns NO if the server failed to start and sets "error" argument if not NULL. */ -- (BOOL)startWithOptions:(NSDictionary*)options error:(NSError**)error; +- (BOOL)startWithOptions:(nullable NSDictionary*)options error:(NSError** _Nullable)error; /** * Stops the server and prevents it to accepts new HTTP requests. @@ -383,7 +385,7 @@ extern NSString* const GCDWebServerAuthenticationMethod_DigestAccess; * * @warning This property is only valid if the server is running. */ -@property(nonatomic, readonly) NSURL* serverURL; +@property(nonatomic, readonly, nullable) NSURL* serverURL; /** * Returns the server's Bonjour URL. @@ -393,7 +395,7 @@ extern NSString* const GCDWebServerAuthenticationMethod_DigestAccess; * Also be aware this property will not automatically update if the Bonjour hostname * has been dynamically changed after the server started running (this should be rare). */ -@property(nonatomic, readonly) NSURL* bonjourServerURL; +@property(nonatomic, readonly, nullable) NSURL* bonjourServerURL; /** * Returns the server's public URL. @@ -401,7 +403,7 @@ extern NSString* const GCDWebServerAuthenticationMethod_DigestAccess; * @warning This property is only valid if the server is running and NAT port * mapping is active. */ -@property(nonatomic, readonly) NSURL* publicServerURL; +@property(nonatomic, readonly, nullable) NSURL* publicServerURL; /** * Starts the server on port 8080 (OS X & iOS Simulator) or port 80 (iOS) @@ -418,7 +420,7 @@ extern NSString* const GCDWebServerAuthenticationMethod_DigestAccess; * * Returns NO if the server failed to start. */ -- (BOOL)startWithPort:(NSUInteger)port bonjourName:(NSString*)name; +- (BOOL)startWithPort:(NSUInteger)port bonjourName:(nullable NSString*)name; #if !TARGET_OS_IPHONE @@ -431,7 +433,7 @@ extern NSString* const GCDWebServerAuthenticationMethod_DigestAccess; * * @warning This method must be used from the main thread only. */ -- (BOOL)runWithPort:(NSUInteger)port bonjourName:(NSString*)name; +- (BOOL)runWithPort:(NSUInteger)port bonjourName:(nullable NSString*)name; /** * Runs the server synchronously using -startWithOptions: until a SIGTERM or @@ -442,7 +444,7 @@ extern NSString* const GCDWebServerAuthenticationMethod_DigestAccess; * * @warning This method must be used from the main thread only. */ -- (BOOL)runWithOptions:(NSDictionary*)options error:(NSError**)error; +- (BOOL)runWithOptions:(nullable NSDictionary*)options error:(NSError** _Nullable)error; #endif @@ -498,7 +500,7 @@ extern NSString* const GCDWebServerAuthenticationMethod_DigestAccess; * Adds a handler to the server to respond to incoming "GET" HTTP requests * with a specific case-insensitive path with in-memory data. */ -- (void)addGETHandlerForPath:(NSString*)path staticData:(NSData*)staticData contentType:(NSString*)contentType cacheAge:(NSUInteger)cacheAge; +- (void)addGETHandlerForPath:(NSString*)path staticData:(NSData*)staticData contentType:(nullable NSString*)contentType cacheAge:(NSUInteger)cacheAge; /** * Adds a handler to the server to respond to incoming "GET" HTTP requests @@ -515,7 +517,7 @@ extern NSString* const GCDWebServerAuthenticationMethod_DigestAccess; * The "indexFilename" argument allows to specify an "index" file name to use * when the request path corresponds to a directory. */ -- (void)addGETHandlerForBasePath:(NSString*)basePath directoryPath:(NSString*)directoryPath indexFilename:(NSString*)indexFilename cacheAge:(NSUInteger)cacheAge allowRangeRequests:(BOOL)allowRangeRequests; +- (void)addGETHandlerForBasePath:(NSString*)basePath directoryPath:(NSString*)directoryPath indexFilename:(nullable NSString*)indexFilename cacheAge:(NSUInteger)cacheAge allowRangeRequests:(BOOL)allowRangeRequests; @end @@ -530,11 +532,10 @@ extern NSString* const GCDWebServerAuthenticationMethod_DigestAccess; * * Currently supported third-party logging facilities are: * - XLFacility (by the same author as GCDWebServer): https://github.com/swisspol/XLFacility - * - CocoaLumberjack: https://github.com/CocoaLumberjack/CocoaLumberjack * - * For both the built-in logging facility and CocoaLumberjack, the default - * logging level is INFO (or DEBUG if the preprocessor constant "DEBUG" - * evaluates to non-zero at compile time). + * For the built-in logging facility, the default logging level is INFO + * (or DEBUG if the preprocessor constant "DEBUG" evaluates to non-zero at + * compile time). * * It's possible to have GCDWebServer use a custom logging facility by defining * the "__GCDWEBSERVER_LOGGING_HEADER__" preprocessor constant in Xcode build @@ -575,22 +576,22 @@ extern NSString* const GCDWebServerAuthenticationMethod_DigestAccess; /** * Logs a message to the logging facility at the VERBOSE level. */ -- (void)logVerbose:(NSString*)format, ... NS_FORMAT_FUNCTION(1,2); +- (void)logVerbose:(NSString*)format, ... NS_FORMAT_FUNCTION(1, 2); /** * Logs a message to the logging facility at the INFO level. */ -- (void)logInfo:(NSString*)format, ... NS_FORMAT_FUNCTION(1,2); +- (void)logInfo:(NSString*)format, ... NS_FORMAT_FUNCTION(1, 2); /** * Logs a message to the logging facility at the WARNING level. */ -- (void)logWarning:(NSString*)format, ... NS_FORMAT_FUNCTION(1,2); +- (void)logWarning:(NSString*)format, ... NS_FORMAT_FUNCTION(1, 2); /** * Logs a message to the logging facility at the ERROR level. */ -- (void)logError:(NSString*)format, ... NS_FORMAT_FUNCTION(1,2); +- (void)logError:(NSString*)format, ... NS_FORMAT_FUNCTION(1, 2); @end @@ -612,8 +613,10 @@ extern NSString* const GCDWebServerAuthenticationMethod_DigestAccess; * * Returns the number of failed tests or -1 if server failed to start. */ -- (NSInteger)runTestsWithOptions:(NSDictionary*)options inDirectory:(NSString*)path; +- (NSInteger)runTestsWithOptions:(nullable NSDictionary*)options inDirectory:(NSString*)path; @end #endif + +NS_ASSUME_NONNULL_END diff --git a/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServer.m b/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServer.m index c773f948..e52ccd4d 100644 --- a/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServer.m +++ b/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServer.m @@ -77,12 +77,6 @@ #else GCDWebServerLoggingLevel GCDWebServerLogLevel = kGCDWebServerLoggingLevel_Info; #endif -#elif defined(__GCDWEBSERVER_LOGGING_FACILITY_COCOALUMBERJACK__) -#if DEBUG -DDLogLevel GCDWebServerLogLevel = DDLogLevelDebug; -#else -DDLogLevel GCDWebServerLogLevel = DDLogLevelInfo; -#endif #endif #if !TARGET_OS_IPHONE @@ -132,18 +126,9 @@ static void _ExecuteMainThreadRunLoopSources() { #endif -@interface GCDWebServerHandler () { -@private - GCDWebServerMatchBlock _matchBlock; - GCDWebServerAsyncProcessBlock _asyncProcessBlock; -} -@end - @implementation GCDWebServerHandler -@synthesize matchBlock=_matchBlock, asyncProcessBlock=_asyncProcessBlock; - -- (id)initWithMatchBlock:(GCDWebServerMatchBlock)matchBlock asyncProcessBlock:(GCDWebServerAsyncProcessBlock)processBlock { +- (instancetype)initWithMatchBlock:(GCDWebServerMatchBlock _Nonnull)matchBlock asyncProcessBlock:(GCDWebServerAsyncProcessBlock _Nonnull)processBlock { if ((self = [super init])) { _matchBlock = [matchBlock copy]; _asyncProcessBlock = [processBlock copy]; @@ -153,26 +138,19 @@ - (id)initWithMatchBlock:(GCDWebServerMatchBlock)matchBlock asyncProcessBlock:(G @end -@interface GCDWebServer () { -@private - id __unsafe_unretained _delegate; +@implementation GCDWebServer { dispatch_queue_t _syncQueue; dispatch_group_t _sourceGroup; NSMutableArray* _handlers; NSInteger _activeConnections; // Accessed through _syncQueue only BOOL _connected; // Accessed on main thread only CFRunLoopTimerRef _disconnectTimer; // Accessed on main thread only - + NSDictionary* _options; - NSString* _serverName; - NSString* _authenticationRealm; NSMutableDictionary* _authenticationBasicAccounts; NSMutableDictionary* _authenticationDigestAccounts; Class _connectionClass; - BOOL _mapHEADToGET; CFTimeInterval _disconnectDelay; - dispatch_queue_priority_t _dispatchQueuePriority; - NSUInteger _port; dispatch_source_t _source4; dispatch_source_t _source6; CFNetServiceRef _registrationService; @@ -191,13 +169,6 @@ @interface GCDWebServer () { BOOL _recording; #endif } -@end - -@implementation GCDWebServer - -@synthesize delegate=_delegate, handlers=_handlers, port=_port, serverName=_serverName, authenticationRealm=_authenticationRealm, - authenticationBasicAccounts=_authenticationBasicAccounts, authenticationDigestAccounts=_authenticationDigestAccounts, - shouldAutomaticallyMapHEADToGET=_mapHEADToGET, dispatchQueuePriority=_dispatchQueuePriority; + (void)initialize { GCDWebServerInitializeFunctions(); @@ -220,7 +191,7 @@ - (void)dealloc { GWS_DCHECK(_activeConnections == 0); GWS_DCHECK(_options == nil); // The server can never be dealloc'ed while running because of the retain-cycle with the dispatch source GWS_DCHECK(_disconnectTimer == NULL); // The server can never be dealloc'ed while the disconnect timer is pending because of the retain-cycle - + #if !OS_OBJECT_USE_OBJC_RETAIN_RELEASE dispatch_release(_sourceGroup); dispatch_release(_syncQueue); @@ -235,10 +206,10 @@ - (void)_startBackgroundTask { if (_backgroundTask == UIBackgroundTaskInvalid) { GWS_LOG_DEBUG(@"Did start background task"); _backgroundTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ - + GWS_LOG_WARNING(@"Application is being suspended while %@ is still connected", [self class]); [self _endBackgroundTask]; - + }]; } else { GWS_DNOT_REACHED(); @@ -253,13 +224,13 @@ - (void)_didConnect { GWS_DCHECK(_connected == NO); _connected = YES; GWS_LOG_DEBUG(@"Did connect"); - + #if TARGET_OS_IPHONE if ([[UIApplication sharedApplication] applicationState] != UIApplicationStateBackground) { [self _startBackgroundTask]; } #endif - + if ([_delegate respondsToSelector:@selector(webServerDidConnect:)]) { [_delegate webServerDidConnect:self]; } @@ -267,7 +238,7 @@ - (void)_didConnect { - (void)willStartConnection:(GCDWebServerConnection*)connection { dispatch_sync(_syncQueue, ^{ - + GWS_DCHECK(_activeConnections >= 0); if (_activeConnections == 0) { dispatch_async(dispatch_get_main_queue(), ^{ @@ -282,7 +253,7 @@ - (void)willStartConnection:(GCDWebServerConnection*)connection { }); } _activeConnections += 1; - + }); } @@ -309,11 +280,11 @@ - (void)_didDisconnect { GWS_DCHECK(_connected == YES); _connected = NO; GWS_LOG_DEBUG(@"Did disconnect"); - + #if TARGET_OS_IPHONE [self _endBackgroundTask]; #endif - + if ([_delegate respondsToSelector:@selector(webServerDidDisconnect:)]) { [_delegate webServerDidDisconnect:self]; } @@ -356,9 +327,10 @@ - (NSString*)bonjourType { } - (void)addHandlerWithMatchBlock:(GCDWebServerMatchBlock)matchBlock processBlock:(GCDWebServerProcessBlock)processBlock { - [self addHandlerWithMatchBlock:matchBlock asyncProcessBlock:^(GCDWebServerRequest* request, GCDWebServerCompletionBlock completionBlock) { - completionBlock(processBlock(request)); - }]; + [self addHandlerWithMatchBlock:matchBlock + asyncProcessBlock:^(GCDWebServerRequest* request, GCDWebServerCompletionBlock completionBlock) { + completionBlock(processBlock(request)); + }]; } - (void)addHandlerWithMatchBlock:(GCDWebServerMatchBlock)matchBlock asyncProcessBlock:(GCDWebServerAsyncProcessBlock)processBlock { @@ -464,7 +436,7 @@ - (int)_createListeningSocket:(BOOL)useIPv6 if (listeningSocket > 0) { int yes = 1; setsockopt(listeningSocket, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes)); - + if (bind(listeningSocket, address, length) == 0) { if (listen(listeningSocket, (int)maxPendingConnections) == 0) { GWS_LOG_DEBUG(@"Did open %s listening socket %i", useIPv6 ? "IPv6" : "IPv4", listeningSocket); @@ -483,7 +455,7 @@ - (int)_createListeningSocket:(BOOL)useIPv6 GWS_LOG_ERROR(@"Failed binding %s listening socket: %s (%i)", useIPv6 ? "IPv6" : "IPv4", strerror(errno), errno); close(listeningSocket); } - + } else { if (error) { *error = GCDWebServerMakePosixError(errno); @@ -497,7 +469,7 @@ - (dispatch_source_t)_createDispatchSourceWithListeningSocket:(int)listeningSock dispatch_group_enter(_sourceGroup); dispatch_source_t source = dispatch_source_create(DISPATCH_SOURCE_TYPE_READ, listeningSocket, 0, dispatch_get_global_queue(_dispatchQueuePriority, 0)); dispatch_source_set_cancel_handler(source, ^{ - + @autoreleasepool { int result = close(listeningSocket); if (result != 0) { @@ -507,17 +479,17 @@ - (dispatch_source_t)_createDispatchSourceWithListeningSocket:(int)listeningSock } } dispatch_group_leave(_sourceGroup); - + }); dispatch_source_set_event_handler(source, ^{ - + @autoreleasepool { struct sockaddr_storage remoteSockAddr; socklen_t remoteAddrLen = sizeof(remoteSockAddr); int socket = accept(listeningSocket, (struct sockaddr*)&remoteSockAddr, &remoteAddrLen); if (socket > 0) { NSData* remoteAddress = [NSData dataWithBytes:&remoteSockAddr length:remoteAddrLen]; - + struct sockaddr_storage localSockAddr; socklen_t localAddrLen = sizeof(localSockAddr); NSData* localAddress = nil; @@ -527,28 +499,28 @@ - (dispatch_source_t)_createDispatchSourceWithListeningSocket:(int)listeningSock } else { GWS_DNOT_REACHED(); } - + int noSigPipe = 1; setsockopt(socket, SOL_SOCKET, SO_NOSIGPIPE, &noSigPipe, sizeof(noSigPipe)); // Make sure this socket cannot generate SIG_PIPE - + GCDWebServerConnection* connection = [[_connectionClass alloc] initWithServer:self localAddress:localAddress remoteAddress:remoteAddress socket:socket]; // Connection will automatically retain itself while opened [connection self]; // Prevent compiler from complaining about unused variable / useless statement } else { GWS_LOG_ERROR(@"Failed accepting %s socket: %s (%i)", isIPv6 ? "IPv6" : "IPv4", strerror(errno), errno); } } - + }); return source; } - (BOOL)_start:(NSError**)error { GWS_DCHECK(_source4 == NULL); - + NSUInteger port = [_GetOption(_options, GCDWebServerOption_Port, @0) unsignedIntegerValue]; BOOL bindToLocalhost = [_GetOption(_options, GCDWebServerOption_BindToLocalhost, @NO) boolValue]; NSUInteger maxPendingConnections = [_GetOption(_options, GCDWebServerOption_MaxPendingConnections, @16) unsignedIntegerValue]; - + struct sockaddr_in addr4; bzero(&addr4, sizeof(addr4)); addr4.sin_len = sizeof(addr4); @@ -568,7 +540,7 @@ - (BOOL)_start:(NSError**)error { GWS_LOG_ERROR(@"Failed retrieving socket address: %s (%i)", strerror(errno), errno); } } - + struct sockaddr_in6 addr6; bzero(&addr6, sizeof(addr6)); addr6.sin6_len = sizeof(addr6); @@ -580,7 +552,7 @@ - (BOOL)_start:(NSError**)error { close(listeningSocket4); return NO; } - + _serverName = [_GetOption(_options, GCDWebServerOption_ServerName, NSStringFromClass([self class])) copy]; NSString* authenticationMethod = _GetOption(_options, GCDWebServerOption_AuthenticationMethod, nil); if ([authenticationMethod isEqualToString:GCDWebServerAuthenticationMethod_Basic]) { @@ -599,27 +571,27 @@ - (BOOL)_start:(NSError**)error { }]; } _connectionClass = _GetOption(_options, GCDWebServerOption_ConnectionClass, [GCDWebServerConnection class]); - _mapHEADToGET = [_GetOption(_options, GCDWebServerOption_AutomaticallyMapHEADToGET, @YES) boolValue]; + _shouldAutomaticallyMapHEADToGET = [_GetOption(_options, GCDWebServerOption_AutomaticallyMapHEADToGET, @YES) boolValue]; _disconnectDelay = [_GetOption(_options, GCDWebServerOption_ConnectedStateCoalescingInterval, @1.0) doubleValue]; _dispatchQueuePriority = [_GetOption(_options, GCDWebServerOption_DispatchQueuePriority, @(DISPATCH_QUEUE_PRIORITY_DEFAULT)) longValue]; - + _source4 = [self _createDispatchSourceWithListeningSocket:listeningSocket4 isIPv6:NO]; _source6 = [self _createDispatchSourceWithListeningSocket:listeningSocket6 isIPv6:YES]; _port = port; _bindToLocalhost = bindToLocalhost; - + NSString* bonjourName = _GetOption(_options, GCDWebServerOption_BonjourName, nil); NSString* bonjourType = _GetOption(_options, GCDWebServerOption_BonjourType, @"_http._tcp"); if (bonjourName) { _registrationService = CFNetServiceCreate(kCFAllocatorDefault, CFSTR("local."), (__bridge CFStringRef)bonjourType, (__bridge CFStringRef)(bonjourName.length ? bonjourName : _serverName), (SInt32)_port); if (_registrationService) { CFNetServiceClientContext context = {0, (__bridge void*)self, NULL, NULL, NULL}; - + CFNetServiceSetClient(_registrationService, _NetServiceRegisterCallBack, &context); CFNetServiceScheduleWithRunLoop(_registrationService, CFRunLoopGetMain(), kCFRunLoopCommonModes); CFStreamError streamError = {0}; CFNetServiceRegisterWithOptions(_registrationService, 0, &streamError); - + _resolutionService = CFNetServiceCreateCopy(kCFAllocatorDefault, _registrationService); if (_resolutionService) { CFNetServiceSetClient(_resolutionService, _NetServiceResolveCallBack, &context); @@ -631,7 +603,7 @@ - (BOOL)_start:(NSError**)error { GWS_LOG_ERROR(@"Failed creating CFNetService for registration"); } } - + if ([_GetOption(_options, GCDWebServerOption_RequestNATPortMapping, @NO) boolValue]) { DNSServiceErrorType status = DNSServiceNATPortMappingCreate(&_dnsService, 0, 0, kDNSServiceProtocol_TCP, htons(port), htons(port), 0, _DNSServiceCallBack, (__bridge void*)self); if (status == kDNSServiceErr_NoError) { @@ -654,7 +626,7 @@ - (BOOL)_start:(NSError**)error { GWS_LOG_ERROR(@"Failed creating NAT port mapping (%i)", status); } } - + dispatch_resume(_source4); dispatch_resume(_source6); GWS_LOG_INFO(@"%@ started on port %i and reachable at %@", [self class], (int)_port, self.serverURL); @@ -663,13 +635,13 @@ - (BOOL)_start:(NSError**)error { [_delegate webServerDidStart:self]; }); } - + return YES; } - (void)_stop { GWS_DCHECK(_source4 != NULL); - + if (_dnsService) { _dnsAddress = nil; _dnsPort = 0; @@ -685,7 +657,7 @@ - (void)_stop { DNSServiceRefDeallocate(_dnsService); _dnsService = NULL; } - + if (_registrationService) { if (_resolutionService) { CFNetServiceUnscheduleFromRunLoop(_resolutionService, CFRunLoopGetMain(), kCFRunLoopCommonModes); @@ -700,7 +672,7 @@ - (void)_stop { CFRelease(_registrationService); _registrationService = NULL; } - + dispatch_source_cancel(_source6); dispatch_source_cancel(_source4); dispatch_group_wait(_sourceGroup, DISPATCH_TIME_FOREVER); // Wait until the cancellation handlers have been called which guarantees the listening sockets are closed @@ -714,12 +686,12 @@ - (void)_stop { _source4 = NULL; _port = 0; _bindToLocalhost = NO; - + _serverName = nil; _authenticationRealm = nil; _authenticationBasicAccounts = nil; _authenticationDigestAccounts = nil; - + dispatch_async(dispatch_get_main_queue(), ^{ if (_disconnectTimer) { CFRunLoopTimerInvalidate(_disconnectTimer); @@ -728,7 +700,7 @@ - (void)_stop { [self _didDisconnect]; } }); - + GWS_LOG_INFO(@"%@ stopped", [self class]); if ([_delegate respondsToSelector:@selector(webServerDidStop:)]) { dispatch_async(dispatch_get_main_queue(), ^{ @@ -896,32 +868,38 @@ - (BOOL)runWithOptions:(NSDictionary*)options error:(NSError**)error { @implementation GCDWebServer (Handlers) - (void)addDefaultHandlerForMethod:(NSString*)method requestClass:(Class)aClass processBlock:(GCDWebServerProcessBlock)block { - [self addDefaultHandlerForMethod:method requestClass:aClass asyncProcessBlock:^(GCDWebServerRequest* request, GCDWebServerCompletionBlock completionBlock) { - completionBlock(block(request)); - }]; + [self addDefaultHandlerForMethod:method + requestClass:aClass + asyncProcessBlock:^(GCDWebServerRequest* request, GCDWebServerCompletionBlock completionBlock) { + completionBlock(block(request)); + }]; } - (void)addDefaultHandlerForMethod:(NSString*)method requestClass:(Class)aClass asyncProcessBlock:(GCDWebServerAsyncProcessBlock)block { - [self addHandlerWithMatchBlock:^GCDWebServerRequest *(NSString* requestMethod, NSURL* requestURL, NSDictionary* requestHeaders, NSString* urlPath, NSDictionary* urlQuery) { - + [self addHandlerWithMatchBlock:^GCDWebServerRequest*(NSString* requestMethod, NSURL* requestURL, NSDictionary* requestHeaders, NSString* urlPath, NSDictionary* urlQuery) { + if (![requestMethod isEqualToString:method]) { return nil; } return [[aClass alloc] initWithMethod:requestMethod url:requestURL headers:requestHeaders path:urlPath query:urlQuery]; - - } asyncProcessBlock:block]; + + } + asyncProcessBlock:block]; } - (void)addHandlerForMethod:(NSString*)method path:(NSString*)path requestClass:(Class)aClass processBlock:(GCDWebServerProcessBlock)block { - [self addHandlerForMethod:method path:path requestClass:aClass asyncProcessBlock:^(GCDWebServerRequest* request, GCDWebServerCompletionBlock completionBlock) { - completionBlock(block(request)); - }]; + [self addHandlerForMethod:method + path:path + requestClass:aClass + asyncProcessBlock:^(GCDWebServerRequest* request, GCDWebServerCompletionBlock completionBlock) { + completionBlock(block(request)); + }]; } - (void)addHandlerForMethod:(NSString*)method path:(NSString*)path requestClass:(Class)aClass asyncProcessBlock:(GCDWebServerAsyncProcessBlock)block { if ([path hasPrefix:@"/"] && [aClass isSubclassOfClass:[GCDWebServerRequest class]]) { - [self addHandlerWithMatchBlock:^GCDWebServerRequest *(NSString* requestMethod, NSURL* requestURL, NSDictionary* requestHeaders, NSString* urlPath, NSDictionary* urlQuery) { - + [self addHandlerWithMatchBlock:^GCDWebServerRequest*(NSString* requestMethod, NSURL* requestURL, NSDictionary* requestHeaders, NSString* urlPath, NSDictionary* urlQuery) { + if (![requestMethod isEqualToString:method]) { return nil; } @@ -929,24 +907,28 @@ - (void)addHandlerForMethod:(NSString*)method path:(NSString*)path requestClass: return nil; } return [[aClass alloc] initWithMethod:requestMethod url:requestURL headers:requestHeaders path:urlPath query:urlQuery]; - - } asyncProcessBlock:block]; + + } + asyncProcessBlock:block]; } else { GWS_DNOT_REACHED(); } } - (void)addHandlerForMethod:(NSString*)method pathRegex:(NSString*)regex requestClass:(Class)aClass processBlock:(GCDWebServerProcessBlock)block { - [self addHandlerForMethod:method pathRegex:regex requestClass:aClass asyncProcessBlock:^(GCDWebServerRequest* request, GCDWebServerCompletionBlock completionBlock) { - completionBlock(block(request)); - }]; + [self addHandlerForMethod:method + pathRegex:regex + requestClass:aClass + asyncProcessBlock:^(GCDWebServerRequest* request, GCDWebServerCompletionBlock completionBlock) { + completionBlock(block(request)); + }]; } - (void)addHandlerForMethod:(NSString*)method pathRegex:(NSString*)regex requestClass:(Class)aClass asyncProcessBlock:(GCDWebServerAsyncProcessBlock)block { NSRegularExpression* expression = [NSRegularExpression regularExpressionWithPattern:regex options:NSRegularExpressionCaseInsensitive error:NULL]; if (expression && [aClass isSubclassOfClass:[GCDWebServerRequest class]]) { - [self addHandlerWithMatchBlock:^GCDWebServerRequest *(NSString* requestMethod, NSURL* requestURL, NSDictionary* requestHeaders, NSString* urlPath, NSDictionary* urlQuery) { - + [self addHandlerWithMatchBlock:^GCDWebServerRequest*(NSString* requestMethod, NSURL* requestURL, NSDictionary* requestHeaders, NSString* urlPath, NSDictionary* urlQuery) { + if (![requestMethod isEqualToString:method]) { return nil; } @@ -972,8 +954,9 @@ - (void)addHandlerForMethod:(NSString*)method pathRegex:(NSString*)regex request GCDWebServerRequest* request = [[aClass alloc] initWithMethod:requestMethod url:requestURL headers:requestHeaders path:urlPath query:urlQuery]; [request setAttribute:captures forKey:GCDWebServerRequestAttribute_RegexCaptures]; return request; - - } asyncProcessBlock:block]; + + } + asyncProcessBlock:block]; } else { GWS_DNOT_REACHED(); } @@ -984,29 +967,35 @@ - (void)addHandlerForMethod:(NSString*)method pathRegex:(NSString*)regex request @implementation GCDWebServer (GETHandlers) - (void)addGETHandlerForPath:(NSString*)path staticData:(NSData*)staticData contentType:(NSString*)contentType cacheAge:(NSUInteger)cacheAge { - [self addHandlerForMethod:@"GET" path:path requestClass:[GCDWebServerRequest class] processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) { - - GCDWebServerResponse* response = [GCDWebServerDataResponse responseWithData:staticData contentType:contentType]; - response.cacheControlMaxAge = cacheAge; - return response; - - }]; + [self addHandlerForMethod:@"GET" + path:path + requestClass:[GCDWebServerRequest class] + processBlock:^GCDWebServerResponse*(GCDWebServerRequest* request) { + + GCDWebServerResponse* response = [GCDWebServerDataResponse responseWithData:staticData contentType:contentType]; + response.cacheControlMaxAge = cacheAge; + return response; + + }]; } - (void)addGETHandlerForPath:(NSString*)path filePath:(NSString*)filePath isAttachment:(BOOL)isAttachment cacheAge:(NSUInteger)cacheAge allowRangeRequests:(BOOL)allowRangeRequests { - [self addHandlerForMethod:@"GET" path:path requestClass:[GCDWebServerRequest class] processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) { - - GCDWebServerResponse* response = nil; - if (allowRangeRequests) { - response = [GCDWebServerFileResponse responseWithFile:filePath byteRange:request.byteRange isAttachment:isAttachment]; - [response setValue:@"bytes" forAdditionalHeader:@"Accept-Ranges"]; - } else { - response = [GCDWebServerFileResponse responseWithFile:filePath isAttachment:isAttachment]; - } - response.cacheControlMaxAge = cacheAge; - return response; - - }]; + [self addHandlerForMethod:@"GET" + path:path + requestClass:[GCDWebServerRequest class] + processBlock:^GCDWebServerResponse*(GCDWebServerRequest* request) { + + GCDWebServerResponse* response = nil; + if (allowRangeRequests) { + response = [GCDWebServerFileResponse responseWithFile:filePath byteRange:request.byteRange isAttachment:isAttachment]; + [response setValue:@"bytes" forAdditionalHeader:@"Accept-Ranges"]; + } else { + response = [GCDWebServerFileResponse responseWithFile:filePath isAttachment:isAttachment]; + } + response.cacheControlMaxAge = cacheAge; + return response; + + }]; } - (GCDWebServerResponse*)_responseWithContentsOfDirectory:(NSString*)path { @@ -1042,8 +1031,8 @@ - (GCDWebServerResponse*)_responseWithContentsOfDirectory:(NSString*)path { - (void)addGETHandlerForBasePath:(NSString*)basePath directoryPath:(NSString*)directoryPath indexFilename:(NSString*)indexFilename cacheAge:(NSUInteger)cacheAge allowRangeRequests:(BOOL)allowRangeRequests { if ([basePath hasPrefix:@"/"] && [basePath hasSuffix:@"/"]) { GCDWebServer* __unsafe_unretained server = self; - [self addHandlerWithMatchBlock:^GCDWebServerRequest *(NSString* requestMethod, NSURL* requestURL, NSDictionary* requestHeaders, NSString* urlPath, NSDictionary* urlQuery) { - + [self addHandlerWithMatchBlock:^GCDWebServerRequest*(NSString* requestMethod, NSURL* requestURL, NSDictionary* requestHeaders, NSString* urlPath, NSDictionary* urlQuery) { + if (![requestMethod isEqualToString:@"GET"]) { return nil; } @@ -1051,39 +1040,40 @@ - (void)addGETHandlerForBasePath:(NSString*)basePath directoryPath:(NSString*)di return nil; } return [[GCDWebServerRequest alloc] initWithMethod:requestMethod url:requestURL headers:requestHeaders path:urlPath query:urlQuery]; - - } processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) { - - GCDWebServerResponse* response = nil; - NSString* filePath = [directoryPath stringByAppendingPathComponent:[request.path substringFromIndex:basePath.length]]; - NSString* fileType = [[[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:NULL] fileType]; - if (fileType) { - if ([fileType isEqualToString:NSFileTypeDirectory]) { - if (indexFilename) { - NSString* indexPath = [filePath stringByAppendingPathComponent:indexFilename]; - NSString* indexType = [[[NSFileManager defaultManager] attributesOfItemAtPath:indexPath error:NULL] fileType]; - if ([indexType isEqualToString:NSFileTypeRegular]) { - return [GCDWebServerFileResponse responseWithFile:indexPath]; + + } + processBlock:^GCDWebServerResponse*(GCDWebServerRequest* request) { + + GCDWebServerResponse* response = nil; + NSString* filePath = [directoryPath stringByAppendingPathComponent:[request.path substringFromIndex:basePath.length]]; + NSString* fileType = [[[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:NULL] fileType]; + if (fileType) { + if ([fileType isEqualToString:NSFileTypeDirectory]) { + if (indexFilename) { + NSString* indexPath = [filePath stringByAppendingPathComponent:indexFilename]; + NSString* indexType = [[[NSFileManager defaultManager] attributesOfItemAtPath:indexPath error:NULL] fileType]; + if ([indexType isEqualToString:NSFileTypeRegular]) { + return [GCDWebServerFileResponse responseWithFile:indexPath]; + } + } + response = [server _responseWithContentsOfDirectory:filePath]; + } else if ([fileType isEqualToString:NSFileTypeRegular]) { + if (allowRangeRequests) { + response = [GCDWebServerFileResponse responseWithFile:filePath byteRange:request.byteRange]; + [response setValue:@"bytes" forAdditionalHeader:@"Accept-Ranges"]; + } else { + response = [GCDWebServerFileResponse responseWithFile:filePath]; + } } } - response = [server _responseWithContentsOfDirectory:filePath]; - } else if ([fileType isEqualToString:NSFileTypeRegular]) { - if (allowRangeRequests) { - response = [GCDWebServerFileResponse responseWithFile:filePath byteRange:request.byteRange]; - [response setValue:@"bytes" forAdditionalHeader:@"Accept-Ranges"]; + if (response) { + response.cacheControlMaxAge = cacheAge; } else { - response = [GCDWebServerFileResponse responseWithFile:filePath]; + response = [GCDWebServerResponse responseWithStatusCode:kGCDWebServerHTTPStatusCode_NotFound]; } - } - } - if (response) { - response.cacheControlMaxAge = cacheAge; - } else { - response = [GCDWebServerResponse responseWithStatusCode:kGCDWebServerHTTPStatusCode_NotFound]; - } - return response; - - }]; + return response; + + }]; } else { GWS_DNOT_REACHED(); } @@ -1096,8 +1086,6 @@ @implementation GCDWebServer (Logging) + (void)setLogLevel:(int)level { #if defined(__GCDWEBSERVER_LOGGING_FACILITY_XLFACILITY__) [XLSharedFacility setMinLogLevel:level]; -#elif defined(__GCDWEBSERVER_LOGGING_FACILITY_COCOALUMBERJACK__) - GCDWebServerLogLevel = level; #elif defined(__GCDWEBSERVER_LOGGING_FACILITY_BUILTIN__) GCDWebServerLogLevel = level; #endif @@ -1204,11 +1192,11 @@ static void _LogResult(NSString* format, ...) { - (NSInteger)runTestsWithOptions:(NSDictionary*)options inDirectory:(NSString*)path { GWS_DCHECK([NSThread isMainThread]); - NSArray* ignoredHeaders = @[@"Date", @"Etag"]; // Dates are always different by definition and ETags depend on file system node IDs + NSArray* ignoredHeaders = @[ @"Date", @"Etag" ]; // Dates are always different by definition and ETags depend on file system node IDs NSInteger result = -1; if ([self startWithOptions:options error:NULL]) { _ExecuteMainThreadRunLoopSources(); - + result = 0; NSArray* files = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:path error:NULL]; for (NSString* requestFile in files) { @@ -1230,19 +1218,19 @@ - (NSInteger)runTestsWithOptions:(NSDictionary*)options inDirectory:(NSString*)p if ([responseFile hasPrefix:prefix] && [responseFile hasSuffix:@".response"]) { NSData* responseData = [NSData dataWithContentsOfFile:[path stringByAppendingPathComponent:responseFile]]; if (responseData) { - CFHTTPMessageRef expectedResponse = _CreateHTTPMessageFromData(responseData, NO); + CFHTTPMessageRef expectedResponse = _CreateHTTPMessageFromData(responseData, NO); if (expectedResponse) { CFHTTPMessageRef actualResponse = _CreateHTTPMessageFromPerformingRequest(requestData, self.port); if (actualResponse) { success = YES; - + CFIndex expectedStatusCode = CFHTTPMessageGetResponseStatusCode(expectedResponse); CFIndex actualStatusCode = CFHTTPMessageGetResponseStatusCode(actualResponse); if (actualStatusCode != expectedStatusCode) { _LogResult(@" Status code not matching:\n Expected: %i\n Actual: %i", (int)expectedStatusCode, (int)actualStatusCode); success = NO; } - + NSDictionary* expectedHeaders = CFBridgingRelease(CFHTTPMessageCopyAllHeaderFields(expectedResponse)); NSDictionary* actualHeaders = CFBridgingRelease(CFHTTPMessageCopyAllHeaderFields(actualResponse)); for (NSString* expectedHeader in expectedHeaders) { @@ -1262,7 +1250,7 @@ - (NSInteger)runTestsWithOptions:(NSDictionary*)options inDirectory:(NSString*)p success = NO; } } - + NSString* expectedContentLength = CFBridgingRelease(CFHTTPMessageCopyHeaderFieldValue(expectedResponse, CFSTR("Content-Length"))); NSData* expectedBody = CFBridgingRelease(CFHTTPMessageCopyBody(expectedResponse)); NSString* actualContentLength = CFBridgingRelease(CFHTTPMessageCopyHeaderFieldValue(actualResponse, CFSTR("Content-Length"))); @@ -1275,20 +1263,20 @@ - (NSInteger)runTestsWithOptions:(NSDictionary*)options inDirectory:(NSString*)p success = NO; #if !TARGET_OS_IPHONE #if DEBUG - if (GCDWebServerIsTextContentType([expectedHeaders objectForKey:@"Content-Type"])) { - NSString* expectedPath = [NSTemporaryDirectory() stringByAppendingPathComponent:[[[NSProcessInfo processInfo] globallyUniqueString] stringByAppendingPathExtension:@"txt"]]; - NSString* actualPath = [NSTemporaryDirectory() stringByAppendingPathComponent:[[[NSProcessInfo processInfo] globallyUniqueString] stringByAppendingPathExtension:@"txt"]]; + if (GCDWebServerIsTextContentType((NSString*)[expectedHeaders objectForKey:@"Content-Type"])) { + NSString* expectedPath = [NSTemporaryDirectory() stringByAppendingPathComponent:(NSString*)[[[NSProcessInfo processInfo] globallyUniqueString] stringByAppendingPathExtension:@"txt"]]; + NSString* actualPath = [NSTemporaryDirectory() stringByAppendingPathComponent:(NSString*)[[[NSProcessInfo processInfo] globallyUniqueString] stringByAppendingPathExtension:@"txt"]]; if ([expectedBody writeToFile:expectedPath atomically:YES] && [actualBody writeToFile:actualPath atomically:YES]) { NSTask* task = [[NSTask alloc] init]; [task setLaunchPath:@"/usr/bin/opendiff"]; - [task setArguments:@[expectedPath, actualPath]]; + [task setArguments:@[ expectedPath, actualPath ]]; [task launch]; } } #endif #endif } - + CFRelease(actualResponse); } CFRelease(expectedResponse); @@ -1311,9 +1299,9 @@ - (NSInteger)runTestsWithOptions:(NSDictionary*)options inDirectory:(NSString*)p } _ExecuteMainThreadRunLoopSources(); } - + [self stop]; - + _ExecuteMainThreadRunLoopSources(); } return result; diff --git a/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerConnection.h b/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerConnection.h index d353c8b9..420d12a4 100644 --- a/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerConnection.h +++ b/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerConnection.h @@ -27,6 +27,8 @@ #import "GCDWebServer.h" +NS_ASSUME_NONNULL_BEGIN + @class GCDWebServerHandler; /** @@ -139,7 +141,7 @@ * The default implementation checks for HTTP authentication if applicable * and returns a barebone 401 status code response if authentication failed. */ -- (GCDWebServerResponse*)preflightRequest:(GCDWebServerRequest*)request; +- (nullable GCDWebServerResponse*)preflightRequest:(GCDWebServerRequest*)request; /** * Assuming a valid HTTP request was received and -preflightRequest: returned nil, @@ -169,7 +171,7 @@ * @warning If the request was invalid (e.g. the HTTP headers were malformed), * the "request" argument will be nil. */ -- (void)abortRequest:(GCDWebServerRequest*)request withStatusCode:(NSInteger)statusCode; +- (void)abortRequest:(nullable GCDWebServerRequest*)request withStatusCode:(NSInteger)statusCode; /** * Called when the connection is closed. @@ -177,3 +179,5 @@ - (void)close; @end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerConnection.m b/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerConnection.m index 1d72f7dc..1fd56c35 100644 --- a/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerConnection.m +++ b/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerConnection.m @@ -57,23 +57,34 @@ static int32_t _connectionCounter = 0; #endif -@interface GCDWebServerConnection () { -@private - GCDWebServer* _server; - NSData* _localAddress; - NSData* _remoteAddress; +NS_ASSUME_NONNULL_BEGIN + +@interface GCDWebServerConnection (Read) +- (void)readData:(NSMutableData*)data withLength:(NSUInteger)length completionBlock:(ReadDataCompletionBlock)block; +- (void)readHeaders:(NSMutableData*)headersData withCompletionBlock:(ReadHeadersCompletionBlock)block; +- (void)readBodyWithRemainingLength:(NSUInteger)length completionBlock:(ReadBodyCompletionBlock)block; +- (void)readNextBodyChunk:(NSMutableData*)chunkData completionBlock:(ReadBodyCompletionBlock)block; +@end + +@interface GCDWebServerConnection (Write) +- (void)writeData:(NSData*)data withCompletionBlock:(WriteDataCompletionBlock)block; +- (void)writeHeadersWithCompletionBlock:(WriteHeadersCompletionBlock)block; +- (void)writeBodyWithCompletionBlock:(WriteBodyCompletionBlock)block; +@end + +NS_ASSUME_NONNULL_END + +@implementation GCDWebServerConnection { CFSocketNativeHandle _socket; - NSUInteger _bytesRead; - NSUInteger _bytesWritten; BOOL _virtualHEAD; - + CFHTTPMessageRef _requestMessage; GCDWebServerRequest* _request; GCDWebServerHandler* _handler; CFHTTPMessageRef _responseMessage; GCDWebServerResponse* _response; NSInteger _statusCode; - + BOOL _opened; #ifdef __GCDWEBSERVER_ENABLE_TESTING__ NSUInteger _connectionIndex; @@ -83,258 +94,6 @@ @interface GCDWebServerConnection () { int _responseFD; #endif } -@end - -@implementation GCDWebServerConnection (Read) - -- (void)_readData:(NSMutableData*)data withLength:(NSUInteger)length completionBlock:(ReadDataCompletionBlock)block { - dispatch_read(_socket, length, dispatch_get_global_queue(_server.dispatchQueuePriority, 0), ^(dispatch_data_t buffer, int error) { - - @autoreleasepool { - if (error == 0) { - size_t size = dispatch_data_get_size(buffer); - if (size > 0) { - NSUInteger originalLength = data.length; - dispatch_data_apply(buffer, ^bool(dispatch_data_t region, size_t chunkOffset, const void* chunkBytes, size_t chunkSize) { - [data appendBytes:chunkBytes length:chunkSize]; - return true; - }); - [self didReadBytes:((char*)data.bytes + originalLength) length:(data.length - originalLength)]; - block(YES); - } else { - if (_bytesRead > 0) { - GWS_LOG_ERROR(@"No more data available on socket %i", _socket); - } else { - GWS_LOG_WARNING(@"No data received from socket %i", _socket); - } - block(NO); - } - } else { - GWS_LOG_ERROR(@"Error while reading from socket %i: %s (%i)", _socket, strerror(error), error); - block(NO); - } - } - - }); -} - -- (void)_readHeaders:(NSMutableData*)headersData withCompletionBlock:(ReadHeadersCompletionBlock)block { - GWS_DCHECK(_requestMessage); - [self _readData:headersData withLength:NSUIntegerMax completionBlock:^(BOOL success) { - - if (success) { - NSRange range = [headersData rangeOfData:_CRLFCRLFData options:0 range:NSMakeRange(0, headersData.length)]; - if (range.location == NSNotFound) { - [self _readHeaders:headersData withCompletionBlock:block]; - } else { - NSUInteger length = range.location + range.length; - if (CFHTTPMessageAppendBytes(_requestMessage, headersData.bytes, length)) { - if (CFHTTPMessageIsHeaderComplete(_requestMessage)) { - block([headersData subdataWithRange:NSMakeRange(length, headersData.length - length)]); - } else { - GWS_LOG_ERROR(@"Failed parsing request headers from socket %i", _socket); - block(nil); - } - } else { - GWS_LOG_ERROR(@"Failed appending request headers data from socket %i", _socket); - block(nil); - } - } - } else { - block(nil); - } - - }]; -} - -- (void)_readBodyWithRemainingLength:(NSUInteger)length completionBlock:(ReadBodyCompletionBlock)block { - GWS_DCHECK([_request hasBody] && ![_request usesChunkedTransferEncoding]); - NSMutableData* bodyData = [[NSMutableData alloc] initWithCapacity:kBodyReadCapacity]; - [self _readData:bodyData withLength:length completionBlock:^(BOOL success) { - - if (success) { - if (bodyData.length <= length) { - NSError* error = nil; - if ([_request performWriteData:bodyData error:&error]) { - NSUInteger remainingLength = length - bodyData.length; - if (remainingLength) { - [self _readBodyWithRemainingLength:remainingLength completionBlock:block]; - } else { - block(YES); - } - } else { - GWS_LOG_ERROR(@"Failed writing request body on socket %i: %@", _socket, error); - block(NO); - } - } else { - GWS_LOG_ERROR(@"Unexpected extra content reading request body on socket %i", _socket); - block(NO); - GWS_DNOT_REACHED(); - } - } else { - block(NO); - } - - }]; -} - -static inline NSUInteger _ScanHexNumber(const void* bytes, NSUInteger size) { - char buffer[size + 1]; - bcopy(bytes, buffer, size); - buffer[size] = 0; - char* end = NULL; - long result = strtol(buffer, &end, 16); - return ((end != NULL) && (*end == 0) && (result >= 0) ? result : NSNotFound); -} - -- (void)_readNextBodyChunk:(NSMutableData*)chunkData completionBlock:(ReadBodyCompletionBlock)block { - GWS_DCHECK([_request hasBody] && [_request usesChunkedTransferEncoding]); - - while (1) { - NSRange range = [chunkData rangeOfData:_CRLFData options:0 range:NSMakeRange(0, chunkData.length)]; - if (range.location == NSNotFound) { - break; - } - NSRange extensionRange = [chunkData rangeOfData:[NSData dataWithBytes:";" length:1] options:0 range:NSMakeRange(0, range.location)]; // Ignore chunk extensions - NSUInteger length = _ScanHexNumber((char*)chunkData.bytes, extensionRange.location != NSNotFound ? extensionRange.location : range.location); - if (length != NSNotFound) { - if (length) { - if (chunkData.length < range.location + range.length + length + 2) { - break; - } - const char* ptr = (char*)chunkData.bytes + range.location + range.length + length; - if ((*ptr == '\r') && (*(ptr + 1) == '\n')) { - NSError* error = nil; - if ([_request performWriteData:[chunkData subdataWithRange:NSMakeRange(range.location + range.length, length)] error:&error]) { - [chunkData replaceBytesInRange:NSMakeRange(0, range.location + range.length + length + 2) withBytes:NULL length:0]; - } else { - GWS_LOG_ERROR(@"Failed writing request body on socket %i: %@", _socket, error); - block(NO); - return; - } - } else { - GWS_LOG_ERROR(@"Missing terminating CRLF sequence for chunk reading request body on socket %i", _socket); - block(NO); - return; - } - } else { - NSRange trailerRange = [chunkData rangeOfData:_CRLFCRLFData options:0 range:NSMakeRange(range.location, chunkData.length - range.location)]; // Ignore trailers - if (trailerRange.location != NSNotFound) { - block(YES); - return; - } - } - } else { - GWS_LOG_ERROR(@"Invalid chunk length reading request body on socket %i", _socket); - block(NO); - return; - } - } - - [self _readData:chunkData withLength:NSUIntegerMax completionBlock:^(BOOL success) { - - if (success) { - [self _readNextBodyChunk:chunkData completionBlock:block]; - } else { - block(NO); - } - - }]; -} - -@end - -@implementation GCDWebServerConnection (Write) - -- (void)_writeData:(NSData*)data withCompletionBlock:(WriteDataCompletionBlock)block { - dispatch_data_t buffer = dispatch_data_create(data.bytes, data.length, dispatch_get_global_queue(_server.dispatchQueuePriority, 0), ^{ - [data self]; // Keeps ARC from releasing data too early - }); - dispatch_write(_socket, buffer, dispatch_get_global_queue(_server.dispatchQueuePriority, 0), ^(dispatch_data_t remainingData, int error) { - - @autoreleasepool { - if (error == 0) { - GWS_DCHECK(remainingData == NULL); - [self didWriteBytes:data.bytes length:data.length]; - block(YES); - } else { - GWS_LOG_ERROR(@"Error while writing to socket %i: %s (%i)", _socket, strerror(error), error); - block(NO); - } - } - - }); -#if !OS_OBJECT_USE_OBJC_RETAIN_RELEASE - dispatch_release(buffer); -#endif -} - -- (void)_writeHeadersWithCompletionBlock:(WriteHeadersCompletionBlock)block { - GWS_DCHECK(_responseMessage); - CFDataRef data = CFHTTPMessageCopySerializedMessage(_responseMessage); - [self _writeData:(__bridge NSData*)data withCompletionBlock:block]; - CFRelease(data); -} - -- (void)_writeBodyWithCompletionBlock:(WriteBodyCompletionBlock)block { - GWS_DCHECK([_response hasBody]); - [_response performReadDataWithCompletion:^(NSData* data, NSError* error) { - - if (data) { - if (data.length) { - if (_response.usesChunkedTransferEncoding) { - const char* hexString = [[NSString stringWithFormat:@"%lx", (unsigned long)data.length] UTF8String]; - size_t hexLength = strlen(hexString); - NSData* chunk = [NSMutableData dataWithLength:(hexLength + 2 + data.length + 2)]; - if (chunk == nil) { - GWS_LOG_ERROR(@"Failed allocating memory for response body chunk for socket %i: %@", _socket, error); - block(NO); - return; - } - char* ptr = (char*)[(NSMutableData*)chunk mutableBytes]; - bcopy(hexString, ptr, hexLength); - ptr += hexLength; - *ptr++ = '\r'; - *ptr++ = '\n'; - bcopy(data.bytes, ptr, data.length); - ptr += data.length; - *ptr++ = '\r'; - *ptr = '\n'; - data = chunk; - } - [self _writeData:data withCompletionBlock:^(BOOL success) { - - if (success) { - [self _writeBodyWithCompletionBlock:block]; - } else { - block(NO); - } - - }]; - } else { - if (_response.usesChunkedTransferEncoding) { - [self _writeData:_lastChunkData withCompletionBlock:^(BOOL success) { - - block(success); - - }]; - } else { - block(YES); - } - } - } else { - GWS_LOG_ERROR(@"Failed reading response body for socket %i: %@", _socket, error); - block(NO); - } - - }]; -} - -@end - -@implementation GCDWebServerConnection - -@synthesize server=_server, localAddressData=_localAddress, remoteAddressData=_remoteAddress, totalBytesRead=_bytesRead, totalBytesWritten=_bytesWritten; + (void)initialize { if (_CRLFData == nil) { @@ -362,7 +121,7 @@ + (void)initialize { } - (BOOL)isUsingIPv6 { - const struct sockaddr* localSockAddr = _localAddress.bytes; + const struct sockaddr* localSockAddr = _localAddressData.bytes; return (localSockAddr->sa_family == AF_INET6); } @@ -376,14 +135,15 @@ - (void)_initializeResponseHeadersWithStatusCode:(NSInteger)statusCode { - (void)_startProcessingRequest { GWS_DCHECK(_responseMessage == NULL); - + GCDWebServerResponse* preflightResponse = [self preflightRequest:_request]; if (preflightResponse) { [self _finishProcessingRequest:preflightResponse]; } else { - [self processRequest:_request completion:^(GCDWebServerResponse* processResponse) { - [self _finishProcessingRequest:processResponse]; - }]; + [self processRequest:_request + completion:^(GCDWebServerResponse* processResponse) { + [self _finishProcessingRequest:processResponse]; + }]; } } @@ -391,7 +151,7 @@ - (void)_startProcessingRequest { - (void)_finishProcessingRequest:(GCDWebServerResponse*)response { GWS_DCHECK(_responseMessage == NULL); BOOL hasBody = NO; - + if (response) { response = [self overrideResponse:response forRequest:_request]; } @@ -407,11 +167,11 @@ - (void)_finishProcessingRequest:(GCDWebServerResponse*)response { _response = response; } } - + if (_response) { [self _initializeResponseHeadersWithStatusCode:_response.statusCode]; if (_response.lastModifiedDate) { - CFHTTPMessageSetHeaderFieldValue(_responseMessage, CFSTR("Last-Modified"), (__bridge CFStringRef)GCDWebServerFormatRFC822(_response.lastModifiedDate)); + CFHTTPMessageSetHeaderFieldValue(_responseMessage, CFSTR("Last-Modified"), (__bridge CFStringRef)GCDWebServerFormatRFC822((NSDate*)_response.lastModifiedDate)); } if (_response.eTag) { CFHTTPMessageSetHeaderFieldValue(_responseMessage, CFSTR("ETag"), (__bridge CFStringRef)_response.eTag); @@ -435,25 +195,24 @@ - (void)_finishProcessingRequest:(GCDWebServerResponse*)response { [_response.additionalHeaders enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL* stop) { CFHTTPMessageSetHeaderFieldValue(_responseMessage, (__bridge CFStringRef)key, (__bridge CFStringRef)obj); }]; - [self _writeHeadersWithCompletionBlock:^(BOOL success) { - + [self writeHeadersWithCompletionBlock:^(BOOL success) { + if (success) { if (hasBody) { - [self _writeBodyWithCompletionBlock:^(BOOL successInner) { - + [self writeBodyWithCompletionBlock:^(BOOL successInner) { + [_response performClose]; // TODO: There's nothing we can do on failure as headers have already been sent - + }]; } } else if (hasBody) { [_response performClose]; } - + }]; } else { [self abortRequest:_request withStatusCode:kGCDWebServerHTTPStatusCode_InternalServerError]; } - } - (void)_readBodyWithLength:(NSUInteger)length initialData:(NSData*)initialData { @@ -463,7 +222,7 @@ - (void)_readBodyWithLength:(NSUInteger)length initialData:(NSData*)initialData [self abortRequest:_request withStatusCode:kGCDWebServerHTTPStatusCode_InternalServerError]; return; } - + if (initialData.length) { if (![_request performWriteData:initialData error:&error]) { GWS_LOG_ERROR(@"Failed writing request body on socket %i: %@", _socket, error); @@ -475,19 +234,20 @@ - (void)_readBodyWithLength:(NSUInteger)length initialData:(NSData*)initialData } length -= initialData.length; } - + if (length) { - [self _readBodyWithRemainingLength:length completionBlock:^(BOOL success) { - - NSError* localError = nil; - if ([_request performClose:&localError]) { - [self _startProcessingRequest]; - } else { - GWS_LOG_ERROR(@"Failed closing request body for socket %i: %@", _socket, error); - [self abortRequest:_request withStatusCode:kGCDWebServerHTTPStatusCode_InternalServerError]; - } - - }]; + [self readBodyWithRemainingLength:length + completionBlock:^(BOOL success) { + + NSError* localError = nil; + if ([_request performClose:&localError]) { + [self _startProcessingRequest]; + } else { + GWS_LOG_ERROR(@"Failed closing request body for socket %i: %@", _socket, error); + [self abortRequest:_request withStatusCode:kGCDWebServerHTTPStatusCode_InternalServerError]; + } + + }]; } else { if ([_request performClose:&error]) { [self _startProcessingRequest]; @@ -505,129 +265,136 @@ - (void)_readChunkedBodyWithInitialData:(NSData*)initialData { [self abortRequest:_request withStatusCode:kGCDWebServerHTTPStatusCode_InternalServerError]; return; } - + NSMutableData* chunkData = [[NSMutableData alloc] initWithData:initialData]; - [self _readNextBodyChunk:chunkData completionBlock:^(BOOL success) { - - NSError* localError = nil; - if ([_request performClose:&localError]) { - [self _startProcessingRequest]; - } else { - GWS_LOG_ERROR(@"Failed closing request body for socket %i: %@", _socket, error); - [self abortRequest:_request withStatusCode:kGCDWebServerHTTPStatusCode_InternalServerError]; - } - - }]; + [self readNextBodyChunk:chunkData + completionBlock:^(BOOL success) { + + NSError* localError = nil; + if ([_request performClose:&localError]) { + [self _startProcessingRequest]; + } else { + GWS_LOG_ERROR(@"Failed closing request body for socket %i: %@", _socket, error); + [self abortRequest:_request withStatusCode:kGCDWebServerHTTPStatusCode_InternalServerError]; + } + + }]; } - (void)_readRequestHeaders { _requestMessage = CFHTTPMessageCreateEmpty(kCFAllocatorDefault, true); NSMutableData* headersData = [[NSMutableData alloc] initWithCapacity:kHeadersReadCapacity]; - [self _readHeaders:headersData withCompletionBlock:^(NSData* extraData) { - - if (extraData) { - NSString* requestMethod = CFBridgingRelease(CFHTTPMessageCopyRequestMethod(_requestMessage)); // Method verbs are case-sensitive and uppercase - if (_server.shouldAutomaticallyMapHEADToGET && [requestMethod isEqualToString:@"HEAD"]) { - requestMethod = @"GET"; - _virtualHEAD = YES; - } - NSDictionary* requestHeaders = CFBridgingRelease(CFHTTPMessageCopyAllHeaderFields(_requestMessage)); // Header names are case-insensitive but CFHTTPMessageCopyAllHeaderFields() will standardize the common ones - NSURL* requestURL = CFBridgingRelease(CFHTTPMessageCopyRequestURL(_requestMessage)); - if (requestURL) { - requestURL = [self rewriteRequestURL:requestURL withMethod:requestMethod headers:requestHeaders]; - GWS_DCHECK(requestURL); - } - NSString* requestPath = requestURL ? GCDWebServerUnescapeURLString(CFBridgingRelease(CFURLCopyPath((CFURLRef)requestURL))) : nil; // Don't use -[NSURL path] which strips the ending slash - NSString* queryString = requestURL ? CFBridgingRelease(CFURLCopyQueryString((CFURLRef)requestURL, NULL)) : nil; // Don't use -[NSURL query] to make sure query is not unescaped; - NSDictionary* requestQuery = queryString ? GCDWebServerParseURLEncodedForm(queryString) : @{}; - if (requestMethod && requestURL && requestHeaders && requestPath && requestQuery) { - for (_handler in _server.handlers) { - _request = _handler.matchBlock(requestMethod, requestURL, requestHeaders, requestPath, requestQuery); - if (_request) { - break; + [self readHeaders:headersData + withCompletionBlock:^(NSData* extraData) { + + if (extraData) { + NSString* requestMethod = CFBridgingRelease(CFHTTPMessageCopyRequestMethod(_requestMessage)); // Method verbs are case-sensitive and uppercase + if (_server.shouldAutomaticallyMapHEADToGET && [requestMethod isEqualToString:@"HEAD"]) { + requestMethod = @"GET"; + _virtualHEAD = YES; } - } - if (_request) { - _request.localAddressData = self.localAddressData; - _request.remoteAddressData = self.remoteAddressData; - if ([_request hasBody]) { - [_request prepareForWriting]; - if (_request.usesChunkedTransferEncoding || (extraData.length <= _request.contentLength)) { - NSString* expectHeader = [requestHeaders objectForKey:@"Expect"]; - if (expectHeader) { - if ([expectHeader caseInsensitiveCompare:@"100-continue"] == NSOrderedSame) { // TODO: Actually validate request before continuing - [self _writeData:_continueData withCompletionBlock:^(BOOL success) { - - if (success) { - if (_request.usesChunkedTransferEncoding) { - [self _readChunkedBodyWithInitialData:extraData]; - } else { - [self _readBodyWithLength:_request.contentLength initialData:extraData]; - } + NSDictionary* requestHeaders = CFBridgingRelease(CFHTTPMessageCopyAllHeaderFields(_requestMessage)); // Header names are case-insensitive but CFHTTPMessageCopyAllHeaderFields() will standardize the common ones + NSURL* requestURL = CFBridgingRelease(CFHTTPMessageCopyRequestURL(_requestMessage)); + if (requestURL) { + requestURL = [self rewriteRequestURL:requestURL withMethod:requestMethod headers:requestHeaders]; + GWS_DCHECK(requestURL); + } + NSString* urlPath = requestURL ? CFBridgingRelease(CFURLCopyPath((CFURLRef)requestURL)) : nil; // Don't use -[NSURL path] which strips the ending slash + if (urlPath == nil) { + urlPath = @"/"; // CFURLCopyPath() returns NULL for a relative URL with path "//" contrary to -[NSURL path] which returns "/" + } + NSString* requestPath = urlPath ? GCDWebServerUnescapeURLString(urlPath) : nil; + NSString* queryString = requestURL ? CFBridgingRelease(CFURLCopyQueryString((CFURLRef)requestURL, NULL)) : nil; // Don't use -[NSURL query] to make sure query is not unescaped; + NSDictionary* requestQuery = queryString ? GCDWebServerParseURLEncodedForm(queryString) : @{}; + if (requestMethod && requestURL && requestHeaders && requestPath && requestQuery) { + for (_handler in _server.handlers) { + _request = _handler.matchBlock(requestMethod, requestURL, requestHeaders, requestPath, requestQuery); + if (_request) { + break; + } + } + if (_request) { + _request.localAddressData = self.localAddressData; + _request.remoteAddressData = self.remoteAddressData; + if ([_request hasBody]) { + [_request prepareForWriting]; + if (_request.usesChunkedTransferEncoding || (extraData.length <= _request.contentLength)) { + NSString* expectHeader = [requestHeaders objectForKey:@"Expect"]; + if (expectHeader) { + if ([expectHeader caseInsensitiveCompare:@"100-continue"] == NSOrderedSame) { // TODO: Actually validate request before continuing + [self writeData:_continueData + withCompletionBlock:^(BOOL success) { + + if (success) { + if (_request.usesChunkedTransferEncoding) { + [self _readChunkedBodyWithInitialData:extraData]; + } else { + [self _readBodyWithLength:_request.contentLength initialData:extraData]; + } + } + + }]; + } else { + GWS_LOG_ERROR(@"Unsupported 'Expect' / 'Content-Length' header combination on socket %i", _socket); + [self abortRequest:_request withStatusCode:kGCDWebServerHTTPStatusCode_ExpectationFailed]; + } + } else { + if (_request.usesChunkedTransferEncoding) { + [self _readChunkedBodyWithInitialData:extraData]; + } else { + [self _readBodyWithLength:_request.contentLength initialData:extraData]; } - - }]; + } } else { - GWS_LOG_ERROR(@"Unsupported 'Expect' / 'Content-Length' header combination on socket %i", _socket); - [self abortRequest:_request withStatusCode:kGCDWebServerHTTPStatusCode_ExpectationFailed]; + GWS_LOG_ERROR(@"Unexpected 'Content-Length' header value on socket %i", _socket); + [self abortRequest:_request withStatusCode:kGCDWebServerHTTPStatusCode_BadRequest]; } } else { - if (_request.usesChunkedTransferEncoding) { - [self _readChunkedBodyWithInitialData:extraData]; - } else { - [self _readBodyWithLength:_request.contentLength initialData:extraData]; - } + [self _startProcessingRequest]; } } else { - GWS_LOG_ERROR(@"Unexpected 'Content-Length' header value on socket %i", _socket); - [self abortRequest:_request withStatusCode:kGCDWebServerHTTPStatusCode_BadRequest]; + _request = [[GCDWebServerRequest alloc] initWithMethod:requestMethod url:requestURL headers:requestHeaders path:requestPath query:requestQuery]; + GWS_DCHECK(_request); + [self abortRequest:_request withStatusCode:kGCDWebServerHTTPStatusCode_NotImplemented]; } } else { - [self _startProcessingRequest]; + [self abortRequest:nil withStatusCode:kGCDWebServerHTTPStatusCode_InternalServerError]; + GWS_DNOT_REACHED(); } } else { - _request = [[GCDWebServerRequest alloc] initWithMethod:requestMethod url:requestURL headers:requestHeaders path:requestPath query:requestQuery]; - GWS_DCHECK(_request); - [self abortRequest:_request withStatusCode:kGCDWebServerHTTPStatusCode_MethodNotAllowed]; + [self abortRequest:nil withStatusCode:kGCDWebServerHTTPStatusCode_InternalServerError]; } - } else { - [self abortRequest:nil withStatusCode:kGCDWebServerHTTPStatusCode_InternalServerError]; - GWS_DNOT_REACHED(); - } - } else { - [self abortRequest:nil withStatusCode:kGCDWebServerHTTPStatusCode_InternalServerError]; - } - - }]; + + }]; } -- (id)initWithServer:(GCDWebServer*)server localAddress:(NSData*)localAddress remoteAddress:(NSData*)remoteAddress socket:(CFSocketNativeHandle)socket { +- (instancetype)initWithServer:(GCDWebServer*)server localAddress:(NSData*)localAddress remoteAddress:(NSData*)remoteAddress socket:(CFSocketNativeHandle)socket { if ((self = [super init])) { _server = server; - _localAddress = localAddress; - _remoteAddress = remoteAddress; + _localAddressData = localAddress; + _remoteAddressData = remoteAddress; _socket = socket; GWS_LOG_DEBUG(@"Did open connection on socket %i", _socket); - + [_server willStartConnection:self]; - + if (![self open]) { close(_socket); return nil; } _opened = YES; - + [self _readRequestHeaders]; } return self; } - (NSString*)localAddressString { - return GCDWebServerStringFromSockAddr(_localAddress.bytes, YES); + return GCDWebServerStringFromSockAddr(_localAddressData.bytes, YES); } - (NSString*)remoteAddressString { - return GCDWebServerStringFromSockAddr(_remoteAddress.bytes, YES); + return GCDWebServerStringFromSockAddr(_remoteAddressData.bytes, YES); } - (void)dealloc { @@ -637,17 +404,17 @@ - (void)dealloc { } else { GWS_LOG_DEBUG(@"Did close connection on socket %i", _socket); } - + if (_opened) { [self close]; } - + [_server didEndConnection:self]; - + if (_requestMessage) { CFRelease(_requestMessage); } - + if (_responseMessage) { CFRelease(_responseMessage); } @@ -655,30 +422,288 @@ - (void)dealloc { @end +@implementation GCDWebServerConnection (Read) + +- (void)readData:(NSMutableData*)data withLength:(NSUInteger)length completionBlock:(ReadDataCompletionBlock)block { + dispatch_read(_socket, length, dispatch_get_global_queue(_server.dispatchQueuePriority, 0), ^(dispatch_data_t buffer, int error) { + + @autoreleasepool { + if (error == 0) { + size_t size = dispatch_data_get_size(buffer); + if (size > 0) { + NSUInteger originalLength = data.length; + dispatch_data_apply(buffer, ^bool(dispatch_data_t region, size_t chunkOffset, const void* chunkBytes, size_t chunkSize) { + [data appendBytes:chunkBytes length:chunkSize]; + return true; + }); + [self didReadBytes:((char*)data.bytes + originalLength) length:(data.length - originalLength)]; + block(YES); + } else { + if (_totalBytesRead > 0) { + GWS_LOG_ERROR(@"No more data available on socket %i", _socket); + } else { + GWS_LOG_WARNING(@"No data received from socket %i", _socket); + } + block(NO); + } + } else { + GWS_LOG_ERROR(@"Error while reading from socket %i: %s (%i)", _socket, strerror(error), error); + block(NO); + } + } + + }); +} + +- (void)readHeaders:(NSMutableData*)headersData withCompletionBlock:(ReadHeadersCompletionBlock)block { + GWS_DCHECK(_requestMessage); + [self readData:headersData + withLength:NSUIntegerMax + completionBlock:^(BOOL success) { + + if (success) { + NSRange range = [headersData rangeOfData:_CRLFCRLFData options:0 range:NSMakeRange(0, headersData.length)]; + if (range.location == NSNotFound) { + [self readHeaders:headersData withCompletionBlock:block]; + } else { + NSUInteger length = range.location + range.length; + if (CFHTTPMessageAppendBytes(_requestMessage, headersData.bytes, length)) { + if (CFHTTPMessageIsHeaderComplete(_requestMessage)) { + block([headersData subdataWithRange:NSMakeRange(length, headersData.length - length)]); + } else { + GWS_LOG_ERROR(@"Failed parsing request headers from socket %i", _socket); + block(nil); + } + } else { + GWS_LOG_ERROR(@"Failed appending request headers data from socket %i", _socket); + block(nil); + } + } + } else { + block(nil); + } + + }]; +} + +- (void)readBodyWithRemainingLength:(NSUInteger)length completionBlock:(ReadBodyCompletionBlock)block { + GWS_DCHECK([_request hasBody] && ![_request usesChunkedTransferEncoding]); + NSMutableData* bodyData = [[NSMutableData alloc] initWithCapacity:kBodyReadCapacity]; + [self readData:bodyData + withLength:length + completionBlock:^(BOOL success) { + + if (success) { + if (bodyData.length <= length) { + NSError* error = nil; + if ([_request performWriteData:bodyData error:&error]) { + NSUInteger remainingLength = length - bodyData.length; + if (remainingLength) { + [self readBodyWithRemainingLength:remainingLength completionBlock:block]; + } else { + block(YES); + } + } else { + GWS_LOG_ERROR(@"Failed writing request body on socket %i: %@", _socket, error); + block(NO); + } + } else { + GWS_LOG_ERROR(@"Unexpected extra content reading request body on socket %i", _socket); + block(NO); + GWS_DNOT_REACHED(); + } + } else { + block(NO); + } + + }]; +} + +static inline NSUInteger _ScanHexNumber(const void* bytes, NSUInteger size) { + char buffer[size + 1]; + bcopy(bytes, buffer, size); + buffer[size] = 0; + char* end = NULL; + long result = strtol(buffer, &end, 16); + return ((end != NULL) && (*end == 0) && (result >= 0) ? result : NSNotFound); +} + +- (void)readNextBodyChunk:(NSMutableData*)chunkData completionBlock:(ReadBodyCompletionBlock)block { + GWS_DCHECK([_request hasBody] && [_request usesChunkedTransferEncoding]); + + while (1) { + NSRange range = [chunkData rangeOfData:_CRLFData options:0 range:NSMakeRange(0, chunkData.length)]; + if (range.location == NSNotFound) { + break; + } + NSRange extensionRange = [chunkData rangeOfData:[NSData dataWithBytes:";" length:1] options:0 range:NSMakeRange(0, range.location)]; // Ignore chunk extensions + NSUInteger length = _ScanHexNumber((char*)chunkData.bytes, extensionRange.location != NSNotFound ? extensionRange.location : range.location); + if (length != NSNotFound) { + if (length) { + if (chunkData.length < range.location + range.length + length + 2) { + break; + } + const char* ptr = (char*)chunkData.bytes + range.location + range.length + length; + if ((*ptr == '\r') && (*(ptr + 1) == '\n')) { + NSError* error = nil; + if ([_request performWriteData:[chunkData subdataWithRange:NSMakeRange(range.location + range.length, length)] error:&error]) { + [chunkData replaceBytesInRange:NSMakeRange(0, range.location + range.length + length + 2) withBytes:NULL length:0]; + } else { + GWS_LOG_ERROR(@"Failed writing request body on socket %i: %@", _socket, error); + block(NO); + return; + } + } else { + GWS_LOG_ERROR(@"Missing terminating CRLF sequence for chunk reading request body on socket %i", _socket); + block(NO); + return; + } + } else { + NSRange trailerRange = [chunkData rangeOfData:_CRLFCRLFData options:0 range:NSMakeRange(range.location, chunkData.length - range.location)]; // Ignore trailers + if (trailerRange.location != NSNotFound) { + block(YES); + return; + } + } + } else { + GWS_LOG_ERROR(@"Invalid chunk length reading request body on socket %i", _socket); + block(NO); + return; + } + } + + [self readData:chunkData + withLength:NSUIntegerMax + completionBlock:^(BOOL success) { + + if (success) { + [self readNextBodyChunk:chunkData completionBlock:block]; + } else { + block(NO); + } + + }]; +} + +@end + +@implementation GCDWebServerConnection (Write) + +- (void)writeData:(NSData*)data withCompletionBlock:(WriteDataCompletionBlock)block { + dispatch_data_t buffer = dispatch_data_create(data.bytes, data.length, dispatch_get_global_queue(_server.dispatchQueuePriority, 0), ^{ + [data self]; // Keeps ARC from releasing data too early + }); + dispatch_write(_socket, buffer, dispatch_get_global_queue(_server.dispatchQueuePriority, 0), ^(dispatch_data_t remainingData, int error) { + + @autoreleasepool { + if (error == 0) { + GWS_DCHECK(remainingData == NULL); + [self didWriteBytes:data.bytes length:data.length]; + block(YES); + } else { + GWS_LOG_ERROR(@"Error while writing to socket %i: %s (%i)", _socket, strerror(error), error); + block(NO); + } + } + + }); +#if !OS_OBJECT_USE_OBJC_RETAIN_RELEASE + dispatch_release(buffer); +#endif +} + +- (void)writeHeadersWithCompletionBlock:(WriteHeadersCompletionBlock)block { + GWS_DCHECK(_responseMessage); + CFDataRef data = CFHTTPMessageCopySerializedMessage(_responseMessage); + [self writeData:(__bridge NSData*)data withCompletionBlock:block]; + CFRelease(data); +} + +- (void)writeBodyWithCompletionBlock:(WriteBodyCompletionBlock)block { + GWS_DCHECK([_response hasBody]); + [_response performReadDataWithCompletion:^(NSData* data, NSError* error) { + + if (data) { + if (data.length) { + if (_response.usesChunkedTransferEncoding) { + const char* hexString = [[NSString stringWithFormat:@"%lx", (unsigned long)data.length] UTF8String]; + size_t hexLength = strlen(hexString); + NSData* chunk = [NSMutableData dataWithLength:(hexLength + 2 + data.length + 2)]; + if (chunk == nil) { + GWS_LOG_ERROR(@"Failed allocating memory for response body chunk for socket %i: %@", _socket, error); + block(NO); + return; + } + char* ptr = (char*)[(NSMutableData*)chunk mutableBytes]; + bcopy(hexString, ptr, hexLength); + ptr += hexLength; + *ptr++ = '\r'; + *ptr++ = '\n'; + bcopy(data.bytes, ptr, data.length); + ptr += data.length; + *ptr++ = '\r'; + *ptr = '\n'; + data = chunk; + } + [self writeData:data + withCompletionBlock:^(BOOL success) { + + if (success) { + [self writeBodyWithCompletionBlock:block]; + } else { + block(NO); + } + + }]; + } else { + if (_response.usesChunkedTransferEncoding) { + [self writeData:_lastChunkData + withCompletionBlock:^(BOOL success) { + + block(success); + + }]; + } else { + block(YES); + } + } + } else { + GWS_LOG_ERROR(@"Failed reading response body for socket %i: %@", _socket, error); + block(NO); + } + + }]; +} + +@end + @implementation GCDWebServerConnection (Subclassing) - (BOOL)open { #ifdef __GCDWEBSERVER_ENABLE_TESTING__ if (_server.recordingEnabled) { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" _connectionIndex = OSAtomicIncrement32(&_connectionCounter); - +#pragma clang diagnostic pop + _requestPath = [NSTemporaryDirectory() stringByAppendingPathComponent:[[NSProcessInfo processInfo] globallyUniqueString]]; _requestFD = open([_requestPath fileSystemRepresentation], O_CREAT | O_TRUNC | O_WRONLY, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); GWS_DCHECK(_requestFD > 0); - + _responsePath = [NSTemporaryDirectory() stringByAppendingPathComponent:[[NSProcessInfo processInfo] globallyUniqueString]]; _responseFD = open([_responsePath fileSystemRepresentation], O_CREAT | O_TRUNC | O_WRONLY, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); GWS_DCHECK(_responseFD > 0); } #endif - + return YES; } - (void)didReadBytes:(const void*)bytes length:(NSUInteger)length { GWS_LOG_DEBUG(@"Connection received %lu bytes on socket %i", (unsigned long)length, _socket); - _bytesRead += length; - + _totalBytesRead += length; + #ifdef __GCDWEBSERVER_ENABLE_TESTING__ if ((_requestFD > 0) && (write(_requestFD, bytes, length) != (ssize_t)length)) { GWS_LOG_ERROR(@"Failed recording request data: %s (%i)", strerror(errno), errno); @@ -690,8 +715,8 @@ - (void)didReadBytes:(const void*)bytes length:(NSUInteger)length { - (void)didWriteBytes:(const void*)bytes length:(NSUInteger)length { GWS_LOG_DEBUG(@"Connection sent %lu bytes on socket %i", (unsigned long)length, _socket); - _bytesWritten += length; - + _totalBytesWritten += length; + #ifdef __GCDWEBSERVER_ENABLE_TESTING__ if ((_responseFD > 0) && (write(_responseFD, bytes, length) != (ssize_t)length)) { GWS_LOG_ERROR(@"Failed recording response data: %s (%i)", strerror(errno), errno); @@ -707,7 +732,7 @@ - (NSURL*)rewriteRequestURL:(NSURL*)url withMethod:(NSString*)method headers:(NS // https://tools.ietf.org/html/rfc2617 - (GCDWebServerResponse*)preflightRequest:(GCDWebServerRequest*)request { - GWS_LOG_DEBUG(@"Connection on socket %i preflighting request \"%@ %@\" with %lu bytes body", _socket, _virtualHEAD ? @"HEAD" : _request.method, _request.path, (unsigned long)_bytesRead); + GWS_LOG_DEBUG(@"Connection on socket %i preflighting request \"%@ %@\" with %lu bytes body", _socket, _virtualHEAD ? @"HEAD" : _request.method, _request.path, (unsigned long)_totalBytesRead); GCDWebServerResponse* response = nil; if (_server.authenticationBasicAccounts) { __block BOOL authenticated = NO; @@ -731,7 +756,7 @@ - (GCDWebServerResponse*)preflightRequest:(GCDWebServerRequest*)request { NSString* authorizationHeader = [request.headers objectForKey:@"Authorization"]; if ([authorizationHeader hasPrefix:@"Digest "]) { NSString* realm = GCDWebServerExtractHeaderValueParameter(authorizationHeader, @"realm"); - if ([realm isEqualToString:_server.authenticationRealm]) { + if (realm && [_server.authenticationRealm isEqualToString:realm]) { NSString* nonce = GCDWebServerExtractHeaderValueParameter(authorizationHeader, @"nonce"); if ([nonce isEqualToString:_digestAuthenticationNonce]) { NSString* username = GCDWebServerExtractHeaderValueParameter(authorizationHeader, @"username"); @@ -757,7 +782,7 @@ - (GCDWebServerResponse*)preflightRequest:(GCDWebServerRequest*)request { } - (void)processRequest:(GCDWebServerRequest*)request completion:(GCDWebServerCompletionBlock)completion { - GWS_LOG_DEBUG(@"Connection on socket %i processing request \"%@ %@\" with %lu bytes body", _socket, _virtualHEAD ? @"HEAD" : _request.method, _request.path, (unsigned long)_bytesRead); + GWS_LOG_DEBUG(@"Connection on socket %i processing request \"%@ %@\" with %lu bytes body", _socket, _virtualHEAD ? @"HEAD" : _request.method, _request.path, (unsigned long)_totalBytesRead); _handler.asyncProcessBlock(request, [completion copy]); } @@ -797,7 +822,7 @@ - (void)abortRequest:(GCDWebServerRequest*)request withStatusCode:(NSInteger)sta GWS_DCHECK(_responseMessage == NULL); GWS_DCHECK((statusCode >= 400) && (statusCode < 600)); [self _initializeResponseHeadersWithStatusCode:statusCode]; - [self _writeHeadersWithCompletionBlock:^(BOOL success) { + [self writeHeadersWithCompletionBlock:^(BOOL success) { ; // Nothing more to do }]; GWS_LOG_DEBUG(@"Connection aborted with status code %i on socket %i", (int)statusCode, _socket); @@ -819,7 +844,7 @@ - (void)close { } unlink([_requestPath fileSystemRepresentation]); } - + if (_responsePath) { BOOL success = NO; NSError* error = nil; @@ -835,11 +860,11 @@ - (void)close { unlink([_responsePath fileSystemRepresentation]); } #endif - + if (_request) { - GWS_LOG_VERBOSE(@"[%@] %@ %i \"%@ %@\" (%lu | %lu)", self.localAddressString, self.remoteAddressString, (int)_statusCode, _virtualHEAD ? @"HEAD" : _request.method, _request.path, (unsigned long)_bytesRead, (unsigned long)_bytesWritten); + GWS_LOG_VERBOSE(@"[%@] %@ %i \"%@ %@\" (%lu | %lu)", self.localAddressString, self.remoteAddressString, (int)_statusCode, _virtualHEAD ? @"HEAD" : _request.method, _request.path, (unsigned long)_totalBytesRead, (unsigned long)_totalBytesWritten); } else { - GWS_LOG_VERBOSE(@"[%@] %@ %i \"(invalid request)\" (%lu | %lu)", self.localAddressString, self.remoteAddressString, (int)_statusCode, (unsigned long)_bytesRead, (unsigned long)_bytesWritten); + GWS_LOG_VERBOSE(@"[%@] %@ %i \"(invalid request)\" (%lu | %lu)", self.localAddressString, self.remoteAddressString, (int)_statusCode, (unsigned long)_totalBytesRead, (unsigned long)_totalBytesWritten); } } diff --git a/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerFunctions.h b/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerFunctions.h index e5be05cf..4235eccc 100644 --- a/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerFunctions.h +++ b/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerFunctions.h @@ -27,6 +27,8 @@ #import +NS_ASSUME_NONNULL_BEGIN + #ifdef __cplusplus extern "C" { #endif @@ -34,20 +36,24 @@ extern "C" { /** * Converts a file extension to the corresponding MIME type. * If there is no match, "application/octet-stream" is returned. + * + * Overrides allow to customize the built-in mapping from extensions to MIME + * types. Keys of the dictionary must be lowercased file extensions without + * the period, and the values must be the corresponding MIME types. */ -NSString* GCDWebServerGetMimeTypeForExtension(NSString* extension); +NSString* GCDWebServerGetMimeTypeForExtension(NSString* extension, NSDictionary* _Nullable overrides); /** * Add percent-escapes to a string so it can be used in a URL. * The legal characters ":@/?&=+" are also escaped to ensure compatibility * with URL encoded forms and URL queries. */ -NSString* GCDWebServerEscapeURLString(NSString* string); +NSString* _Nullable GCDWebServerEscapeURLString(NSString* string); /** * Unescapes a URL percent-encoded string. */ -NSString* GCDWebServerUnescapeURLString(NSString* string); +NSString* _Nullable GCDWebServerUnescapeURLString(NSString* string); /** * Extracts the unescaped names and values from an @@ -63,7 +69,7 @@ NSDictionary* GCDWebServerParseURLEncodedForm(NSString* form); * On iOS, returns the IPv4 or IPv6 address as a string of the WiFi * interface if connected or nil otherwise. */ -NSString* GCDWebServerGetPrimaryIPAddress(BOOL useIPv6); +NSString* _Nullable GCDWebServerGetPrimaryIPAddress(BOOL useIPv6); /** * Converts a date into a string using RFC822 formatting. @@ -79,7 +85,7 @@ NSString* GCDWebServerFormatRFC822(NSDate* date); * * @warning Timezones other than GMT are not supported by this function. */ -NSDate* GCDWebServerParseRFC822(NSString* string); +NSDate* _Nullable GCDWebServerParseRFC822(NSString* string); /** * Converts a date into a string using IOS 8601 formatting. @@ -94,8 +100,10 @@ NSString* GCDWebServerFormatISO8601(NSDate* date); * @warning Only "calendar" variant is supported at this time and timezones * other than GMT are not supported either. */ -NSDate* GCDWebServerParseISO8601(NSString* string); +NSDate* _Nullable GCDWebServerParseISO8601(NSString* string); #ifdef __cplusplus } #endif + +NS_ASSUME_NONNULL_END diff --git a/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerFunctions.m b/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerFunctions.m index 25e41ca2..2a1edfc5 100644 --- a/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerFunctions.m +++ b/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerFunctions.m @@ -83,21 +83,28 @@ void GCDWebServerInitializeFunctions() { } NSString* GCDWebServerTruncateHeaderValue(NSString* value) { - NSRange range = [value rangeOfString:@";"]; - return range.location != NSNotFound ? [value substringToIndex:range.location] : value; + if (value) { + NSRange range = [value rangeOfString:@";"]; + if (range.location != NSNotFound) { + return [value substringToIndex:range.location]; + } + } + return value; } NSString* GCDWebServerExtractHeaderValueParameter(NSString* value, NSString* name) { NSString* parameter = nil; - NSScanner* scanner = [[NSScanner alloc] initWithString:value]; - [scanner setCaseSensitive:NO]; // Assume parameter names are case-insensitive - NSString* string = [NSString stringWithFormat:@"%@=", name]; - if ([scanner scanUpToString:string intoString:NULL]) { - [scanner scanString:string intoString:NULL]; - if ([scanner scanString:@"\"" intoString:NULL]) { - [scanner scanUpToString:@"\"" intoString:¶meter]; - } else { - [scanner scanUpToCharactersFromSet:[NSCharacterSet whitespaceCharacterSet] intoString:¶meter]; + if (value) { + NSScanner* scanner = [[NSScanner alloc] initWithString:value]; + [scanner setCaseSensitive:NO]; // Assume parameter names are case-insensitive + NSString* string = [NSString stringWithFormat:@"%@=", name]; + if ([scanner scanUpToString:string intoString:NULL]) { + [scanner scanString:string intoString:NULL]; + if ([scanner scanString:@"\"" intoString:NULL]) { + [scanner scanUpToString:@"\"" intoString:¶meter]; + } else { + [scanner scanUpToCharactersFromSet:[NSCharacterSet whitespaceCharacterSet] intoString:¶meter]; + } } } return parameter; @@ -159,17 +166,15 @@ BOOL GCDWebServerIsTextContentType(NSString* type) { return [NSString stringWithFormat:@"<%lu bytes>", (unsigned long)data.length]; } -NSString* GCDWebServerGetMimeTypeForExtension(NSString* extension) { - static NSDictionary* _overrides = nil; - if (_overrides == nil) { - _overrides = [[NSDictionary alloc] initWithObjectsAndKeys: - @"text/css", @"css", - nil]; - } +NSString* GCDWebServerGetMimeTypeForExtension(NSString* extension, NSDictionary* overrides) { + NSDictionary* builtInOverrides = @{ @"css" : @"text/css" }; NSString* mimeType = nil; extension = [extension lowercaseString]; if (extension.length) { - mimeType = [_overrides objectForKey:extension]; + mimeType = [overrides objectForKey:extension]; + if (mimeType == nil) { + mimeType = [builtInOverrides objectForKey:extension]; + } if (mimeType == nil) { CFStringRef uti = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, (__bridge CFStringRef)extension, NULL); if (uti) { @@ -205,13 +210,13 @@ BOOL GCDWebServerIsTextContentType(NSString* type) { break; } [scanner setScanLocation:([scanner scanLocation] + 1)]; - + NSString* value = nil; [scanner scanUpToString:@"&" intoString:&value]; if (value == nil) { value = @""; } - + key = [key stringByReplacingOccurrencesOfString:@"+" withString:@" "]; NSString* unescapedKey = key ? GCDWebServerUnescapeURLString(key) : nil; value = [value stringByReplacingOccurrencesOfString:@"+" withString:@" "]; @@ -222,7 +227,7 @@ BOOL GCDWebServerIsTextContentType(NSString* type) { GWS_LOG_WARNING(@"Failed parsing URL encoded form for key \"%@\" and value \"%@\"", key, value); GWS_DNOT_REACHED(); } - + if ([scanner isAtEnd]) { break; } @@ -232,15 +237,16 @@ BOOL GCDWebServerIsTextContentType(NSString* type) { } NSString* GCDWebServerStringFromSockAddr(const struct sockaddr* addr, BOOL includeService) { - NSString* string = nil; char hostBuffer[NI_MAXHOST]; char serviceBuffer[NI_MAXSERV]; - if (getnameinfo(addr, addr->sa_len, hostBuffer, sizeof(hostBuffer), serviceBuffer, sizeof(serviceBuffer), NI_NUMERICHOST | NI_NUMERICSERV | NI_NOFQDN) >= 0) { - string = includeService ? [NSString stringWithFormat:@"%s:%s", hostBuffer, serviceBuffer] : [NSString stringWithUTF8String:hostBuffer]; - } else { + if (getnameinfo(addr, addr->sa_len, hostBuffer, sizeof(hostBuffer), serviceBuffer, sizeof(serviceBuffer), NI_NUMERICHOST | NI_NUMERICSERV | NI_NOFQDN) != 0) { +#if DEBUG GWS_DNOT_REACHED(); +#else + return @""; +#endif } - return string; + return includeService ? [NSString stringWithFormat:@"%s:%s", hostBuffer, serviceBuffer] : (NSString*)[NSString stringWithUTF8String:hostBuffer]; } NSString* GCDWebServerGetPrimaryIPAddress(BOOL useIPv6) { @@ -255,7 +261,10 @@ BOOL GCDWebServerIsTextContentType(NSString* type) { if (store) { CFPropertyListRef info = SCDynamicStoreCopyValue(store, CFSTR("State:/Network/Global/IPv4")); // There is no equivalent for IPv6 but the primary interface should be the same if (info) { - primaryInterface = [[NSString stringWithString:[(__bridge NSDictionary*)info objectForKey:@"PrimaryInterface"]] UTF8String]; + NSString* interface = [(__bridge NSDictionary*)info objectForKey:@"PrimaryInterface"]; + if (interface) { + primaryInterface = [[NSString stringWithString:interface] UTF8String]; // Copy string to auto-release pool + } CFRelease(info); } CFRelease(store); @@ -267,9 +276,9 @@ BOOL GCDWebServerIsTextContentType(NSString* type) { struct ifaddrs* list; if (getifaddrs(&list) >= 0) { for (struct ifaddrs* ifap = list; ifap; ifap = ifap->ifa_next) { -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_TV - // Assume en0 is Ethernet and en1 is WiFi since there is no way to use SystemConfiguration framework in iOS Simulator - // Assumption holds for Apple TV running tvOS +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_TV + // Assume en0 is Ethernet and en1 is WiFi since there is no way to use SystemConfiguration framework in iOS Simulator + // Assumption holds for Apple TV running tvOS if (strcmp(ifap->ifa_name, "en0") && strcmp(ifap->ifa_name, "en1")) #else if (strcmp(ifap->ifa_name, primaryInterface)) @@ -303,5 +312,5 @@ BOOL GCDWebServerIsTextContentType(NSString* type) { buffer[2 * i + 1] = byteLo >= 10 ? 'a' + byteLo - 10 : '0' + byteLo; } buffer[2 * CC_MD5_DIGEST_LENGTH] = 0; - return [NSString stringWithUTF8String:buffer]; + return (NSString*)[NSString stringWithUTF8String:buffer]; } diff --git a/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerPrivate.h b/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerPrivate.h index 8150d584..d726ec2c 100644 --- a/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerPrivate.h +++ b/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerPrivate.h @@ -81,27 +81,6 @@ #define GWS_DCHECK(__CONDITION__) XLOG_DEBUG_CHECK(__CONDITION__) #define GWS_DNOT_REACHED() XLOG_DEBUG_UNREACHABLE() -/** - * Automatically detect if CocoaLumberJack is available and if so use - * it as a logging facility. - */ - -#elif defined(__has_include) && __has_include("CocoaLumberjack/CocoaLumberjack.h") - -#import - -#define __GCDWEBSERVER_LOGGING_FACILITY_COCOALUMBERJACK__ - -#undef LOG_LEVEL_DEF -#define LOG_LEVEL_DEF GCDWebServerLogLevel -extern DDLogLevel GCDWebServerLogLevel; - -#define GWS_LOG_DEBUG(...) DDLogDebug(__VA_ARGS__) -#define GWS_LOG_VERBOSE(...) DDLogVerbose(__VA_ARGS__) -#define GWS_LOG_INFO(...) DDLogInfo(__VA_ARGS__) -#define GWS_LOG_WARNING(...) DDLogWarn(__VA_ARGS__) -#define GWS_LOG_ERROR(...) DDLogError(__VA_ARGS__) - /** * If all of the above fail, then use GCDWebServer built-in * logging facility. @@ -120,17 +99,32 @@ typedef NS_ENUM(int, GCDWebServerLoggingLevel) { }; extern GCDWebServerLoggingLevel GCDWebServerLogLevel; -extern void GCDWebServerLogMessage(GCDWebServerLoggingLevel level, NSString* format, ...) NS_FORMAT_FUNCTION(2, 3); +extern void GCDWebServerLogMessage(GCDWebServerLoggingLevel level, NSString* _Nonnull format, ...) NS_FORMAT_FUNCTION(2, 3); #if DEBUG -#define GWS_LOG_DEBUG(...) do { if (GCDWebServerLogLevel <= kGCDWebServerLoggingLevel_Debug) GCDWebServerLogMessage(kGCDWebServerLoggingLevel_Debug, __VA_ARGS__); } while (0) +#define GWS_LOG_DEBUG(...) \ + do { \ + if (GCDWebServerLogLevel <= kGCDWebServerLoggingLevel_Debug) GCDWebServerLogMessage(kGCDWebServerLoggingLevel_Debug, __VA_ARGS__); \ + } while (0) #else #define GWS_LOG_DEBUG(...) #endif -#define GWS_LOG_VERBOSE(...) do { if (GCDWebServerLogLevel <= kGCDWebServerLoggingLevel_Verbose) GCDWebServerLogMessage(kGCDWebServerLoggingLevel_Verbose, __VA_ARGS__); } while (0) -#define GWS_LOG_INFO(...) do { if (GCDWebServerLogLevel <= kGCDWebServerLoggingLevel_Info) GCDWebServerLogMessage(kGCDWebServerLoggingLevel_Info, __VA_ARGS__); } while (0) -#define GWS_LOG_WARNING(...) do { if (GCDWebServerLogLevel <= kGCDWebServerLoggingLevel_Warning) GCDWebServerLogMessage(kGCDWebServerLoggingLevel_Warning, __VA_ARGS__); } while (0) -#define GWS_LOG_ERROR(...) do { if (GCDWebServerLogLevel <= kGCDWebServerLoggingLevel_Error) GCDWebServerLogMessage(kGCDWebServerLoggingLevel_Error, __VA_ARGS__); } while (0) +#define GWS_LOG_VERBOSE(...) \ + do { \ + if (GCDWebServerLogLevel <= kGCDWebServerLoggingLevel_Verbose) GCDWebServerLogMessage(kGCDWebServerLoggingLevel_Verbose, __VA_ARGS__); \ + } while (0) +#define GWS_LOG_INFO(...) \ + do { \ + if (GCDWebServerLogLevel <= kGCDWebServerLoggingLevel_Info) GCDWebServerLogMessage(kGCDWebServerLoggingLevel_Info, __VA_ARGS__); \ + } while (0) +#define GWS_LOG_WARNING(...) \ + do { \ + if (GCDWebServerLogLevel <= kGCDWebServerLoggingLevel_Warning) GCDWebServerLogMessage(kGCDWebServerLoggingLevel_Warning, __VA_ARGS__); \ + } while (0) +#define GWS_LOG_ERROR(...) \ + do { \ + if (GCDWebServerLogLevel <= kGCDWebServerLoggingLevel_Error) GCDWebServerLogMessage(kGCDWebServerLoggingLevel_Error, __VA_ARGS__); \ + } while (0) #endif @@ -143,10 +137,10 @@ extern void GCDWebServerLogMessage(GCDWebServerLoggingLevel level, NSString* for #if DEBUG #define GWS_DCHECK(__CONDITION__) \ - do { \ - if (!(__CONDITION__)) { \ - abort(); \ - } \ + do { \ + if (!(__CONDITION__)) { \ + abort(); \ + } \ } while (0) #define GWS_DNOT_REACHED() abort() @@ -159,6 +153,8 @@ extern void GCDWebServerLogMessage(GCDWebServerLoggingLevel level, NSString* for #endif +NS_ASSUME_NONNULL_BEGIN + /** * GCDWebServer internal constants and APIs. */ @@ -171,29 +167,29 @@ static inline BOOL GCDWebServerIsValidByteRange(NSRange range) { } static inline NSError* GCDWebServerMakePosixError(int code) { - return [NSError errorWithDomain:NSPOSIXErrorDomain code:code userInfo:@{NSLocalizedDescriptionKey: [NSString stringWithUTF8String:strerror(code)]}]; + return [NSError errorWithDomain:NSPOSIXErrorDomain code:code userInfo:@{NSLocalizedDescriptionKey : (NSString*)[NSString stringWithUTF8String:strerror(code)]}]; } extern void GCDWebServerInitializeFunctions(); -extern NSString* GCDWebServerNormalizeHeaderValue(NSString* value); -extern NSString* GCDWebServerTruncateHeaderValue(NSString* value); -extern NSString* GCDWebServerExtractHeaderValueParameter(NSString* header, NSString* attribute); +extern NSString* _Nullable GCDWebServerNormalizeHeaderValue(NSString* _Nullable value); +extern NSString* _Nullable GCDWebServerTruncateHeaderValue(NSString* _Nullable value); +extern NSString* _Nullable GCDWebServerExtractHeaderValueParameter(NSString* _Nullable value, NSString* attribute); extern NSStringEncoding GCDWebServerStringEncodingFromCharset(NSString* charset); extern BOOL GCDWebServerIsTextContentType(NSString* type); extern NSString* GCDWebServerDescribeData(NSData* data, NSString* contentType); -extern NSString* GCDWebServerComputeMD5Digest(NSString* format, ...) NS_FORMAT_FUNCTION(1,2); +extern NSString* GCDWebServerComputeMD5Digest(NSString* format, ...) NS_FORMAT_FUNCTION(1, 2); extern NSString* GCDWebServerStringFromSockAddr(const struct sockaddr* addr, BOOL includeService); @interface GCDWebServerConnection () -- (id)initWithServer:(GCDWebServer*)server localAddress:(NSData*)localAddress remoteAddress:(NSData*)remoteAddress socket:(CFSocketNativeHandle)socket; +- (instancetype)initWithServer:(GCDWebServer*)server localAddress:(NSData*)localAddress remoteAddress:(NSData*)remoteAddress socket:(CFSocketNativeHandle)socket; @end @interface GCDWebServer () -@property(nonatomic, readonly) NSArray* handlers; -@property(nonatomic, readonly) NSString* serverName; -@property(nonatomic, readonly) NSString* authenticationRealm; -@property(nonatomic, readonly) NSDictionary* authenticationBasicAccounts; -@property(nonatomic, readonly) NSDictionary* authenticationDigestAccounts; +@property(nonatomic, readonly) NSMutableArray* handlers; +@property(nonatomic, readonly, nullable) NSString* serverName; +@property(nonatomic, readonly, nullable) NSString* authenticationRealm; +@property(nonatomic, readonly, nullable) NSMutableDictionary* authenticationBasicAccounts; +@property(nonatomic, readonly, nullable) NSMutableDictionary* authenticationDigestAccounts; @property(nonatomic, readonly) BOOL shouldAutomaticallyMapHEADToGET; @property(nonatomic, readonly) dispatch_queue_priority_t dispatchQueuePriority; - (void)willStartConnection:(GCDWebServerConnection*)connection; @@ -207,13 +203,13 @@ extern NSString* GCDWebServerStringFromSockAddr(const struct sockaddr* addr, BOO @interface GCDWebServerRequest () @property(nonatomic, readonly) BOOL usesChunkedTransferEncoding; -@property(nonatomic, readwrite) NSData* localAddressData; -@property(nonatomic, readwrite) NSData* remoteAddressData; +@property(nonatomic) NSData* localAddressData; +@property(nonatomic) NSData* remoteAddressData; - (void)prepareForWriting; - (BOOL)performOpen:(NSError**)error; - (BOOL)performWriteData:(NSData*)data error:(NSError**)error; - (BOOL)performClose:(NSError**)error; -- (void)setAttribute:(id)attribute forKey:(NSString*)key; +- (void)setAttribute:(nullable id)attribute forKey:(NSString*)key; @end @interface GCDWebServerResponse () @@ -224,3 +220,5 @@ extern NSString* GCDWebServerStringFromSockAddr(const struct sockaddr* addr, BOO - (void)performReadDataWithCompletion:(GCDWebServerBodyReaderCompletionBlock)block; - (void)performClose; @end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerRequest.h b/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerRequest.h index c7bc31bf..3fe90296 100644 --- a/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerRequest.h +++ b/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerRequest.h @@ -27,6 +27,8 @@ #import +NS_ASSUME_NONNULL_BEGIN + /** * Attribute key to retrieve an NSArray containing NSStrings from a GCDWebServerRequest * with the contents of any regular expression captures done on the request path. @@ -112,7 +114,7 @@ extern NSString* const GCDWebServerRequestAttribute_RegexCaptures; * * @warning This property will be nil if there is no query in the URL. */ -@property(nonatomic, readonly) NSDictionary* query; +@property(nonatomic, readonly, nullable) NSDictionary* query; /** * Returns the content type for the body of the request parsed from the @@ -122,7 +124,7 @@ extern NSString* const GCDWebServerRequestAttribute_RegexCaptures; * "application/octet-stream" if a body is present but there was no * "Content-Type" header. */ -@property(nonatomic, readonly) NSString* contentType; +@property(nonatomic, readonly, nullable) NSString* contentType; /** * Returns the content length for the body of the request parsed from the @@ -137,12 +139,12 @@ extern NSString* const GCDWebServerRequestAttribute_RegexCaptures; /** * Returns the parsed "If-Modified-Since" header or nil if absent or malformed. */ -@property(nonatomic, readonly) NSDate* ifModifiedSince; +@property(nonatomic, readonly, nullable) NSDate* ifModifiedSince; /** * Returns the parsed "If-None-Match" header or nil if absent or malformed. */ -@property(nonatomic, readonly) NSString* ifNoneMatch; +@property(nonatomic, readonly, nullable) NSString* ifNoneMatch; /** * Returns the parsed "Range" header or (NSUIntegerMax, 0) if absent or malformed. @@ -184,7 +186,7 @@ extern NSString* const GCDWebServerRequestAttribute_RegexCaptures; /** * This method is the designated initializer for the class. */ -- (instancetype)initWithMethod:(NSString*)method url:(NSURL*)url headers:(NSDictionary*)headers path:(NSString*)path query:(NSDictionary*)query; +- (instancetype)initWithMethod:(NSString*)method url:(NSURL*)url headers:(NSDictionary*)headers path:(NSString*)path query:(nullable NSDictionary*)query; /** * Convenience method that checks if the contentType property is defined. @@ -201,6 +203,8 @@ extern NSString* const GCDWebServerRequestAttribute_RegexCaptures; * * @return The attribute value for the key. */ -- (id)attributeForKey:(NSString*)key; +- (nullable id)attributeForKey:(NSString*)key; @end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerRequest.m b/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerRequest.m index 7542dc00..05988cd5 100644 --- a/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerRequest.m +++ b/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerRequest.m @@ -39,22 +39,17 @@ #define kGZipInitialBufferSize (256 * 1024) @interface GCDWebServerBodyDecoder : NSObject -- (id)initWithRequest:(GCDWebServerRequest*)request writer:(id)writer; @end @interface GCDWebServerGZipDecoder : GCDWebServerBodyDecoder @end -@interface GCDWebServerBodyDecoder () { -@private +@implementation GCDWebServerBodyDecoder { GCDWebServerRequest* __unsafe_unretained _request; id __unsafe_unretained _writer; } -@end - -@implementation GCDWebServerBodyDecoder -- (id)initWithRequest:(GCDWebServerRequest*)request writer:(id)writer { +- (instancetype)initWithRequest:(GCDWebServerRequest* _Nonnull)request writer:(id _Nonnull)writer { if ((self = [super init])) { _request = request; _writer = writer; @@ -76,14 +71,10 @@ - (BOOL)close:(NSError**)error { @end -@interface GCDWebServerGZipDecoder () { -@private +@implementation GCDWebServerGZipDecoder { z_stream _stream; BOOL _finished; } -@end - -@implementation GCDWebServerGZipDecoder - (BOOL)open:(NSError**)error { int result = inflateInit2(&_stream, 15 + 16); @@ -143,77 +134,55 @@ - (BOOL)close:(NSError**)error { @end -@interface GCDWebServerRequest () { -@private - NSString* _method; - NSURL* _url; - NSDictionary* _headers; - NSString* _path; - NSDictionary* _query; - NSString* _type; - BOOL _chunked; - NSUInteger _length; - NSDate* _modifiedSince; - NSString* _noneMatch; - NSRange _range; - BOOL _gzipAccepted; - NSData* _localAddress; - NSData* _remoteAddress; - +@implementation GCDWebServerRequest { BOOL _opened; NSMutableArray* _decoders; - NSMutableDictionary* _attributes; id __unsafe_unretained _writer; + NSMutableDictionary* _attributes; } -@end - -@implementation GCDWebServerRequest : NSObject - -@synthesize method=_method, URL=_url, headers=_headers, path=_path, query=_query, contentType=_type, contentLength=_length, ifModifiedSince=_modifiedSince, ifNoneMatch=_noneMatch, - byteRange=_range, acceptsGzipContentEncoding=_gzipAccepted, usesChunkedTransferEncoding=_chunked, localAddressData=_localAddress, remoteAddressData=_remoteAddress; - (instancetype)initWithMethod:(NSString*)method url:(NSURL*)url headers:(NSDictionary*)headers path:(NSString*)path query:(NSDictionary*)query { if ((self = [super init])) { _method = [method copy]; - _url = url; + _URL = url; _headers = headers; _path = [path copy]; _query = query; - - _type = GCDWebServerNormalizeHeaderValue([_headers objectForKey:@"Content-Type"]); - _chunked = [GCDWebServerNormalizeHeaderValue([_headers objectForKey:@"Transfer-Encoding"]) isEqualToString:@"chunked"]; + + _contentType = GCDWebServerNormalizeHeaderValue([_headers objectForKey:@"Content-Type"]); + _usesChunkedTransferEncoding = [GCDWebServerNormalizeHeaderValue([_headers objectForKey:@"Transfer-Encoding"]) isEqualToString:@"chunked"]; NSString* lengthHeader = [_headers objectForKey:@"Content-Length"]; if (lengthHeader) { NSInteger length = [lengthHeader integerValue]; - if (_chunked || (length < 0)) { - GWS_LOG_WARNING(@"Invalid 'Content-Length' header '%@' for '%@' request on \"%@\"", lengthHeader, _method, _url); + if (_usesChunkedTransferEncoding || (length < 0)) { + GWS_LOG_WARNING(@"Invalid 'Content-Length' header '%@' for '%@' request on \"%@\"", lengthHeader, _method, _URL); GWS_DNOT_REACHED(); return nil; } - _length = length; - if (_type == nil) { - _type = kGCDWebServerDefaultMimeType; + _contentLength = length; + if (_contentType == nil) { + _contentType = kGCDWebServerDefaultMimeType; } - } else if (_chunked) { - if (_type == nil) { - _type = kGCDWebServerDefaultMimeType; + } else if (_usesChunkedTransferEncoding) { + if (_contentType == nil) { + _contentType = kGCDWebServerDefaultMimeType; } - _length = NSUIntegerMax; + _contentLength = NSUIntegerMax; } else { - if (_type) { - GWS_LOG_WARNING(@"Ignoring 'Content-Type' header for '%@' request on \"%@\"", _method, _url); - _type = nil; // Content-Type without Content-Length or chunked-encoding doesn't make sense + if (_contentType) { + GWS_LOG_WARNING(@"Ignoring 'Content-Type' header for '%@' request on \"%@\"", _method, _URL); + _contentType = nil; // Content-Type without Content-Length or chunked-encoding doesn't make sense } - _length = NSUIntegerMax; + _contentLength = NSUIntegerMax; } - + NSString* modifiedHeader = [_headers objectForKey:@"If-Modified-Since"]; if (modifiedHeader) { - _modifiedSince = [GCDWebServerParseRFC822(modifiedHeader) copy]; + _ifModifiedSince = [GCDWebServerParseRFC822(modifiedHeader) copy]; } - _noneMatch = [_headers objectForKey:@"If-None-Match"]; - - _range = NSMakeRange(NSUIntegerMax, 0); + _ifNoneMatch = [_headers objectForKey:@"If-None-Match"]; + + _byteRange = NSMakeRange(NSUIntegerMax, 0); NSString* rangeHeader = GCDWebServerNormalizeHeaderValue([_headers objectForKey:@"Range"]); if (rangeHeader) { if ([rangeHeader hasPrefix:@"bytes="]) { @@ -226,27 +195,27 @@ - (instancetype)initWithMethod:(NSString*)method url:(NSURL*)url headers:(NSDict NSString* endString = [components objectAtIndex:1]; NSInteger endValue = [endString integerValue]; if (startString.length && (startValue >= 0) && endString.length && (endValue >= startValue)) { // The second 500 bytes: "500-999" - _range.location = startValue; - _range.length = endValue - startValue + 1; + _byteRange.location = startValue; + _byteRange.length = endValue - startValue + 1; } else if (startString.length && (startValue >= 0)) { // The bytes after 9500 bytes: "9500-" - _range.location = startValue; - _range.length = NSUIntegerMax; + _byteRange.location = startValue; + _byteRange.length = NSUIntegerMax; } else if (endString.length && (endValue > 0)) { // The final 500 bytes: "-500" - _range.location = NSUIntegerMax; - _range.length = endValue; + _byteRange.location = NSUIntegerMax; + _byteRange.length = endValue; } } } } - if ((_range.location == NSUIntegerMax) && (_range.length == 0)) { // Ignore "Range" header if syntactically invalid + if ((_byteRange.location == NSUIntegerMax) && (_byteRange.length == 0)) { // Ignore "Range" header if syntactically invalid GWS_LOG_WARNING(@"Failed to parse 'Range' header \"%@\" for url: %@", rangeHeader, url); } } - + if ([[_headers objectForKey:@"Accept-Encoding"] rangeOfString:@"gzip"].location != NSNotFound) { - _gzipAccepted = YES; + _acceptsGzipContentEncoding = YES; } - + _decoders = [[NSMutableArray alloc] init]; _attributes = [[NSMutableDictionary alloc] init]; } @@ -254,11 +223,11 @@ - (instancetype)initWithMethod:(NSString*)method url:(NSURL*)url headers:(NSDict } - (BOOL)hasBody { - return _type ? YES : NO; + return _contentType ? YES : NO; } - (BOOL)hasByteRange { - return GCDWebServerIsValidByteRange(_range); + return GCDWebServerIsValidByteRange(_byteRange); } - (id)attributeForKey:(NSString*)key { @@ -287,7 +256,7 @@ - (void)prepareForWriting { } - (BOOL)performOpen:(NSError**)error { - GWS_DCHECK(_type); + GWS_DCHECK(_contentType); GWS_DCHECK(_writer); if (_opened) { GWS_DNOT_REACHED(); @@ -312,11 +281,11 @@ - (void)setAttribute:(id)attribute forKey:(NSString*)key { } - (NSString*)localAddressString { - return GCDWebServerStringFromSockAddr(_localAddress.bytes, YES); + return GCDWebServerStringFromSockAddr(_localAddressData.bytes, YES); } - (NSString*)remoteAddressString { - return GCDWebServerStringFromSockAddr(_remoteAddress.bytes, YES); + return GCDWebServerStringFromSockAddr(_remoteAddressData.bytes, YES); } - (NSString*)description { diff --git a/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerResponse.h b/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerResponse.h index 2ec2deef..1e5e8c9a 100644 --- a/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerResponse.h +++ b/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerResponse.h @@ -27,11 +27,13 @@ #import +NS_ASSUME_NONNULL_BEGIN + /** * The GCDWebServerBodyReaderCompletionBlock is passed by GCDWebServer to the * GCDWebServerBodyReader object when reading data from it asynchronously. */ -typedef void (^GCDWebServerBodyReaderCompletionBlock)(NSData* data, NSError* error); +typedef void (^GCDWebServerBodyReaderCompletionBlock)(NSData* data, NSError* _Nullable error); /** * This protocol is used by the GCDWebServerConnection to communicate with @@ -62,7 +64,7 @@ typedef void (^GCDWebServerBodyReaderCompletionBlock)(NSData* data, NSError* err * or an empty NSData there is no more body data, or nil on error and set * the "error" argument which is guaranteed to be non-NULL. */ -- (NSData*)readData:(NSError**)error; +- (nullable NSData*)readData:(NSError**)error; /** * This method is called after all body data has been sent. @@ -102,7 +104,7 @@ typedef void (^GCDWebServerBodyReaderCompletionBlock)(NSData* data, NSError* err * * @warning This property must be set if a body is present. */ -@property(nonatomic, copy) NSString* contentType; +@property(nonatomic, copy, nullable) NSString* contentType; /** * Sets the content length for the body of the response. If a body is present @@ -136,14 +138,14 @@ typedef void (^GCDWebServerBodyReaderCompletionBlock)(NSData* data, NSError* err * * The default value is nil. */ -@property(nonatomic, retain) NSDate* lastModifiedDate; +@property(nonatomic, nullable) NSDate* lastModifiedDate; /** * Sets the ETag for the response using the "ETag" header. * * The default value is nil. */ -@property(nonatomic, copy) NSString* eTag; +@property(nonatomic, copy, nullable) NSString* eTag; /** * Enables gzip encoding for the response body. @@ -174,7 +176,7 @@ typedef void (^GCDWebServerBodyReaderCompletionBlock)(NSData* data, NSError* err * @warning Do not attempt to override the primary headers used * by GCDWebServerResponse like "Content-Type", "ETag", etc... */ -- (void)setValue:(NSString*)value forAdditionalHeader:(NSString*)header; +- (void)setValue:(nullable NSString*)value forAdditionalHeader:(NSString*)header; /** * Convenience method that checks if the contentType property is defined. @@ -206,3 +208,5 @@ typedef void (^GCDWebServerBodyReaderCompletionBlock)(NSData* data, NSError* err - (instancetype)initWithRedirect:(NSURL*)location permanent:(BOOL)permanent; @end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerResponse.m b/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerResponse.m index a5dc5374..9153ff67 100644 --- a/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerResponse.m +++ b/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerResponse.m @@ -37,22 +37,17 @@ #define kGZipInitialBufferSize (256 * 1024) @interface GCDWebServerBodyEncoder : NSObject -- (id)initWithResponse:(GCDWebServerResponse*)response reader:(id)reader; @end @interface GCDWebServerGZipEncoder : GCDWebServerBodyEncoder @end -@interface GCDWebServerBodyEncoder () { -@private +@implementation GCDWebServerBodyEncoder { GCDWebServerResponse* __unsafe_unretained _response; id __unsafe_unretained _reader; } -@end - -@implementation GCDWebServerBodyEncoder -- (id)initWithResponse:(GCDWebServerResponse*)response reader:(id)reader { +- (instancetype)initWithResponse:(GCDWebServerResponse* _Nonnull)response reader:(id _Nonnull)reader { if ((self = [super init])) { _response = response; _reader = reader; @@ -74,16 +69,12 @@ - (void)close { @end -@interface GCDWebServerGZipEncoder () { -@private +@implementation GCDWebServerGZipEncoder { z_stream _stream; BOOL _finished; } -@end - -@implementation GCDWebServerGZipEncoder -- (id)initWithResponse:(GCDWebServerResponse*)response reader:(id)reader { +- (instancetype)initWithResponse:(GCDWebServerResponse* _Nonnull)response reader:(id _Nonnull)reader { if ((self = [super initWithResponse:response reader:reader])) { response.contentLength = NSUIntegerMax; // Make sure "Content-Length" header is not set since we don't know it [response setValue:@"gzip" forAdditionalHeader:@"Content-Encoding"]; @@ -157,28 +148,11 @@ - (void)close { @end -@interface GCDWebServerResponse () { -@private - NSString* _type; - NSUInteger _length; - NSInteger _status; - NSUInteger _maxAge; - NSDate* _lastModified; - NSString* _eTag; - NSMutableDictionary* _headers; - BOOL _chunked; - BOOL _gzipped; - +@implementation GCDWebServerResponse { BOOL _opened; NSMutableArray* _encoders; id __unsafe_unretained _reader; } -@end - -@implementation GCDWebServerResponse - -@synthesize contentType=_type, contentLength=_length, statusCode=_status, cacheControlMaxAge=_maxAge, lastModifiedDate=_lastModified, eTag=_eTag, - gzipContentEncodingEnabled=_gzipped, additionalHeaders=_headers; + (instancetype)response { return [[[self class] alloc] init]; @@ -186,26 +160,26 @@ + (instancetype)response { - (instancetype)init { if ((self = [super init])) { - _type = nil; - _length = NSUIntegerMax; - _status = kGCDWebServerHTTPStatusCode_OK; - _maxAge = 0; - _headers = [[NSMutableDictionary alloc] init]; + _contentType = nil; + _contentLength = NSUIntegerMax; + _statusCode = kGCDWebServerHTTPStatusCode_OK; + _cacheControlMaxAge = 0; + _additionalHeaders = [[NSMutableDictionary alloc] init]; _encoders = [[NSMutableArray alloc] init]; } return self; } - (void)setValue:(NSString*)value forAdditionalHeader:(NSString*)header { - [_headers setValue:value forKey:header]; + [_additionalHeaders setValue:value forKey:header]; } - (BOOL)hasBody { - return _type ? YES : NO; + return _contentType ? YES : NO; } - (BOOL)usesChunkedTransferEncoding { - return (_type != nil) && (_length == NSUIntegerMax); + return (_contentType != nil) && (_contentLength == NSUIntegerMax); } - (BOOL)open:(NSError**)error { @@ -222,7 +196,7 @@ - (void)close { - (void)prepareForReading { _reader = self; - if (_gzipped) { + if (_gzipContentEncodingEnabled) { GCDWebServerGZipEncoder* encoder = [[GCDWebServerGZipEncoder alloc] initWithResponse:self reader:_reader]; [_encoders addObject:encoder]; _reader = encoder; @@ -230,7 +204,7 @@ - (void)prepareForReading { } - (BOOL)performOpen:(NSError**)error { - GWS_DCHECK(_type); + GWS_DCHECK(_contentType); GWS_DCHECK(_reader); if (_opened) { GWS_DNOT_REACHED(); @@ -257,24 +231,24 @@ - (void)performClose { } - (NSString*)description { - NSMutableString* description = [NSMutableString stringWithFormat:@"Status Code = %i", (int)_status]; - if (_type) { - [description appendFormat:@"\nContent Type = %@", _type]; + NSMutableString* description = [NSMutableString stringWithFormat:@"Status Code = %i", (int)_statusCode]; + if (_contentType) { + [description appendFormat:@"\nContent Type = %@", _contentType]; } - if (_length != NSUIntegerMax) { - [description appendFormat:@"\nContent Length = %lu", (unsigned long)_length]; + if (_contentLength != NSUIntegerMax) { + [description appendFormat:@"\nContent Length = %lu", (unsigned long)_contentLength]; } - [description appendFormat:@"\nCache Control Max Age = %lu", (unsigned long)_maxAge]; - if (_lastModified) { - [description appendFormat:@"\nLast Modified Date = %@", _lastModified]; + [description appendFormat:@"\nCache Control Max Age = %lu", (unsigned long)_cacheControlMaxAge]; + if (_lastModifiedDate) { + [description appendFormat:@"\nLast Modified Date = %@", _lastModifiedDate]; } if (_eTag) { [description appendFormat:@"\nETag = %@", _eTag]; } - if (_headers.count) { + if (_additionalHeaders.count) { [description appendString:@"\n"]; - for (NSString* header in [[_headers allKeys] sortedArrayUsingSelector:@selector(compare:)]) { - [description appendFormat:@"\n%@: %@", header, [_headers objectForKey:header]]; + for (NSString* header in [[_additionalHeaders allKeys] sortedArrayUsingSelector:@selector(compare:)]) { + [description appendFormat:@"\n%@: %@", header, [_additionalHeaders objectForKey:header]]; } } return description; diff --git a/Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerDataRequest.h b/Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerDataRequest.h index 5048d080..f21a4b78 100644 --- a/Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerDataRequest.h +++ b/Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerDataRequest.h @@ -27,6 +27,8 @@ #import "GCDWebServerRequest.h" +NS_ASSUME_NONNULL_BEGIN + /** * The GCDWebServerDataRequest subclass of GCDWebServerRequest stores the body * of the HTTP request in memory. @@ -49,12 +51,14 @@ * The text encoding used to interpret the data is extracted from the * "Content-Type" header or defaults to UTF-8. */ -@property(nonatomic, readonly) NSString* text; +@property(nonatomic, readonly, nullable) NSString* text; /** * Returns the data for the request body interpreted as a JSON object. If the * content type of the body is not JSON, or if an error occurs, nil is returned. */ -@property(nonatomic, readonly) id jsonObject; +@property(nonatomic, readonly, nullable) id jsonObject; @end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerDataRequest.m b/Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerDataRequest.m index 840e985d..3ea9bba7 100644 --- a/Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerDataRequest.m +++ b/Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerDataRequest.m @@ -31,18 +31,14 @@ #import "GCDWebServerPrivate.h" -@interface GCDWebServerDataRequest () { -@private - NSMutableData* _data; - +@interface GCDWebServerDataRequest () +@property(nonatomic) NSMutableData* data; +@end + +@implementation GCDWebServerDataRequest { NSString* _text; id _jsonObject; } -@end - -@implementation GCDWebServerDataRequest - -@synthesize data=_data; - (BOOL)open:(NSError**)error { if (self.contentLength != NSUIntegerMax) { @@ -52,7 +48,7 @@ - (BOOL)open:(NSError**)error { } if (_data == nil) { if (error) { - *error = [NSError errorWithDomain:kGCDWebServerErrorDomain code:-1 userInfo:@{NSLocalizedDescriptionKey: @"Failed allocating memory"}]; + *error = [NSError errorWithDomain:kGCDWebServerErrorDomain code:-1 userInfo:@{ NSLocalizedDescriptionKey : @"Failed allocating memory" }]; } return NO; } @@ -72,7 +68,7 @@ - (NSString*)description { NSMutableString* description = [NSMutableString stringWithString:[super description]]; if (_data) { [description appendString:@"\n\n"]; - [description appendString:GCDWebServerDescribeData(_data, self.contentType)]; + [description appendString:GCDWebServerDescribeData(_data, (NSString*)self.contentType)]; } return description; } diff --git a/Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerFileRequest.h b/Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerFileRequest.h index ad29eaba..8aceae4d 100644 --- a/Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerFileRequest.h +++ b/Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerFileRequest.h @@ -27,6 +27,8 @@ #import "GCDWebServerRequest.h" +NS_ASSUME_NONNULL_BEGIN + /** * The GCDWebServerFileRequest subclass of GCDWebServerRequest stores the body * of the HTTP request to a file on disk. @@ -43,3 +45,5 @@ @property(nonatomic, readonly) NSString* temporaryPath; @end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerFileRequest.m b/Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerFileRequest.m index adf67a5d..8a47fcc0 100644 --- a/Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerFileRequest.m +++ b/Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerFileRequest.m @@ -31,16 +31,9 @@ #import "GCDWebServerPrivate.h" -@interface GCDWebServerFileRequest () { -@private - NSString* _temporaryPath; +@implementation GCDWebServerFileRequest { int _file; } -@end - -@implementation GCDWebServerFileRequest - -@synthesize temporaryPath=_temporaryPath; - (instancetype)initWithMethod:(NSString*)method url:(NSURL*)url headers:(NSDictionary*)headers path:(NSString*)path query:(NSDictionary*)query { if ((self = [super initWithMethod:method url:url headers:headers path:path query:query])) { @@ -85,14 +78,14 @@ - (BOOL)close:(NSError**)error { NSString* creationDateHeader = [self.headers objectForKey:@"X-GCDWebServer-CreationDate"]; if (creationDateHeader) { NSDate* date = GCDWebServerParseISO8601(creationDateHeader); - if (!date || ![[NSFileManager defaultManager] setAttributes:@{NSFileCreationDate: date} ofItemAtPath:_temporaryPath error:error]) { + if (!date || ![[NSFileManager defaultManager] setAttributes:@{NSFileCreationDate : date} ofItemAtPath:_temporaryPath error:error]) { return NO; } } NSString* modifiedDateHeader = [self.headers objectForKey:@"X-GCDWebServer-ModifiedDate"]; if (modifiedDateHeader) { NSDate* date = GCDWebServerParseRFC822(modifiedDateHeader); - if (!date || ![[NSFileManager defaultManager] setAttributes:@{NSFileModificationDate: date} ofItemAtPath:_temporaryPath error:error]) { + if (!date || ![[NSFileManager defaultManager] setAttributes:@{NSFileModificationDate : date} ofItemAtPath:_temporaryPath error:error]) { return NO; } } diff --git a/Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerMultiPartFormRequest.h b/Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerMultiPartFormRequest.h index 832c2e71..93ac1791 100644 --- a/Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerMultiPartFormRequest.h +++ b/Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerMultiPartFormRequest.h @@ -27,6 +27,8 @@ #import "GCDWebServerRequest.h" +NS_ASSUME_NONNULL_BEGIN + /** * The GCDWebServerMultiPart class is an abstract class that wraps the content * of a part. @@ -69,7 +71,7 @@ * The text encoding used to interpret the data is extracted from the * "Content-Type" header or defaults to UTF-8. */ -@property(nonatomic, readonly) NSString* string; +@property(nonatomic, readonly, nullable) NSString* string; @end @@ -122,11 +124,13 @@ /** * Returns the first argument for a given control name or nil if not found. */ -- (GCDWebServerMultiPartArgument*)firstArgumentForControlName:(NSString*)name; +- (nullable GCDWebServerMultiPartArgument*)firstArgumentForControlName:(NSString*)name; /** * Returns the first file for a given control name or nil if not found. */ -- (GCDWebServerMultiPartFile*)firstFileForControlName:(NSString*)name; +- (nullable GCDWebServerMultiPartFile*)firstFileForControlName:(NSString*)name; @end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerMultiPartFormRequest.m b/Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerMultiPartFormRequest.m index c2fc9bfb..4e6bf09c 100644 --- a/Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerMultiPartFormRequest.m +++ b/Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerMultiPartFormRequest.m @@ -42,53 +42,31 @@ } ParserState; @interface GCDWebServerMIMEStreamParser : NSObject -- (id)initWithBoundary:(NSString*)boundary defaultControlName:(NSString*)name arguments:(NSMutableArray*)arguments files:(NSMutableArray*)files; -- (BOOL)appendBytes:(const void*)bytes length:(NSUInteger)length; -- (BOOL)isAtEnd; @end static NSData* _newlineData = nil; static NSData* _newlinesData = nil; static NSData* _dashNewlineData = nil; -@interface GCDWebServerMultiPart () { -@private - NSString* _controlName; - NSString* _contentType; - NSString* _mimeType; -} -@end - @implementation GCDWebServerMultiPart -@synthesize controlName=_controlName, contentType=_contentType, mimeType=_mimeType; - -- (id)initWithControlName:(NSString*)name contentType:(NSString*)type { +- (instancetype)initWithControlName:(NSString* _Nonnull)name contentType:(NSString* _Nonnull)type { if ((self = [super init])) { _controlName = [name copy]; _contentType = [type copy]; - _mimeType = GCDWebServerTruncateHeaderValue(_contentType); + _mimeType = (NSString*)GCDWebServerTruncateHeaderValue(_contentType); } return self; } @end -@interface GCDWebServerMultiPartArgument () { -@private - NSData* _data; - NSString* _string; -} -@end - @implementation GCDWebServerMultiPartArgument -@synthesize data=_data, string=_string; - -- (id)initWithControlName:(NSString*)name contentType:(NSString*)type data:(NSData*)data { +- (instancetype)initWithControlName:(NSString* _Nonnull)name contentType:(NSString* _Nonnull)type data:(NSData* _Nonnull)data { if ((self = [super initWithControlName:name contentType:type])) { _data = data; - + if ([self.contentType hasPrefix:@"text/"]) { NSString* charset = GCDWebServerExtractHeaderValueParameter(self.contentType, @"charset"); _string = [[NSString alloc] initWithData:_data encoding:GCDWebServerStringEncodingFromCharset(charset)]; @@ -103,18 +81,9 @@ - (NSString*)description { @end -@interface GCDWebServerMultiPartFile () { -@private - NSString* _fileName; - NSString* _temporaryPath; -} -@end - @implementation GCDWebServerMultiPartFile -@synthesize fileName=_fileName, temporaryPath=_temporaryPath; - -- (id)initWithControlName:(NSString*)name contentType:(NSString*)type fileName:(NSString*)fileName temporaryPath:(NSString*)temporaryPath { +- (instancetype)initWithControlName:(NSString* _Nonnull)name contentType:(NSString* _Nonnull)type fileName:(NSString* _Nonnull)fileName temporaryPath:(NSString* _Nonnull)temporaryPath { if ((self = [super initWithControlName:name contentType:type])) { _fileName = [fileName copy]; _temporaryPath = [temporaryPath copy]; @@ -132,15 +101,14 @@ - (NSString*)description { @end -@interface GCDWebServerMIMEStreamParser () { -@private +@implementation GCDWebServerMIMEStreamParser { NSData* _boundary; NSString* _defaultcontrolName; ParserState _state; NSMutableData* _data; NSMutableArray* _arguments; NSMutableArray* _files; - + NSString* _controlName; NSString* _fileName; NSString* _contentType; @@ -148,9 +116,6 @@ @interface GCDWebServerMIMEStreamParser () { int _tmpFile; GCDWebServerMIMEStreamParser* _subParser; } -@end - -@implementation GCDWebServerMIMEStreamParser + (void)initialize { if (_newlineData == nil) { @@ -167,7 +132,7 @@ + (void)initialize { } } -- (id)initWithBoundary:(NSString*)boundary defaultControlName:(NSString*)name arguments:(NSMutableArray*)arguments files:(NSMutableArray*)files { +- (instancetype)initWithBoundary:(NSString* _Nonnull)boundary defaultControlName:(NSString* _Nullable)name arguments:(NSMutableArray* _Nonnull)arguments files:(NSMutableArray* _Nonnull)files { NSData* data = boundary.length ? [[NSString stringWithFormat:@"--%@", boundary] dataUsingEncoding:NSASCIIStringEncoding] : nil; if (data == nil) { GWS_DNOT_REACHED(); @@ -194,11 +159,10 @@ - (void)dealloc { // http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.2 - (BOOL)_parseData { BOOL success = YES; - + if (_state == kParserState_Headers) { NSRange range = [_data rangeOfData:_newlinesData options:0 range:NSMakeRange(0, _data.length)]; if (range.location != NSNotFound) { - _controlName = nil; _fileName = nil; _contentType = nil; @@ -256,12 +220,12 @@ - (BOOL)_parseData { GWS_DNOT_REACHED(); success = NO; } - + [_data replaceBytesInRange:NSMakeRange(0, range.location + range.length) withBytes:NULL length:0]; _state = kParserState_Content; } } - + if ((_state == kParserState_Start) || (_state == kParserState_Content)) { NSRange range = [_data rangeOfData:_boundary options:0 range:NSMakeRange(0, _data.length)]; if (range.location != NSNotFound) { @@ -269,7 +233,6 @@ - (BOOL)_parseData { NSRange subRange1 = [_data rangeOfData:_newlineData options:NSDataSearchAnchored range:subRange]; NSRange subRange2 = [_data rangeOfData:_dashNewlineData options:NSDataSearchAnchored range:subRange]; if ((subRange1.location != NSNotFound) || (subRange2.location != NSNotFound)) { - if (_state == kParserState_Content) { const void* dataBytes = _data.bytes; NSUInteger dataLength = range.location - 2; @@ -301,7 +264,7 @@ - (BOOL)_parseData { [_arguments addObject:argument]; } } - + if (subRange1.location != NSNotFound) { [_data replaceBytesInRange:NSMakeRange(0, subRange1.location + subRange1.length) withBytes:NULL length:0]; _state = kParserState_Headers; @@ -333,7 +296,7 @@ - (BOOL)_parseData { } } } - + return success; } @@ -348,17 +311,14 @@ - (BOOL)isAtEnd { @end -@interface GCDWebServerMultiPartFormRequest () { -@private - GCDWebServerMIMEStreamParser* _parser; - NSMutableArray* _arguments; - NSMutableArray* _files; -} +@interface GCDWebServerMultiPartFormRequest () +@property(nonatomic) NSMutableArray* arguments; +@property(nonatomic) NSMutableArray* files; @end -@implementation GCDWebServerMultiPartFormRequest - -@synthesize arguments=_arguments, files=_files; +@implementation GCDWebServerMultiPartFormRequest { + GCDWebServerMIMEStreamParser* _parser; +} + (NSString*)mimeType { return @"multipart/form-data"; @@ -377,7 +337,7 @@ - (BOOL)open:(NSError**)error { _parser = [[GCDWebServerMIMEStreamParser alloc] initWithBoundary:boundary defaultControlName:nil arguments:_arguments files:_files]; if (_parser == nil) { if (error) { - *error = [NSError errorWithDomain:kGCDWebServerErrorDomain code:-1 userInfo:@{NSLocalizedDescriptionKey: @"Failed starting to parse multipart form data"}]; + *error = [NSError errorWithDomain:kGCDWebServerErrorDomain code:-1 userInfo:@{ NSLocalizedDescriptionKey : @"Failed starting to parse multipart form data" }]; } return NO; } @@ -387,7 +347,7 @@ - (BOOL)open:(NSError**)error { - (BOOL)writeData:(NSData*)data error:(NSError**)error { if (![_parser appendBytes:data.bytes length:data.length]) { if (error) { - *error = [NSError errorWithDomain:kGCDWebServerErrorDomain code:-1 userInfo:@{NSLocalizedDescriptionKey: @"Failed continuing to parse multipart form data"}]; + *error = [NSError errorWithDomain:kGCDWebServerErrorDomain code:-1 userInfo:@{ NSLocalizedDescriptionKey : @"Failed continuing to parse multipart form data" }]; } return NO; } @@ -399,7 +359,7 @@ - (BOOL)close:(NSError**)error { _parser = nil; if (!atEnd) { if (error) { - *error = [NSError errorWithDomain:kGCDWebServerErrorDomain code:-1 userInfo:@{NSLocalizedDescriptionKey: @"Failed finishing to parse multipart form data"}]; + *error = [NSError errorWithDomain:kGCDWebServerErrorDomain code:-1 userInfo:@{ NSLocalizedDescriptionKey : @"Failed finishing to parse multipart form data" }]; } return NO; } diff --git a/Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerURLEncodedFormRequest.h b/Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerURLEncodedFormRequest.h index 97353804..fcf177e5 100644 --- a/Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerURLEncodedFormRequest.h +++ b/Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerURLEncodedFormRequest.h @@ -27,6 +27,8 @@ #import "GCDWebServerDataRequest.h" +NS_ASSUME_NONNULL_BEGIN + /** * The GCDWebServerURLEncodedFormRequest subclass of GCDWebServerRequest * parses the body of the HTTP request as a URL encoded form using @@ -49,3 +51,5 @@ + (NSString*)mimeType; @end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerURLEncodedFormRequest.m b/Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerURLEncodedFormRequest.m index 2c5fcc59..7e0137f8 100644 --- a/Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerURLEncodedFormRequest.m +++ b/Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerURLEncodedFormRequest.m @@ -31,16 +31,8 @@ #import "GCDWebServerPrivate.h" -@interface GCDWebServerURLEncodedFormRequest () { -@private - NSDictionary* _arguments; -} -@end - @implementation GCDWebServerURLEncodedFormRequest -@synthesize arguments=_arguments; - + (NSString*)mimeType { return @"application/x-www-form-urlencoded"; } @@ -49,12 +41,10 @@ - (BOOL)close:(NSError**)error { if (![super close:error]) { return NO; } - + NSString* charset = GCDWebServerExtractHeaderValueParameter(self.contentType, @"charset"); NSString* string = [[NSString alloc] initWithData:self.data encoding:GCDWebServerStringEncodingFromCharset(charset)]; _arguments = GCDWebServerParseURLEncodedForm(string); - GWS_DCHECK(_arguments); - return YES; } diff --git a/Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerDataResponse.h b/Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerDataResponse.h index 6e06cd89..783f5966 100644 --- a/Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerDataResponse.h +++ b/Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerDataResponse.h @@ -27,11 +27,14 @@ #import "GCDWebServerResponse.h" +NS_ASSUME_NONNULL_BEGIN + /** * The GCDWebServerDataResponse subclass of GCDWebServerResponse reads the body * of the HTTP response from memory. */ @interface GCDWebServerDataResponse : GCDWebServerResponse +@property(nonatomic, copy) NSString* contentType; // Redeclare as non-null /** * Creates a response with data in memory and a given content type. @@ -50,40 +53,40 @@ /** * Creates a data response from text encoded using UTF-8. */ -+ (instancetype)responseWithText:(NSString*)text; ++ (nullable instancetype)responseWithText:(NSString*)text; /** * Creates a data response from HTML encoded using UTF-8. */ -+ (instancetype)responseWithHTML:(NSString*)html; ++ (nullable instancetype)responseWithHTML:(NSString*)html; /** * Creates a data response from an HTML template encoded using UTF-8. * See -initWithHTMLTemplate:variables: for details. */ -+ (instancetype)responseWithHTMLTemplate:(NSString*)path variables:(NSDictionary*)variables; ++ (nullable instancetype)responseWithHTMLTemplate:(NSString*)path variables:(NSDictionary*)variables; /** * Creates a data response from a serialized JSON object and the default * "application/json" content type. */ -+ (instancetype)responseWithJSONObject:(id)object; ++ (nullable instancetype)responseWithJSONObject:(id)object; /** * Creates a data response from a serialized JSON object and a custom * content type. */ -+ (instancetype)responseWithJSONObject:(id)object contentType:(NSString*)type; ++ (nullable instancetype)responseWithJSONObject:(id)object contentType:(NSString*)type; /** * Initializes a data response from text encoded using UTF-8. */ -- (instancetype)initWithText:(NSString*)text; +- (nullable instancetype)initWithText:(NSString*)text; /** * Initializes a data response from HTML encoded using UTF-8. */ -- (instancetype)initWithHTML:(NSString*)html; +- (nullable instancetype)initWithHTML:(NSString*)html; /** * Initializes a data response from an HTML template encoded using UTF-8. @@ -91,18 +94,20 @@ * All occurences of "%variable%" within the HTML template are replaced with * their corresponding values. */ -- (instancetype)initWithHTMLTemplate:(NSString*)path variables:(NSDictionary*)variables; +- (nullable instancetype)initWithHTMLTemplate:(NSString*)path variables:(NSDictionary*)variables; /** * Initializes a data response from a serialized JSON object and the default * "application/json" content type. */ -- (instancetype)initWithJSONObject:(id)object; +- (nullable instancetype)initWithJSONObject:(id)object; /** * Initializes a data response from a serialized JSON object and a custom * content type. */ -- (instancetype)initWithJSONObject:(id)object contentType:(NSString*)type; +- (nullable instancetype)initWithJSONObject:(id)object contentType:(NSString*)type; @end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerDataResponse.m b/Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerDataResponse.m index 12cd12b3..b4968474 100644 --- a/Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerDataResponse.m +++ b/Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerDataResponse.m @@ -31,28 +31,21 @@ #import "GCDWebServerPrivate.h" -@interface GCDWebServerDataResponse () { -@private +@implementation GCDWebServerDataResponse { NSData* _data; BOOL _done; } -@end -@implementation GCDWebServerDataResponse +@dynamic contentType; + (instancetype)responseWithData:(NSData*)data contentType:(NSString*)type { return [[[self class] alloc] initWithData:data contentType:type]; } - (instancetype)initWithData:(NSData*)data contentType:(NSString*)type { - if (data == nil) { - GWS_DNOT_REACHED(); - return nil; - } - if ((self = [super init])) { _data = data; - + self.contentType = type; self.contentLength = data.length; } @@ -124,8 +117,7 @@ - (instancetype)initWithHTMLTemplate:(NSString*)path variables:(NSDictionary*)va [variables enumerateKeysAndObjectsUsingBlock:^(NSString* key, NSString* value, BOOL* stop) { [html replaceOccurrencesOfString:[NSString stringWithFormat:@"%%%@%%", key] withString:value options:0 range:NSMakeRange(0, html.length)]; }]; - id response = [self initWithHTML:html]; - return response; + return [self initWithHTML:html]; } - (instancetype)initWithJSONObject:(id)object { @@ -135,6 +127,7 @@ - (instancetype)initWithJSONObject:(id)object { - (instancetype)initWithJSONObject:(id)object contentType:(NSString*)type { NSData* data = [NSJSONSerialization dataWithJSONObject:object options:0 error:NULL]; if (data == nil) { + GWS_DNOT_REACHED(); return nil; } return [self initWithData:data contentType:type]; diff --git a/Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerErrorResponse.h b/Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerErrorResponse.h index dad01147..92c834cf 100644 --- a/Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerErrorResponse.h +++ b/Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerErrorResponse.h @@ -28,6 +28,8 @@ #import "GCDWebServerDataResponse.h" #import "GCDWebServerHTTPStatusCodes.h" +NS_ASSUME_NONNULL_BEGIN + /** * The GCDWebServerDataResponse subclass of GCDWebServerDataResponse generates * an HTML body from an HTTP status code and an error message. @@ -37,45 +39,47 @@ /** * Creates a client error response with the corresponding HTTP status code. */ -+ (instancetype)responseWithClientError:(GCDWebServerClientErrorHTTPStatusCode)errorCode message:(NSString*)format, ... NS_FORMAT_FUNCTION(2,3); ++ (instancetype)responseWithClientError:(GCDWebServerClientErrorHTTPStatusCode)errorCode message:(NSString*)format, ... NS_FORMAT_FUNCTION(2, 3); /** * Creates a server error response with the corresponding HTTP status code. */ -+ (instancetype)responseWithServerError:(GCDWebServerServerErrorHTTPStatusCode)errorCode message:(NSString*)format, ... NS_FORMAT_FUNCTION(2,3); ++ (instancetype)responseWithServerError:(GCDWebServerServerErrorHTTPStatusCode)errorCode message:(NSString*)format, ... NS_FORMAT_FUNCTION(2, 3); /** * Creates a client error response with the corresponding HTTP status code * and an underlying NSError. */ -+ (instancetype)responseWithClientError:(GCDWebServerClientErrorHTTPStatusCode)errorCode underlyingError:(NSError*)underlyingError message:(NSString*)format, ... NS_FORMAT_FUNCTION(3,4); ++ (instancetype)responseWithClientError:(GCDWebServerClientErrorHTTPStatusCode)errorCode underlyingError:(nullable NSError*)underlyingError message:(NSString*)format, ... NS_FORMAT_FUNCTION(3, 4); /** * Creates a server error response with the corresponding HTTP status code * and an underlying NSError. */ -+ (instancetype)responseWithServerError:(GCDWebServerServerErrorHTTPStatusCode)errorCode underlyingError:(NSError*)underlyingError message:(NSString*)format, ... NS_FORMAT_FUNCTION(3,4); ++ (instancetype)responseWithServerError:(GCDWebServerServerErrorHTTPStatusCode)errorCode underlyingError:(nullable NSError*)underlyingError message:(NSString*)format, ... NS_FORMAT_FUNCTION(3, 4); /** * Initializes a client error response with the corresponding HTTP status code. */ -- (instancetype)initWithClientError:(GCDWebServerClientErrorHTTPStatusCode)errorCode message:(NSString*)format, ... NS_FORMAT_FUNCTION(2,3); +- (instancetype)initWithClientError:(GCDWebServerClientErrorHTTPStatusCode)errorCode message:(NSString*)format, ... NS_FORMAT_FUNCTION(2, 3); /** * Initializes a server error response with the corresponding HTTP status code. */ -- (instancetype)initWithServerError:(GCDWebServerServerErrorHTTPStatusCode)errorCode message:(NSString*)format, ... NS_FORMAT_FUNCTION(2,3); +- (instancetype)initWithServerError:(GCDWebServerServerErrorHTTPStatusCode)errorCode message:(NSString*)format, ... NS_FORMAT_FUNCTION(2, 3); /** * Initializes a client error response with the corresponding HTTP status code * and an underlying NSError. */ -- (instancetype)initWithClientError:(GCDWebServerClientErrorHTTPStatusCode)errorCode underlyingError:(NSError*)underlyingError message:(NSString*)format, ... NS_FORMAT_FUNCTION(3,4); +- (instancetype)initWithClientError:(GCDWebServerClientErrorHTTPStatusCode)errorCode underlyingError:(nullable NSError*)underlyingError message:(NSString*)format, ... NS_FORMAT_FUNCTION(3, 4); /** * Initializes a server error response with the corresponding HTTP status code * and an underlying NSError. */ -- (instancetype)initWithServerError:(GCDWebServerServerErrorHTTPStatusCode)errorCode underlyingError:(NSError*)underlyingError message:(NSString*)format, ... NS_FORMAT_FUNCTION(3,4); +- (instancetype)initWithServerError:(GCDWebServerServerErrorHTTPStatusCode)errorCode underlyingError:(nullable NSError*)underlyingError message:(NSString*)format, ... NS_FORMAT_FUNCTION(3, 4); @end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerErrorResponse.m b/Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerErrorResponse.m index ef6a991d..f1cd2023 100644 --- a/Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerErrorResponse.m +++ b/Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerErrorResponse.m @@ -31,10 +31,6 @@ #import "GCDWebServerPrivate.h" -@interface GCDWebServerErrorResponse () -- (instancetype)initWithStatusCode:(NSInteger)statusCode underlyingError:(NSError*)underlyingError messageFormat:(NSString*)format arguments:(va_list)arguments; -@end - @implementation GCDWebServerErrorResponse + (instancetype)responseWithClientError:(GCDWebServerClientErrorHTTPStatusCode)errorCode message:(NSString*)format, ... { diff --git a/Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerFileResponse.h b/Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerFileResponse.h index 050e92f8..9403835e 100644 --- a/Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerFileResponse.h +++ b/Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerFileResponse.h @@ -27,6 +27,8 @@ #import "GCDWebServerResponse.h" +NS_ASSUME_NONNULL_BEGIN + /** * The GCDWebServerFileResponse subclass of GCDWebServerResponse reads the body * of the HTTP response from a file on disk. @@ -36,17 +38,20 @@ * metadata. */ @interface GCDWebServerFileResponse : GCDWebServerResponse +@property(nonatomic, copy) NSString* contentType; // Redeclare as non-null +@property(nonatomic) NSDate* lastModifiedDate; // Redeclare as non-null +@property(nonatomic, copy) NSString* eTag; // Redeclare as non-null /** * Creates a response with the contents of a file. */ -+ (instancetype)responseWithFile:(NSString*)path; ++ (nullable instancetype)responseWithFile:(NSString*)path; /** * Creates a response like +responseWithFile: and sets the "Content-Disposition" * HTTP header for a download if the "attachment" argument is YES. */ -+ (instancetype)responseWithFile:(NSString*)path isAttachment:(BOOL)attachment; ++ (nullable instancetype)responseWithFile:(NSString*)path isAttachment:(BOOL)attachment; /** * Creates a response like +responseWithFile: but restricts the file contents @@ -54,26 +59,26 @@ * * See -initWithFile:byteRange: for details. */ -+ (instancetype)responseWithFile:(NSString*)path byteRange:(NSRange)range; ++ (nullable instancetype)responseWithFile:(NSString*)path byteRange:(NSRange)range; /** * Creates a response like +responseWithFile:byteRange: and sets the * "Content-Disposition" HTTP header for a download if the "attachment" * argument is YES. */ -+ (instancetype)responseWithFile:(NSString*)path byteRange:(NSRange)range isAttachment:(BOOL)attachment; ++ (nullable instancetype)responseWithFile:(NSString*)path byteRange:(NSRange)range isAttachment:(BOOL)attachment; /** * Initializes a response with the contents of a file. */ -- (instancetype)initWithFile:(NSString*)path; +- (nullable instancetype)initWithFile:(NSString*)path; /** * Initializes a response like +responseWithFile: and sets the * "Content-Disposition" HTTP header for a download if the "attachment" * argument is YES. */ -- (instancetype)initWithFile:(NSString*)path isAttachment:(BOOL)attachment; +- (nullable instancetype)initWithFile:(NSString*)path isAttachment:(BOOL)attachment; /** * Initializes a response like -initWithFile: but restricts the file contents @@ -86,11 +91,18 @@ * This argument would typically be set to the value of the byteRange property * of the current GCDWebServerRequest. */ -- (instancetype)initWithFile:(NSString*)path byteRange:(NSRange)range; +- (nullable instancetype)initWithFile:(NSString*)path byteRange:(NSRange)range; /** * This method is the designated initializer for the class. + * + * If MIME type overrides are specified, they allow to customize the built-in + * mapping from extensions to MIME types. Keys of the dictionary must be lowercased + * file extensions without the period, and the values must be the corresponding + * MIME types. */ -- (instancetype)initWithFile:(NSString*)path byteRange:(NSRange)range isAttachment:(BOOL)attachment; +- (nullable instancetype)initWithFile:(NSString*)path byteRange:(NSRange)range isAttachment:(BOOL)attachment mimeTypeOverrides:(nullable NSDictionary*)overrides; @end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerFileResponse.m b/Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerFileResponse.m index a2b7c3c0..bd07518c 100644 --- a/Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerFileResponse.m +++ b/Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerFileResponse.m @@ -35,16 +35,14 @@ #define kFileReadBufferSize (32 * 1024) -@interface GCDWebServerFileResponse () { -@private +@implementation GCDWebServerFileResponse { NSString* _path; NSUInteger _offset; NSUInteger _size; int _file; } -@end -@implementation GCDWebServerFileResponse +@dynamic contentType, lastModifiedDate, eTag; + (instancetype)responseWithFile:(NSString*)path { return [[[self class] alloc] initWithFile:path]; @@ -59,26 +57,26 @@ + (instancetype)responseWithFile:(NSString*)path byteRange:(NSRange)range { } + (instancetype)responseWithFile:(NSString*)path byteRange:(NSRange)range isAttachment:(BOOL)attachment { - return [[[self class] alloc] initWithFile:path byteRange:range isAttachment:attachment]; + return [[[self class] alloc] initWithFile:path byteRange:range isAttachment:attachment mimeTypeOverrides:nil]; } - (instancetype)initWithFile:(NSString*)path { - return [self initWithFile:path byteRange:NSMakeRange(NSUIntegerMax, 0) isAttachment:NO]; + return [self initWithFile:path byteRange:NSMakeRange(NSUIntegerMax, 0) isAttachment:NO mimeTypeOverrides:nil]; } - (instancetype)initWithFile:(NSString*)path isAttachment:(BOOL)attachment { - return [self initWithFile:path byteRange:NSMakeRange(NSUIntegerMax, 0) isAttachment:attachment]; + return [self initWithFile:path byteRange:NSMakeRange(NSUIntegerMax, 0) isAttachment:attachment mimeTypeOverrides:nil]; } - (instancetype)initWithFile:(NSString*)path byteRange:(NSRange)range { - return [self initWithFile:path byteRange:range isAttachment:NO]; + return [self initWithFile:path byteRange:range isAttachment:NO mimeTypeOverrides:nil]; } static inline NSDate* _NSDateFromTimeSpec(const struct timespec* t) { return [NSDate dateWithTimeIntervalSince1970:((NSTimeInterval)t->tv_sec + (NSTimeInterval)t->tv_nsec / 1000000000.0)]; } -- (instancetype)initWithFile:(NSString*)path byteRange:(NSRange)range isAttachment:(BOOL)attachment { +- (instancetype)initWithFile:(NSString*)path byteRange:(NSRange)range isAttachment:(BOOL)attachment mimeTypeOverrides:(NSDictionary*)overrides { struct stat info; if (lstat([path fileSystemRepresentation], &info) || !(info.st_mode & S_IFREG)) { GWS_DNOT_REACHED(); @@ -91,7 +89,7 @@ - (instancetype)initWithFile:(NSString*)path byteRange:(NSRange)range isAttachme } #endif NSUInteger fileSize = (NSUInteger)info.st_size; - + BOOL hasByteRange = GCDWebServerIsValidByteRange(range); if (hasByteRange) { if (range.location != NSUIntegerMax) { @@ -108,7 +106,7 @@ - (instancetype)initWithFile:(NSString*)path byteRange:(NSRange)range isAttachme range.location = 0; range.length = fileSize; } - + if ((self = [super init])) { _path = [path copy]; _offset = range.location; @@ -118,7 +116,7 @@ - (instancetype)initWithFile:(NSString*)path byteRange:(NSRange)range isAttachme [self setValue:[NSString stringWithFormat:@"bytes %lu-%lu/%lu", (unsigned long)_offset, (unsigned long)(_offset + _size - 1), (unsigned long)fileSize] forAdditionalHeader:@"Content-Range"]; GWS_LOG_DEBUG(@"Using content bytes range [%lu-%lu] for file \"%@\"", (unsigned long)_offset, (unsigned long)(_offset + _size - 1), path); } - + if (attachment) { NSString* fileName = [path lastPathComponent]; NSData* data = [[fileName stringByReplacingOccurrencesOfString:@"\"" withString:@""] dataUsingEncoding:NSISOLatin1StringEncoding allowLossyConversion:YES]; @@ -130,8 +128,8 @@ - (instancetype)initWithFile:(NSString*)path byteRange:(NSRange)range isAttachme GWS_DNOT_REACHED(); } } - - self.contentType = GCDWebServerGetMimeTypeForExtension([_path pathExtension]); + + self.contentType = GCDWebServerGetMimeTypeForExtension([_path pathExtension], overrides); self.contentLength = _size; self.lastModifiedDate = _NSDateFromTimeSpec(&info.st_mtimespec); self.eTag = [NSString stringWithFormat:@"%llu/%li/%li", info.st_ino, info.st_mtimespec.tv_sec, info.st_mtimespec.tv_nsec]; diff --git a/Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerStreamedResponse.h b/Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerStreamedResponse.h index 2731b7c6..bb48e661 100644 --- a/Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerStreamedResponse.h +++ b/Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerStreamedResponse.h @@ -27,12 +27,14 @@ #import "GCDWebServerResponse.h" +NS_ASSUME_NONNULL_BEGIN + /** * The GCDWebServerStreamBlock is called to stream the data for the HTTP body. * The block must return either a chunk of data, an empty NSData when done, or * nil on error and set the "error" argument which is guaranteed to be non-NULL. */ -typedef NSData* (^GCDWebServerStreamBlock)(NSError** error); +typedef NSData* _Nullable (^GCDWebServerStreamBlock)(NSError** error); /** * The GCDWebServerAsyncStreamBlock works like the GCDWebServerStreamBlock @@ -51,6 +53,7 @@ typedef void (^GCDWebServerAsyncStreamBlock)(GCDWebServerBodyReaderCompletionBlo * the body of the HTTP response using a GCD block. */ @interface GCDWebServerStreamedResponse : GCDWebServerResponse +@property(nonatomic, copy) NSString* contentType; // Redeclare as non-null /** * Creates a response with streamed data and a given content type. @@ -73,3 +76,5 @@ typedef void (^GCDWebServerAsyncStreamBlock)(GCDWebServerBodyReaderCompletionBlo - (instancetype)initWithContentType:(NSString*)type asyncStreamBlock:(GCDWebServerAsyncStreamBlock)block; @end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerStreamedResponse.m b/Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerStreamedResponse.m index 4669617f..9387263c 100644 --- a/Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerStreamedResponse.m +++ b/Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerStreamedResponse.m @@ -31,13 +31,11 @@ #import "GCDWebServerPrivate.h" -@interface GCDWebServerStreamedResponse () { -@private +@implementation GCDWebServerStreamedResponse { GCDWebServerAsyncStreamBlock _block; } -@end -@implementation GCDWebServerStreamedResponse +@dynamic contentType; + (instancetype)responseWithContentType:(NSString*)type streamBlock:(GCDWebServerStreamBlock)block { return [[[self class] alloc] initWithContentType:type streamBlock:block]; @@ -48,19 +46,20 @@ + (instancetype)responseWithContentType:(NSString*)type asyncStreamBlock:(GCDWeb } - (instancetype)initWithContentType:(NSString*)type streamBlock:(GCDWebServerStreamBlock)block { - return [self initWithContentType:type asyncStreamBlock:^(GCDWebServerBodyReaderCompletionBlock completionBlock) { - - NSError* error = nil; - NSData* data = block(&error); - completionBlock(data, error); - - }]; + return [self initWithContentType:type + asyncStreamBlock:^(GCDWebServerBodyReaderCompletionBlock completionBlock) { + + NSError* error = nil; + NSData* data = block(&error); + completionBlock(data, error); + + }]; } - (instancetype)initWithContentType:(NSString*)type asyncStreamBlock:(GCDWebServerAsyncStreamBlock)block { if ((self = [super init])) { _block = [block copy]; - + self.contentType = type; } return self; diff --git a/Pods/GCDWebServer/README.md b/Pods/GCDWebServer/README.md index 870d4e60..b22211ad 100644 --- a/Pods/GCDWebServer/README.md +++ b/Pods/GCDWebServer/README.md @@ -36,7 +36,7 @@ What's not supported (but not really required from an embedded HTTP server): Requirements: * OS X 10.7 or later (x86_64) -* iOS 5.0 or later (armv7, armv7s or arm64) +* iOS 8.0 or later (armv7, armv7s or arm64) * ARC memory management only (if you need MRC support use GCDWebServer 3.1 and earlier) Getting Started @@ -71,7 +71,7 @@ Then run `$ carthage update` and add the generated frameworks to your Xcode proj Help & Support ============== -For help with using GCDWebServer, it's best to ask your question on Stack Overflow with the [`gcdwebserver`](http://stackoverflow.com/questions/tagged/gcdwebserver) tag. +For help with using GCDWebServer, it's best to ask your question on Stack Overflow with the [`gcdwebserver`](http://stackoverflow.com/questions/tagged/gcdwebserver) tag. For bug reports and enhancement requests you can use [issues](https://github.com/swisspol/GCDWebServer/issues) in this project. Be sure to read this entire README first though! @@ -365,7 +365,7 @@ Both for debugging and informational purpose, GCDWebServer logs messages extensi By default, all messages logged by GCDWebServer are sent to its built-in logging facility, which simply outputs to ```stderr``` (assuming a terminal type device is connected). In order to better integrate with the rest of your app or because of the amount of information logged, you might want to use another logging facility. -GCDWebServer has automatic support for [XLFacility](https://github.com/swisspol/XLFacility) (by the same author as GCDWebServer and also open-source) and [CocoaLumberjack](https://github.com/CocoaLumberjack/CocoaLumberjack). If either of them is in the same Xcode project, GCDWebServer should use it automatically instead of the built-in logging facility (see [GCDWebServerPrivate.h](GCDWebServer/Core/GCDWebServerPrivate.h) for the implementation details). +GCDWebServer has automatic support for [XLFacility](https://github.com/swisspol/XLFacility) (by the same author as GCDWebServer and also open-source): if it is in the same Xcode project, GCDWebServer should use it automatically instead of the built-in logging facility (see [GCDWebServerPrivate.h](GCDWebServer/Core/GCDWebServerPrivate.h) for the implementation details). It's also possible to use a custom logging facility - see [GCDWebServer.h](GCDWebServer/Core/GCDWebServer.h) for more information. diff --git a/Pods/Manifest.lock b/Pods/Manifest.lock index d43d1e33..453e037f 100644 --- a/Pods/Manifest.lock +++ b/Pods/Manifest.lock @@ -1,20 +1,26 @@ PODS: - Alamofire (4.2.0) - BRLOptionParser (0.3.1) - - GCDWebServer (3.3.3): - - GCDWebServer/Core (= 3.3.3) - - GCDWebServer/Core (3.3.3) + - GCDWebServer (3.4.2): + - GCDWebServer/Core (= 3.4.2) + - GCDWebServer/Core (3.4.2) DEPENDENCIES: - Alamofire (~> 4.2.0) - BRLOptionParser (~> 0.3.1) - GCDWebServer (~> 3.0) +SPEC REPOS: + https://github.com/cocoapods/specs.git: + - Alamofire + - BRLOptionParser + - GCDWebServer + SPEC CHECKSUMS: Alamofire: aa2e09d871c9160ac53c90e83c68064a94e3dfbe BRLOptionParser: a03256a8ff003ca1f5376c55f55f210e085a3958 - GCDWebServer: 1c39a1f0763e4eb492bee021e4270fce097d3555 + GCDWebServer: 8d67ee9f634b4bb91eb4b8aee440318a5fc6debd -PODFILE CHECKSUM: 8e98b2fb2d6be56882a44b2ff9241a800101e1d4 +PODFILE CHECKSUM: 6b485731eac897a000e5b608b7849ad661fe16da -COCOAPODS: 1.1.1 +COCOAPODS: 1.5.3 diff --git a/Pods/Pods.xcodeproj/project.pbxproj b/Pods/Pods.xcodeproj/project.pbxproj index f5239bb8..2e978b58 100644 --- a/Pods/Pods.xcodeproj/project.pbxproj +++ b/Pods/Pods.xcodeproj/project.pbxproj @@ -7,65 +7,63 @@ objects = { /* Begin PBXBuildFile section */ - 008D88E94858B0B8190DD42951253AD2 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9F07CBE6988BD391FE7A0AE9BAA63882 /* Cocoa.framework */; }; 015A2D47B6DA8E170E4E64108EC177CA /* GCDWebServerFileRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = D7C15E08E56E065130F76FC8DC8C8619 /* GCDWebServerFileRequest.h */; settings = {ATTRIBUTES = (Public, ); }; }; 03810806C0578A750613717248DC37CC /* GCDWebServerPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = CA78677B47A82041B6A0C96CE51F76C2 /* GCDWebServerPrivate.h */; settings = {ATTRIBUTES = (Private, ); }; }; 0551162B7568A0F3028CF7CE13E9C1C7 /* GCDWebServerURLEncodedFormRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 8C6444C9A87ED6919A7864A0C9D70A4C /* GCDWebServerURLEncodedFormRequest.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; 098AA417A5494FC829E777DC5CF06ECC /* GCDWebServerURLEncodedFormRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = 56CBA6D73D3D0B47B5D2DCA98FD3514E /* GCDWebServerURLEncodedFormRequest.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 0A402C97D8A2855E4F69D8E2BFEE752E /* BRLOptionParser.m in Sources */ = {isa = PBXBuildFile; fileRef = BAA6E2FFB996A81C9D31918A563B43FB /* BRLOptionParser.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; 0B8140968914C908CFB4949F67745DD7 /* GCDWebServerFileResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = EB10970D56AE3E8EC08A3B6CB0ECF896 /* GCDWebServerFileResponse.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 0EC1F64B51A455E18896FCB15AE297F7 /* Pods-ShadowsocksX-NG-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 14A9EC2BB1EC6484018A5EB4B9B2C231 /* Pods-ShadowsocksX-NG-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0EC1F64B51A455E18896FCB15AE297F7 /* Pods-ShadowsocksX-NG-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 2502B1002366776EA56601BE5F5D84B7 /* Pods-ShadowsocksX-NG-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 10EB23E9ECC4B33E16933BB1EA560B6A /* Timeline.swift in Sources */ = {isa = PBXBuildFile; fileRef = B2E64BA5DE520D1FF8D157D1948EF678 /* Timeline.swift */; }; 1568BC317134F1902AB76EE65E0A18CE /* GCDWebServerDataResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = B49FCFC5427009EB0DE924D8E6689486 /* GCDWebServerDataResponse.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1AB0577134E333EA71DCCE332191A260 /* Pods-ShadowsocksX-NGTests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 46662EB64876AD1C891F548C69A89E89 /* Pods-ShadowsocksX-NGTests-dummy.m */; }; - 1B9EDEDC964E6B08F78920B4F4B9DB84 /* Alamofire-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = BB1A40A42CB3E3DE3C7FB21A038462FD /* Alamofire-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1B9EDEDC964E6B08F78920B4F4B9DB84 /* Alamofire-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = E04A54848FAAA36AAE89BBDAFE1685A3 /* Alamofire-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 1EF1D9B948C91F3CAD0F2998F3765D8B /* GCDWebServerErrorResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = 7B884322F7F32E5886E831225EF61A24 /* GCDWebServerErrorResponse.h */; settings = {ATTRIBUTES = (Public, ); }; }; 2527F62CEADDA5CE60852E0C067D3438 /* GCDWebServerResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = 7EA43A03295E967E8CE48DC3D41B1FB1 /* GCDWebServerResponse.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 2545E11592C408516EA9AC047FFD47FD /* BRLOptionParser-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 052330BD03A0DFCDEFF81F8EC5BFEB02 /* BRLOptionParser-dummy.m */; }; 286A79B0F2405FD08804042FE30407B1 /* GCDWebServerMultiPartFormRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 5BF25F29EE771444894D4B4BD6A5094A /* GCDWebServerMultiPartFormRequest.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - 2DBAC0452D6B85DF3E41E3AEFB4EEC16 /* Pods-ShadowsocksX-NGTests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = D7E8128F302CF60BEF206008CE11F6D3 /* Pods-ShadowsocksX-NGTests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 30E2A73CDE464DC6C23D3524F07FBB9F /* GCDWebServer-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = F5FCCAE1F4AE542376E5F228D7463E4F /* GCDWebServer-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 33669A1E8FF6BB34131FB94871DDF908 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9F07CBE6988BD391FE7A0AE9BAA63882 /* Cocoa.framework */; }; + 30E2A73CDE464DC6C23D3524F07FBB9F /* GCDWebServer-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = CEA8A07A4390EF3FDD8F1EC9EA300AF6 /* GCDWebServer-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 35B3DA850A250223EE5CEB9DB04D1FC4 /* GCDWebServerResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 432FFBD34AE4D6FE11F7562A7B2E2DF6 /* GCDWebServerResponse.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; 3626B94094672CB1C9DEA32B9F9502E1 /* TaskDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C058E7895E0BD655DB18CD87B39658B /* TaskDelegate.swift */; }; 36E0FA5FE4424D20F0215B1C2CD85D90 /* GCDWebServerRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = FE4DE2F9318899EC55FF739F09547B9F /* GCDWebServerRequest.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 382EEA9832CF0E0860B998EAD0EE66E1 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 49E50A971405B804294572CAAD1D1F90 /* SystemConfiguration.framework */; }; - 3DD0362B0B6B939B5D087A150121A4B1 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9F07CBE6988BD391FE7A0AE9BAA63882 /* Cocoa.framework */; }; 3E715DFE443524EB6ADE892E4A676224 /* GCDWebServerMultiPartFormRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = EAEC4F2E970093B9815E645E63781C40 /* GCDWebServerMultiPartFormRequest.h */; settings = {ATTRIBUTES = (Public, ); }; }; 48FE45BD7BF4ABB32A024550ED96B4C6 /* GCDWebServerStreamedResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 41B03492069EA8D52FDD5E9F8CC3749D /* GCDWebServerStreamedResponse.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; 4EDE49009B5B68074CD71F8B362F0DDC /* GCDWebServerDataRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = 056695931D97F3BAC1F31181094FF7F0 /* GCDWebServerDataRequest.h */; settings = {ATTRIBUTES = (Public, ); }; }; 5387216E723A3C68E851CA15573CDD71 /* Request.swift in Sources */ = {isa = PBXBuildFile; fileRef = 781B71F26694E106B9C6014A4D828CFE /* Request.swift */; }; 53D63A17DB43C044EFBAA17337600276 /* GCDWebServerRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 4BD69E62A30DA9C6468DE578D50E5FB0 /* GCDWebServerRequest.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - 5BCD116D40D884DF5E2F4DDC9E3AD53A /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9F07CBE6988BD391FE7A0AE9BAA63882 /* Cocoa.framework */; }; + 58892DB0E616E7CD4145434C0726715D /* Pods-ShadowsocksX-NGTests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = BA83B34060483A9575B0CF713C3A6561 /* Pods-ShadowsocksX-NGTests-dummy.m */; }; 61200D01A1855D7920CEF835C8BE00B0 /* DispatchQueue+Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2625C48AD777A2B7E26D2A80E9CD94E7 /* DispatchQueue+Alamofire.swift */; }; 62F65AD8DC4F0F9610F4B8B4738EC094 /* ServerTrustPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 193AA1B44C4CB1CFCCEDD6C9741F5211 /* ServerTrustPolicy.swift */; }; 66AD0D86950A5C05121AE482F5257717 /* GCDWebServerConnection.h in Headers */ = {isa = PBXBuildFile; fileRef = 150AAAC15A441418AEA6DFBF159FBEA0 /* GCDWebServerConnection.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6C5CE01B22D5E2A5E4775C9A9787DE0C /* Pods-ShadowsocksX-NGTests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 12208C6E49D11049C3EC034F39958E1F /* Pods-ShadowsocksX-NGTests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 6C62ACD1AF9B80626023D3E654D3E77B /* GCDWebServerStreamedResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = 65715F792D70CDE4E67F1EB98531E233 /* GCDWebServerStreamedResponse.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7968E0EAEE89CC230514453422FA04A0 /* BRLOptionParser-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 052330BD03A0DFCDEFF81F8EC5BFEB02 /* BRLOptionParser-dummy.m */; }; 7B5FE28C7EA4122B0598738E54DBEBD8 /* SessionDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3565E299C44D10C2D206FDCD078A0008 /* SessionDelegate.swift */; }; 7B70A32CB535894B889DC0400D0DE4B5 /* GCDWebServerDataRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = E02D3FE330950F96E4826E6785950F95 /* GCDWebServerDataRequest.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; 7C46C6DFBF9F5A96C6BCE1C93052B63D /* GCDWebServerHTTPStatusCodes.h in Headers */ = {isa = PBXBuildFile; fileRef = D9D61BAD16772ED8DBCD878F6BBF7025 /* GCDWebServerHTTPStatusCodes.h */; settings = {ATTRIBUTES = (Public, ); }; }; 7D8CC01E8C9EFFF9F4D65406CDE0AB66 /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1673CAE4B8238FFD59A792823A36A9DF /* Result.swift */; }; 886E89D85907BBD7A8C8BAA088D23E3D /* GCDWebServerFileResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = D35A95B17B77B37E12236498D60B8478 /* GCDWebServerFileResponse.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - 9B622302DDDA1881AC9ABA9EA4C81564 /* BRLOptionParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 4461C7BE603BCBC96BA24E3E752C6AC0 /* BRLOptionParser.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9DB91F7B392D045AB8451F515D20D649 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9F07CBE6988BD391FE7A0AE9BAA63882 /* Cocoa.framework */; }; + 903476C2107A142E31FFA47421F24259 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7E568825514EC24B9FF8D686A2131D45 /* Cocoa.framework */; }; + 97148AEF5411075B9F03F3F4493EDEC6 /* BRLOptionParser.m in Sources */ = {isa = PBXBuildFile; fileRef = BAA6E2FFB996A81C9D31918A563B43FB /* BRLOptionParser.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 9AEFC01EC977E03EF314D01BBC8506AD /* BRLOptionParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 4461C7BE603BCBC96BA24E3E752C6AC0 /* BRLOptionParser.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 9C685B398DA6F9040CF0B83810978868 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7340F61024A15F9541F6FF0FBC2494F3 /* SystemConfiguration.framework */; }; 9ED2BB2981896E0A39EFA365503F58CE /* AFError.swift in Sources */ = {isa = PBXBuildFile; fileRef = D86AC40F610A78D1B5E5AC9528E70ADB /* AFError.swift */; }; A2A6F71B727312BD45CC7A4AAD7B0AB7 /* NetworkReachabilityManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7E6D819AE4FECE3068ED91259133EAC /* NetworkReachabilityManager.swift */; }; - A9EEEA7477981DEEBC72432DE9990A4B /* Alamofire-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 383ADB6B629F7BC3B7FB986648404A88 /* Alamofire-dummy.m */; }; - ADE45FBACDF07286A544DC20605FE624 /* Pods-proxy_conf_helper-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = CE50445A73ECB9A2ED31A6FF93D45808 /* Pods-proxy_conf_helper-dummy.m */; }; + A9EEEA7477981DEEBC72432DE9990A4B /* Alamofire-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = C3BBE5823DB4F4B1FBAB13B76BA8A625 /* Alamofire-dummy.m */; }; AE1EF48399533730D0066E04B22CA2D6 /* SessionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 352C9ACA5D14E48B378FF32021EAD9B4 /* SessionManager.swift */; }; B65FCF589DA398C3EFE0128064E510EC /* MultipartFormData.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9C4A7AA3B3DD74EDA43165A42745D1A /* MultipartFormData.swift */; }; B7EF65DA3A34ABF3B41F50ADCD198BDC /* GCDWebServerFunctions.h in Headers */ = {isa = PBXBuildFile; fileRef = A2AB24692BC4901FA1B8CD5A65C8AA62 /* GCDWebServerFunctions.h */; settings = {ATTRIBUTES = (Public, ); }; }; BBEFE2F9CEB73DC7BD97FFA66A0D9D4F /* Validation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6648A20B97426F9940955502FA6FF042 /* Validation.swift */; }; + BD08FB1B1A3C44D391639973F1AE05E4 /* Pods-proxy_conf_helper-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = CE50445A73ECB9A2ED31A6FF93D45808 /* Pods-proxy_conf_helper-dummy.m */; }; BE5C67A07E289FE1F9BE27335B159997 /* ParameterEncoding.swift in Sources */ = {isa = PBXBuildFile; fileRef = C83162C9BDFB3C0617CF191D660EC2DA /* ParameterEncoding.swift */; }; C96E54153198E59FF0F8B9F7408523E0 /* GCDWebServerDataResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = BE05C895D7CA02C6123697B3944C59D3 /* GCDWebServerDataResponse.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + CB5D0CFFF87398EE681C5B15F7EA39BF /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7E568825514EC24B9FF8D686A2131D45 /* Cocoa.framework */; }; CB6D60925223897FFA2662667DF83E8A /* Response.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC11D9EFE483BFE3E6CC4AC3CCC0E8D7 /* Response.swift */; }; - CD97073476795E5EAA07C91A7F7890D2 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9F07CBE6988BD391FE7A0AE9BAA63882 /* Cocoa.framework */; }; D2B04C075D6CA6AF10C35D8BF7DEF0D3 /* GCDWebServerFileRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 9564AF1CDDA43CCBDDB1A7A9D41FD163 /* GCDWebServerFileRequest.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - D63E514E26A060F7C90A92AE8E9B49F9 /* GCDWebServer-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 675C317EFB4447DD15024A74FF8C9E6C /* GCDWebServer-dummy.m */; }; + D63E514E26A060F7C90A92AE8E9B49F9 /* GCDWebServer-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 0F7694525D8AE670711C0FB82C944D82 /* GCDWebServer-dummy.m */; }; D7524216B4C0994A50624825DFB7CB6B /* GCDWebServerConnection.m in Sources */ = {isa = PBXBuildFile; fileRef = 8C6F72ED24E84D8DC9445729D927B6E8 /* GCDWebServerConnection.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + DDEF6BD8E24542AFD83487B24269B4DB /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7E568825514EC24B9FF8D686A2131D45 /* Cocoa.framework */; }; E62DD91C60246BD1E4E8A0AF5D7BF0E7 /* GCDWebServerErrorResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CC694BC2D5AA3651FE2946D4032D0F5 /* GCDWebServerErrorResponse.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - E9E49601CF0FCF90E3E962F5DDEFD115 /* Pods-ShadowsocksX-NG-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 24B01D81E3D7058FA14A053EC19874D0 /* Pods-ShadowsocksX-NG-dummy.m */; }; + E9E49601CF0FCF90E3E962F5DDEFD115 /* Pods-ShadowsocksX-NG-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = D14DA8CFEF72F4E6EC8C74463B3D83FE /* Pods-ShadowsocksX-NG-dummy.m */; }; EA6D2E46B967F447FFC46520EC328B5E /* GCDWebServer.h in Headers */ = {isa = PBXBuildFile; fileRef = 057330267A99F07C8ADE6135AA1F622F /* GCDWebServer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EC1E412798763F19D981B30C3197EE54 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7E568825514EC24B9FF8D686A2131D45 /* Cocoa.framework */; }; EFD264FC408EBF3BA2528E70B08DDD94 /* Notifications.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12B556C66780BC3D0BECF011EAF49ECB /* Notifications.swift */; }; F359857602B1D4C91B4AC3D1A2CDFE1B /* GCDWebServerFunctions.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CD28F4DA9E9FD6CDF59B9183753B0AD /* GCDWebServerFunctions.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; F6BECD98B97CBFEBE2C96F0E9E72A6C0 /* ResponseSerialization.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B6EC5B2B4F6B09E9967325BF493C9D /* ResponseSerialization.swift */; }; @@ -88,13 +86,20 @@ remoteGlobalIDString = 5B8B0ED1046111D92895FC95F12DBC10; remoteInfo = GCDWebServer; }; - FDE579D9762D0D9F86EDB1DE6EADE62F /* PBXContainerItemProxy */ = { + E1417E8043387EBCC51821F7ACD5F0DB /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 3CB2B8006B2B1ACAF9ADCA1DC82E2290; + remoteGlobalIDString = 0C108414EE23FDB4033E3B303978D10C; remoteInfo = BRLOptionParser; }; + F9CFFA924DFC28767F1D6BF790060032 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 76AB1BA247F8CB57FCB2BA6577D40FE6; + remoteInfo = "Pods-ShadowsocksX-NG"; + }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ @@ -102,171 +107,169 @@ 054C3E84057CD06DB85D99E7AD207F48 /* Pods-proxy_conf_helper.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-proxy_conf_helper.debug.xcconfig"; sourceTree = ""; }; 056695931D97F3BAC1F31181094FF7F0 /* GCDWebServerDataRequest.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerDataRequest.h; path = GCDWebServer/Requests/GCDWebServerDataRequest.h; sourceTree = ""; }; 057330267A99F07C8ADE6135AA1F622F /* GCDWebServer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServer.h; path = GCDWebServer/Core/GCDWebServer.h; sourceTree = ""; }; - 089EB7E66F64D3A19BB7681AFCE91031 /* Pods-ShadowsocksX-NG.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ShadowsocksX-NG.release.xcconfig"; sourceTree = ""; }; - 0E8A27A8C9BD6FF9AE3DCBC4050CCD76 /* Pods-ShadowsocksX-NGTests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ShadowsocksX-NGTests-frameworks.sh"; sourceTree = ""; }; + 077EFEEE90EECB42A067C82EE65DEE1F /* Pods-ShadowsocksX-NGTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ShadowsocksX-NGTests.debug.xcconfig"; sourceTree = ""; }; 0E8D592A9C0AE4B6C90789AFF29DF516 /* Alamofire.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Alamofire.swift; path = Source/Alamofire.swift; sourceTree = ""; }; + 0F7694525D8AE670711C0FB82C944D82 /* GCDWebServer-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "GCDWebServer-dummy.m"; sourceTree = ""; }; 11B6EC5B2B4F6B09E9967325BF493C9D /* ResponseSerialization.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ResponseSerialization.swift; path = Source/ResponseSerialization.swift; sourceTree = ""; }; + 12208C6E49D11049C3EC034F39958E1F /* Pods-ShadowsocksX-NGTests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-ShadowsocksX-NGTests-umbrella.h"; sourceTree = ""; }; 12B556C66780BC3D0BECF011EAF49ECB /* Notifications.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Notifications.swift; path = Source/Notifications.swift; sourceTree = ""; }; - 13333F29A08390FCEFECA0FDCDDC919F /* Pods-ShadowsocksX-NG-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ShadowsocksX-NG-frameworks.sh"; sourceTree = ""; }; - 14A9EC2BB1EC6484018A5EB4B9B2C231 /* Pods-ShadowsocksX-NG-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-ShadowsocksX-NG-umbrella.h"; sourceTree = ""; }; 150AAAC15A441418AEA6DFBF159FBEA0 /* GCDWebServerConnection.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerConnection.h; path = GCDWebServer/Core/GCDWebServerConnection.h; sourceTree = ""; }; + 163050E3BA688F1C20D3722140B14EA7 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 1673CAE4B8238FFD59A792823A36A9DF /* Result.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Result.swift; path = Source/Result.swift; sourceTree = ""; }; 193AA1B44C4CB1CFCCEDD6C9741F5211 /* ServerTrustPolicy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ServerTrustPolicy.swift; path = Source/ServerTrustPolicy.swift; sourceTree = ""; }; 1A8CE48109F7ED7873F4FF9D2D3603AD /* Pods-proxy_conf_helper-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-proxy_conf_helper-acknowledgements.markdown"; sourceTree = ""; }; 1C058E7895E0BD655DB18CD87B39658B /* TaskDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TaskDelegate.swift; path = Source/TaskDelegate.swift; sourceTree = ""; }; - 1F162D37B7B6534A6D80FEE301F586EE /* Pods-ShadowsocksX-NGTests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-ShadowsocksX-NGTests-acknowledgements.plist"; sourceTree = ""; }; - 24B01D81E3D7058FA14A053EC19874D0 /* Pods-ShadowsocksX-NG-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-ShadowsocksX-NG-dummy.m"; sourceTree = ""; }; - 24BCEE536E19B38E28CE6933A0D49A2D /* GCDWebServer.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = GCDWebServer.xcconfig; sourceTree = ""; }; + 2502B1002366776EA56601BE5F5D84B7 /* Pods-ShadowsocksX-NG-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-ShadowsocksX-NG-umbrella.h"; sourceTree = ""; }; 2625C48AD777A2B7E26D2A80E9CD94E7 /* DispatchQueue+Alamofire.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "DispatchQueue+Alamofire.swift"; path = "Source/DispatchQueue+Alamofire.swift"; sourceTree = ""; }; - 28D7F65F9E64735E3320A028DCDDDD90 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 28FCAD871C7C0139E4C222EB3B99E749 /* Alamofire-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Alamofire-prefix.pch"; sourceTree = ""; }; 29F1D38D8FBC1D989199E905EA6CA548 /* GCDWebServer.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = GCDWebServer.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 2D644FB3545AF46CBD6ED919703E7147 /* Alamofire-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Alamofire-prefix.pch"; sourceTree = ""; }; - 3358F45A5BEC1A7F725167CD1969EDC8 /* Pods-ShadowsocksX-NG-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-ShadowsocksX-NG-acknowledgements.markdown"; sourceTree = ""; }; 3490D661D0DB72BC3A5F94A1C6AE083C /* GCDWebServer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServer.m; path = GCDWebServer/Core/GCDWebServer.m; sourceTree = ""; }; 352C9ACA5D14E48B378FF32021EAD9B4 /* SessionManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionManager.swift; path = Source/SessionManager.swift; sourceTree = ""; }; 3565E299C44D10C2D206FDCD078A0008 /* SessionDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionDelegate.swift; path = Source/SessionDelegate.swift; sourceTree = ""; }; - 383ADB6B629F7BC3B7FB986648404A88 /* Alamofire-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Alamofire-dummy.m"; sourceTree = ""; }; + 3849AD56E466B6A43AFEA14EF60D51F3 /* GCDWebServer.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = GCDWebServer.modulemap; sourceTree = ""; }; + 3B23098A73BEFE5201FEB48F369DAD5C /* GCDWebServer.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = GCDWebServer.xcconfig; sourceTree = ""; }; + 3B63D3CCC3889A8B3EAEE6D2EDA2E46F /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 3FA68D4D6E271C0AE35D2B658ED73F6F /* Pods-ShadowsocksX-NGTests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ShadowsocksX-NGTests-frameworks.sh"; sourceTree = ""; }; 41B03492069EA8D52FDD5E9F8CC3749D /* GCDWebServerStreamedResponse.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerStreamedResponse.m; path = GCDWebServer/Responses/GCDWebServerStreamedResponse.m; sourceTree = ""; }; 432FFBD34AE4D6FE11F7562A7B2E2DF6 /* GCDWebServerResponse.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerResponse.m; path = GCDWebServer/Core/GCDWebServerResponse.m; sourceTree = ""; }; 4461C7BE603BCBC96BA24E3E752C6AC0 /* BRLOptionParser.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BRLOptionParser.h; path = BRLOptionParser/BRLOptionParser.h; sourceTree = ""; }; - 46662EB64876AD1C891F548C69A89E89 /* Pods-ShadowsocksX-NGTests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-ShadowsocksX-NGTests-dummy.m"; sourceTree = ""; }; - 49E50A971405B804294572CAAD1D1F90 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/System/Library/Frameworks/SystemConfiguration.framework; sourceTree = DEVELOPER_DIR; }; 4BD69E62A30DA9C6468DE578D50E5FB0 /* GCDWebServerRequest.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerRequest.m; path = GCDWebServer/Core/GCDWebServerRequest.m; sourceTree = ""; }; - 52F51F94701ABD692BFFC9F92AE2E115 /* Pods-ShadowsocksX-NG-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-ShadowsocksX-NG-acknowledgements.plist"; sourceTree = ""; }; + 4C13BB1EE0DA008B3F99625819E5B338 /* Pods-ShadowsocksX-NG-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-ShadowsocksX-NG-acknowledgements.markdown"; sourceTree = ""; }; + 4D37F4CA22A697838D77BBB11E28FD8D /* Pods-ShadowsocksX-NGTests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-ShadowsocksX-NGTests-acknowledgements.plist"; sourceTree = ""; }; 56CBA6D73D3D0B47B5D2DCA98FD3514E /* GCDWebServerURLEncodedFormRequest.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerURLEncodedFormRequest.h; path = GCDWebServer/Requests/GCDWebServerURLEncodedFormRequest.h; sourceTree = ""; }; 5BF25F29EE771444894D4B4BD6A5094A /* GCDWebServerMultiPartFormRequest.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerMultiPartFormRequest.m; path = GCDWebServer/Requests/GCDWebServerMultiPartFormRequest.m; sourceTree = ""; }; 5D84D92D27CE8A6F5C45E8A03155C1CF /* Pods-proxy_conf_helper-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-proxy_conf_helper-frameworks.sh"; sourceTree = ""; }; - 5DD6170F5D4F70A833509C495183FBA3 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 5E949AC812278EA6428E8B1B3F4567E5 /* libBRLOptionParser.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libBRLOptionParser.a; sourceTree = BUILT_PRODUCTS_DIR; }; - 622DEEE18C4E0A0DD196A4D2D8853154 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 65715F792D70CDE4E67F1EB98531E233 /* GCDWebServerStreamedResponse.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerStreamedResponse.h; path = GCDWebServer/Responses/GCDWebServerStreamedResponse.h; sourceTree = ""; }; 6648A20B97426F9940955502FA6FF042 /* Validation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Validation.swift; path = Source/Validation.swift; sourceTree = ""; }; - 675C317EFB4447DD15024A74FF8C9E6C /* GCDWebServer-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "GCDWebServer-dummy.m"; sourceTree = ""; }; + 6C9954457264984EC63B073E6CD4C2CC /* Pods-ShadowsocksX-NG.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-ShadowsocksX-NG.modulemap"; sourceTree = ""; }; + 6D9EE153FEB3F418F9FA6B36E0D4489D /* Alamofire.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Alamofire.xcconfig; sourceTree = ""; }; + 7340F61024A15F9541F6FF0FBC2494F3 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/System/Library/Frameworks/SystemConfiguration.framework; sourceTree = DEVELOPER_DIR; }; + 740E43F0D6047222F0DA914F4A53250B /* Pods-ShadowsocksX-NG-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ShadowsocksX-NG-resources.sh"; sourceTree = ""; }; 781B71F26694E106B9C6014A4D828CFE /* Request.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Request.swift; path = Source/Request.swift; sourceTree = ""; }; - 78FDF9432C1735D2CE78FC0BBD37B6D3 /* GCDWebServer.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = GCDWebServer.modulemap; sourceTree = ""; }; 7B884322F7F32E5886E831225EF61A24 /* GCDWebServerErrorResponse.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerErrorResponse.h; path = GCDWebServer/Responses/GCDWebServerErrorResponse.h; sourceTree = ""; }; + 7E568825514EC24B9FF8D686A2131D45 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/System/Library/Frameworks/Cocoa.framework; sourceTree = DEVELOPER_DIR; }; 7EA43A03295E967E8CE48DC3D41B1FB1 /* GCDWebServerResponse.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerResponse.h; path = GCDWebServer/Core/GCDWebServerResponse.h; sourceTree = ""; }; - 8020307C336BF75396517D172B6CCBA0 /* Alamofire.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = Alamofire.modulemap; sourceTree = ""; }; - 83323A1A2936BBA3D386DCC078E3821E /* Pods-ShadowsocksX-NGTests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-ShadowsocksX-NGTests-acknowledgements.markdown"; sourceTree = ""; }; + 829DFEA55B57369E92A185F1B8F76C8A /* Pods-ShadowsocksX-NGTests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-ShadowsocksX-NGTests.modulemap"; sourceTree = ""; }; + 8AF4DF6BD9D69E67DDD5B4B2BEB36A9F /* Pods-ShadowsocksX-NGTests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-ShadowsocksX-NGTests-acknowledgements.markdown"; sourceTree = ""; }; 8C6444C9A87ED6919A7864A0C9D70A4C /* GCDWebServerURLEncodedFormRequest.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerURLEncodedFormRequest.m; path = GCDWebServer/Requests/GCDWebServerURLEncodedFormRequest.m; sourceTree = ""; }; 8C6F72ED24E84D8DC9445729D927B6E8 /* GCDWebServerConnection.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerConnection.m; path = GCDWebServer/Core/GCDWebServerConnection.m; sourceTree = ""; }; 8CC694BC2D5AA3651FE2946D4032D0F5 /* GCDWebServerErrorResponse.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerErrorResponse.m; path = GCDWebServer/Responses/GCDWebServerErrorResponse.m; sourceTree = ""; }; 8CD28F4DA9E9FD6CDF59B9183753B0AD /* GCDWebServerFunctions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerFunctions.m; path = GCDWebServer/Core/GCDWebServerFunctions.m; sourceTree = ""; }; 8CDD45C6D7A038F415A78787317E931A /* Pods-proxy_conf_helper-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-proxy_conf_helper-resources.sh"; sourceTree = ""; }; 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + 93BF9975C4E8600C77D382FF58405EEE /* Alamofire.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Alamofire.modulemap; sourceTree = ""; }; 9564AF1CDDA43CCBDDB1A7A9D41FD163 /* GCDWebServerFileRequest.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerFileRequest.m; path = GCDWebServer/Requests/GCDWebServerFileRequest.m; sourceTree = ""; }; - 98522BF2EB25C0255284080F9CA3E195 /* Pods-ShadowsocksX-NG.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ShadowsocksX-NG.debug.xcconfig"; sourceTree = ""; }; - 9B8B5CBA357BDB968C73E8F58DFBC74C /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 9BA2A0099476E08B6CC8026BDF0C603E /* Pods-ShadowsocksX-NGTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ShadowsocksX-NGTests.debug.xcconfig"; sourceTree = ""; }; - 9F07CBE6988BD391FE7A0AE9BAA63882 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/System/Library/Frameworks/Cocoa.framework; sourceTree = DEVELOPER_DIR; }; A2AB24692BC4901FA1B8CD5A65C8AA62 /* GCDWebServerFunctions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerFunctions.h; path = GCDWebServer/Core/GCDWebServerFunctions.h; sourceTree = ""; }; A5055B8EFFFBEDE50909E935D4BCA446 /* Pods-proxy_conf_helper.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-proxy_conf_helper.release.xcconfig"; sourceTree = ""; }; - A51D2862E977EC32406F9AB39ECEC3BF /* GCDWebServer-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "GCDWebServer-prefix.pch"; sourceTree = ""; }; A628D7F35A0F9EBD66407BDCC9C92D20 /* Pods_ShadowsocksX_NGTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ShadowsocksX_NGTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + A843EBA827210564422C1B16D828EC9A /* Pods-ShadowsocksX-NG-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ShadowsocksX-NG-frameworks.sh"; sourceTree = ""; }; AE6E689502E4366B125481CD898B947E /* Pods-proxy_conf_helper-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-proxy_conf_helper-acknowledgements.plist"; sourceTree = ""; }; B2E64BA5DE520D1FF8D157D1948EF678 /* Timeline.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Timeline.swift; path = Source/Timeline.swift; sourceTree = ""; }; - B30805F63C611810B322187824EBC4A5 /* Pods-ShadowsocksX-NGTests-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ShadowsocksX-NGTests-resources.sh"; sourceTree = ""; }; B49FCFC5427009EB0DE924D8E6689486 /* GCDWebServerDataResponse.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerDataResponse.h; path = GCDWebServer/Responses/GCDWebServerDataResponse.h; sourceTree = ""; }; B7E6D819AE4FECE3068ED91259133EAC /* NetworkReachabilityManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkReachabilityManager.swift; path = Source/NetworkReachabilityManager.swift; sourceTree = ""; }; + BA83B34060483A9575B0CF713C3A6561 /* Pods-ShadowsocksX-NGTests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-ShadowsocksX-NGTests-dummy.m"; sourceTree = ""; }; BA947346171BBF9CB75B49AF462D0A14 /* Alamofire.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Alamofire.framework; sourceTree = BUILT_PRODUCTS_DIR; }; BAA6E2FFB996A81C9D31918A563B43FB /* BRLOptionParser.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BRLOptionParser.m; path = BRLOptionParser/BRLOptionParser.m; sourceTree = ""; }; - BB1A40A42CB3E3DE3C7FB21A038462FD /* Alamofire-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Alamofire-umbrella.h"; sourceTree = ""; }; BE05C895D7CA02C6123697B3944C59D3 /* GCDWebServerDataResponse.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerDataResponse.m; path = GCDWebServer/Responses/GCDWebServerDataResponse.m; sourceTree = ""; }; - BE672B43951C625CA5F89E448A620AB0 /* Pods-ShadowsocksX-NGTests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = "Pods-ShadowsocksX-NGTests.modulemap"; sourceTree = ""; }; BE93E2446670327B7B8B5F4713BB6AF3 /* BRLOptionParser-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "BRLOptionParser-prefix.pch"; sourceTree = ""; }; C12AC1F78F621586EC3C233BD8CF4BE0 /* BRLOptionParser.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = BRLOptionParser.xcconfig; sourceTree = ""; }; - C18C5D68D2A979595D2A50A1D65A8AF2 /* Alamofire.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Alamofire.xcconfig; sourceTree = ""; }; + C3BBE5823DB4F4B1FBAB13B76BA8A625 /* Alamofire-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Alamofire-dummy.m"; sourceTree = ""; }; + C7666B80A7B5F02FB102943E5D775992 /* Pods-ShadowsocksX-NGTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ShadowsocksX-NGTests.release.xcconfig"; sourceTree = ""; }; C83162C9BDFB3C0617CF191D660EC2DA /* ParameterEncoding.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ParameterEncoding.swift; path = Source/ParameterEncoding.swift; sourceTree = ""; }; C9C4A7AA3B3DD74EDA43165A42745D1A /* MultipartFormData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MultipartFormData.swift; path = Source/MultipartFormData.swift; sourceTree = ""; }; + C9F4F2073199E3EAC1743067E81839B8 /* GCDWebServer-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "GCDWebServer-prefix.pch"; sourceTree = ""; }; CA78677B47A82041B6A0C96CE51F76C2 /* GCDWebServerPrivate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerPrivate.h; path = GCDWebServer/Core/GCDWebServerPrivate.h; sourceTree = ""; }; + CD9475C5BEA13835102584D55DCDA102 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; CE50445A73ECB9A2ED31A6FF93D45808 /* Pods-proxy_conf_helper-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-proxy_conf_helper-dummy.m"; sourceTree = ""; }; + CEA8A07A4390EF3FDD8F1EC9EA300AF6 /* GCDWebServer-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "GCDWebServer-umbrella.h"; sourceTree = ""; }; + D14DA8CFEF72F4E6EC8C74463B3D83FE /* Pods-ShadowsocksX-NG-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-ShadowsocksX-NG-dummy.m"; sourceTree = ""; }; + D309BD494E25BEE6941FB60D26D0790C /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; D35A95B17B77B37E12236498D60B8478 /* GCDWebServerFileResponse.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerFileResponse.m; path = GCDWebServer/Responses/GCDWebServerFileResponse.m; sourceTree = ""; }; D534FA8B75596A674095DAA7CA3B08D1 /* libPods-proxy_conf_helper.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-proxy_conf_helper.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + D5B095D0CF50FEAE4820D692369FBA33 /* Pods-ShadowsocksX-NG.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ShadowsocksX-NG.release.xcconfig"; sourceTree = ""; }; D7C15E08E56E065130F76FC8DC8C8619 /* GCDWebServerFileRequest.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerFileRequest.h; path = GCDWebServer/Requests/GCDWebServerFileRequest.h; sourceTree = ""; }; - D7E8128F302CF60BEF206008CE11F6D3 /* Pods-ShadowsocksX-NGTests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-ShadowsocksX-NGTests-umbrella.h"; sourceTree = ""; }; D86AC40F610A78D1B5E5AC9528E70ADB /* AFError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AFError.swift; path = Source/AFError.swift; sourceTree = ""; }; D9D61BAD16772ED8DBCD878F6BBF7025 /* GCDWebServerHTTPStatusCodes.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerHTTPStatusCodes.h; path = GCDWebServer/Core/GCDWebServerHTTPStatusCodes.h; sourceTree = ""; }; - DC250BF8313F337272DBC9DE1FB6DB6B /* Pods-ShadowsocksX-NG.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = "Pods-ShadowsocksX-NG.modulemap"; sourceTree = ""; }; + DE7A0154918329E1BFCE3167A327EB5F /* Pods-ShadowsocksX-NG.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ShadowsocksX-NG.debug.xcconfig"; sourceTree = ""; }; E02D3FE330950F96E4826E6785950F95 /* GCDWebServerDataRequest.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerDataRequest.m; path = GCDWebServer/Requests/GCDWebServerDataRequest.m; sourceTree = ""; }; - EA41BEE3B4D9F1A89F0135CA91A7F472 /* Pods-ShadowsocksX-NG-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ShadowsocksX-NG-resources.sh"; sourceTree = ""; }; + E04A54848FAAA36AAE89BBDAFE1685A3 /* Alamofire-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Alamofire-umbrella.h"; sourceTree = ""; }; + E0C0B504482F55234D867E0B27E7FF86 /* Pods-ShadowsocksX-NGTests-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ShadowsocksX-NGTests-resources.sh"; sourceTree = ""; }; + E2F6B801F0E48A42F0CBAAC5294A09E4 /* Pods-ShadowsocksX-NG-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-ShadowsocksX-NG-acknowledgements.plist"; sourceTree = ""; }; EAEC4F2E970093B9815E645E63781C40 /* GCDWebServerMultiPartFormRequest.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerMultiPartFormRequest.h; path = GCDWebServer/Requests/GCDWebServerMultiPartFormRequest.h; sourceTree = ""; }; EB10970D56AE3E8EC08A3B6CB0ECF896 /* GCDWebServerFileResponse.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerFileResponse.h; path = GCDWebServer/Responses/GCDWebServerFileResponse.h; sourceTree = ""; }; - F5FCCAE1F4AE542376E5F228D7463E4F /* GCDWebServer-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "GCDWebServer-umbrella.h"; sourceTree = ""; }; - F67191B1F87DA238C4D87250DFBE43DD /* Pods-ShadowsocksX-NGTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ShadowsocksX-NGTests.release.xcconfig"; sourceTree = ""; }; FB6A7098E32F88CAD8F6D0BB8E334D4C /* Pods_ShadowsocksX_NG.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ShadowsocksX_NG.framework; sourceTree = BUILT_PRODUCTS_DIR; }; FC11D9EFE483BFE3E6CC4AC3CCC0E8D7 /* Response.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Response.swift; path = Source/Response.swift; sourceTree = ""; }; FE4DE2F9318899EC55FF739F09547B9F /* GCDWebServerRequest.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerRequest.h; path = GCDWebServer/Core/GCDWebServerRequest.h; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 6E7F016811926ED895957BC5F8CE3ACA /* Frameworks */ = { + 302E088C0B666B6DB61CC7FB9B946696 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 5BCD116D40D884DF5E2F4DDC9E3AD53A /* Cocoa.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 7E718F9F87ABFC0EC82CF710FAF92DC4 /* Frameworks */ = { + 3B4BAC5F7C3EE5CD7021AF3EC2ACB302 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 33669A1E8FF6BB34131FB94871DDF908 /* Cocoa.framework in Frameworks */, - 382EEA9832CF0E0860B998EAD0EE66E1 /* SystemConfiguration.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - B14D21A682C80219D90189FAC9A7DDDF /* Frameworks */ = { + 59C483B339EB94BE7ACAFE3791727E59 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 9DB91F7B392D045AB8451F515D20D649 /* Cocoa.framework in Frameworks */, + 903476C2107A142E31FFA47421F24259 /* Cocoa.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - BC15E0C98F4999B51186E4915D7B5660 /* Frameworks */ = { + 6E7F016811926ED895957BC5F8CE3ACA /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - CD97073476795E5EAA07C91A7F7890D2 /* Cocoa.framework in Frameworks */, + EC1E412798763F19D981B30C3197EE54 /* Cocoa.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - BFC962BBCB4EEE8B8C42B979F2D19C34 /* Frameworks */ = { + 7E718F9F87ABFC0EC82CF710FAF92DC4 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 3DD0362B0B6B939B5D087A150121A4B1 /* Cocoa.framework in Frameworks */, + CB5D0CFFF87398EE681C5B15F7EA39BF /* Cocoa.framework in Frameworks */, + 9C685B398DA6F9040CF0B83810978868 /* SystemConfiguration.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - C8718142612A4E100493606F033235C0 /* Frameworks */ = { + B14D21A682C80219D90189FAC9A7DDDF /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 008D88E94858B0B8190DD42951253AD2 /* Cocoa.framework in Frameworks */, + DDEF6BD8E24542AFD83487B24269B4DB /* Cocoa.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 07568FCBBF071BD2EE0E5EBA001A4712 /* Pods-ShadowsocksX-NGTests */ = { + 258933DAF08DBE2E757B08A6BAC5AE8F /* Pods-ShadowsocksX-NG */ = { isa = PBXGroup; children = ( - 9B8B5CBA357BDB968C73E8F58DFBC74C /* Info.plist */, - BE672B43951C625CA5F89E448A620AB0 /* Pods-ShadowsocksX-NGTests.modulemap */, - 83323A1A2936BBA3D386DCC078E3821E /* Pods-ShadowsocksX-NGTests-acknowledgements.markdown */, - 1F162D37B7B6534A6D80FEE301F586EE /* Pods-ShadowsocksX-NGTests-acknowledgements.plist */, - 46662EB64876AD1C891F548C69A89E89 /* Pods-ShadowsocksX-NGTests-dummy.m */, - 0E8A27A8C9BD6FF9AE3DCBC4050CCD76 /* Pods-ShadowsocksX-NGTests-frameworks.sh */, - B30805F63C611810B322187824EBC4A5 /* Pods-ShadowsocksX-NGTests-resources.sh */, - D7E8128F302CF60BEF206008CE11F6D3 /* Pods-ShadowsocksX-NGTests-umbrella.h */, - 9BA2A0099476E08B6CC8026BDF0C603E /* Pods-ShadowsocksX-NGTests.debug.xcconfig */, - F67191B1F87DA238C4D87250DFBE43DD /* Pods-ShadowsocksX-NGTests.release.xcconfig */, + 163050E3BA688F1C20D3722140B14EA7 /* Info.plist */, + 6C9954457264984EC63B073E6CD4C2CC /* Pods-ShadowsocksX-NG.modulemap */, + 4C13BB1EE0DA008B3F99625819E5B338 /* Pods-ShadowsocksX-NG-acknowledgements.markdown */, + E2F6B801F0E48A42F0CBAAC5294A09E4 /* Pods-ShadowsocksX-NG-acknowledgements.plist */, + D14DA8CFEF72F4E6EC8C74463B3D83FE /* Pods-ShadowsocksX-NG-dummy.m */, + A843EBA827210564422C1B16D828EC9A /* Pods-ShadowsocksX-NG-frameworks.sh */, + 740E43F0D6047222F0DA914F4A53250B /* Pods-ShadowsocksX-NG-resources.sh */, + 2502B1002366776EA56601BE5F5D84B7 /* Pods-ShadowsocksX-NG-umbrella.h */, + DE7A0154918329E1BFCE3167A327EB5F /* Pods-ShadowsocksX-NG.debug.xcconfig */, + D5B095D0CF50FEAE4820D692369FBA33 /* Pods-ShadowsocksX-NG.release.xcconfig */, ); - name = "Pods-ShadowsocksX-NGTests"; - path = "Target Support Files/Pods-ShadowsocksX-NGTests"; + name = "Pods-ShadowsocksX-NG"; + path = "Target Support Files/Pods-ShadowsocksX-NG"; sourceTree = ""; }; 5000B1C6A169B988EBFD533C6AE96E51 /* Support Files */ = { @@ -280,15 +283,15 @@ path = "../Target Support Files/BRLOptionParser"; sourceTree = ""; }; - 5719BC2FF455313AC86A7D2916E845F7 /* Support Files */ = { + 522922E45257CE30982CB44459F72E76 /* Support Files */ = { isa = PBXGroup; children = ( - 8020307C336BF75396517D172B6CCBA0 /* Alamofire.modulemap */, - C18C5D68D2A979595D2A50A1D65A8AF2 /* Alamofire.xcconfig */, - 383ADB6B629F7BC3B7FB986648404A88 /* Alamofire-dummy.m */, - 2D644FB3545AF46CBD6ED919703E7147 /* Alamofire-prefix.pch */, - BB1A40A42CB3E3DE3C7FB21A038462FD /* Alamofire-umbrella.h */, - 5DD6170F5D4F70A833509C495183FBA3 /* Info.plist */, + 93BF9975C4E8600C77D382FF58405EEE /* Alamofire.modulemap */, + 6D9EE153FEB3F418F9FA6B36E0D4489D /* Alamofire.xcconfig */, + C3BBE5823DB4F4B1FBAB13B76BA8A625 /* Alamofire-dummy.m */, + 28FCAD871C7C0139E4C222EB3B99E749 /* Alamofire-prefix.pch */, + E04A54848FAAA36AAE89BBDAFE1685A3 /* Alamofire-umbrella.h */, + D309BD494E25BEE6941FB60D26D0790C /* Info.plist */, ); name = "Support Files"; path = "../Target Support Files/Alamofire"; @@ -304,21 +307,12 @@ path = BRLOptionParser; sourceTree = ""; }; - 648D916E57015940B3943E2D877A7EFA /* OS X */ = { - isa = PBXGroup; - children = ( - 9F07CBE6988BD391FE7A0AE9BAA63882 /* Cocoa.framework */, - 49E50A971405B804294572CAAD1D1F90 /* SystemConfiguration.framework */, - ); - name = "OS X"; - sourceTree = ""; - }; 785842678515C4CDC9428DD20DCD752D /* Targets Support Files */ = { isa = PBXGroup; children = ( B5020B0A649E766997C633601AD85F17 /* Pods-proxy_conf_helper */, - 93AB896DD6AD247E69959A4B8C06F5AC /* Pods-ShadowsocksX-NG */, - 07568FCBBF071BD2EE0E5EBA001A4712 /* Pods-ShadowsocksX-NGTests */, + 258933DAF08DBE2E757B08A6BAC5AE8F /* Pods-ShadowsocksX-NG */, + 8826D029B5CB8BD709AC10386EE5F5A4 /* Pods-ShadowsocksX-NGTests */, ); name = "Targets Support Files"; sourceTree = ""; @@ -343,7 +337,7 @@ 1C058E7895E0BD655DB18CD87B39658B /* TaskDelegate.swift */, B2E64BA5DE520D1FF8D157D1948EF678 /* Timeline.swift */, 6648A20B97426F9940955502FA6FF042 /* Validation.swift */, - 5719BC2FF455313AC86A7D2916E845F7 /* Support Files */, + 522922E45257CE30982CB44459F72E76 /* Support Files */, ); path = Alamofire; sourceTree = ""; @@ -359,18 +353,31 @@ ); sourceTree = ""; }; - 80D1C6F4BC4E4DBF8EF7E37CED106452 /* Support Files */ = { + 84CD4C420F532F2486BE230B573552DA /* OS X */ = { isa = PBXGroup; children = ( - 78FDF9432C1735D2CE78FC0BBD37B6D3 /* GCDWebServer.modulemap */, - 24BCEE536E19B38E28CE6933A0D49A2D /* GCDWebServer.xcconfig */, - 675C317EFB4447DD15024A74FF8C9E6C /* GCDWebServer-dummy.m */, - A51D2862E977EC32406F9AB39ECEC3BF /* GCDWebServer-prefix.pch */, - F5FCCAE1F4AE542376E5F228D7463E4F /* GCDWebServer-umbrella.h */, - 622DEEE18C4E0A0DD196A4D2D8853154 /* Info.plist */, + 7E568825514EC24B9FF8D686A2131D45 /* Cocoa.framework */, + 7340F61024A15F9541F6FF0FBC2494F3 /* SystemConfiguration.framework */, ); - name = "Support Files"; - path = "../Target Support Files/GCDWebServer"; + name = "OS X"; + sourceTree = ""; + }; + 8826D029B5CB8BD709AC10386EE5F5A4 /* Pods-ShadowsocksX-NGTests */ = { + isa = PBXGroup; + children = ( + 3B63D3CCC3889A8B3EAEE6D2EDA2E46F /* Info.plist */, + 829DFEA55B57369E92A185F1B8F76C8A /* Pods-ShadowsocksX-NGTests.modulemap */, + 8AF4DF6BD9D69E67DDD5B4B2BEB36A9F /* Pods-ShadowsocksX-NGTests-acknowledgements.markdown */, + 4D37F4CA22A697838D77BBB11E28FD8D /* Pods-ShadowsocksX-NGTests-acknowledgements.plist */, + BA83B34060483A9575B0CF713C3A6561 /* Pods-ShadowsocksX-NGTests-dummy.m */, + 3FA68D4D6E271C0AE35D2B658ED73F6F /* Pods-ShadowsocksX-NGTests-frameworks.sh */, + E0C0B504482F55234D867E0B27E7FF86 /* Pods-ShadowsocksX-NGTests-resources.sh */, + 12208C6E49D11049C3EC034F39958E1F /* Pods-ShadowsocksX-NGTests-umbrella.h */, + 077EFEEE90EECB42A067C82EE65DEE1F /* Pods-ShadowsocksX-NGTests.debug.xcconfig */, + C7666B80A7B5F02FB102943E5D775992 /* Pods-ShadowsocksX-NGTests.release.xcconfig */, + ); + name = "Pods-ShadowsocksX-NGTests"; + path = "Target Support Files/Pods-ShadowsocksX-NGTests"; sourceTree = ""; }; 8AACDC8BEA5F54F99281AA46DACD674A /* Core */ = { @@ -421,22 +428,18 @@ name = Products; sourceTree = ""; }; - 93AB896DD6AD247E69959A4B8C06F5AC /* Pods-ShadowsocksX-NG */ = { + A6DC8EBD252D02324A24CBD69FBB2B9B /* Support Files */ = { isa = PBXGroup; children = ( - 28D7F65F9E64735E3320A028DCDDDD90 /* Info.plist */, - DC250BF8313F337272DBC9DE1FB6DB6B /* Pods-ShadowsocksX-NG.modulemap */, - 3358F45A5BEC1A7F725167CD1969EDC8 /* Pods-ShadowsocksX-NG-acknowledgements.markdown */, - 52F51F94701ABD692BFFC9F92AE2E115 /* Pods-ShadowsocksX-NG-acknowledgements.plist */, - 24B01D81E3D7058FA14A053EC19874D0 /* Pods-ShadowsocksX-NG-dummy.m */, - 13333F29A08390FCEFECA0FDCDDC919F /* Pods-ShadowsocksX-NG-frameworks.sh */, - EA41BEE3B4D9F1A89F0135CA91A7F472 /* Pods-ShadowsocksX-NG-resources.sh */, - 14A9EC2BB1EC6484018A5EB4B9B2C231 /* Pods-ShadowsocksX-NG-umbrella.h */, - 98522BF2EB25C0255284080F9CA3E195 /* Pods-ShadowsocksX-NG.debug.xcconfig */, - 089EB7E66F64D3A19BB7681AFCE91031 /* Pods-ShadowsocksX-NG.release.xcconfig */, + 3849AD56E466B6A43AFEA14EF60D51F3 /* GCDWebServer.modulemap */, + 3B23098A73BEFE5201FEB48F369DAD5C /* GCDWebServer.xcconfig */, + 0F7694525D8AE670711C0FB82C944D82 /* GCDWebServer-dummy.m */, + C9F4F2073199E3EAC1743067E81839B8 /* GCDWebServer-prefix.pch */, + CEA8A07A4390EF3FDD8F1EC9EA300AF6 /* GCDWebServer-umbrella.h */, + CD9475C5BEA13835102584D55DCDA102 /* Info.plist */, ); - name = "Pods-ShadowsocksX-NG"; - path = "Target Support Files/Pods-ShadowsocksX-NG"; + name = "Support Files"; + path = "../Target Support Files/GCDWebServer"; sourceTree = ""; }; B5020B0A649E766997C633601AD85F17 /* Pods-proxy_conf_helper */ = { @@ -457,7 +460,7 @@ D648CE86F139C7CCFD55D5B8A03BE74B /* Frameworks */ = { isa = PBXGroup; children = ( - 648D916E57015940B3943E2D877A7EFA /* OS X */, + 84CD4C420F532F2486BE230B573552DA /* OS X */, ); name = Frameworks; sourceTree = ""; @@ -466,7 +469,7 @@ isa = PBXGroup; children = ( 8AACDC8BEA5F54F99281AA46DACD674A /* Core */, - 80D1C6F4BC4E4DBF8EF7E37CED106452 /* Support Files */, + A6DC8EBD252D02324A24CBD69FBB2B9B /* Support Files */, ); path = GCDWebServer; sourceTree = ""; @@ -484,14 +487,6 @@ /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ - 49E47E8FB0395F70E77651B02346BF41 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 2DBAC0452D6B85DF3E41E3AEFB4EEC16 /* Pods-ShadowsocksX-NGTests-umbrella.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; 6B9981C9382CA48E42CADD9274429C8D /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; @@ -515,19 +510,27 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - B4002B6E97835FDCCAA5963EFE09A3E0 /* Headers */ = { + 75E07625A276438E2A1C2586204221B5 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 1B9EDEDC964E6B08F78920B4F4B9DB84 /* Alamofire-umbrella.h in Headers */, + 6C5CE01B22D5E2A5E4775C9A9787DE0C /* Pods-ShadowsocksX-NGTests-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 76C11F872E3886080DC4B2B4505DBA5B /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 9AEFC01EC977E03EF314D01BBC8506AD /* BRLOptionParser.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - D6D75A22098E62174AFAD752CA5F6BEC /* Headers */ = { + B4002B6E97835FDCCAA5963EFE09A3E0 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 9B622302DDDA1881AC9ABA9EA4C81564 /* BRLOptionParser.h in Headers */, + 1B9EDEDC964E6B08F78920B4F4B9DB84 /* Alamofire-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -542,47 +545,31 @@ /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ - 05800FAF969AA3CD7F8AEB1C36988B53 /* Pods-proxy_conf_helper */ = { - isa = PBXNativeTarget; - buildConfigurationList = 246647E8AB354727F9ECD0879805161F /* Build configuration list for PBXNativeTarget "Pods-proxy_conf_helper" */; - buildPhases = ( - B8B68DF2BFB4B345BDF00E3B4B94B92C /* Sources */, - BFC962BBCB4EEE8B8C42B979F2D19C34 /* Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - 7C03549F53DE7DA200E36C0642A79977 /* PBXTargetDependency */, - ); - name = "Pods-proxy_conf_helper"; - productName = "Pods-proxy_conf_helper"; - productReference = D534FA8B75596A674095DAA7CA3B08D1 /* libPods-proxy_conf_helper.a */; - productType = "com.apple.product-type.library.static"; - }; - 339CC546E4A1696296EFEDC2FA79ADE0 /* Pods-ShadowsocksX-NGTests */ = { + 02486B4ED82798E52430FDA750E7D82D /* Pods-ShadowsocksX-NGTests */ = { isa = PBXNativeTarget; - buildConfigurationList = 78B338CAC10BFFE58C0DE5D189212D60 /* Build configuration list for PBXNativeTarget "Pods-ShadowsocksX-NGTests" */; + buildConfigurationList = 40A9E0F21FE41E6146ED16E9D2403D91 /* Build configuration list for PBXNativeTarget "Pods-ShadowsocksX-NGTests" */; buildPhases = ( - AFD9223E8E59CD878E1C56F1407DA2C8 /* Sources */, - BC15E0C98F4999B51186E4915D7B5660 /* Frameworks */, - 49E47E8FB0395F70E77651B02346BF41 /* Headers */, + 06DDD4F059ECE1E632AAB5124F284585 /* Sources */, + 59C483B339EB94BE7ACAFE3791727E59 /* Frameworks */, + 75E07625A276438E2A1C2586204221B5 /* Headers */, ); buildRules = ( ); dependencies = ( + 09ACBC250C7737C9108CFD0CFD9D60DB /* PBXTargetDependency */, ); name = "Pods-ShadowsocksX-NGTests"; productName = "Pods-ShadowsocksX-NGTests"; productReference = A628D7F35A0F9EBD66407BDCC9C92D20 /* Pods_ShadowsocksX_NGTests.framework */; productType = "com.apple.product-type.framework"; }; - 3CB2B8006B2B1ACAF9ADCA1DC82E2290 /* BRLOptionParser */ = { + 0C108414EE23FDB4033E3B303978D10C /* BRLOptionParser */ = { isa = PBXNativeTarget; - buildConfigurationList = 4B561109B4C51E9DC9F5F27E9C033405 /* Build configuration list for PBXNativeTarget "BRLOptionParser" */; + buildConfigurationList = BAA362AFDE955A0A6C1126194B019FC6 /* Build configuration list for PBXNativeTarget "BRLOptionParser" */; buildPhases = ( - 2899546AD56DA12F9B03BC5050860413 /* Sources */, - C8718142612A4E100493606F033235C0 /* Frameworks */, - D6D75A22098E62174AFAD752CA5F6BEC /* Headers */, + FB28E632CBBC0A4486B7BE21A60D0BC2 /* Sources */, + 3B4BAC5F7C3EE5CD7021AF3EC2ACB302 /* Frameworks */, + 76C11F872E3886080DC4B2B4505DBA5B /* Headers */, ); buildRules = ( ); @@ -646,14 +633,31 @@ productReference = BA947346171BBF9CB75B49AF462D0A14 /* Alamofire.framework */; productType = "com.apple.product-type.framework"; }; + BAE42B81A719ACCA70D08EC06B64B500 /* Pods-proxy_conf_helper */ = { + isa = PBXNativeTarget; + buildConfigurationList = 2F77498525A0E767346D427FFFA9B395 /* Build configuration list for PBXNativeTarget "Pods-proxy_conf_helper" */; + buildPhases = ( + 26A99521906379536EF3EE85A13AFAE6 /* Sources */, + 302E088C0B666B6DB61CC7FB9B946696 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 0C85B5A137058C4E72C319F6BA0F28BB /* PBXTargetDependency */, + ); + name = "Pods-proxy_conf_helper"; + productName = "Pods-proxy_conf_helper"; + productReference = D534FA8B75596A674095DAA7CA3B08D1 /* libPods-proxy_conf_helper.a */; + productType = "com.apple.product-type.library.static"; + }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ D41D8CD98F00B204E9800998ECF8427E /* Project object */ = { isa = PBXProject; attributes = { - LastSwiftUpdateCheck = 0730; - LastUpgradeCheck = 0830; + LastSwiftUpdateCheck = 0930; + LastUpgradeCheck = 1000; }; buildConfigurationList = 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */; compatibilityVersion = "Xcode 3.2"; @@ -668,22 +672,29 @@ projectRoot = ""; targets = ( 88E9EC28B8B46C3631E6B242B50F4442 /* Alamofire */, - 3CB2B8006B2B1ACAF9ADCA1DC82E2290 /* BRLOptionParser */, + 0C108414EE23FDB4033E3B303978D10C /* BRLOptionParser */, 5B8B0ED1046111D92895FC95F12DBC10 /* GCDWebServer */, - 05800FAF969AA3CD7F8AEB1C36988B53 /* Pods-proxy_conf_helper */, + BAE42B81A719ACCA70D08EC06B64B500 /* Pods-proxy_conf_helper */, 76AB1BA247F8CB57FCB2BA6577D40FE6 /* Pods-ShadowsocksX-NG */, - 339CC546E4A1696296EFEDC2FA79ADE0 /* Pods-ShadowsocksX-NGTests */, + 02486B4ED82798E52430FDA750E7D82D /* Pods-ShadowsocksX-NGTests */, ); }; /* End PBXProject section */ /* Begin PBXSourcesBuildPhase section */ - 2899546AD56DA12F9B03BC5050860413 /* Sources */ = { + 06DDD4F059ECE1E632AAB5124F284585 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 2545E11592C408516EA9AC047FFD47FD /* BRLOptionParser-dummy.m in Sources */, - 0A402C97D8A2855E4F69D8E2BFEE752E /* BRLOptionParser.m in Sources */, + 58892DB0E616E7CD4145434C0726715D /* Pods-ShadowsocksX-NGTests-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 26A99521906379536EF3EE85A13AFAE6 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BD08FB1B1A3C44D391639973F1AE05E4 /* Pods-proxy_conf_helper-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -733,33 +744,38 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - AFD9223E8E59CD878E1C56F1407DA2C8 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 1AB0577134E333EA71DCCE332191A260 /* Pods-ShadowsocksX-NGTests-dummy.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - B8B68DF2BFB4B345BDF00E3B4B94B92C /* Sources */ = { + D58B98E801980FD3514B9C96F2FEBA64 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - ADE45FBACDF07286A544DC20605FE624 /* Pods-proxy_conf_helper-dummy.m in Sources */, + E9E49601CF0FCF90E3E962F5DDEFD115 /* Pods-ShadowsocksX-NG-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - D58B98E801980FD3514B9C96F2FEBA64 /* Sources */ = { + FB28E632CBBC0A4486B7BE21A60D0BC2 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - E9E49601CF0FCF90E3E962F5DDEFD115 /* Pods-ShadowsocksX-NG-dummy.m in Sources */, + 7968E0EAEE89CC230514453422FA04A0 /* BRLOptionParser-dummy.m in Sources */, + 97148AEF5411075B9F03F3F4493EDEC6 /* BRLOptionParser.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ + 09ACBC250C7737C9108CFD0CFD9D60DB /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "Pods-ShadowsocksX-NG"; + target = 76AB1BA247F8CB57FCB2BA6577D40FE6 /* Pods-ShadowsocksX-NG */; + targetProxy = F9CFFA924DFC28767F1D6BF790060032 /* PBXContainerItemProxy */; + }; + 0C85B5A137058C4E72C319F6BA0F28BB /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = BRLOptionParser; + target = 0C108414EE23FDB4033E3B303978D10C /* BRLOptionParser */; + targetProxy = E1417E8043387EBCC51821F7ACD5F0DB /* PBXContainerItemProxy */; + }; 3C89DE54CAB947747F7F2F6907F40D6E /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = GCDWebServer; @@ -772,419 +788,339 @@ target = 88E9EC28B8B46C3631E6B242B50F4442 /* Alamofire */; targetProxy = 408240F5321FFD1270C133C590B77FEC /* PBXContainerItemProxy */; }; - 7C03549F53DE7DA200E36C0642A79977 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = BRLOptionParser; - target = 3CB2B8006B2B1ACAF9ADCA1DC82E2290 /* BRLOptionParser */; - targetProxy = FDE579D9762D0D9F86EDB1DE6EADE62F /* PBXContainerItemProxy */; - }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ - 02E195CBAB30A9CBC71B668C0E2C5F60 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = C18C5D68D2A979595D2A50A1D65A8AF2 /* Alamofire.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = "-"; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = dwarf; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - FRAMEWORK_VERSION = A; - GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/Alamofire/Alamofire-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/Alamofire/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; - MACOSX_DEPLOYMENT_TARGET = 10.10; - MODULEMAP_FILE = "Target Support Files/Alamofire/Alamofire.modulemap"; - MTL_ENABLE_DEBUG_INFO = YES; - PRODUCT_NAME = Alamofire; - SDKROOT = macosx; - SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 3.0; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - 055AE8BB5FE83DD0248770E9FE7FC64A /* Debug */ = { + 0339BB86D5A0B3E760726AB20BB1757E /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9BA2A0099476E08B6CC8026BDF0C603E /* Pods-ShadowsocksX-NGTests.debug.xcconfig */; + baseConfigurationReference = A5055B8EFFFBEDE50909E935D4BCA446 /* Pods-proxy_conf_helper.release.xcconfig */; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CLANG_ENABLE_OBJC_WEAK = NO; CODE_SIGN_IDENTITY = "-"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = dwarf; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - FRAMEWORK_VERSION = A; - GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = "Target Support Files/Pods-ShadowsocksX-NGTests/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; + EXECUTABLE_PREFIX = lib; MACH_O_TYPE = staticlib; MACOSX_DEPLOYMENT_TARGET = 10.11; - MODULEMAP_FILE = "Target Support Files/Pods-ShadowsocksX-NGTests/Pods-ShadowsocksX-NGTests.modulemap"; - MTL_ENABLE_DEBUG_INFO = YES; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PODS_ROOT = "$(SRCROOT)"; PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = Pods_ShadowsocksX_NGTests; SDKROOT = macosx; SKIP_INSTALL = YES; - SWIFT_VERSION = 3.0; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; + SWIFT_VERSION = 4.2; }; - name = Debug; + name = Release; }; - 22020BFD96930B88F386AC9254BD6D9E /* Release */ = { + 0D6BACE0C342D735B6DC38F72D5F3976 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = F67191B1F87DA238C4D87250DFBE43DD /* Pods-ShadowsocksX-NGTests.release.xcconfig */; + baseConfigurationReference = 6D9EE153FEB3F418F9FA6B36E0D4489D /* Alamofire.xcconfig */; buildSettings = { - CODE_SIGN_IDENTITY = "-"; + CLANG_ENABLE_OBJC_WEAK = NO; + CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; COMBINE_HIDPI_IMAGES = YES; CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_STRICT_OBJC_MSGSEND = YES; FRAMEWORK_VERSION = A; - GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = "Target Support Files/Pods-ShadowsocksX-NGTests/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/Alamofire/Alamofire-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Alamofire/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MACOSX_DEPLOYMENT_TARGET = 10.11; - MODULEMAP_FILE = "Target Support Files/Pods-ShadowsocksX-NGTests/Pods-ShadowsocksX-NGTests.modulemap"; - MTL_ENABLE_DEBUG_INFO = NO; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = Pods_ShadowsocksX_NGTests; + MACOSX_DEPLOYMENT_TARGET = 10.10; + MODULEMAP_FILE = "Target Support Files/Alamofire/Alamofire.modulemap"; + PRODUCT_MODULE_NAME = Alamofire; + PRODUCT_NAME = Alamofire; SDKROOT = macosx; SKIP_INSTALL = YES; - SWIFT_VERSION = 3.0; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 4.2; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; name = Release; }; - 581B7E690A5A7F5E7DF616728F5651C1 /* Release */ = { + 0E4E4C059EF6B779CD20D65A5145BAA1 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C18C5D68D2A979595D2A50A1D65A8AF2 /* Alamofire.xcconfig */; + baseConfigurationReference = 3B23098A73BEFE5201FEB48F369DAD5C /* GCDWebServer.xcconfig */; buildSettings = { - CODE_SIGN_IDENTITY = "-"; + CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; COMBINE_HIDPI_IMAGES = YES; CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_STRICT_OBJC_MSGSEND = YES; FRAMEWORK_VERSION = A; - GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/Alamofire/Alamofire-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/Alamofire/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/GCDWebServer/GCDWebServer-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/GCDWebServer/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; - MACOSX_DEPLOYMENT_TARGET = 10.10; - MODULEMAP_FILE = "Target Support Files/Alamofire/Alamofire.modulemap"; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_NAME = Alamofire; + MACOSX_DEPLOYMENT_TARGET = 10.7; + MODULEMAP_FILE = "Target Support Files/GCDWebServer/GCDWebServer.modulemap"; + PRODUCT_MODULE_NAME = GCDWebServer; + PRODUCT_NAME = GCDWebServer; SDKROOT = macosx; SKIP_INSTALL = YES; - SWIFT_VERSION = 3.0; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 4.2; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; name = Release; }; - 589B72DA8822ACB473F08C2D741AC4F0 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = A5055B8EFFFBEDE50909E935D4BCA446 /* Pods-proxy_conf_helper.release.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = "-"; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - EXECUTABLE_PREFIX = lib; - GCC_NO_COMMON_BLOCKS = YES; - MACH_O_TYPE = staticlib; - MACOSX_DEPLOYMENT_TARGET = 10.11; - MTL_ENABLE_DEBUG_INFO = NO; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - SKIP_INSTALL = YES; - SWIFT_VERSION = 3.0; - }; - name = Release; - }; - 5D622BA00757EC20ADAD24C580904C04 /* Release */ = { + 2865D6CA54276FC287AEEA5628D514EE /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGNING_ALLOWED = NO; CODE_SIGNING_REQUIRED = NO; - COPY_PHASE_STRIP = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_C_LANGUAGE_STANDARD = gnu11; GCC_NO_COMMON_BLOCKS = YES; GCC_PREPROCESSOR_DEFINITIONS = ( "POD_CONFIGURATION_RELEASE=1", "$(inherited)", ); GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 10.11; - PROVISIONING_PROFILE_SPECIFIER = NO_SIGNING/; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = "$(TARGET_NAME)"; STRIP_INSTALLED_PRODUCT = NO; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_COMPILATION_MODE = wholemodule; SYMROOT = "${SRCROOT}/../build"; - VALIDATE_PRODUCT = YES; }; name = Release; }; - 63FB37CC6087A8247F1771B40A55D156 /* Debug */ = { + 64276C599C4DD5F85BD4A83CD846C56F /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C12AC1F78F621586EC3C233BD8CF4BE0 /* BRLOptionParser.xcconfig */; + baseConfigurationReference = DE7A0154918329E1BFCE3167A327EB5F /* Pods-ShadowsocksX-NG.debug.xcconfig */; buildSettings = { - CODE_SIGN_IDENTITY = "-"; + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CLANG_ENABLE_OBJC_WEAK = NO; + CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - EXECUTABLE_PREFIX = lib; - GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/BRLOptionParser/BRLOptionParser-prefix.pch"; - MACOSX_DEPLOYMENT_TARGET = 10.7; - MTL_ENABLE_DEBUG_INFO = YES; + COMBINE_HIDPI_IMAGES = YES; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + FRAMEWORK_VERSION = A; + INFOPLIST_FILE = "Target Support Files/Pods-ShadowsocksX-NG/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MACOSX_DEPLOYMENT_TARGET = 10.11; + MODULEMAP_FILE = "Target Support Files/Pods-ShadowsocksX-NG/Pods-ShadowsocksX-NG.modulemap"; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; - PRIVATE_HEADERS_FOLDER_PATH = ""; - PRODUCT_NAME = "$(TARGET_NAME)"; - PUBLIC_HEADERS_FOLDER_PATH = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SDKROOT = macosx; - SWIFT_VERSION = 3.0; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.2; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; }; name = Debug; }; - 6A602B9551DB707685B6B5EA5A2A8150 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = C12AC1F78F621586EC3C233BD8CF4BE0 /* BRLOptionParser.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = "-"; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - EXECUTABLE_PREFIX = lib; - GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/BRLOptionParser/BRLOptionParser-prefix.pch"; - MACOSX_DEPLOYMENT_TARGET = 10.7; - MTL_ENABLE_DEBUG_INFO = NO; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PRIVATE_HEADERS_FOLDER_PATH = ""; - PRODUCT_NAME = "$(TARGET_NAME)"; - PUBLIC_HEADERS_FOLDER_PATH = ""; - SDKROOT = macosx; - SWIFT_VERSION = 3.0; - }; - name = Release; - }; - 7AF712BB856DEC6530CF949EFCCE66A0 /* Debug */ = { + 6D42D53D2134A7D822DABBD3BB8F2BD0 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 98522BF2EB25C0255284080F9CA3E195 /* Pods-ShadowsocksX-NG.debug.xcconfig */; + baseConfigurationReference = D5B095D0CF50FEAE4820D692369FBA33 /* Pods-ShadowsocksX-NG.release.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - CODE_SIGN_IDENTITY = "-"; + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CLANG_ENABLE_OBJC_WEAK = NO; + CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; COMBINE_HIDPI_IMAGES = YES; CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = dwarf; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_STRICT_OBJC_MSGSEND = YES; FRAMEWORK_VERSION = A; - GCC_NO_COMMON_BLOCKS = YES; INFOPLIST_FILE = "Target Support Files/Pods-ShadowsocksX-NG/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; MACH_O_TYPE = staticlib; MACOSX_DEPLOYMENT_TARGET = 10.11; MODULEMAP_FILE = "Target Support Files/Pods-ShadowsocksX-NG/Pods-ShadowsocksX-NG.modulemap"; - MTL_ENABLE_DEBUG_INFO = YES; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PODS_ROOT = "$(SRCROOT)"; PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = Pods_ShadowsocksX_NG; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SDKROOT = macosx; SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 3.0; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 4.2; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Debug; + name = Release; }; - 85EFB31300ECD852FAD5DE392B6CDD3A /* Release */ = { + 9C8F8DED6609B556C07F92145FA999ED /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 24BCEE536E19B38E28CE6933A0D49A2D /* GCDWebServer.xcconfig */; + baseConfigurationReference = 3B23098A73BEFE5201FEB48F369DAD5C /* GCDWebServer.xcconfig */; buildSettings = { - CODE_SIGN_IDENTITY = "-"; + CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; COMBINE_HIDPI_IMAGES = YES; CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_STRICT_OBJC_MSGSEND = YES; FRAMEWORK_VERSION = A; - GCC_NO_COMMON_BLOCKS = YES; GCC_PREFIX_HEADER = "Target Support Files/GCDWebServer/GCDWebServer-prefix.pch"; INFOPLIST_FILE = "Target Support Files/GCDWebServer/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; MACOSX_DEPLOYMENT_TARGET = 10.7; MODULEMAP_FILE = "Target Support Files/GCDWebServer/GCDWebServer.modulemap"; - MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_MODULE_NAME = GCDWebServer; PRODUCT_NAME = GCDWebServer; SDKROOT = macosx; SKIP_INSTALL = YES; - SWIFT_VERSION = 3.0; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 4.2; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Release; + name = Debug; }; - 98148054FE9949354B04AFFEF1EA5E4C /* Release */ = { + 9EACEB4BAD50DFDFBBF6F24068ACC433 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 089EB7E66F64D3A19BB7681AFCE91031 /* Pods-ShadowsocksX-NG.release.xcconfig */; + baseConfigurationReference = C7666B80A7B5F02FB102943E5D775992 /* Pods-ShadowsocksX-NGTests.release.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - CODE_SIGN_IDENTITY = "-"; + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CLANG_ENABLE_OBJC_WEAK = NO; + CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; COMBINE_HIDPI_IMAGES = YES; CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_STRICT_OBJC_MSGSEND = YES; FRAMEWORK_VERSION = A; - GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = "Target Support Files/Pods-ShadowsocksX-NG/Info.plist"; + INFOPLIST_FILE = "Target Support Files/Pods-ShadowsocksX-NGTests/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; MACH_O_TYPE = staticlib; MACOSX_DEPLOYMENT_TARGET = 10.11; - MODULEMAP_FILE = "Target Support Files/Pods-ShadowsocksX-NG/Pods-ShadowsocksX-NG.modulemap"; - MTL_ENABLE_DEBUG_INFO = NO; + MODULEMAP_FILE = "Target Support Files/Pods-ShadowsocksX-NGTests/Pods-ShadowsocksX-NGTests.modulemap"; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PODS_ROOT = "$(SRCROOT)"; PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = Pods_ShadowsocksX_NG; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SDKROOT = macosx; SKIP_INSTALL = YES; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 4.2; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; name = Release; }; - AB74B5E09B30AE94F1D9671501EA01E8 /* Debug */ = { + BE5BFE8D01810C31013EFB6520C87162 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGNING_ALLOWED = NO; CODE_SIGNING_REQUIRED = NO; COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_C_LANGUAGE_STANDARD = gnu11; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; @@ -1193,134 +1129,216 @@ "DEBUG=1", "$(inherited)", ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; - PROVISIONING_PROFILE_SPECIFIER = NO_SIGNING/; + PRODUCT_NAME = "$(TARGET_NAME)"; STRIP_INSTALLED_PRODUCT = NO; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SYMROOT = "${SRCROOT}/../build"; }; name = Debug; }; - DE3E0842AEADB29ED1894C79AA05F044 /* Debug */ = { + C0B61A0DED54B5E9D66EB87CAF76AD05 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 054C3E84057CD06DB85D99E7AD207F48 /* Pods-proxy_conf_helper.debug.xcconfig */; + baseConfigurationReference = 6D9EE153FEB3F418F9FA6B36E0D4489D /* Alamofire.xcconfig */; buildSettings = { - CODE_SIGN_IDENTITY = "-"; + CLANG_ENABLE_OBJC_WEAK = NO; + CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - EXECUTABLE_PREFIX = lib; - GCC_NO_COMMON_BLOCKS = YES; - MACH_O_TYPE = staticlib; - MACOSX_DEPLOYMENT_TARGET = 10.11; - MTL_ENABLE_DEBUG_INFO = YES; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME)"; + COMBINE_HIDPI_IMAGES = YES; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + FRAMEWORK_VERSION = A; + GCC_PREFIX_HEADER = "Target Support Files/Alamofire/Alamofire-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Alamofire/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 10.10; + MODULEMAP_FILE = "Target Support Files/Alamofire/Alamofire.modulemap"; + PRODUCT_MODULE_NAME = Alamofire; + PRODUCT_NAME = Alamofire; SDKROOT = macosx; SKIP_INSTALL = YES; - SWIFT_VERSION = 3.0; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.2; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; }; name = Debug; }; - EEC1F7D47739588099958DDE9B22FEEB /* Debug */ = { + C3E8A2C1A410ABC9191A677AF25D80FB /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 24BCEE536E19B38E28CE6933A0D49A2D /* GCDWebServer.xcconfig */; + baseConfigurationReference = 077EFEEE90EECB42A067C82EE65DEE1F /* Pods-ShadowsocksX-NGTests.debug.xcconfig */; buildSettings = { - CODE_SIGN_IDENTITY = "-"; + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CLANG_ENABLE_OBJC_WEAK = NO; + CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; COMBINE_HIDPI_IMAGES = YES; CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = dwarf; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_STRICT_OBJC_MSGSEND = YES; FRAMEWORK_VERSION = A; - GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/GCDWebServer/GCDWebServer-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/GCDWebServer/Info.plist"; + INFOPLIST_FILE = "Target Support Files/Pods-ShadowsocksX-NGTests/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; - MACOSX_DEPLOYMENT_TARGET = 10.7; - MODULEMAP_FILE = "Target Support Files/GCDWebServer/GCDWebServer.modulemap"; - MTL_ENABLE_DEBUG_INFO = YES; - PRODUCT_NAME = GCDWebServer; + MACH_O_TYPE = staticlib; + MACOSX_DEPLOYMENT_TARGET = 10.11; + MODULEMAP_FILE = "Target Support Files/Pods-ShadowsocksX-NGTests/Pods-ShadowsocksX-NGTests.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SDKROOT = macosx; SKIP_INSTALL = YES; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 4.2; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; name = Debug; }; + CEEF6CE792B07B071C52558E9BAFE33B /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = C12AC1F78F621586EC3C233BD8CF4BE0 /* BRLOptionParser.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = "-"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + EXECUTABLE_PREFIX = lib; + GCC_PREFIX_HEADER = "Target Support Files/BRLOptionParser/BRLOptionParser-prefix.pch"; + MACOSX_DEPLOYMENT_TARGET = 10.7; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PRIVATE_HEADERS_FOLDER_PATH = ""; + PRODUCT_MODULE_NAME = BRLOptionParser; + PRODUCT_NAME = BRLOptionParser; + PUBLIC_HEADERS_FOLDER_PATH = ""; + SDKROOT = macosx; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 4.2; + }; + name = Debug; + }; + E7F5DD567B952E82C8F8E24C695A1F8C /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 054C3E84057CD06DB85D99E7AD207F48 /* Pods-proxy_conf_helper.debug.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CLANG_ENABLE_OBJC_WEAK = NO; + CODE_SIGN_IDENTITY = "-"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + EXECUTABLE_PREFIX = lib; + MACH_O_TYPE = staticlib; + MACOSX_DEPLOYMENT_TARGET = 10.11; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + SDKROOT = macosx; + SKIP_INSTALL = YES; + SWIFT_VERSION = 4.2; + }; + name = Debug; + }; + F3041222849E5132C157814A2A346700 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = C12AC1F78F621586EC3C233BD8CF4BE0 /* BRLOptionParser.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = "-"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + EXECUTABLE_PREFIX = lib; + GCC_PREFIX_HEADER = "Target Support Files/BRLOptionParser/BRLOptionParser-prefix.pch"; + MACOSX_DEPLOYMENT_TARGET = 10.7; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PRIVATE_HEADERS_FOLDER_PATH = ""; + PRODUCT_MODULE_NAME = BRLOptionParser; + PRODUCT_NAME = BRLOptionParser; + PUBLIC_HEADERS_FOLDER_PATH = ""; + SDKROOT = macosx; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 4.2; + }; + name = Release; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 010811070A86F912EA0CD2BB98136CD9 /* Build configuration list for PBXNativeTarget "GCDWebServer" */ = { isa = XCConfigurationList; buildConfigurations = ( - EEC1F7D47739588099958DDE9B22FEEB /* Debug */, - 85EFB31300ECD852FAD5DE392B6CDD3A /* Release */, + 9C8F8DED6609B556C07F92145FA999ED /* Debug */, + 0E4E4C059EF6B779CD20D65A5145BAA1 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 246647E8AB354727F9ECD0879805161F /* Build configuration list for PBXNativeTarget "Pods-proxy_conf_helper" */ = { + 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { isa = XCConfigurationList; buildConfigurations = ( - DE3E0842AEADB29ED1894C79AA05F044 /* Debug */, - 589B72DA8822ACB473F08C2D741AC4F0 /* Release */, + BE5BFE8D01810C31013EFB6520C87162 /* Debug */, + 2865D6CA54276FC287AEEA5628D514EE /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { + 2F77498525A0E767346D427FFFA9B395 /* Build configuration list for PBXNativeTarget "Pods-proxy_conf_helper" */ = { isa = XCConfigurationList; buildConfigurations = ( - AB74B5E09B30AE94F1D9671501EA01E8 /* Debug */, - 5D622BA00757EC20ADAD24C580904C04 /* Release */, + E7F5DD567B952E82C8F8E24C695A1F8C /* Debug */, + 0339BB86D5A0B3E760726AB20BB1757E /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 419E5D95491847CD79841B971A8A3277 /* Build configuration list for PBXNativeTarget "Alamofire" */ = { + 40A9E0F21FE41E6146ED16E9D2403D91 /* Build configuration list for PBXNativeTarget "Pods-ShadowsocksX-NGTests" */ = { isa = XCConfigurationList; buildConfigurations = ( - 02E195CBAB30A9CBC71B668C0E2C5F60 /* Debug */, - 581B7E690A5A7F5E7DF616728F5651C1 /* Release */, + C3E8A2C1A410ABC9191A677AF25D80FB /* Debug */, + 9EACEB4BAD50DFDFBBF6F24068ACC433 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 4B561109B4C51E9DC9F5F27E9C033405 /* Build configuration list for PBXNativeTarget "BRLOptionParser" */ = { + 419E5D95491847CD79841B971A8A3277 /* Build configuration list for PBXNativeTarget "Alamofire" */ = { isa = XCConfigurationList; buildConfigurations = ( - 63FB37CC6087A8247F1771B40A55D156 /* Debug */, - 6A602B9551DB707685B6B5EA5A2A8150 /* Release */, + C0B61A0DED54B5E9D66EB87CAF76AD05 /* Debug */, + 0D6BACE0C342D735B6DC38F72D5F3976 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 78B338CAC10BFFE58C0DE5D189212D60 /* Build configuration list for PBXNativeTarget "Pods-ShadowsocksX-NGTests" */ = { + BAA362AFDE955A0A6C1126194B019FC6 /* Build configuration list for PBXNativeTarget "BRLOptionParser" */ = { isa = XCConfigurationList; buildConfigurations = ( - 055AE8BB5FE83DD0248770E9FE7FC64A /* Debug */, - 22020BFD96930B88F386AC9254BD6D9E /* Release */, + CEEF6CE792B07B071C52558E9BAFE33B /* Debug */, + F3041222849E5132C157814A2A346700 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -1328,8 +1346,8 @@ BFE80AF401A02D5658D84A694BE7A3CE /* Build configuration list for PBXNativeTarget "Pods-ShadowsocksX-NG" */ = { isa = XCConfigurationList; buildConfigurations = ( - 7AF712BB856DEC6530CF949EFCCE66A0 /* Debug */, - 98148054FE9949354B04AFFEF1EA5E4C /* Release */, + 64276C599C4DD5F85BD4A83CD846C56F /* Debug */, + 6D42D53D2134A7D822DABBD3BB8F2BD0 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; diff --git a/Pods/Target Support Files/Alamofire/Alamofire-prefix.pch b/Pods/Target Support Files/Alamofire/Alamofire-prefix.pch index b9c163b4..082f8af2 100644 --- a/Pods/Target Support Files/Alamofire/Alamofire-prefix.pch +++ b/Pods/Target Support Files/Alamofire/Alamofire-prefix.pch @@ -1,4 +1,12 @@ #ifdef __OBJC__ #import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif #endif diff --git a/Pods/Target Support Files/Alamofire/Alamofire-umbrella.h b/Pods/Target Support Files/Alamofire/Alamofire-umbrella.h index 14b3ff78..c83c1a52 100644 --- a/Pods/Target Support Files/Alamofire/Alamofire-umbrella.h +++ b/Pods/Target Support Files/Alamofire/Alamofire-umbrella.h @@ -1,5 +1,13 @@ #ifdef __OBJC__ #import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif #endif diff --git a/Pods/Target Support Files/Alamofire/Alamofire.xcconfig b/Pods/Target Support Files/Alamofire/Alamofire.xcconfig index 572419f0..24dcf653 100644 --- a/Pods/Target Support Files/Alamofire/Alamofire.xcconfig +++ b/Pods/Target Support Files/Alamofire/Alamofire.xcconfig @@ -1,10 +1,10 @@ CODE_SIGN_IDENTITY = -CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/Alamofire +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Alamofire GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/BRLOptionParser" OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" -PODS_BUILD_DIR = $BUILD_DIR -PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/Alamofire PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} SKIP_INSTALL = YES diff --git a/Pods/Target Support Files/BRLOptionParser/BRLOptionParser-prefix.pch b/Pods/Target Support Files/BRLOptionParser/BRLOptionParser-prefix.pch index b9c163b4..082f8af2 100644 --- a/Pods/Target Support Files/BRLOptionParser/BRLOptionParser-prefix.pch +++ b/Pods/Target Support Files/BRLOptionParser/BRLOptionParser-prefix.pch @@ -1,4 +1,12 @@ #ifdef __OBJC__ #import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif #endif diff --git a/Pods/Target Support Files/BRLOptionParser/BRLOptionParser.xcconfig b/Pods/Target Support Files/BRLOptionParser/BRLOptionParser.xcconfig index 1660b8d3..74e0192a 100644 --- a/Pods/Target Support Files/BRLOptionParser/BRLOptionParser.xcconfig +++ b/Pods/Target Support Files/BRLOptionParser/BRLOptionParser.xcconfig @@ -1,8 +1,9 @@ -CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/BRLOptionParser +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/BRLOptionParser GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/BRLOptionParser" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/BRLOptionParser" -PODS_BUILD_DIR = $BUILD_DIR -PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/BRLOptionParser" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/BRLOptionParser" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/BRLOptionParser PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} SKIP_INSTALL = YES diff --git a/Pods/Target Support Files/GCDWebServer/GCDWebServer-prefix.pch b/Pods/Target Support Files/GCDWebServer/GCDWebServer-prefix.pch index b9c163b4..082f8af2 100644 --- a/Pods/Target Support Files/GCDWebServer/GCDWebServer-prefix.pch +++ b/Pods/Target Support Files/GCDWebServer/GCDWebServer-prefix.pch @@ -1,4 +1,12 @@ #ifdef __OBJC__ #import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif #endif diff --git a/Pods/Target Support Files/GCDWebServer/GCDWebServer-umbrella.h b/Pods/Target Support Files/GCDWebServer/GCDWebServer-umbrella.h index e559de4e..e7ae4003 100644 --- a/Pods/Target Support Files/GCDWebServer/GCDWebServer-umbrella.h +++ b/Pods/Target Support Files/GCDWebServer/GCDWebServer-umbrella.h @@ -1,5 +1,13 @@ #ifdef __OBJC__ #import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif #endif #import "GCDWebServer.h" diff --git a/Pods/Target Support Files/GCDWebServer/GCDWebServer.xcconfig b/Pods/Target Support Files/GCDWebServer/GCDWebServer.xcconfig index 9fd18481..96a00819 100644 --- a/Pods/Target Support Files/GCDWebServer/GCDWebServer.xcconfig +++ b/Pods/Target Support Files/GCDWebServer/GCDWebServer.xcconfig @@ -1,10 +1,10 @@ CODE_SIGN_IDENTITY = -CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/GCDWebServer +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/GCDWebServer GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/BRLOptionParser" OTHER_LDFLAGS = -l"z" -framework "SystemConfiguration" -PODS_BUILD_DIR = $BUILD_DIR -PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/GCDWebServer PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} SKIP_INSTALL = YES diff --git a/Pods/Target Support Files/GCDWebServer/Info.plist b/Pods/Target Support Files/GCDWebServer/Info.plist index 234e3516..152c333e 100644 --- a/Pods/Target Support Files/GCDWebServer/Info.plist +++ b/Pods/Target Support Files/GCDWebServer/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 3.3.3 + 3.4.2 CFBundleSignature ???? CFBundleVersion diff --git a/Pods/Target Support Files/Pods-ShadowsocksX-NG/Pods-ShadowsocksX-NG-frameworks.sh b/Pods/Target Support Files/Pods-ShadowsocksX-NG/Pods-ShadowsocksX-NG-frameworks.sh index 6b1dedfc..ecbee2d4 100755 --- a/Pods/Target Support Files/Pods-ShadowsocksX-NG/Pods-ShadowsocksX-NG-frameworks.sh +++ b/Pods/Target Support Files/Pods-ShadowsocksX-NG/Pods-ShadowsocksX-NG-frameworks.sh @@ -1,11 +1,28 @@ #!/bin/sh set -e +set -u +set -o pipefail + +if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then + # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy + # frameworks to, so exit 0 (signalling the script phase was successful). + exit 0 +fi echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" +COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}" SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" +# Used as a return value for each invocation of `strip_invalid_archs` function. +STRIP_BINARY_RETVAL=0 + +# This protects against multiple targets copying the same framework dependency at the same time. The solution +# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html +RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") + +# Copies and strips a vendored framework install_framework() { if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then @@ -23,9 +40,9 @@ install_framework() source="$(readlink "${source}")" fi - # use filter instead of exclude so missing patterns dont' throw errors - echo "rsync -av --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" - rsync -av --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" + # Use filter instead of exclude so missing patterns don't throw errors. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" local basename basename="$(basename -s .framework "$1")" @@ -54,24 +71,65 @@ install_framework() fi } +# Copies and strips a vendored dSYM +install_dsym() { + local source="$1" + if [ -r "$source" ]; then + # Copy the dSYM into a the targets temp dir. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DERIVED_FILES_DIR}" + + local basename + basename="$(basename -s .framework.dSYM "$source")" + binary="${DERIVED_FILES_DIR}/${basename}.framework.dSYM/Contents/Resources/DWARF/${basename}" + + # Strip invalid architectures so "fat" simulator / device frameworks work on device + if [[ "$(file "$binary")" == *"Mach-O dSYM companion"* ]]; then + strip_invalid_archs "$binary" + fi + + if [[ $STRIP_BINARY_RETVAL == 1 ]]; then + # Move the stripped file into its final destination. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.framework.dSYM" "${DWARF_DSYM_FOLDER_PATH}" + else + # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing. + touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.framework.dSYM" + fi + fi +} + # Signs a framework with the provided identity code_sign_if_enabled() { - if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then + if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then # Use the current code_sign_identitiy echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" - echo "/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements \"$1\"" - /usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements "$1" + local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'" + + if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + code_sign_cmd="$code_sign_cmd &" + fi + echo "$code_sign_cmd" + eval "$code_sign_cmd" fi } # Strip invalid architectures strip_invalid_archs() { binary="$1" - # Get architectures for current file - archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | rev)" + # Get architectures for current target binary + binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)" + # Intersect them with the architectures we are building for + intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)" + # If there are no archs supported by this binary then warn the user + if [[ -z "$intersected_archs" ]]; then + echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)." + STRIP_BINARY_RETVAL=0 + return + fi stripped="" - for arch in $archs; do - if ! [[ "${VALID_ARCHS}" == *"$arch"* ]]; then + for arch in $binary_archs; do + if ! [[ "${ARCHS}" == *"$arch"* ]]; then # Strip non-valid architectures in-place lipo -remove "$arch" -output "$binary" "$binary" || exit 1 stripped="$stripped $arch" @@ -80,14 +138,18 @@ strip_invalid_archs() { if [[ "$stripped" ]]; then echo "Stripped $binary of architectures:$stripped" fi + STRIP_BINARY_RETVAL=1 } if [[ "$CONFIGURATION" == "Debug" ]]; then - install_framework "$BUILT_PRODUCTS_DIR/Alamofire/Alamofire.framework" - install_framework "$BUILT_PRODUCTS_DIR/GCDWebServer/GCDWebServer.framework" + install_framework "${BUILT_PRODUCTS_DIR}/Alamofire/Alamofire.framework" + install_framework "${BUILT_PRODUCTS_DIR}/GCDWebServer/GCDWebServer.framework" fi if [[ "$CONFIGURATION" == "Release" ]]; then - install_framework "$BUILT_PRODUCTS_DIR/Alamofire/Alamofire.framework" - install_framework "$BUILT_PRODUCTS_DIR/GCDWebServer/GCDWebServer.framework" + install_framework "${BUILT_PRODUCTS_DIR}/Alamofire/Alamofire.framework" + install_framework "${BUILT_PRODUCTS_DIR}/GCDWebServer/GCDWebServer.framework" +fi +if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + wait fi diff --git a/Pods/Target Support Files/Pods-ShadowsocksX-NG/Pods-ShadowsocksX-NG-resources.sh b/Pods/Target Support Files/Pods-ShadowsocksX-NG/Pods-ShadowsocksX-NG-resources.sh index 25e9d377..345301f2 100755 --- a/Pods/Target Support Files/Pods-ShadowsocksX-NG/Pods-ShadowsocksX-NG-resources.sh +++ b/Pods/Target Support Files/Pods-ShadowsocksX-NG/Pods-ShadowsocksX-NG-resources.sh @@ -1,5 +1,13 @@ #!/bin/sh set -e +set -u +set -o pipefail + +if [ -z ${UNLOCALIZED_RESOURCES_FOLDER_PATH+x} ]; then + # If UNLOCALIZED_RESOURCES_FOLDER_PATH is not set, then there's nowhere for us to copy + # resources to, so exit 0 (signalling the script phase was successful). + exit 0 +fi mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" @@ -8,7 +16,11 @@ RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt XCASSET_FILES=() -case "${TARGETED_DEVICE_FAMILY}" in +# This protects against multiple targets copying the same framework dependency at the same time. The solution +# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html +RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") + +case "${TARGETED_DEVICE_FAMILY:-}" in 1,2) TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" ;; @@ -18,6 +30,12 @@ case "${TARGETED_DEVICE_FAMILY}" in 2) TARGET_DEVICE_ARGS="--target-device ipad" ;; + 3) + TARGET_DEVICE_ARGS="--target-device tv" + ;; + 4) + TARGET_DEVICE_ARGS="--target-device watch" + ;; *) TARGET_DEVICE_ARGS="--target-device mac" ;; @@ -38,29 +56,29 @@ EOM fi case $RESOURCE_PATH in *.storyboard) - echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" + echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} ;; *.xib) - echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" + echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} ;; *.framework) - echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - echo "rsync -av $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - rsync -av "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" ;; *.xcdatamodel) - echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" + echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" || true xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom" ;; *.xcdatamodeld) - echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" + echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" || true xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd" ;; *.xcmappingmodel) - echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" + echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" || true xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" ;; *.xcassets) @@ -68,7 +86,7 @@ EOM XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") ;; *) - echo "$RESOURCE_PATH" + echo "$RESOURCE_PATH" || true echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY" ;; esac @@ -82,7 +100,7 @@ if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then fi rm -f "$RESOURCES_TO_COPY" -if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "$XCASSET_FILES" ] +if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "${XCASSET_FILES:-}" ] then # Find all other xcassets (this unfortunately includes those of path pods and other targets). OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) @@ -92,5 +110,9 @@ then fi done <<<"$OTHER_XCASSETS" - printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + if [ -z ${ASSETCATALOG_COMPILER_APPICON_NAME+x} ]; then + printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + else + printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" --app-icon "${ASSETCATALOG_COMPILER_APPICON_NAME}" --output-partial-info-plist "${TARGET_TEMP_DIR}/assetcatalog_generated_info_cocoapods.plist" + fi fi diff --git a/Pods/Target Support Files/Pods-ShadowsocksX-NG/Pods-ShadowsocksX-NG-umbrella.h b/Pods/Target Support Files/Pods-ShadowsocksX-NG/Pods-ShadowsocksX-NG-umbrella.h index 1549e466..9422e612 100644 --- a/Pods/Target Support Files/Pods-ShadowsocksX-NG/Pods-ShadowsocksX-NG-umbrella.h +++ b/Pods/Target Support Files/Pods-ShadowsocksX-NG/Pods-ShadowsocksX-NG-umbrella.h @@ -1,5 +1,13 @@ #ifdef __OBJC__ #import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif #endif diff --git a/Pods/Target Support Files/Pods-ShadowsocksX-NG/Pods-ShadowsocksX-NG.debug.xcconfig b/Pods/Target Support Files/Pods-ShadowsocksX-NG/Pods-ShadowsocksX-NG.debug.xcconfig index 48b961a8..156f0781 100644 --- a/Pods/Target Support Files/Pods-ShadowsocksX-NG/Pods-ShadowsocksX-NG.debug.xcconfig +++ b/Pods/Target Support Files/Pods-ShadowsocksX-NG/Pods-ShadowsocksX-NG.debug.xcconfig @@ -1,12 +1,12 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES CODE_SIGN_IDENTITY = -EMBEDDED_CONTENT_CONTAINS_SWIFT = YES -FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/Alamofire" "$PODS_CONFIGURATION_BUILD_DIR/GCDWebServer" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire" "${PODS_CONFIGURATION_BUILD_DIR}/GCDWebServer" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/../Frameworks' '@loader_path/Frameworks' -OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/Alamofire/Alamofire.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/GCDWebServer/GCDWebServer.framework/Headers" +OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire/Alamofire.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/GCDWebServer/GCDWebServer.framework/Headers" OTHER_LDFLAGS = $(inherited) -framework "Alamofire" -framework "GCDWebServer" OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" -PODS_BUILD_DIR = $BUILD_DIR -PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. PODS_ROOT = ${SRCROOT}/Pods diff --git a/Pods/Target Support Files/Pods-ShadowsocksX-NG/Pods-ShadowsocksX-NG.release.xcconfig b/Pods/Target Support Files/Pods-ShadowsocksX-NG/Pods-ShadowsocksX-NG.release.xcconfig index 48b961a8..156f0781 100644 --- a/Pods/Target Support Files/Pods-ShadowsocksX-NG/Pods-ShadowsocksX-NG.release.xcconfig +++ b/Pods/Target Support Files/Pods-ShadowsocksX-NG/Pods-ShadowsocksX-NG.release.xcconfig @@ -1,12 +1,12 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES CODE_SIGN_IDENTITY = -EMBEDDED_CONTENT_CONTAINS_SWIFT = YES -FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/Alamofire" "$PODS_CONFIGURATION_BUILD_DIR/GCDWebServer" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire" "${PODS_CONFIGURATION_BUILD_DIR}/GCDWebServer" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/../Frameworks' '@loader_path/Frameworks' -OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/Alamofire/Alamofire.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/GCDWebServer/GCDWebServer.framework/Headers" +OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire/Alamofire.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/GCDWebServer/GCDWebServer.framework/Headers" OTHER_LDFLAGS = $(inherited) -framework "Alamofire" -framework "GCDWebServer" OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" -PODS_BUILD_DIR = $BUILD_DIR -PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. PODS_ROOT = ${SRCROOT}/Pods diff --git a/Pods/Target Support Files/Pods-ShadowsocksX-NGTests/Pods-ShadowsocksX-NGTests-frameworks.sh b/Pods/Target Support Files/Pods-ShadowsocksX-NGTests/Pods-ShadowsocksX-NGTests-frameworks.sh index 893c16a6..08e3eaac 100755 --- a/Pods/Target Support Files/Pods-ShadowsocksX-NGTests/Pods-ShadowsocksX-NGTests-frameworks.sh +++ b/Pods/Target Support Files/Pods-ShadowsocksX-NGTests/Pods-ShadowsocksX-NGTests-frameworks.sh @@ -1,11 +1,28 @@ #!/bin/sh set -e +set -u +set -o pipefail + +if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then + # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy + # frameworks to, so exit 0 (signalling the script phase was successful). + exit 0 +fi echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" +COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}" SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" +# Used as a return value for each invocation of `strip_invalid_archs` function. +STRIP_BINARY_RETVAL=0 + +# This protects against multiple targets copying the same framework dependency at the same time. The solution +# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html +RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") + +# Copies and strips a vendored framework install_framework() { if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then @@ -23,9 +40,9 @@ install_framework() source="$(readlink "${source}")" fi - # use filter instead of exclude so missing patterns dont' throw errors - echo "rsync -av --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" - rsync -av --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" + # Use filter instead of exclude so missing patterns don't throw errors. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" local basename basename="$(basename -s .framework "$1")" @@ -54,24 +71,65 @@ install_framework() fi } +# Copies and strips a vendored dSYM +install_dsym() { + local source="$1" + if [ -r "$source" ]; then + # Copy the dSYM into a the targets temp dir. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DERIVED_FILES_DIR}" + + local basename + basename="$(basename -s .framework.dSYM "$source")" + binary="${DERIVED_FILES_DIR}/${basename}.framework.dSYM/Contents/Resources/DWARF/${basename}" + + # Strip invalid architectures so "fat" simulator / device frameworks work on device + if [[ "$(file "$binary")" == *"Mach-O dSYM companion"* ]]; then + strip_invalid_archs "$binary" + fi + + if [[ $STRIP_BINARY_RETVAL == 1 ]]; then + # Move the stripped file into its final destination. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.framework.dSYM" "${DWARF_DSYM_FOLDER_PATH}" + else + # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing. + touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.framework.dSYM" + fi + fi +} + # Signs a framework with the provided identity code_sign_if_enabled() { - if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then + if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then # Use the current code_sign_identitiy echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" - echo "/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements \"$1\"" - /usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements "$1" + local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'" + + if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + code_sign_cmd="$code_sign_cmd &" + fi + echo "$code_sign_cmd" + eval "$code_sign_cmd" fi } # Strip invalid architectures strip_invalid_archs() { binary="$1" - # Get architectures for current file - archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | rev)" + # Get architectures for current target binary + binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)" + # Intersect them with the architectures we are building for + intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)" + # If there are no archs supported by this binary then warn the user + if [[ -z "$intersected_archs" ]]; then + echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)." + STRIP_BINARY_RETVAL=0 + return + fi stripped="" - for arch in $archs; do - if ! [[ "${VALID_ARCHS}" == *"$arch"* ]]; then + for arch in $binary_archs; do + if ! [[ "${ARCHS}" == *"$arch"* ]]; then # Strip non-valid architectures in-place lipo -remove "$arch" -output "$binary" "$binary" || exit 1 stripped="$stripped $arch" @@ -80,5 +138,9 @@ strip_invalid_archs() { if [[ "$stripped" ]]; then echo "Stripped $binary of architectures:$stripped" fi + STRIP_BINARY_RETVAL=1 } +if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + wait +fi diff --git a/Pods/Target Support Files/Pods-ShadowsocksX-NGTests/Pods-ShadowsocksX-NGTests-resources.sh b/Pods/Target Support Files/Pods-ShadowsocksX-NGTests/Pods-ShadowsocksX-NGTests-resources.sh index 25e9d377..345301f2 100755 --- a/Pods/Target Support Files/Pods-ShadowsocksX-NGTests/Pods-ShadowsocksX-NGTests-resources.sh +++ b/Pods/Target Support Files/Pods-ShadowsocksX-NGTests/Pods-ShadowsocksX-NGTests-resources.sh @@ -1,5 +1,13 @@ #!/bin/sh set -e +set -u +set -o pipefail + +if [ -z ${UNLOCALIZED_RESOURCES_FOLDER_PATH+x} ]; then + # If UNLOCALIZED_RESOURCES_FOLDER_PATH is not set, then there's nowhere for us to copy + # resources to, so exit 0 (signalling the script phase was successful). + exit 0 +fi mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" @@ -8,7 +16,11 @@ RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt XCASSET_FILES=() -case "${TARGETED_DEVICE_FAMILY}" in +# This protects against multiple targets copying the same framework dependency at the same time. The solution +# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html +RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") + +case "${TARGETED_DEVICE_FAMILY:-}" in 1,2) TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" ;; @@ -18,6 +30,12 @@ case "${TARGETED_DEVICE_FAMILY}" in 2) TARGET_DEVICE_ARGS="--target-device ipad" ;; + 3) + TARGET_DEVICE_ARGS="--target-device tv" + ;; + 4) + TARGET_DEVICE_ARGS="--target-device watch" + ;; *) TARGET_DEVICE_ARGS="--target-device mac" ;; @@ -38,29 +56,29 @@ EOM fi case $RESOURCE_PATH in *.storyboard) - echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" + echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} ;; *.xib) - echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" + echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} ;; *.framework) - echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - echo "rsync -av $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - rsync -av "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" ;; *.xcdatamodel) - echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" + echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" || true xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom" ;; *.xcdatamodeld) - echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" + echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" || true xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd" ;; *.xcmappingmodel) - echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" + echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" || true xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" ;; *.xcassets) @@ -68,7 +86,7 @@ EOM XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") ;; *) - echo "$RESOURCE_PATH" + echo "$RESOURCE_PATH" || true echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY" ;; esac @@ -82,7 +100,7 @@ if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then fi rm -f "$RESOURCES_TO_COPY" -if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "$XCASSET_FILES" ] +if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "${XCASSET_FILES:-}" ] then # Find all other xcassets (this unfortunately includes those of path pods and other targets). OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) @@ -92,5 +110,9 @@ then fi done <<<"$OTHER_XCASSETS" - printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + if [ -z ${ASSETCATALOG_COMPILER_APPICON_NAME+x} ]; then + printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + else + printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" --app-icon "${ASSETCATALOG_COMPILER_APPICON_NAME}" --output-partial-info-plist "${TARGET_TEMP_DIR}/assetcatalog_generated_info_cocoapods.plist" + fi fi diff --git a/Pods/Target Support Files/Pods-ShadowsocksX-NGTests/Pods-ShadowsocksX-NGTests-umbrella.h b/Pods/Target Support Files/Pods-ShadowsocksX-NGTests/Pods-ShadowsocksX-NGTests-umbrella.h index 6afec73d..6531c0d1 100644 --- a/Pods/Target Support Files/Pods-ShadowsocksX-NGTests/Pods-ShadowsocksX-NGTests-umbrella.h +++ b/Pods/Target Support Files/Pods-ShadowsocksX-NGTests/Pods-ShadowsocksX-NGTests-umbrella.h @@ -1,5 +1,13 @@ #ifdef __OBJC__ #import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif #endif diff --git a/Pods/Target Support Files/Pods-ShadowsocksX-NGTests/Pods-ShadowsocksX-NGTests.debug.xcconfig b/Pods/Target Support Files/Pods-ShadowsocksX-NGTests/Pods-ShadowsocksX-NGTests.debug.xcconfig index e16baf7d..954022f2 100644 --- a/Pods/Target Support Files/Pods-ShadowsocksX-NGTests/Pods-ShadowsocksX-NGTests.debug.xcconfig +++ b/Pods/Target Support Files/Pods-ShadowsocksX-NGTests/Pods-ShadowsocksX-NGTests.debug.xcconfig @@ -1,9 +1,9 @@ -ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO CODE_SIGN_IDENTITY = -FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/Alamofire" "$PODS_CONFIGURATION_BUILD_DIR/GCDWebServer" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire" "${PODS_CONFIGURATION_BUILD_DIR}/GCDWebServer" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/../Frameworks' '@loader_path/Frameworks' -OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/Alamofire/Alamofire.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/GCDWebServer/GCDWebServer.framework/Headers" -PODS_BUILD_DIR = $BUILD_DIR -PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/../Frameworks' '@loader_path/../Frameworks' +OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire/Alamofire.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/GCDWebServer/GCDWebServer.framework/Headers" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. PODS_ROOT = ${SRCROOT}/Pods diff --git a/Pods/Target Support Files/Pods-ShadowsocksX-NGTests/Pods-ShadowsocksX-NGTests.release.xcconfig b/Pods/Target Support Files/Pods-ShadowsocksX-NGTests/Pods-ShadowsocksX-NGTests.release.xcconfig index e16baf7d..954022f2 100644 --- a/Pods/Target Support Files/Pods-ShadowsocksX-NGTests/Pods-ShadowsocksX-NGTests.release.xcconfig +++ b/Pods/Target Support Files/Pods-ShadowsocksX-NGTests/Pods-ShadowsocksX-NGTests.release.xcconfig @@ -1,9 +1,9 @@ -ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO CODE_SIGN_IDENTITY = -FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/Alamofire" "$PODS_CONFIGURATION_BUILD_DIR/GCDWebServer" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire" "${PODS_CONFIGURATION_BUILD_DIR}/GCDWebServer" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/../Frameworks' '@loader_path/Frameworks' -OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/Alamofire/Alamofire.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/GCDWebServer/GCDWebServer.framework/Headers" -PODS_BUILD_DIR = $BUILD_DIR -PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/../Frameworks' '@loader_path/../Frameworks' +OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire/Alamofire.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/GCDWebServer/GCDWebServer.framework/Headers" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. PODS_ROOT = ${SRCROOT}/Pods diff --git a/Pods/Target Support Files/Pods-proxy_conf_helper/Pods-proxy_conf_helper-frameworks.sh b/Pods/Target Support Files/Pods-proxy_conf_helper/Pods-proxy_conf_helper-frameworks.sh index 893c16a6..08e3eaac 100755 --- a/Pods/Target Support Files/Pods-proxy_conf_helper/Pods-proxy_conf_helper-frameworks.sh +++ b/Pods/Target Support Files/Pods-proxy_conf_helper/Pods-proxy_conf_helper-frameworks.sh @@ -1,11 +1,28 @@ #!/bin/sh set -e +set -u +set -o pipefail + +if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then + # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy + # frameworks to, so exit 0 (signalling the script phase was successful). + exit 0 +fi echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" +COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}" SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" +# Used as a return value for each invocation of `strip_invalid_archs` function. +STRIP_BINARY_RETVAL=0 + +# This protects against multiple targets copying the same framework dependency at the same time. The solution +# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html +RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") + +# Copies and strips a vendored framework install_framework() { if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then @@ -23,9 +40,9 @@ install_framework() source="$(readlink "${source}")" fi - # use filter instead of exclude so missing patterns dont' throw errors - echo "rsync -av --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" - rsync -av --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" + # Use filter instead of exclude so missing patterns don't throw errors. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" local basename basename="$(basename -s .framework "$1")" @@ -54,24 +71,65 @@ install_framework() fi } +# Copies and strips a vendored dSYM +install_dsym() { + local source="$1" + if [ -r "$source" ]; then + # Copy the dSYM into a the targets temp dir. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DERIVED_FILES_DIR}" + + local basename + basename="$(basename -s .framework.dSYM "$source")" + binary="${DERIVED_FILES_DIR}/${basename}.framework.dSYM/Contents/Resources/DWARF/${basename}" + + # Strip invalid architectures so "fat" simulator / device frameworks work on device + if [[ "$(file "$binary")" == *"Mach-O dSYM companion"* ]]; then + strip_invalid_archs "$binary" + fi + + if [[ $STRIP_BINARY_RETVAL == 1 ]]; then + # Move the stripped file into its final destination. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.framework.dSYM" "${DWARF_DSYM_FOLDER_PATH}" + else + # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing. + touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.framework.dSYM" + fi + fi +} + # Signs a framework with the provided identity code_sign_if_enabled() { - if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then + if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then # Use the current code_sign_identitiy echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" - echo "/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements \"$1\"" - /usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements "$1" + local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'" + + if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + code_sign_cmd="$code_sign_cmd &" + fi + echo "$code_sign_cmd" + eval "$code_sign_cmd" fi } # Strip invalid architectures strip_invalid_archs() { binary="$1" - # Get architectures for current file - archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | rev)" + # Get architectures for current target binary + binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)" + # Intersect them with the architectures we are building for + intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)" + # If there are no archs supported by this binary then warn the user + if [[ -z "$intersected_archs" ]]; then + echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)." + STRIP_BINARY_RETVAL=0 + return + fi stripped="" - for arch in $archs; do - if ! [[ "${VALID_ARCHS}" == *"$arch"* ]]; then + for arch in $binary_archs; do + if ! [[ "${ARCHS}" == *"$arch"* ]]; then # Strip non-valid architectures in-place lipo -remove "$arch" -output "$binary" "$binary" || exit 1 stripped="$stripped $arch" @@ -80,5 +138,9 @@ strip_invalid_archs() { if [[ "$stripped" ]]; then echo "Stripped $binary of architectures:$stripped" fi + STRIP_BINARY_RETVAL=1 } +if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + wait +fi diff --git a/Pods/Target Support Files/Pods-proxy_conf_helper/Pods-proxy_conf_helper-resources.sh b/Pods/Target Support Files/Pods-proxy_conf_helper/Pods-proxy_conf_helper-resources.sh index 25e9d377..345301f2 100755 --- a/Pods/Target Support Files/Pods-proxy_conf_helper/Pods-proxy_conf_helper-resources.sh +++ b/Pods/Target Support Files/Pods-proxy_conf_helper/Pods-proxy_conf_helper-resources.sh @@ -1,5 +1,13 @@ #!/bin/sh set -e +set -u +set -o pipefail + +if [ -z ${UNLOCALIZED_RESOURCES_FOLDER_PATH+x} ]; then + # If UNLOCALIZED_RESOURCES_FOLDER_PATH is not set, then there's nowhere for us to copy + # resources to, so exit 0 (signalling the script phase was successful). + exit 0 +fi mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" @@ -8,7 +16,11 @@ RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt XCASSET_FILES=() -case "${TARGETED_DEVICE_FAMILY}" in +# This protects against multiple targets copying the same framework dependency at the same time. The solution +# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html +RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") + +case "${TARGETED_DEVICE_FAMILY:-}" in 1,2) TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" ;; @@ -18,6 +30,12 @@ case "${TARGETED_DEVICE_FAMILY}" in 2) TARGET_DEVICE_ARGS="--target-device ipad" ;; + 3) + TARGET_DEVICE_ARGS="--target-device tv" + ;; + 4) + TARGET_DEVICE_ARGS="--target-device watch" + ;; *) TARGET_DEVICE_ARGS="--target-device mac" ;; @@ -38,29 +56,29 @@ EOM fi case $RESOURCE_PATH in *.storyboard) - echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" + echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} ;; *.xib) - echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" + echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} ;; *.framework) - echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - echo "rsync -av $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - rsync -av "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" ;; *.xcdatamodel) - echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" + echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" || true xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom" ;; *.xcdatamodeld) - echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" + echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" || true xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd" ;; *.xcmappingmodel) - echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" + echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" || true xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" ;; *.xcassets) @@ -68,7 +86,7 @@ EOM XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") ;; *) - echo "$RESOURCE_PATH" + echo "$RESOURCE_PATH" || true echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY" ;; esac @@ -82,7 +100,7 @@ if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then fi rm -f "$RESOURCES_TO_COPY" -if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "$XCASSET_FILES" ] +if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "${XCASSET_FILES:-}" ] then # Find all other xcassets (this unfortunately includes those of path pods and other targets). OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) @@ -92,5 +110,9 @@ then fi done <<<"$OTHER_XCASSETS" - printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + if [ -z ${ASSETCATALOG_COMPILER_APPICON_NAME+x} ]; then + printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + else + printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" --app-icon "${ASSETCATALOG_COMPILER_APPICON_NAME}" --output-partial-info-plist "${TARGET_TEMP_DIR}/assetcatalog_generated_info_cocoapods.plist" + fi fi diff --git a/Pods/Target Support Files/Pods-proxy_conf_helper/Pods-proxy_conf_helper.debug.xcconfig b/Pods/Target Support Files/Pods-proxy_conf_helper/Pods-proxy_conf_helper.debug.xcconfig index bb1eaa00..2f65c6e0 100644 --- a/Pods/Target Support Files/Pods-proxy_conf_helper/Pods-proxy_conf_helper.debug.xcconfig +++ b/Pods/Target Support Files/Pods-proxy_conf_helper/Pods-proxy_conf_helper.debug.xcconfig @@ -1,9 +1,9 @@ -ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/BRLOptionParser" -LIBRARY_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/BRLOptionParser" +LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/BRLOptionParser" OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/BRLOptionParser" OTHER_LDFLAGS = $(inherited) -ObjC -l"BRLOptionParser" -PODS_BUILD_DIR = $BUILD_DIR -PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. PODS_ROOT = ${SRCROOT}/Pods diff --git a/Pods/Target Support Files/Pods-proxy_conf_helper/Pods-proxy_conf_helper.release.xcconfig b/Pods/Target Support Files/Pods-proxy_conf_helper/Pods-proxy_conf_helper.release.xcconfig index bb1eaa00..2f65c6e0 100644 --- a/Pods/Target Support Files/Pods-proxy_conf_helper/Pods-proxy_conf_helper.release.xcconfig +++ b/Pods/Target Support Files/Pods-proxy_conf_helper/Pods-proxy_conf_helper.release.xcconfig @@ -1,9 +1,9 @@ -ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/BRLOptionParser" -LIBRARY_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/BRLOptionParser" +LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/BRLOptionParser" OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/BRLOptionParser" OTHER_LDFLAGS = $(inherited) -ObjC -l"BRLOptionParser" -PODS_BUILD_DIR = $BUILD_DIR -PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. PODS_ROOT = ${SRCROOT}/Pods diff --git a/ShadowsocksX-NG.xcodeproj/project.pbxproj b/ShadowsocksX-NG.xcodeproj/project.pbxproj index e7341ace..aca7cfdf 100644 --- a/ShadowsocksX-NG.xcodeproj/project.pbxproj +++ b/ShadowsocksX-NG.xcodeproj/project.pbxproj @@ -11,6 +11,10 @@ 083BF8371D82742200831C68 /* PingClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083BF8351D82742200831C68 /* PingClient.swift */; }; 083BF8391D82759600831C68 /* StatusItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083BF8381D82759600831C68 /* StatusItemView.swift */; }; 083BF83B1D8275A800831C68 /* SystemThemeChangeHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083BF83A1D8275A800831C68 /* SystemThemeChangeHelper.swift */; }; + 08635C771EF750FA00F1D25E /* SubscribeManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08635C761EF750FA00F1D25E /* SubscribeManager.swift */; }; + 086A31451F1AF797004C7285 /* SubscribePreferenceWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 086A31471F1AF797004C7285 /* SubscribePreferenceWindowController.xib */; }; + 0877D6541EF1E65600126865 /* Subscribe.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0877D6531EF1E65600126865 /* Subscribe.swift */; }; + 0877D6571EF1E82400126865 /* SubscribePreferenceWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0877D6551EF1E82400126865 /* SubscribePreferenceWindowController.swift */; }; 0880CE401D6FE6D900BD39E2 /* example-gui-config.json in Resources */ = {isa = PBXBuildFile; fileRef = 0880CE3F1D6FE6D900BD39E2 /* example-gui-config.json */; }; 088EC3971D5F5B8600E40791 /* whitelist.pac in Resources */ = {isa = PBXBuildFile; fileRef = 088EC3961D5F5B8600E40791 /* whitelist.pac */; }; 088EC3991D5F5BA300E40791 /* whiteiplist.pac in Resources */ = {isa = PBXBuildFile; fileRef = 088EC3981D5F5BA300E40791 /* whiteiplist.pac */; }; @@ -110,6 +114,11 @@ 083BF8381D82759600831C68 /* StatusItemView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StatusItemView.swift; sourceTree = ""; }; 083BF83A1D8275A800831C68 /* SystemThemeChangeHelper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SystemThemeChangeHelper.swift; sourceTree = ""; }; 085641E91D7188C400116B27 /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/Localizable.strings; sourceTree = ""; }; + 08635C761EF750FA00F1D25E /* SubscribeManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SubscribeManager.swift; sourceTree = ""; }; + 086A31461F1AF797004C7285 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/SubscribePreferenceWindowController.xib; sourceTree = ""; }; + 086A31491F1AF799004C7285 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/SubscribePreferenceWindowController.strings"; sourceTree = ""; }; + 0877D6531EF1E65600126865 /* Subscribe.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Subscribe.swift; sourceTree = ""; }; + 0877D6551EF1E82400126865 /* SubscribePreferenceWindowController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SubscribePreferenceWindowController.swift; sourceTree = ""; }; 0880CE3F1D6FE6D900BD39E2 /* example-gui-config.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "example-gui-config.json"; sourceTree = ""; }; 088EC3961D5F5B8600E40791 /* whitelist.pac */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = whitelist.pac; sourceTree = ""; }; 088EC3981D5F5BA300E40791 /* whiteiplist.pac */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = whiteiplist.pac; sourceTree = ""; }; @@ -133,7 +142,7 @@ 9B07EFA91D048E880052D9DF /* menu_icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = menu_icon.png; sourceTree = ""; }; 9B07EFAA1D048E880052D9DF /* menu_icon_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = menu_icon_disabled.png; sourceTree = ""; }; 9B07EFAB1D048E880052D9DF /* menu_icon_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "menu_icon_disabled@2x.png"; sourceTree = ""; }; - 9B0BFFE51D0460A70040E62B /* ShadowsocksX-NG.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "ShadowsocksX-NG.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 9B0BFFE51D0460A70040E62B /* ShadowsocksX-NG-R.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "ShadowsocksX-NG-R.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 9B0BFFE81D0460A70040E62B /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 9B0BFFEA1D0460A70040E62B /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 9B0BFFED1D0460A70040E62B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; @@ -298,7 +307,7 @@ 9B0BFFE61D0460A70040E62B /* Products */ = { isa = PBXGroup; children = ( - 9B0BFFE51D0460A70040E62B /* ShadowsocksX-NG.app */, + 9B0BFFE51D0460A70040E62B /* ShadowsocksX-NG-R.app */, 9B0BFFF41D0460A70040E62B /* ShadowsocksX-NGTests.xctest */, 9B3FFF441D09CD3B0019A709 /* proxy_conf_helper */, ); @@ -321,6 +330,8 @@ 9B0BFFEF1D0460A70040E62B /* Info.plist */, 9BEEF06D1D04DCE400FC52B3 /* ServerProfile.swift */, 9BEEF06F1D04DDB100FC52B3 /* ServerProfileManager.swift */, + 0877D6531EF1E65600126865 /* Subscribe.swift */, + 08635C761EF750FA00F1D25E /* SubscribeManager.swift */, 08BDBB471E2361BD00C4BBC2 /* VersionChecker.swift */, 083BF8381D82759600831C68 /* StatusItemView.swift */, 083BF83A1D8275A800831C68 /* SystemThemeChangeHelper.swift */, @@ -356,6 +367,8 @@ 9B3FFF331D08CEF70019A709 /* SWBQRCodeWindowController.xib */, 9B3FFF301D08CEE40019A709 /* SWBQRCodeWindowController.h */, 9B3FFF311D08CEE40019A709 /* SWBQRCodeWindowController.m */, + 0877D6551EF1E82400126865 /* SubscribePreferenceWindowController.swift */, + 086A31471F1AF797004C7285 /* SubscribePreferenceWindowController.xib */, 9BEEF0731D04EF3E00FC52B3 /* PreferencesWindowController.swift */, 9B2491B61D0ACC3A003BBECC /* PreferencesWindowController.xib */, 9BEEF0791D05631500FC52B3 /* AdvPreferencesWindowController.swift */, @@ -394,25 +407,24 @@ /* End PBXGroup section */ /* Begin PBXNativeTarget section */ - 9B0BFFE41D0460A70040E62B /* ShadowsocksX-NG */ = { + 9B0BFFE41D0460A70040E62B /* ShadowsocksX-NG-R */ = { isa = PBXNativeTarget; - buildConfigurationList = 9B0B00081D0460A70040E62B /* Build configuration list for PBXNativeTarget "ShadowsocksX-NG" */; + buildConfigurationList = 9B0B00081D0460A70040E62B /* Build configuration list for PBXNativeTarget "ShadowsocksX-NG-R" */; buildPhases = ( A3C8167BB5EB01FBDE2A08BC /* [CP] Check Pods Manifest.lock */, 9B0BFFE11D0460A70040E62B /* Sources */, 9B0BFFE21D0460A70040E62B /* Frameworks */, 9B0BFFE31D0460A70040E62B /* Resources */, 5E160625E3EC80E27DA7EF05 /* [CP] Embed Pods Frameworks */, - 3E819BD46B855EDB116A3C70 /* [CP] Copy Pods Resources */, ); buildRules = ( ); dependencies = ( 9B3FFF531D09E2B30019A709 /* PBXTargetDependency */, ); - name = "ShadowsocksX-NG"; + name = "ShadowsocksX-NG-R"; productName = "ShadowsocksX-NG"; - productReference = 9B0BFFE51D0460A70040E62B /* ShadowsocksX-NG.app */; + productReference = 9B0BFFE51D0460A70040E62B /* ShadowsocksX-NG-R.app */; productType = "com.apple.product-type.application"; }; 9B0BFFF31D0460A70040E62B /* ShadowsocksX-NGTests */ = { @@ -423,8 +435,6 @@ 9B0BFFF01D0460A70040E62B /* Sources */, 9B0BFFF11D0460A70040E62B /* Frameworks */, 9B0BFFF21D0460A70040E62B /* Resources */, - 8A094D4241AB0C72A177FDC3 /* [CP] Embed Pods Frameworks */, - D8C2D6AF002916F4095E15E3 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -444,7 +454,6 @@ 9B3FFF401D09CD3B0019A709 /* Sources */, 9B3FFF411D09CD3B0019A709 /* Frameworks */, 9B3FFF421D09CD3B0019A709 /* CopyFiles */, - 0BD38C8FA95AA74C8D7003EC /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -474,11 +483,14 @@ 9B0BFFF31D0460A70040E62B = { CreatedOnToolsVersion = 7.3.1; LastSwiftMigration = 0800; + ProvisioningStyle = Automatic; TestTargetID = 9B0BFFE41D0460A70040E62B; }; 9B3FFF431D09CD3B0019A709 = { CreatedOnToolsVersion = 7.3.1; + DevelopmentTeam = 2E8Q4BTFR2; LastSwiftMigration = 0800; + ProvisioningStyle = Automatic; }; }; }; @@ -496,7 +508,7 @@ projectDirPath = ""; projectRoot = ""; targets = ( - 9B0BFFE41D0460A70040E62B /* ShadowsocksX-NG */, + 9B0BFFE41D0460A70040E62B /* ShadowsocksX-NG-R */, 9B0BFFF31D0460A70040E62B /* ShadowsocksX-NGTests */, 9B3FFF431D09CD3B0019A709 /* proxy_conf_helper */, ); @@ -513,6 +525,7 @@ C6E28E951DA79705004F8330 /* HTTPPreferencesWindowController.xib in Resources */, 9BEEF0691D04D4D500FC52B3 /* install_ss_local.sh in Resources */, 9B0D55461D2CC85400A4A8E2 /* ProxyPreferencesController.xib in Resources */, + 086A31451F1AF797004C7285 /* SubscribePreferenceWindowController.xib in Resources */, 9B2491B41D0ACC3A003BBECC /* PreferencesWindowController.xib in Resources */, 9B3FFF291D08A1DF0019A709 /* user-rule.txt in Resources */, C6D429971DA75988002A5711 /* stop_privoxy.sh in Resources */, @@ -558,34 +571,22 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 0BD38C8FA95AA74C8D7003EC /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "[CP] Copy Pods Resources"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-proxy_conf_helper/Pods-proxy_conf_helper-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; 22E2FC257F00091B923B1A15 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", ); name = "[CP] Check Pods Manifest.lock"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-ShadowsocksX-NGTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; 3545247EFCD033C3FA63EA6C /* [CP] Check Pods Manifest.lock */ = { @@ -594,28 +595,16 @@ files = ( ); inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", ); name = "[CP] Check Pods Manifest.lock"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-proxy_conf_helper-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n"; - showEnvVarsInLog = 0; - }; - 3E819BD46B855EDB116A3C70 /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "[CP] Copy Pods Resources"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-ShadowsocksX-NG/Pods-ShadowsocksX-NG-resources.sh\"\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; 5E160625E3EC80E27DA7EF05 /* [CP] Embed Pods Frameworks */ = { @@ -624,58 +613,36 @@ files = ( ); inputPaths = ( + "${SRCROOT}/Pods/Target Support Files/Pods-ShadowsocksX-NG/Pods-ShadowsocksX-NG-frameworks.sh", + "${BUILT_PRODUCTS_DIR}/Alamofire/Alamofire.framework", + "${BUILT_PRODUCTS_DIR}/GCDWebServer/GCDWebServer.framework", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Alamofire.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GCDWebServer.framework", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-ShadowsocksX-NG/Pods-ShadowsocksX-NG-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - 8A094D4241AB0C72A177FDC3 /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "[CP] Embed Pods Frameworks"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-ShadowsocksX-NGTests/Pods-ShadowsocksX-NGTests-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; A3C8167BB5EB01FBDE2A08BC /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", ); name = "[CP] Check Pods Manifest.lock"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-ShadowsocksX-NG-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n"; - showEnvVarsInLog = 0; - }; - D8C2D6AF002916F4095E15E3 /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "[CP] Copy Pods Resources"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-ShadowsocksX-NGTests/Pods-ShadowsocksX-NGTests-resources.sh\"\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -697,6 +664,9 @@ 9BA04B261D24044D005AAD7F /* ProxyPreferencesController.swift in Sources */, 9B3FFF141D0705810019A709 /* Notifications.swift in Sources */, 9BEEF0701D04DDB100FC52B3 /* ServerProfileManager.swift in Sources */, + 08635C771EF750FA00F1D25E /* SubscribeManager.swift in Sources */, + 0877D6571EF1E82400126865 /* SubscribePreferenceWindowController.swift in Sources */, + 0877D6541EF1E65600126865 /* Subscribe.swift in Sources */, 9BEEF07B1D05631500FC52B3 /* AdvPreferencesWindowController.swift in Sources */, 083BF8391D82759600831C68 /* StatusItemView.swift in Sources */, 9BEEF06E1D04DCE400FC52B3 /* ServerProfile.swift in Sources */, @@ -732,7 +702,7 @@ /* Begin PBXTargetDependency section */ 9B0BFFF61D0460A70040E62B /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = 9B0BFFE41D0460A70040E62B /* ShadowsocksX-NG */; + target = 9B0BFFE41D0460A70040E62B /* ShadowsocksX-NG-R */; targetProxy = 9B0BFFF51D0460A70040E62B /* PBXContainerItemProxy */; }; 9B3FFF531D09E2B30019A709 /* PBXTargetDependency */ = { @@ -743,6 +713,15 @@ /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ + 086A31471F1AF797004C7285 /* SubscribePreferenceWindowController.xib */ = { + isa = PBXVariantGroup; + children = ( + 086A31461F1AF797004C7285 /* Base */, + 086A31491F1AF799004C7285 /* zh-Hans */, + ); + name = SubscribePreferenceWindowController.xib; + sourceTree = ""; + }; 9B0BFFEC1D0460A70040E62B /* MainMenu.xib */ = { isa = PBXVariantGroup; children = ( @@ -923,7 +902,7 @@ "$(PROJECT_DIR)", ); MACOSX_DEPLOYMENT_TARGET = 10.11; - PRODUCT_BUNDLE_IDENTIFIER = "com.qiuyuzhou.ShadowsocksX-NG"; + PRODUCT_BUNDLE_IDENTIFIER = "com.qiuyuzhou.ShadowsocksX-NG-R"; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "ShadowsocksX-NG/ShadowsocksX-NG-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -954,7 +933,7 @@ "$(PROJECT_DIR)", ); MACOSX_DEPLOYMENT_TARGET = 10.11; - PRODUCT_BUNDLE_IDENTIFIER = "com.qiuyuzhou.ShadowsocksX-NG"; + PRODUCT_BUNDLE_IDENTIFIER = "com.qiuyuzhou.ShadowsocksX-NG-R"; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "ShadowsocksX-NG/ShadowsocksX-NG-Bridging-Header.h"; SWIFT_VERSION = 3.0; @@ -966,11 +945,15 @@ baseConfigurationReference = 5B6203C1228FCD3D365814AC /* Pods-ShadowsocksX-NGTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_IDENTITY = "Mac Developer"; + CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; + DEVELOPMENT_TEAM = ""; INFOPLIST_FILE = "ShadowsocksX-NGTests/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "com.qiuyuzhou.ShadowsocksX-NGTests"; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_VERSION = 3.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ShadowsocksX-NG.app/Contents/MacOS/ShadowsocksX-NG"; }; @@ -981,11 +964,15 @@ baseConfigurationReference = 3AC7CD9886196A997D6FC78D /* Pods-ShadowsocksX-NGTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_IDENTITY = "Mac Developer"; + CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; + DEVELOPMENT_TEAM = ""; INFOPLIST_FILE = "ShadowsocksX-NGTests/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "com.qiuyuzhou.ShadowsocksX-NGTests"; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_VERSION = 3.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ShadowsocksX-NG.app/Contents/MacOS/ShadowsocksX-NG"; }; @@ -995,8 +982,11 @@ isa = XCBuildConfiguration; baseConfigurationReference = B4E6A97CA843F3943524B686 /* Pods-proxy_conf_helper.debug.xcconfig */; buildSettings = { - CODE_SIGN_IDENTITY = ""; + CODE_SIGN_IDENTITY = "Mac Developer"; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 2E8Q4BTFR2; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_VERSION = 3.0; }; name = Debug; @@ -1005,8 +995,11 @@ isa = XCBuildConfiguration; baseConfigurationReference = 297AF069022A197FD8E9D226 /* Pods-proxy_conf_helper.release.xcconfig */; buildSettings = { - CODE_SIGN_IDENTITY = ""; + CODE_SIGN_IDENTITY = "Mac Developer"; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 2E8Q4BTFR2; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_VERSION = 3.0; }; name = Release; @@ -1014,7 +1007,7 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 9B0B00081D0460A70040E62B /* Build configuration list for PBXNativeTarget "ShadowsocksX-NG" */ = { + 9B0B00081D0460A70040E62B /* Build configuration list for PBXNativeTarget "ShadowsocksX-NG-R" */ = { isa = XCConfigurationList; buildConfigurations = ( 9B0B00091D0460A70040E62B /* Debug */, diff --git a/ShadowsocksX-NG.xcodeproj/xcshareddata/xcschemes/ShadowsocksX-NG.xcscheme b/ShadowsocksX-NG.xcodeproj/xcshareddata/xcschemes/ShadowsocksX-NG.xcscheme index db485a06..1c8565bd 100644 --- a/ShadowsocksX-NG.xcodeproj/xcshareddata/xcschemes/ShadowsocksX-NG.xcscheme +++ b/ShadowsocksX-NG.xcodeproj/xcshareddata/xcschemes/ShadowsocksX-NG.xcscheme @@ -1,6 +1,6 @@ @@ -56,7 +56,7 @@ buildForAnalyzing = "YES"> @@ -70,7 +70,7 @@ buildForAnalyzing = "YES"> @@ -85,8 +85,8 @@ @@ -113,8 +113,8 @@ @@ -136,8 +136,8 @@ @@ -155,8 +155,8 @@ diff --git a/ShadowsocksX-NG.xcodeproj/xcshareddata/xcschemes/ShadowsocksX-NGTests.xcscheme b/ShadowsocksX-NG.xcodeproj/xcshareddata/xcschemes/ShadowsocksX-NGTests.xcscheme index 3c53f56f..f8e058d2 100644 --- a/ShadowsocksX-NG.xcodeproj/xcshareddata/xcschemes/ShadowsocksX-NGTests.xcscheme +++ b/ShadowsocksX-NG.xcodeproj/xcshareddata/xcschemes/ShadowsocksX-NGTests.xcscheme @@ -1,6 +1,6 @@ + + + + IDEDidComputeMac32BitWarning + + + diff --git a/ShadowsocksX-NG/AppDelegate.swift b/ShadowsocksX-NG/AppDelegate.swift index df7318c9..b8daf1d3 100644 --- a/ShadowsocksX-NG/AppDelegate.swift +++ b/ShadowsocksX-NG/AppDelegate.swift @@ -19,6 +19,7 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDele var proxyPreferencesWinCtrl: ProxyPreferencesController! var editUserRulesWinCtrl: UserRulesController! var httpPreferencesWinCtrl : HTTPPreferencesWindowController! + var subscribePreferenceWinCtrl: SubscribePreferenceWindowController! var launchAtLoginController: LaunchAtLoginController = LaunchAtLoginController() @@ -51,11 +52,15 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDele @IBOutlet weak var ShowNetworkSpeedItem: NSMenuItem! @IBOutlet weak var checkUpdateMenuItem: NSMenuItem! @IBOutlet weak var checkUpdateAtLaunchMenuItem: NSMenuItem! + @IBOutlet var updateSubscribeAtLaunchMenuItem: NSMenuItem! + @IBOutlet var manualUpdateSubscribeMenuItem: NSMenuItem! + @IBOutlet var editSubscribeMenuItem: NSMenuItem! // MARK: Variables var statusItemView:StatusItemView! var statusItem: NSStatusItem? var speedMonitor:NetWorkMonitor? + var globalSubscribeFeed: Subscribe! // MARK: Application function @@ -80,16 +85,18 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDele "LocalSocks5.EnableUDPRelay": NSNumber(value: false as Bool), "LocalSocks5.EnableVerboseMode": NSNumber(value: false as Bool), "GFWListURL": "https://raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt", - "ACLWhiteListURL": "https://raw.githubusercontent.com/shadowsocksr/shadowsocksr-libev/master/acl/chn.acl", - "ACLAutoListURL": "https://raw.githubusercontent.com/shadowsocksr/shadowsocksr-libev/master/acl/gfwlist.acl", - "ACLProxyBackCHNURL":"https://raw.githubusercontent.com/shadowsocksr/ShadowsocksX-NG/develop/ShadowsocksX-NG/backchn.acl", + "ACLWhiteListURL": "https://raw.githubusercontent.com/shadowsocks/shadowsocks-libev/master/acl/chn.acl", + "ACLAutoListURL": "https://raw.githubusercontent.com/shadowsocks/shadowsocks-libev/master/acl/gfwlist.acl", + "ACLProxyBackCHNURL":"https://raw.githubusercontent.com/shadowsocks/shadowsocks-libev/master/ShadowsocksX-NG/server_block_chn.acl", "AutoConfigureNetworkServices": NSNumber(value: true as Bool), "LocalHTTP.ListenAddress": "127.0.0.1", "LocalHTTP.ListenPort": NSNumber(value: 1087 as UInt16), "LocalHTTPOn": true, "LocalHTTP.FollowGlobal": true, "AutoCheckUpdate": false, - "ACLFileName": "chn.acl" + "ACLFileName": "chn.acl", + "Subscribes": [], + "AutoUpdateSubscribe":false, ]) setUpMenu(defaults.bool(forKey: "enable_showSpeed")) @@ -111,7 +118,7 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDele , using: { (note) in let profileMgr = ServerProfileManager.instance - if profileMgr.activeProfileId == nil && + if profileMgr.getActiveProfileId() == "" && profileMgr.profiles.count > 0{ if profileMgr.profiles[0].isValid(){ profileMgr.setActiveProfiledId(profileMgr.profiles[0].uuid) @@ -192,14 +199,24 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDele ProxyConfHelper.install() applyConfig() - SyncSSLocal() +// SyncSSLocal() - if defaults.bool(forKey: "ConnectAtLaunch") { + if defaults.bool(forKey: "ConnectAtLaunch") && ServerProfileManager.instance.getActiveProfileId() != "" { + defaults.set(false, forKey: "ShadowsocksOn") toggleRunning(toggleRunningMenuItem) } - // Version Check! - if defaults.bool(forKey: "AutoCheckUpdate"){ - checkForUpdate(mustShowAlert: false) + + DispatchQueue.global().async { + // Version Check! + if defaults.bool(forKey: "AutoCheckUpdate") { + self.checkForUpdate(mustShowAlert: false) + } + if defaults.bool(forKey: "AutoUpdateSubscribe") { + SubscribeManager.instance.updateAllServerFromSubscribe() + } + DispatchQueue.main.async { + + } } } @@ -214,13 +231,6 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDele } func applyConfig() { - let profileMgr = ServerProfileManager.instance - if profileMgr.profiles.count == 0{ - let notice = NSUserNotification() - notice.title = "还没有服务器设定!" - notice.subtitle = "去设置里面填一下吧,填完记得选择呦~" - NSUserNotificationCenter.default.deliver(notice) - } let defaults = UserDefaults.standard let isOn = defaults.bool(forKey: "ShadowsocksOn") let mode = defaults.string(forKey: "ShadowsocksRunningMode") @@ -253,12 +263,10 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDele @IBAction func toggleRunning(_ sender: NSMenuItem) { let defaults = UserDefaults.standard - var isOn = defaults.bool(forKey: "ShadowsocksOn") - isOn = !isOn - defaults.set(isOn, forKey: "ShadowsocksOn") + defaults.set(!defaults.bool(forKey: "ShadowsocksOn"), forKey: "ShadowsocksOn") updateMainMenu() - + SyncSSLocal() applyConfig() } @@ -282,6 +290,18 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDele ctrl.window?.makeKeyAndOrderFront(self) } + @IBAction func editSubscribeFeed(_ sender: NSMenuItem) { + if subscribePreferenceWinCtrl != nil { + subscribePreferenceWinCtrl.close() + } + let ctrl = SubscribePreferenceWindowController(windowNibName: "SubscribePreferenceWindowController") + subscribePreferenceWinCtrl = ctrl + + ctrl.showWindow(self) + NSApp.activate(ignoringOtherApps: true) + ctrl.window?.makeKeyAndOrderFront(self) + } + @IBAction func toggleLaunghAtLogin(_ sender: NSMenuItem) { launchAtLoginController.launchAtLogin = !launchAtLoginController.launchAtLogin; updateLaunchAtLoginMenu() @@ -345,6 +365,19 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDele ServerProfileManager.instance.exportConfigFile() } + @IBAction func updateSubscribe(_ sender: NSMenuItem) { + SubscribeManager.instance.updateAllServerFromSubscribe() + } + + @IBAction func updateSubscribeAtLaunch(_ sender: NSMenuItem) { + let defaults = UserDefaults.standard + defaults.set(!defaults.bool(forKey: "AutoUpdateSubscribe"), forKey: "AutoUpdateSubscribe") + updateSubscribeAtLaunchMenuItem.state = defaults.bool(forKey: "AutoUpdateSubscribe") ? 1 : 0 + } + + + // MARK: Proxy submenu function + @IBAction func selectPACMode(_ sender: NSMenuItem) { let defaults = UserDefaults.standard defaults.setValue("auto", forKey: "ShadowsocksRunningMode") @@ -446,7 +479,7 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDele let index = sender.tag let spMgr = ServerProfileManager.instance let newProfile = spMgr.profiles[index] - if newProfile.uuid != spMgr.activeProfileId { + if newProfile.uuid != spMgr.getActiveProfileId() { spMgr.setActiveProfiledId(newProfile.uuid) updateServersMenu() SyncSSLocal() @@ -508,7 +541,7 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDele let mgr = ServerProfileManager.instance for p in mgr.profiles { - if mgr.activeProfileId == p.uuid { + if mgr.getActiveProfileId() == p.uuid { if !p.remark.isEmpty { serverMenuText = p.remark } else { @@ -620,6 +653,9 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDele let showBunch = showBunchJsonExampleFileItem let importBuntch = importBunchJsonFileItem let exportAllServer = exportAllServerProfileItem + let updateSubscribeItem = manualUpdateSubscribeMenuItem + let autoUpdateSubscribeItem = updateSubscribeAtLaunchMenuItem + let editSubscribeItem = editSubscribeMenuItem // let pingItem = pingserverMenuItem var i = 0 @@ -634,7 +670,7 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDele item.title += " - failed" } } - if mgr.activeProfileId == p.uuid { + if mgr.getActiveProfileId() == p.uuid { item.state = 1 } if !p.isValid() { @@ -650,7 +686,7 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDele groupSubmenuItem.title = p.ssrGroup serversMenuItem.submenu?.addItem(groupSubmenuItem) serversMenuItem.submenu?.setSubmenu(groupSubmenu, for: groupSubmenuItem) - if mgr.activeProfileId == p.uuid { + if mgr.getActiveProfileId() == p.uuid { item.state = 1 groupSubmenuItem.state = 1 } @@ -659,7 +695,7 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDele continue } else{ - if mgr.activeProfileId == p.uuid { + if mgr.getActiveProfileId() == p.uuid { item.state = 1 serversMenuItem.submenu?.item(withTitle: p.ssrGroup)?.state = 1 } @@ -675,6 +711,10 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDele if !mgr.profiles.isEmpty { serversMenuItem.submenu?.addItem(NSMenuItem.separator()) } + serversMenuItem.submenu?.addItem(editSubscribeItem!) + serversMenuItem.submenu?.addItem(autoUpdateSubscribeItem!) + autoUpdateSubscribeItem?.state = UserDefaults.standard.bool(forKey: "AutoUpdateSubscribe") ? 1 : 0 + serversMenuItem.submenu?.addItem(updateSubscribeItem!) serversMenuItem.submenu?.addItem(showQRItem!) serversMenuItem.submenu?.addItem(scanQRItem!) serversMenuItem.submenu?.addItem(showBunch!) @@ -719,7 +759,7 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDele let alertResult = versionChecker.showAlertView(Title: newVersion["Title"] as! String, SubTitle: newVersion["SubTitle"] as! String, ConfirmBtn: newVersion["ConfirmBtn"] as! String, CancelBtn: newVersion["CancelBtn"] as! String) print(alertResult) if (newVersion["newVersion"] as! Bool && alertResult == 1000){ - NSWorkspace.shared().open(URL(string: "https://github.com/shadowsocksr/ShadowsocksX-NG/releases")!) + NSWorkspace.shared().open(URL(string: "https://github.com/qinyuhang/ShadowsocksX-NG-R/releases")!) } } } diff --git a/ShadowsocksX-NG/Base.lproj/MainMenu.xib b/ShadowsocksX-NG/Base.lproj/MainMenu.xib index fef73adf..8151ca8f 100644 --- a/ShadowsocksX-NG/Base.lproj/MainMenu.xib +++ b/ShadowsocksX-NG/Base.lproj/MainMenu.xib @@ -1,8 +1,8 @@ - + - + @@ -12,7 +12,7 @@ - + @@ -23,11 +23,13 @@ + + @@ -38,6 +40,7 @@ + @@ -47,32 +50,31 @@ - - + - + - + - + - + @@ -134,6 +136,24 @@ + + + + + + + + + + + + + + + + + + diff --git a/ShadowsocksX-NG/Base.lproj/PreferencesWindowController.xib b/ShadowsocksX-NG/Base.lproj/PreferencesWindowController.xib index ef993a63..877b73f9 100644 --- a/ShadowsocksX-NG/Base.lproj/PreferencesWindowController.xib +++ b/ShadowsocksX-NG/Base.lproj/PreferencesWindowController.xib @@ -375,7 +375,7 @@ DQ - + diff --git a/ShadowsocksX-NG/Base.lproj/SubscribePreferenceWindowController.xib b/ShadowsocksX-NG/Base.lproj/SubscribePreferenceWindowController.xib new file mode 100644 index 00000000..8db75daa --- /dev/null +++ b/ShadowsocksX-NG/Base.lproj/SubscribePreferenceWindowController.xib @@ -0,0 +1,240 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ShadowsocksX-NG/Info.plist b/ShadowsocksX-NG/Info.plist index 4742046f..fc4f7cdf 100644 --- a/ShadowsocksX-NG/Info.plist +++ b/ShadowsocksX-NG/Info.plist @@ -17,7 +17,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.4.1-R8 + 1.4.4-R8 CFBundleSignature ???? CFBundleURLTypes @@ -48,7 +48,7 @@ CFBundleVersion - 4 + 1 LSApplicationCategoryType public.app-category.utilities LSMinimumSystemVersion diff --git a/ShadowsocksX-NG/LaunchAgentUtils.swift b/ShadowsocksX-NG/LaunchAgentUtils.swift index 901e81fa..51435c5b 100644 --- a/ShadowsocksX-NG/LaunchAgentUtils.swift +++ b/ShadowsocksX-NG/LaunchAgentUtils.swift @@ -8,12 +8,12 @@ import Foundation -let SS_LOCAL_VERSION = "2.5.6.9.static" +let SS_LOCAL_VERSION = "2.5.6.12.static" let PRIVOXY_VERSION = "3.0.26.static" -let APP_SUPPORT_DIR = "/Library/Application Support/ShadowsocksX-NG/" +let APP_SUPPORT_DIR = "/Library/Application Support/ShadowsocksX-NG-R/" let LAUNCH_AGENT_DIR = "/Library/LaunchAgents/" -let LAUNCH_AGENT_CONF_SSLOCAL_NAME = "com.qiuyuzhou.shadowsocksX-NG.local.plist" -let LAUNCH_AGENT_CONF_PRIVOXY_NAME = "com.qiuyuzhou.shadowsocksX-NG.http.plist" +let LAUNCH_AGENT_CONF_SSLOCAL_NAME = "com.qiuyuzhou.shadowsocksX-NG-R.local.plist" +let LAUNCH_AGENT_CONF_PRIVOXY_NAME = "com.qiuyuzhou.shadowsocksX-NG-R.http.plist" func getFileSHA1Sum(_ filepath: String) -> String { @@ -64,7 +64,7 @@ func generateSSLocalLauchAgentPlist() -> Bool { // For a complete listing of the keys, see the launchd.plist manual page. let dict: NSMutableDictionary = [ - "Label": "com.qiuyuzhou.shadowsocksX-NG.local", + "Label": "com.qiuyuzhou.shadowsocksX-NG-R.local", "WorkingDirectory": NSHomeDirectory() + APP_SUPPORT_DIR, "KeepAlive": true, "StandardOutPath": logFilePath, @@ -168,7 +168,7 @@ func SyncSSLocal() { var changed: Bool = false changed = changed || generateSSLocalLauchAgentPlist() let mgr = ServerProfileManager.instance - if mgr.activeProfileId != nil { + if mgr.getActiveProfileId() != "" { if mgr.getActiveProfile() != nil { changed = changed || writeSSLocalConfFile((mgr.getActiveProfile()?.toJsonConfig())!) } @@ -205,7 +205,7 @@ func generatePrivoxyLauchAgentPlist() -> Bool { // For a complete listing of the keys, see the launchd.plist manual page. let dict: NSMutableDictionary = [ - "Label": "com.qiuyuzhou.shadowsocksX-NG.http", + "Label": "com.qiuyuzhou.shadowsocksX-NG-R.http", "WorkingDirectory": NSHomeDirectory() + APP_SUPPORT_DIR, "KeepAlive": true, "StandardOutPath": logFilePath, @@ -315,7 +315,7 @@ func SyncPrivoxy() { var changed: Bool = false changed = changed || generatePrivoxyLauchAgentPlist() let mgr = ServerProfileManager.instance - if mgr.activeProfileId != nil { + if mgr.getActiveProfileId() != "" { changed = changed || writePrivoxyConfFile() let on = UserDefaults.standard.bool(forKey: "LocalHTTPOn") diff --git a/ShadowsocksX-NG/NetWorkMonitor.swift b/ShadowsocksX-NG/NetWorkMonitor.swift index 79c7a9f0..490ff17c 100755 --- a/ShadowsocksX-NG/NetWorkMonitor.swift +++ b/ShadowsocksX-NG/NetWorkMonitor.swift @@ -117,7 +117,7 @@ open class NetWorkMonitor: NSObject { let pattern = "en\\w+\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)" do { let regex = try NSRegularExpression(pattern: pattern, options: NSRegularExpression.Options.caseInsensitive) - let results = regex.matches(in: string, options: NSRegularExpression.MatchingOptions(rawValue: 0), range: NSMakeRange(0, string.characters.count)) + let results = regex.matches(in: string, options: NSRegularExpression.MatchingOptions(rawValue: 0), range: NSMakeRange(0, string.count)) var upRate: Float = 0.00 var downRate: Float = 0.00 for result in results { diff --git a/ShadowsocksX-NG/PingClient.swift b/ShadowsocksX-NG/PingClient.swift index c8fe76cd..d3b0ba59 100644 --- a/ShadowsocksX-NG/PingClient.swift +++ b/ShadowsocksX-NG/PingClient.swift @@ -116,7 +116,7 @@ class PingServers:NSObject{ return nil } res.removeSubrange(res.range(of: "round-trip min/avg/max/stddev = ")!) - res = String(res.characters.dropLast(3)) + res = String(res.dropLast(3)) res = res.components(separatedBy: "/")[1] let latency = Double(res) return latency diff --git a/ShadowsocksX-NG/PreferencesWindowController.swift b/ShadowsocksX-NG/PreferencesWindowController.swift index 502609ee..61199d59 100644 --- a/ShadowsocksX-NG/PreferencesWindowController.swift +++ b/ShadowsocksX-NG/PreferencesWindowController.swift @@ -81,6 +81,7 @@ class PreferencesWindowController: NSWindowController "auth_aes128_sha1", "auth_aes128_md5", "auth_chain_a", + "auth_chain_b", ]) ObfsTextField.addItems(withObjectValues: [ "plain", @@ -133,6 +134,10 @@ class PreferencesWindowController: NSWindowController self.profilesTableView.scrollRowToVisible(index-1) self.profilesTableView.selectRowIndexes(IndexSet(integer: index-1), byExtendingSelection: false) updateProfileBoxVisible() + if profileMgr.profiles.count == 0 { + defaults.set(true, forKey: "ShadowsocksOn") + (NSApplication.shared().delegate as! AppDelegate).toggleRunning((NSApplication.shared().delegate as! AppDelegate).toggleRunningMenuItem) + } } @IBAction func ok(_ sender: NSButton) { @@ -260,7 +265,7 @@ class PreferencesWindowController: NSWindowController func getDataAtRow(_ index:Int) -> (String, Bool) { let profile = profileMgr.profiles[index] - let isActive = (profileMgr.activeProfileId == profile.uuid) + let isActive = (profileMgr.getActiveProfileId() == profile.uuid) if !profile.remark.isEmpty { return (profile.remark, isActive) } else { diff --git a/ShadowsocksX-NG/ProxyConfHelper.m b/ShadowsocksX-NG/ProxyConfHelper.m index d67613ae..eb53cc9f 100644 --- a/ShadowsocksX-NG/ProxyConfHelper.m +++ b/ShadowsocksX-NG/ProxyConfHelper.m @@ -9,7 +9,7 @@ #import "ProxyConfHelper.h" #import "proxy_conf_helper_version.h" -#define kShadowsocksHelper @"/Library/Application Support/ShadowsocksX-NG/proxy_conf_helper" +#define kShadowsocksHelper @"/Library/Application Support/ShadowsocksX-NG-R/proxy_conf_helper" @implementation ProxyConfHelper diff --git a/ShadowsocksX-NG/ProxyPreferencesController.swift b/ShadowsocksX-NG/ProxyPreferencesController.swift index 5a6e3fc0..168b0616 100644 --- a/ShadowsocksX-NG/ProxyPreferencesController.swift +++ b/ShadowsocksX-NG/ProxyPreferencesController.swift @@ -32,7 +32,7 @@ class ProxyPreferencesController: NSWindowController, NSTableViewDataSource, NST selectedNetworkServices = NSMutableSet() } - networkServices = ProxyConfTool.networkServicesList() as NSArray! + networkServices = ProxyConfTool.networkServicesList() as NSArray tableView.reloadData() } diff --git a/ShadowsocksX-NG/SWBQRCodeWindowController.m b/ShadowsocksX-NG/SWBQRCodeWindowController.m index a7e97e9e..59b9fde3 100644 --- a/ShadowsocksX-NG/SWBQRCodeWindowController.m +++ b/ShadowsocksX-NG/SWBQRCodeWindowController.m @@ -50,9 +50,9 @@ - (CGImageRef)createQRImageForString:(NSString *)string size:(CGSize)size { CGContextRef bitmapRef = CGBitmapContextCreate(nil, width, height, 8, 0, cs, (CGBitmapInfo)kCGImageAlphaNone); #if TARGET_OS_IPHONE - CIContext *context = [CIContext contextWithOptions:nil]; + CIContext *context = [CIContext contextWithOptions: @{kCIContextUseSoftwareRenderer: true}]; #else - CIContext *context = [CIContext contextWithCGContext:bitmapRef options:nil]; + CIContext *context = [CIContext contextWithCGContext:bitmapRef options:@{kCIContextUseSoftwareRenderer: @true}]; #endif CGImageRef bitmapImage = [context createCGImage:image fromRect:extent]; diff --git a/ShadowsocksX-NG/ServerProfile.swift b/ShadowsocksX-NG/ServerProfile.swift index d88cea6a..5e558be1 100644 --- a/ShadowsocksX-NG/ServerProfile.swift +++ b/ShadowsocksX-NG/ServerProfile.swift @@ -40,20 +40,20 @@ class ServerProfile: NSObject { (profile: ServerProfile) in profile.serverHost = data["ServerHost"] as! String profile.serverPort = (data["ServerPort"] as! NSNumber).uint16Value - profile.method = data["Method"] as! String + profile.method = (data["Method"] as! String).lowercased() profile.password = data["Password"] as! String if let remark = data["Remark"] { profile.remark = remark as! String } if let ssrObfs = data["ssrObfs"] { - profile.ssrObfs = ssrObfs as! String + profile.ssrObfs = (ssrObfs as! String).lowercased() } if let ssrObfsParam = data["ssrObfsParam"] { profile.ssrObfsParam = ssrObfsParam as! String } if let ssrProtocol = data["ssrProtocol"] { - profile.ssrProtocol = ssrProtocol as! String + profile.ssrProtocol = (ssrProtocol as! String).lowercased() } if let ssrProtocolParam = data["ssrProtocolParam"]{ profile.ssrProtocolParam = ssrProtocolParam as! String @@ -131,7 +131,7 @@ class ServerProfile: NSObject { } func validateDomainName(_ value: String) -> Bool { - let validHostnameRegex = "^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\\-]*[a-zA-Z0-9])\\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\\-]*[A-Za-z0-9])$" + let validHostnameRegex = "^(([a-zA-Z0-9_]|[a-zA-Z0-9_][a-zA-Z0-9\\-_]*[a-zA-Z0-9_])\\.)*([A-Za-z0-9_]|[A-Za-z0-9_][A-Za-z0-9\\-_]*[A-Za-z0-9_])$" if (value.range(of: validHostnameRegex, options: .regularExpression) != nil) { return true diff --git a/ShadowsocksX-NG/ServerProfileManager.swift b/ShadowsocksX-NG/ServerProfileManager.swift index 9293dfc9..cbd13f8e 100644 --- a/ShadowsocksX-NG/ServerProfileManager.swift +++ b/ShadowsocksX-NG/ServerProfileManager.swift @@ -2,7 +2,7 @@ // ServerProfileManager.swift // ShadowsocksX-NG // -// Created by 邱宇舟 on 16/6/6. Modified by 秦宇航 16/9/12 +// Created by 邱宇舟 on 16/6/6. Modified by 秦宇航 17/7/22 // Copyright © 2016年 qiuyuzhou. All rights reserved. // @@ -19,13 +19,27 @@ class ServerProfileManager: NSObject { profiles = [ServerProfile]() let defaults = UserDefaults.standard + activeProfileId = defaults.string(forKey: "ActiveServerProfileId") + var didFindActiveProfileId = false if let _profiles = defaults.array(forKey: "ServerProfiles") { for _profile in _profiles { let profile = ServerProfile.fromDictionary(_profile as! [String : AnyObject]) profiles.append(profile) + if profile.uuid == activeProfileId { + didFindActiveProfileId = true + } } } - activeProfileId = defaults.string(forKey: "ActiveServerProfileId") + if profiles.count == 0{ + let notice = NSUserNotification() + notice.title = "还没有服务器设定!" + notice.subtitle = "去设置里面填一下吧,填完记得选择呦~" + NSUserNotificationCenter.default.deliver(notice) + return + } + if !didFindActiveProfileId { + activeProfileId = profiles[0].uuid + } } func setActiveProfiledId(_ id: String) { @@ -34,6 +48,16 @@ class ServerProfileManager: NSObject { defaults.set(id, forKey: "ActiveServerProfileId") } + func getActiveProfileId() -> String { + for p in profiles { + if p.uuid == activeProfileId { + return activeProfileId! + } + } + if profiles.count == 0 {return ""} + return profiles[0].uuid + } + func save() { let defaults = UserDefaults.standard var _profiles = [AnyObject]() @@ -46,11 +70,11 @@ class ServerProfileManager: NSObject { defaults.set(_profiles, forKey: "ServerProfiles") if getActiveProfile() == nil { - activeProfileId = nil + activeProfileId = "" } - if activeProfileId != nil { - defaults.set(activeProfileId, forKey: "ActiveServerProfileId") + if getActiveProfileId() != "" { + defaults.set(getActiveProfileId(), forKey: "ActiveServerProfileId") let _ = writeSSLocalConfFile((getActiveProfile()?.toJsonConfig())!) } else { defaults.removeObject(forKey: "ActiveServerProfileId") @@ -59,18 +83,42 @@ class ServerProfileManager: NSObject { } func getActiveProfile() -> ServerProfile? { - if let id = activeProfileId { - for p in profiles { - if p.uuid == id { - return p - } + if getActiveProfileId() == "" { return nil } + for p in profiles { + if p.uuid == getActiveProfileId() { + return p + } + } + return nil + } + + func isExisted(profile: ServerProfile) -> (Bool, Int){ + for (index, value) in profiles.enumerated() { + let ret = (value.serverHost == profile.serverHost && value.serverPort == profile.serverPort) + if ret { + return (ret, index) } - return nil - } else { - return nil } + return (false, -1) } + func isDuplicated(profile: ServerProfile) -> (Bool, Int){ + for (index, value) in profiles.enumerated() { + let ret = value.serverHost == profile.serverHost + && value.password == profile.password + && value.serverPort == profile.serverPort + && value.ssrProtocol == profile.ssrProtocol + && value.ssrObfs == profile.ssrObfs + && value.ssrObfsParam == profile.ssrObfsParam + && value.ssrProtocolParam == profile.ssrProtocolParam + && value.remark == profile.remark + if ret { + return (ret, index) + } + } + return (false, -1) + } + func importConfigFile() { let openPanel = NSOpenPanel() openPanel.title = "Choose Config Json File".localized diff --git a/ShadowsocksX-NG/Subscribe.swift b/ShadowsocksX-NG/Subscribe.swift new file mode 100644 index 00000000..4df98ece --- /dev/null +++ b/ShadowsocksX-NG/Subscribe.swift @@ -0,0 +1,199 @@ +// +// Subscribe.swift +// ShadowsocksX-NG +// +// Created by 秦宇航 on 2017/6/15. +// Copyright © 2017年 qiuyuzhou. All rights reserved. +// + +import Foundation +import Alamofire + +class Subscribe: NSObject{ + + var subscribeFeed = "" + var isActive = true + var maxCount = 0 // -1 is not limited + var groupName = "" + var token = "" + var cache = "" + + var profileMgr: ServerProfileManager! + + init(initUrlString:String, initGroupName: String, initToken: String, initMaxCount: Int){ + super.init() + subscribeFeed = initUrlString + + token = initToken + + setMaxCount(initMaxCount: initMaxCount) + setGroupName(newGroupName: initGroupName) + profileMgr = ServerProfileManager.instance + } + func getFeed() -> String{ + return subscribeFeed + } + func setFeed(newFeed: String){ + subscribeFeed = newFeed + } + func diactivateSubscribe(){ + isActive = false + } + func activateSubscribe(){ + isActive = true + } + func setGroupName(newGroupName: String) { + func getGroupNameFromRes(resString: String) { + let decodeRes = decode64(resString)! + let ssrregexp = "ssr://([A-Za-z0-9_-]+)" + let urls = splitor(url: decodeRes, regexp: ssrregexp) + let profile = ServerProfile.fromDictionary(ParseAppURLSchemes(URL(string: urls[0])) as [String : AnyObject]) + self.groupName = profile.ssrGroup + } + if newGroupName != "" { return groupName = newGroupName } + if self.cache != "" { return getGroupNameFromRes(resString: cache) } + sendRequest(url: self.subscribeFeed, options: "", callback: { resString in + if resString == "" { return self.groupName = "New Subscribe" } + getGroupNameFromRes(resString: resString) + self.cache = resString + }) + } + func getGroupName() -> String { + return groupName + } + func getMaxCount() -> Int { + return maxCount + } + static func fromDictionary(_ data:[String:AnyObject]) -> Subscribe { + var feed:String = "" + var group:String = "" + var token:String = "" + var maxCount:Int = -1 + for (key, value) in data { + switch key { + case "feed": + feed = value as! String + case "group": + group = value as! String + case "token": + token = value as! String + case "maxCount": + maxCount = value as! Int + default: + print("") + } + } + return Subscribe.init(initUrlString: feed, initGroupName: group, initToken: token, initMaxCount: maxCount) + } + static func toDictionary(_ data: Subscribe) -> [String: AnyObject] { + var ret : [String: AnyObject] = [:] + ret["feed"] = data.subscribeFeed as AnyObject + ret["group"] = data.groupName as AnyObject + ret["token"] = data.token as AnyObject + ret["maxCount"] = data.maxCount as AnyObject + return ret + } + fileprivate func sendRequest(url: String, options: Any, callback: @escaping (String) -> Void) { + let headers: HTTPHeaders = [ + // "Authorization": "Basic U2hhZG93c29ja1gtTkctUg==", + // "Accept": "application/json", + "token": self.token, + "User-Agent": "ShadowsocksX-NG-R " + (getLocalInfo()["CFBundleShortVersionString"] as! String) + " Version " + (getLocalInfo()["CFBundleVersion"] as! String) + ] + + Alamofire.request(url, headers: headers) + .responseString{ + response in + if response.result.isSuccess { + callback(response.result.value!) + } + else{ + callback("") + self.pushNotification(title: "请求失败", subtitle: "", info: "发送到\(url)的请求失败,请检查您的网络") + } + } + } + func setMaxCount(initMaxCount:Int) { + func getMaxFromRes(resString: String) { + let maxCountReg = "MAX=[0-9]+" + let decodeRes = decode64(resString)! + let range = decodeRes.range(of: maxCountReg, options: .regularExpression) + if range != nil { + let result = decodeRes.substring(with:range!) + self.maxCount = Int(result.replacingOccurrences(of: "MAX=", with: ""))! + } + else{ + self.maxCount = -1 + } + } + if initMaxCount != 0 { return self.maxCount = initMaxCount } + if cache != "" { return getMaxFromRes(resString: cache) } + sendRequest(url: self.subscribeFeed, options: "", callback: { resString in + if resString == "" { return }// Also should hold if token is wrong feedback + getMaxFromRes(resString: resString) + self.cache = resString + }) + } + func updateServerFromFeed(){ + func updateServerHandler(resString: String) { + let decodeRes = decode64(resString)! + let ssrregexp = "ssr://([A-Za-z0-9_-]+)" + let urls = splitor(url: decodeRes, regexp: ssrregexp) + // hold if user fill a maxCount larger then server return + // Should push a notification about it and correct the user filled maxCOunt? + let maxN = (self.maxCount > urls.count) ? urls.count : (self.maxCount == -1) ? urls.count: self.maxCount + // TODO change the loop into random pick + for index in 0.. Bool{ + // is the right format + // should be http or https reg + // but we should not support http only feed + // TODO refine the regular expression + let feedRegExp = "http[s]?://[A-Za-z0-9-_/.=?]*" + return subscribeFeed.range(of:feedRegExp, options: .regularExpression) != nil + } + fileprivate func pushNotification(title: String, subtitle: String, info: String){ + let userNote = NSUserNotification() + userNote.title = title + userNote.subtitle = subtitle + userNote.informativeText = info + userNote.soundName = NSUserNotificationDefaultSoundName + + NSUserNotificationCenter.default + .deliver(userNote); + } + class func isSame(source: Subscribe, target: Subscribe) -> Bool { + return source.subscribeFeed == target.subscribeFeed && source.token == target.token && source.maxCount == target.maxCount + } + func isExist(_ target: Subscribe) -> Bool { + return self.subscribeFeed == target.subscribeFeed + } +} diff --git a/ShadowsocksX-NG/SubscribeManager.swift b/ShadowsocksX-NG/SubscribeManager.swift new file mode 100644 index 00000000..6bd26ff6 --- /dev/null +++ b/ShadowsocksX-NG/SubscribeManager.swift @@ -0,0 +1,66 @@ +// +// SubscribeManager.swift +// ShadowsocksX-NG +// +// Created by 秦宇航 on 2017/6/19. +// Copyright © 2017年 qiuyuzhou. All rights reserved. +// + +import Foundation + +class SubscribeManager:NSObject{ + static let instance:SubscribeManager = SubscribeManager() + + var subscribes:[Subscribe] + var subscribesDefault : [[String: AnyObject]] + let defaults = UserDefaults.standard + + fileprivate override init() { + subscribes = [] + subscribesDefault = [[:]] + if let subscribesDefault = defaults.array(forKey: "Subscribes") { + for value in subscribesDefault{ + subscribes.append(Subscribe.fromDictionary(value as! [String : AnyObject])) + } + } + } + func addSubscribe(oneSubscribe: Subscribe) -> Bool { + for (index, value) in subscribes.enumerated() { + if Subscribe.isSame(source: oneSubscribe, target: value) { + return true + } + if value.isExist(oneSubscribe) { + subscribes.replaceSubrange(Range(index.. Bool { + subscribes.remove(at: atIndex) + return true + } + func save() { + defaults.set(subscribesToDefaults(data: subscribes), forKey: "Subscribes") + } + fileprivate func subscribesToDefaults(data: [Subscribe]) -> [[String: AnyObject]]{ + var ret : [[String: AnyObject]] = [] + for value in data { + ret.append(Subscribe.toDictionary(value)) + } + return ret + } + fileprivate func DefaultsToSubscribes(data:[[String: AnyObject]]) -> [Subscribe] { + var ret : [Subscribe] = [] + for value in data{ + ret.append(Subscribe.fromDictionary(value)) + } + return ret + } + func updateAllServerFromSubscribe(){ + subscribes.forEach{ value in + value.updateServerFromFeed() + } + } +} diff --git a/ShadowsocksX-NG/SubscribePreferenceWindowController.swift b/ShadowsocksX-NG/SubscribePreferenceWindowController.swift new file mode 100644 index 00000000..c0398df9 --- /dev/null +++ b/ShadowsocksX-NG/SubscribePreferenceWindowController.swift @@ -0,0 +1,280 @@ +// +// SubscribePreferenceWindowController.swift +// ShadowsocksX-NG +// +// Created by 秦宇航 on 2017/6/15. +// Copyright © 2017年 qiuyuzhou. All rights reserved. +// + +import Cocoa + +class SubscribePreferenceWindowController: NSWindowController + , NSTableViewDataSource, NSTableViewDelegate { + + @IBOutlet weak var FeedLabel: NSTextField! + @IBOutlet weak var OKButton: NSButton! + + @IBOutlet weak var FeedTextField: NSTextField! + @IBOutlet weak var TokenTextField: NSTextField! + @IBOutlet weak var GroupTextField: NSTextField! + @IBOutlet weak var MaxCountTextField: NSTextField! + @IBOutlet weak var SubscribeTableView: NSTableView! + + @IBOutlet weak var AddSubscribeBtn: NSButton! + @IBOutlet weak var DeleteSubscribeBtn: NSButton! + + var sbMgr: SubscribeManager! + var defaults: UserDefaults! + let tableViewDragType: String = "subscribe.host" + var editingSubscribe: Subscribe! + + override func windowDidLoad() { + super.windowDidLoad() + + sbMgr = SubscribeManager.instance + defaults = UserDefaults.standard + SubscribeTableView.reloadData() + updateSubscribeBoxVisible() + } + + override func awakeFromNib() { + SubscribeTableView.register(forDraggedTypes: [tableViewDragType]) + SubscribeTableView.allowsMultipleSelection = true + } + + @IBAction func onOk(_ sender: NSButton) { + if editingSubscribe != nil { + if !editingSubscribe.feedValidator() { + // Done Shake window + shakeWindows() + return + } + } + sbMgr.save() + window?.performClose(self) + } + + @IBAction func onAdd(_ sender: NSButton) { + if editingSubscribe != nil && !editingSubscribe.feedValidator(){ + shakeWindows() + return + } + SubscribeTableView.beginUpdates() + let subscribe = Subscribe(initUrlString: "", initGroupName: "", initToken: "", initMaxCount: -1) + sbMgr.subscribes.append(subscribe) + + let index = IndexSet(integer: sbMgr.subscribes.count-1) + SubscribeTableView.insertRows(at: index, withAnimation: .effectFade) + + self.SubscribeTableView.scrollRowToVisible(self.sbMgr.subscribes.count-1) + self.SubscribeTableView.selectRowIndexes(index, byExtendingSelection: false) + SubscribeTableView.endUpdates() + updateSubscribeBoxVisible() + } + + @IBAction func onDelete(_ sender: NSButton) { + let index = Int(SubscribeTableView.selectedRowIndexes.first!) + var deleteCount = 0 + if index >= 0 { + SubscribeTableView.beginUpdates() + for (_, toDeleteIndex) in SubscribeTableView.selectedRowIndexes.enumerated() { + _ = sbMgr.deleteSubscribe(atIndex: toDeleteIndex - deleteCount) + SubscribeTableView.removeRows(at: IndexSet(integer: toDeleteIndex - deleteCount), withAnimation: .effectFade) + deleteCount += 1 + if sbMgr.subscribes.count == 0 { + cleanField() + } + } + SubscribeTableView.endUpdates() + } + self.SubscribeTableView.scrollRowToVisible(index - 1) + self.SubscribeTableView.selectRowIndexes(IndexSet(integer: index - 1), byExtendingSelection: false) + updateSubscribeBoxVisible() + } + + func updateSubscribeBoxVisible() { + if sbMgr.subscribes.count <= 0 { + DeleteSubscribeBtn.isEnabled = false + FeedTextField.isEnabled = false + TokenTextField.isEnabled = false + GroupTextField.isEnabled = false + MaxCountTextField.isEnabled = false + }else{ + DeleteSubscribeBtn.isEnabled = true + FeedTextField.isEnabled = true + TokenTextField.isEnabled = true + GroupTextField.isEnabled = true + MaxCountTextField.isEnabled = true + } + } + + func bindSubscribe(_ index:Int) { + if index >= 0 && index < sbMgr.subscribes.count { + editingSubscribe = sbMgr.subscribes[index] + + FeedTextField.bind("value", to: editingSubscribe, withKeyPath: "subscribeFeed", options: [NSContinuouslyUpdatesValueBindingOption: true]) + TokenTextField.bind("value", to: editingSubscribe, withKeyPath: "token", options: [NSContinuouslyUpdatesValueBindingOption: true]) + GroupTextField.bind("value", to: editingSubscribe, withKeyPath: "groupName", options: [NSContinuouslyUpdatesValueBindingOption: true]) + MaxCountTextField.bind("value", to: editingSubscribe, withKeyPath: "maxCount", options: [NSContinuouslyUpdatesValueBindingOption: true]) + + } else { + editingSubscribe = nil + FeedTextField.unbind("value") + TokenTextField.unbind("value") + GroupTextField.unbind("value") + MaxCountTextField.unbind("value") + } + } + + func getDataAtRow(_ index:Int) -> String { + if sbMgr.subscribes[index].groupName != "" { + return sbMgr.subscribes[index].groupName + } + return sbMgr.subscribes[index].subscribeFeed + } + + // MARK: For NSTableViewDataSource + + func numberOfRows(in tableView: NSTableView) -> Int { + if let mgr = sbMgr { + return mgr.subscribes.count + } + return 0 + } + + func tableView(_ tableView: NSTableView + , objectValueFor tableColumn: NSTableColumn? + , row: Int) -> Any? { + + let title = getDataAtRow(row) + + if tableColumn?.identifier == "main" { + if title != "" {return title} + else {return "S"} + } else if tableColumn?.identifier == "status" { + return NSImage(named: "menu_icon") + } + return "" + } + + // MARK: Drag & Drop reorder rows + + func tableView(_ tableView: NSTableView, pasteboardWriterForRow row: Int) -> NSPasteboardWriting? { + let item = NSPasteboardItem() + item.setString(String(row), forType: tableViewDragType) + return item + } + + func tableView(_ tableView: NSTableView, validateDrop info: NSDraggingInfo, proposedRow row: Int + , proposedDropOperation dropOperation: NSTableViewDropOperation) -> NSDragOperation { + if dropOperation == .above { + return .move + } + return NSDragOperation() + } + + func tableView(_ tableView: NSTableView, acceptDrop info: NSDraggingInfo + , row: Int, dropOperation: NSTableViewDropOperation) -> Bool { + if let mgr = sbMgr { + var oldIndexes = [Int]() + info.enumerateDraggingItems(options: [], for: tableView, classes: [NSPasteboardItem.self], searchOptions: [:]) { + if let str = ($0.0.item as! NSPasteboardItem).string(forType: self.tableViewDragType), let index = Int(str) { + oldIndexes.append(index) + } + } + + var oldIndexOffset = 0 + var newIndexOffset = 0 + + // For simplicity, the code below uses `tableView.moveRowAtIndex` to move rows around directly. + // You may want to move rows in your content array and then call `tableView.reloadData()` instead. + tableView.beginUpdates() + for oldIndex in oldIndexes { + if oldIndex < row { + let o = mgr.subscribes.remove(at: oldIndex + oldIndexOffset) + mgr.subscribes.insert(o, at:row - 1) + tableView.moveRow(at: oldIndex + oldIndexOffset, to: row - 1) + oldIndexOffset -= 1 + } else { + let o = mgr.subscribes.remove(at: oldIndex) + mgr.subscribes.insert(o, at:row + newIndexOffset) + tableView.moveRow(at: oldIndex, to: row + newIndexOffset) + newIndexOffset += 1 + } + } + tableView.endUpdates() + + return true + } + return false + } + + //-------------------------------------------------- + // For NSTableViewDelegate + + func tableView(_ tableView: NSTableView + , shouldEdit tableColumn: NSTableColumn?, row: Int) -> Bool { + return false + } + + func tableView(_ tableView: NSTableView, shouldSelectRow row: Int) -> Bool { + if row < 0 { + editingSubscribe = nil + return true + } +// if editingSubscribe != nil { +// if !editingSubscribe.isValid() { +// return false +// } +// } + + return true + } + + func tableViewSelectionDidChange(_ notification: Notification) { + if SubscribeTableView.selectedRow >= 0 { + bindSubscribe(SubscribeTableView.selectedRow) + if (SubscribeTableView.selectedRowIndexes.count > 1){ +// duplicateProfileButton.isEnabled = false + } else { +// duplicateProfileButton.isEnabled = true + } + } else { + if !sbMgr.subscribes.isEmpty { + let index = IndexSet(integer: sbMgr.subscribes.count - 1) + SubscribeTableView.selectRowIndexes(index, byExtendingSelection: false) + } + } + } + + func cleanField(){ + FeedTextField.stringValue = "" + TokenTextField.stringValue = "" + GroupTextField.stringValue = "" + MaxCountTextField.stringValue = "" + } + + func shakeWindows(){ + let numberOfShakes:Int = 8 + let durationOfShake:Float = 0.5 + let vigourOfShake:Float = 0.05 + + let frame:CGRect = (window?.frame)! + let shakeAnimation = CAKeyframeAnimation() + + let shakePath = CGMutablePath() + + shakePath.move(to: CGPoint(x:NSMinX(frame), y:NSMinY(frame))) + + for _ in 1...numberOfShakes{ + shakePath.addLine(to: CGPoint(x: NSMinX(frame) - frame.size.width * CGFloat(vigourOfShake), y: NSMinY(frame))) + shakePath.addLine(to: CGPoint(x: NSMinX(frame) + frame.size.width * CGFloat(vigourOfShake), y: NSMinY(frame))) + } + + shakePath.closeSubpath() + shakeAnimation.path = shakePath + shakeAnimation.duration = CFTimeInterval(durationOfShake) + window?.animations = ["frameOrigin":shakeAnimation] + window?.animator().setFrameOrigin(window!.frame.origin) + } +} diff --git a/ShadowsocksX-NG/Utils.m b/ShadowsocksX-NG/Utils.m index d412ad3e..c7922a86 100644 --- a/ShadowsocksX-NG/Utils.m +++ b/ShadowsocksX-NG/Utils.m @@ -45,7 +45,7 @@ void ScanQRCodeOnScreen() { NSMutableArray* foundSSUrls = [NSMutableArray array]; CIDetector *detector = [CIDetector detectorOfType:@"CIDetectorTypeQRCode" - context:nil + context:[CIContext contextWithOptions:@{kCIContextUseSoftwareRenderer: @true}] options:@{ CIDetectorAccuracy:CIDetectorAccuracyHigh }]; for (unsigned int displaysIndex = 0; displaysIndex < dspCount; displaysIndex++) @@ -66,7 +66,7 @@ void ScanQRCodeOnScreen() { } free(displays); - + // TODO if not find any urls push a notification tells there is no QR on the screen [[NSNotificationCenter defaultCenter] postNotificationName:@"NOTIFY_FOUND_SS_URL" object:nil diff --git a/ShadowsocksX-NG/Utils.swift b/ShadowsocksX-NG/Utils.swift index 87a062e8..cc34ebd2 100644 --- a/ShadowsocksX-NG/Utils.swift +++ b/ShadowsocksX-NG/Utils.swift @@ -39,10 +39,10 @@ func splitProfile(url: String, max: Int) -> [String] { return [""] } -fileprivate func splitor(url: String, regexp: String) -> [String] { +func splitor(url: String, regexp: String) -> [String] { var ret: [String] = [] var ssrUrl = url - while ssrUrl.range(of:regexp, options: .regularExpression) != nil{ + while ssrUrl.range(of:regexp, options: .regularExpression) != nil { let range = ssrUrl.range(of:regexp, options: .regularExpression) let result = ssrUrl.substring(with:range!) ssrUrl.replaceSubrange(range!, with: "") @@ -50,3 +50,8 @@ fileprivate func splitor(url: String, regexp: String) -> [String] { } return ret } + +func getLocalInfo() -> [String: Any] { + let InfoDict = Bundle.main.infoDictionary + return InfoDict! +} diff --git a/ShadowsocksX-NG/VersionChecker.swift b/ShadowsocksX-NG/VersionChecker.swift index 78eecdc6..cecdfa60 100644 --- a/ShadowsocksX-NG/VersionChecker.swift +++ b/ShadowsocksX-NG/VersionChecker.swift @@ -8,7 +8,7 @@ import Foundation -let _VERSION_XML_URL = "https://raw.githubusercontent.com/shadowsocksr/ShadowsocksX-NG/develop/ShadowsocksX-NG/Info.plist" +let _VERSION_XML_URL = "https://raw.githubusercontent.com/qinyuhang/ShadowsocksX-NG-R/develop/ShadowsocksX-NG/Info.plist" let _VERSION_XML_LOCAL:String = Bundle.main.bundlePath + "/Contents/Info.plist" class VersionChecker: NSObject { diff --git a/ShadowsocksX-NG/gfwlist.txt b/ShadowsocksX-NG/gfwlist.txt index e50e2331..e9e34797 100644 --- a/ShadowsocksX-NG/gfwlist.txt +++ b/ShadowsocksX-NG/gfwlist.txt @@ -1,1587 +1,2243 @@ -W0F1dG9Qcm94eSAwLjIuOV0KISBDaGVja3N1bTogSWRvRnhYWWM4OU5iRExQbEpD -UTIxdwohIEV4cGlyZXM6IDZoCiEgVGl0bGU6IEdGV0xpc3Q0TEwKISBHRldMaXN0 -IHdpdGggRVZFUllUSElORyBpbmNsdWRlZAohIExhc3QgTW9kaWZpZWQ6IEZyaSwg -MjYgQXVnIDIwMTYgMTc6MjM6MTUgKzA4MDAKIQohIEhvbWVQYWdlOiBodHRwczov -L2dpdGh1Yi5jb20vZ2Z3bGlzdC9nZndsaXN0CiEgTGljZW5zZTogaHR0cHM6Ly9y -YXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2dmd2xpc3QvZ2Z3bGlzdC9tYXN0ZXIv -Q09QWUlORy50eHQKIQohIEdGV0xpc3QgaXMgdW5saWtlbHkgdG8gZnVsbHkgY29t -cHJpc2UgdGhlIHJlYWwKISBydWxlcyBiZWluZyBkZXBsb3llZCBpbnNpZGUgR0ZX -IHN5c3RlbS4gV2UgdHJ5CiEgb3VyIGJlc3QgdG8ga2VlcCB0aGUgbGlzdCB1cCB0 -byBkYXRlLiBQbGVhc2UKISBjb250YWN0IHVzIHJlZ2FyZGluZyBVUkwgc3VibWlz -c2lvbiAvIHJlbW92YWwsCiEgb3Igc3VnZ2VzdGlvbiAvIGVuaGFuY2VtZW50IGF0 -IGlzc3VlIHRyYWNrZXI6CiEgaHR0cHM6Ly9naXRodWIuY29tL2dmd2xpc3QvZ2Z3 -bGlzdC9pc3N1ZXMvLgoKIS0tLS0tLS0tLTQwMy80NTEgJiBVUkwgUmVkaXJlY3Rz -LS0tLS0tLS0tCnx8NHRlcm4uY29tCiEtLWVoZW50YWkKfGh0dHA6Ly84NS4xNy43 -My4zMS8KfHxhZG9yYW1hLmNvbQp8fGFnbmVzYi5mcgp8fGFraWJhLXdlYi5jb20K -fHxhbGllbi11Zm9zLmNvbQp8fGFsdHJlYy5jb20KfHxhcmVuYS50YWlwZWkKfHxh -c2lhbnNwaXNzLmNvbQp8fGF0aGVuYWVpem91LmNvbQp8fGF6dWJ1LnR2Cnx8YmFy -cmFjdWRhLmNvbQp8fGJlZWcuY29tCnx8Ymxvb21iZXJndmlldy5jb20KfHxib3lz -bWFzdGVyLmNvbQp8fGNhcmZheC5jb20KLmNhc2lub2JlbGxpbmkuY29tCnx8Y2Fz -aW5vYmVsbGluaS5jb20KfHxjZW50YXVyby5jb20uYnIKfHxpbWFnZXMuY29taWNv -LnR3Cnx8c3RhdGljLmNvbWljby50dwp8fGNyb3NzZmlyZS5jby5rcgp8fGRhcnBh -Lm1pbAp8fGRlc2lwcm8uZGUKfHxkaXNoLmNvbQp8aHR0cDovL2ltZy5kbHNpdGUu -anAvCnx8ZG01MzAubmV0CiEtLXx8c2hhcmUuZG1oeS5vcmcKfHxkbW0uY28uanAK -IS0tfHxkbW0uY29tCnx8ZWVzdGkuZWUKLmV4cGVrdC5jb20KfHxleHBla3QuY29t -Ci5leHRtYXRyaXguY29tCnx8ZXh0bWF0cml4LmNvbQp8fGZha2t1Lm5ldAp8fGZh -c3RwaWMucnUKfHxmaWxlc29yLmNvbQp8fGZpbmFuY2V0d2l0dGVyLmNvbQp8fGZp -bmRtaW1hLmNvbQp8fGZsaXBib2FyZC5jb20KfHxmbGl0dG8uY29tCnx8ZnhuZXR3 -b3Jrcy5jb20KfHxnZXR0eWltYWdlcy5jb20KfHxnZXR1cGxvYWRlci5jb20KfGh0 -dHBzOi8vZ2l0aHViLmNvbS9wcm9ncmFtdGhpbmsvemhhbwp8fGdsYXNzOC5ldQp8 -fGdseXBlLmNvbQp8fGdvMTQxLmNvbQp8fGhhdXRlbG9vay5jb20KfHxoYXV0ZWxv -b2tjZG4uY29tCnx8aG12ZGlnaXRhbC5jYQp8fGhtdmRpZ2l0YWwuY29tCnx8aG9t -ZWRlcG90LmNvbQp8fGhvb3ZlcnMuY29tCnx8aHVsdS5jb20KfHxodWx1aW0uY29t -CnxodHRwOi8vc2VjdXJlLmh1c3RsZXIuY29tCnxodHRwOi8vaHVzdGxlcmNhc2gu -Y29tCnxodHRwOi8vd3d3Lmh1c3RsZXJjYXNoLmNvbQp8fGh5YnJpZC1hbmFseXNp -cy5jb20KfHxpbG92ZWxvbmd0b2VzLmNvbQp8aHR0cDovL2ltZ21lZ2EuY29tLyou -Z2lmLmh0bWwKfGh0dHA6Ly9pbWdtZWdhLmNvbS8qLmpwZy5odG1sCnxodHRwOi8v -aW1nbWVnYS5jb20vKi5qcGVnLmh0bWwKfGh0dHA6Ly9pbWdtZWdhLmNvbS8qLnBu -Zy5odG1sCnxodHRwOi8vaW1ndXIuY29tL3VwbG9hZAp8fGphdmh1Yi5uZXQKfHxq -YXZodWdlLmNvbQouamF2bGlicmFyeS5jb20KfHxqYXZsaWJyYXJ5LmNvbQp8fGpj -cGVubmV5LmNvbQp8fGp1bGllcG9zdC5jb20KfHxrYXdhaWlrYXdhaWkuanAKfHxr -aGF0cmltYXphLm9yZwp8fGxlaXN1cmVwcm8uY29tCnx8bG9uZ3RvZXMuY29tCnx8 -bG92ZXR2c2hvdy5jb20KfGh0dHA6Ly93d3cubS1zcG9ydC5jby51awp8fG1hY2dh -bWVzdG9yZS5jb20KfHxtYWRvbm5hLWF2LmNvbQp8fG1hbmdhZm94LmNvbQp8fG1h -bmdhZm94Lm1lCnx8bWF0b21lLXBsdXMuY29tCnx8bWF0b21lLXBsdXMubmV0Cnx8 -bWF0dHdpbGNveC5uZXQKfHxtZXRhcnRodW50ZXIuY29tCnx8bWZ4bWVkaWEuY29t -Cnx8bW9uc3Rlci5jb20KfHxtb29keXouY29tCnx8bXV6dS50dgp8fG12Zy5qcAp8 -fG5hdGlvbndpZGUuY29tCnxodHRwOi8vd3d3Lm5iYy5jb20vbGl2ZQp8fG5ldGZs -aXguY29tCnxodHRwOi8vbW8ubmlnaHRsaWZlMTQxLmNvbQp8fG5vcmRzdHJvbS5j -b20KfHxub3Jkc3Ryb21pbWFnZS5jb20KfHxub3Jkc3Ryb21yYWNrLmNvbQp8fG5v -dHRpbmdoYW1wb3N0LmNvbQp8fG50ZHR2LmN6Cnx8bnVzYXRyaXAuY29tCnx8bnV1 -dmVtLmNvbQp8fG9tbmk3LmpwCiEtLVdlIGFyZSBjb25mdXNlZCBhcyB3ZWxsCnx8 -b250cmFjLmNvbQpAQHxodHRwOi8vYmxvZy5vbnRyYWMuY29tCnx8cGFuZG9yYS5j -b20KLnBhbmRvcmEudHYKfHxwYXJrYW5za3kuY29tCnxodHRwOi8vKi5waW1nLnR3 -Lwp8fHB1cmUxOC5jb20KfHxxcS5jby56YQp8fHIxOC5jb20KfGh0dHA6Ly9yYWRp -a28uanAKfHxyZC5jb20KfHxyZGlvLmNvbQp8fHNhZGlzdGljLXYuY29tCnxodHRw -Oi8vY2RuKi5zZWFyY2gueHh4Lwp8fHNodXR0ZXJzdG9jay5jb20KfHxzbGFja2Vy -LmNvbQp8fHNwb3RpZnkuY29tCnx8c3ByaW5nYm9hcmRwbGF0Zm9ybS5jb20KfHxz -cHJpdGUub3JnCkBAfGh0dHA6Ly9zdG9yZS5zcHJpdGUub3JnCnx8c3VwZXJwYWdl -cy5jb20KfHxzd2FnYnVja3MuY29tCnx8c3dpdGNoMS5qcAp8fHRhcGFud2FwLmNv -bQp8fHRhcmdldC5jb20KQEB8fGludGwudGFyZ2V0LmNvbQp8fHRtYS5jby5qcAp8 -fHR1cm50YWJsZS5mbQp8fHR3ZXJraW5nYnV0dC5jb20KfHx2ZWdhc3JlZC5jb20K -fHx2ZXZvLmNvbQp8aHR0cDovL3ZpdS50di9jaC8KfGh0dHA6Ly92aXUudHYvZW5j -b3JlLwp8aHR0cDovL2Vjc20udnMuY29tLwp8fHdhbnotZmFjdG9yeS5jb20KfHx3 -aGVyZXRvd2F0Y2guY29tCnx8d2luZ2FtZXN0b3JlLmNvbQp8fHdpemNyYWZ0cy5u -ZXQKfHx4ZmluaXR5LmNvbQp8fHphdHRvby5jb20KfHx6b3pvdG93bi5jb20KCiEj -IyMjIyMjIyMjIyMjI0dlbmVyYWwgTGlzdCBTdGFydCMjIyMjIyMjIyMjIyMjIwoh -LS0tLS0tLS0tLS0tLS0tLS0tLVB1cmUgSVAtLS0tLS0tLS0tLS0tLS0tLS0tLS0K -NTAuNy4zMS4yMzA6ODg5OAoxNzQuMTQyLjEwNS4xNTMKNjkuNjUuMTkuMTYwCgoh -LS0tLS0tLS0tLS0tLU5vbi1MYXRpbiBEb21haW4gTmFtZXMtLS0tLS0tLS0tLS0K -fHx4bi0tNGdxMTcxcC5jb20KfHx4bi0tcDhqOWEwZDljOWEueG4tLXE5anliNGMK -CiEtLS0tLS0tLS0tLS0tLS0tRnJhdWRzICYgU2NhbXMtLS0tLS0tLS0tLS0tLS0t -LQpjaGluYS1tbW0uanAubmV0Ci5sc3hzenpnLmNvbQouY2hpbmEtbW1tLm5ldAp8 -fGNoaW5hLW1tbS5uZXQKY2hpbmEtbW1tLnNhLmNvbQoKIS0tLS0tLS0tLS0tLS0t -LS0tLS0tLUdyb3Vwcy0tLS0tLS0tLS0tLS0tLS0tLS0tCiEhLS0tQW1hem9uLS0t -CnMzLWFwLW5vcnRoZWFzdC0xLmFtYXpvbmF3cy5jb20KCiEhLS0tQXZNb28tLS0K -LmF2bW8ucHcKIS0tfGh0dHA6Ly9hdm1vLnB3Ci5hdm1vby5jb20KfGh0dHA6Ly9h -dm1vby5jb20KLmF2bW9vLm5ldAp8aHR0cDovL2F2bW9vLm5ldAp8fGF2bW9vLnB3 -Ci5qYXZtb28ueHl6CnxodHRwOi8vamF2bW9vLnh5egouamF2dGFnLmNvbQp8aHR0 -cDovL2phdnRhZy5jb20KLmphdnpvby5jb20KfGh0dHA6Ly9qYXZ6b28uY29tCgoh -IS0tLUNsb3VkRnJvbnQtLS0KfHxkM3JocjdrZ210cnExdi5jbG91ZGZyb250Lm5l -dAoKISEtLS1EdEROUy0tLQouM2QtZ2FtZS5jb20KLjRpcmMuY29tCi5iMG5lLmNv -bQouY2hhdG5vb2suY29tCi5kYXJrdGVjaC5vcmcKLmRlYWZ0b25lLmNvbQouZHRk -bnMubmV0Ci5lZmZlcnMuY29tCi5ldG93bnMubmV0Ci5ldG93bnMub3JnCi5mbG5l -dC5vcmcKLmdvdGdlZWtzLmNvbQouc2NpZXJvbi5jb20KLnNseWlwLmNvbQouc2x5 -aXAubmV0Ci5zdXJvb3QuY29tCgohIS0tLUZhY2Vib29rLS0tCnx8ZmFjZWJvb2su -YnIKLmZhY2Vib29rLmNvbQp8fGZhY2Vib29rLmNvbQohLS0vXmh0dHBzPzpcL1wv -W15cL10rZmFjZWJvb2tcLmNvbS8KQEB8fCp2Ni5mYWNlYm9vay5jb20KfHxjb25u -ZWN0LmZhY2Vib29rLm5ldAp8fGZhY2Vib29rLmh1Cnx8ZmFjZWJvb2suaW4KfHxm -YWNlYm9vay5ubAp8fGZhY2Vib29rLnNlCnx8bWVzc2VuZ2VyLmNvbQp8fG9jdWx1 -cy5jb20KCiEhLS0tR29vZ2xlLS0tCiEjIyNodHRwczovL3d3dy5nb29nbGUuY29t -L3N1cHBvcnRlZF9kb21haW5zIyMjCiEuLi5HRldMaXN0IGRvZXNuJ3QgaW50ZW5k -IHRvIHN1cHBvcnQgdHlwb3NxdWF0dGluZy4uLgp8fDFlMTAwLm5ldAp8fGFiYy54 -eXoKfHxhZG1vYi5jb20KfHxhZ29vZ2xlYWRheS5jb20KfHxhbXBwcm9qZWN0Lm9y -Zwp8fGFuZHJvaWQuY29tCnx8YW5kcm9pZGlmeS5jb20KLmFwcHNwb3QuY29tCnx8 -YXBwc3BvdC5jb20KYmxvZ3Nwb3QuY29tCi9eaHR0cHM/OlwvXC9bXlwvXStibG9n -c3BvdFwuKC4qKS8KfHxjZXJ0aWZpY2F0ZS10cmFuc3BhcmVuY3kub3JnCnx8Y2hy -b21lLmNvbQp8fGNocm9tZWNhc3QuY29tCnx8Y2hyb21lZXhwZXJpbWVudHMuY29t -Cnx8Y2hyb21lcmNpc2UuY29tCnx8Y2hyb21lc3RhdHVzLmNvbQp8fGNocm9taXVt -Lm9yZwp8fGNvbS5nb29nbGUKfHxkYXRhLXZvY2FidWxhcnkub3JnCnx8ZGVlcG1p -bmQuY29tCnx8ZGVqYS5jb20KfHxkaWdpc2ZlcmEuY29tCnx8ZG9tYWlucy5nb29n -bGUKfHxmZWVkYnVybmVyLmNvbQp8fGcuY28KfHxnY3IuaW8KfHxnZXQuaG93Cnx8 -Z2V0bWRsLmlvCnx8Z2dwaHQuY29tCnx8Z21haWwuY29tCnx8Z21vZHVsZXMuY29t -Cnx8Z29vLmdsCi5nb29nbGUuYWUKLmdvb2dsZS5hbQouZ29vZ2xlLmNhdAouZ29v -Z2xlLmNkCi5nb29nbGUuY2kKLmdvb2dsZS5jby5qcAouZ29vZ2xlLmNvLmtyCi5n -b29nbGUuY28ubWEKLmdvb2dsZS5jby51awouZ29vZ2xlLmNvbQouZ29vZ2xlLmRl -Ci5nb29nbGUuZGsKLmdvb2dsZS5lcwouZ29vZ2xlLmZpCi5nb29nbGUuZnIKLmdv -b2dsZS5nZwouZ29vZ2xlLmllCi5nb29nbGUuaXMKLmdvb2dsZS5pdAouZ29vZ2xl -Lm5sCi5nb29nbGUubm8KLmdvb2dsZS5zawouZ29vZ2xlLnNtCi5nb29nbGUudGsK -L15odHRwcz86XC9cLyhbXlwvXStcLikqZ29vZ2xlXC4oYWN8YWR8YWV8YWx8YW18 -YXN8YXR8YXp8YmF8YmV8YmZ8Ymd8Yml8Ymp8YnN8YnR8Ynl8Y2F8Y2F0fGNkfGNm -fGNnfGNofGNpfGNsfGNtfGNvLmFvfGNvLmJ3fGNvLmNrfGNvLmNyfGNvLmlkfGNv -LmlsfGNvLmlufGNvLmpwfGNvLmtlfGNvLmtyfGNvLmxzfGNvLm1hfGNvbXxjb20u -YWZ8Y29tLmFnfGNvbS5haXxjb20uYXJ8Y29tLmF1fGNvbS5iZHxjb20uYmh8Y29t -LmJufGNvbS5ib3xjb20uYnJ8Y29tLmJ6fGNvbS5jb3xjb20uY3V8Y29tLmN5fGNv -bS5kb3xjb20uZWN8Y29tLmVnfGNvbS5ldHxjb20uZmp8Y29tLmdofGNvbS5naXxj -b20uZ3R8Y29tLmhrfGNvbS5qbXxjb20ua2h8Y29tLmt3fGNvbS5sYnxjb20ubHl8 -Y29tLm1tfGNvbS5tdHxjb20ubXh8Y29tLm15fGNvbS5uYXxjb20ubmZ8Y29tLm5n -fGNvbS5uaXxjb20ubnB8Y29tLm9tfGNvbS5wYXxjb20ucGV8Y29tLnBnfGNvbS5w -aHxjb20ucGt8Y29tLnByfGNvbS5weXxjb20ucWF8Y29tLnNhfGNvbS5zYnxjb20u -c2d8Y29tLnNsfGNvbS5zdnxjb20udGp8Y29tLnRyfGNvbS50d3xjb20udWF8Y29t -LnV5fGNvbS52Y3xjb20udm58Y28ubXp8Y28ubnp8Y28udGh8Y28udHp8Y28udWd8 -Y28udWt8Y28udXp8Y28udmV8Y28udml8Y28uemF8Y28uem18Y28uend8Y3Z8Y3p8 -ZGV8ZGp8ZGt8ZG18ZHp8ZWV8ZXN8Zml8Zm18ZnJ8Z2F8Z2V8Z2d8Z2x8Z218Z3B8 -Z3J8Z3l8aGt8aG58aHJ8aHR8aHV8aWV8aW18aXF8aXN8aXR8amV8am98a2d8a2l8 -a3p8bGF8bGl8bGt8bHR8bHV8bHZ8bWR8bWV8bWd8bWt8bWx8bW58bXN8bXV8bXZ8 -bXd8bXh8bmV8bmx8bm98bnJ8bnV8b3JnfHBsfHBufHBzfHB0fHJvfHJzfHJ1fHJ3 -fHNjfHNlfHNofHNpfHNrfHNtfHNufHNvfHNyfHN0fHRkfHRnfHRrfHRsfHRtfHRu -fHRvfHR0fHVzfHZnfHZufHZ1fHdzKVwvLiovCiEtLXx8Z29vZ2xlLWFuYWx5dGlj -cy5jb20KIS0tfHxnb29nbGVhZHNlcnZpY2VzLmNvbQp8fGdvb2dsZWFwaXMuY29t -Cnx8Z29vZ2xlYXBwcy5jb20KfHxnb29nbGVhcnRwcm9qZWN0LmNvbQp8fGdvb2ds -ZWJsb2cuY29tCnx8Z29vZ2xlYm90LmNvbQp8fGdvb2dsZWNvZGUuY29tCnx8Z29v -Z2xlY29tbWVyY2UuY29tCnx8Z29vZ2xlZG9tYWlucy5jb20KfHxnb29nbGVlYXJ0 -aC5jb20KfHxnb29nbGVkcml2ZS5jb20KfHxnb29nbGVncm91cHMuY29tCnx8Z29v -Z2xlaG9zdGVkLmNvbQp8fGdvb2dsZWlkZWFzLmNvbQp8fGdvb2dsZWxhYnMuY29t -Cnx8Z29vZ2xlbWFpbC5jb20KfHxnb29nbGVwbGF5LmNvbQp8fGdvb2dsZXBsdXMu -Y29tCnx8Z29vZ2xlc291cmNlLmNvbQohLS18fGdvb2dsZXN5bmRpY2F0aW9uLmNv -bQohLS18fGdvb2dsZXRhZ21hbmFnZXIuY29tCiEtLXx8Z29vZ2xldGFnc2Vydmlj -ZXMuY29tCnx8Z29vZ2xldXNlcmNvbnRlbnQuY29tCnx8Z29vZ2xldmlkZW8uY29t -Cnx8Z29vZ2xlemlwLm5ldAp8fGdyb3Vwcy5nb29nbGUuY24KfHxndnQwLmNvbQp8 -fGd2dDEuY29tCnx8Z3Z0My5jb20KfHxodG1sNXJvY2tzLmNvbQp8fGlhbS5zb3kK -fHxpZ29vZ2xlLmNvbQp8fGl0YXNvZnR3YXJlLmNvbQp8fGxpa2UuY29tCnx8bmlj -Lmdvb2dsZQp8fG9uMi5jb20KfHxwYW5vcmFtaW8uY29tCnx8cGljYXNhd2ViLmNv -bQp8fHBvbHltZXItcHJvamVjdC5vcmcKfHxxdWVzdHZpc3VhbC5jb20KfHxyZWNh -cHRjaGEubmV0Cnx8cmVkaG90bGFicy5jb20KfHxyZWdpc3RyeS5nb29nbGUKfGh0 -dHA6Ly9zaXBtbDUub3JnLwp8fHN0b3JpZXMuZ29vZ2xlCnx8c3luZXJneXNlLmNv -bQp8fHRlbnNvcmZsb3cub3JnCnx8dGhpbmt3aXRoZ29vZ2xlLmNvbQp8fHRpbHRi -cnVzaC5jb20KIS0tfHx3d3cuZ29vZ2xlCnx8d2F2ZXByb3RvY29sLm9yZwp8fHdl -Ym1wcm9qZWN0Lm9yZwp8fHdlYnJ0Yy5vcmcKfHx3aGF0YnJvd3Nlci5vcmcKfHx3 -aXRoZ29vZ2xlLmNvbQp8fHlvdXR1LmJlCi55b3V0dWJlLmNvbQp8fHlvdXR1YmUu -Y29tCnx8eW91dHViZS1ub2Nvb2tpZS5jb20KfHx5dGltZy5jb20KfHx6eW5hbWlj -cy5jb20KCiEhLS0tS2lja0FTUy0tLQohLS1PRkZJQ0lBTCBVUkwgbGlzdCBhdDog -aHR0cHM6Ly9rYXN0YXR1cy5jb20KLmthdC5jcgoKISEtLS1OYXVnaHR5QW1lcmlj -YS0tLQp8fG5hdWdodHlhbWVyaWNhLmNvbQoKISEtLS1WMkVYLS0tCi52MmV4LmNv -bQohLS1JbmNsdWRlZCBpbiBhYm92ZSBydWxlOiBkbnMudjJleC5jb20KQEB8aHR0 -cDovL3YyZXguY29tCkBAfGh0dHA6Ly9jZG4udjJleC5jb20KQEB8aHR0cDovL2Nu -LnYyZXguY29tCkBAfGh0dHA6Ly9oay52MmV4LmNvbQpAQHxodHRwOi8vaS52MmV4 -LmNvbQpAQHxodHRwOi8vbGF4LnYyZXguY29tCkBAfGh0dHA6Ly9uZXVlLnYyZXgu -Y29tCkBAfGh0dHA6Ly9wYWdlc3BlZWQudjJleC5jb20KQEB8aHR0cDovL3N0YXRp -Yy52MmV4LmNvbQpAQHxodHRwOi8vd29ya3NwYWNlLnYyZXguY29tCkBAfGh0dHA6 -Ly93d3cudjJleC5jb20KCiEtLS0tLS0tLS0tLS0tLS0tLS1OdW1lcmljcy0tLS0t -LS0tLS0tLS0tLS0tLS0tLQouMHJ6LnR3CnxodHRwOi8vMHJ6LnR3Cnx8MHRvMjU1 -LmNvbQoxLWFwcGxlLmNvbS50dwp8fDEtYXBwbGUuY29tLnR3Ci4xMDBrZS5vcmcK -LjEwMDBnaXJpLm5ldAp8fDEwMDBnaXJpLm5ldAouMTBjb25kaXRpb25zb2Zsb3Zl -LmNvbQp8fDEwbXVzdW1lLmNvbQoxMjNyZi5jb20KLjEyYmV0LmNvbQp8fDEyYmV0 -LmNvbQouMTJ2cG4uY29tCi4xMnZwbi5uZXQKfHwxMnZwbi5jb20KfHwxMnZwbi5u -ZXQKMTQxaG9uZ2tvbmcuY29tL2ZvcnVtCi4xNDF0dWJlLmNvbQouMTY4OC5jb20u -YXUKLjE3M25nLmNvbQp8fDE3M25nLmNvbQouMTc3cGljLmluZm8KLjE3dDE3cC5j -b20KMThvbmx5Z2lybHMuY29tCi4xOHZpcmdpbnNleC5jb20KLjE5NDllci5vcmcK -emhhby4xOTg0LmNpdHkKfHx6aGFvLjE5ODQuY2l0eQoxOTg0YmJzLmNvbQp8fDE5 -ODRiYnMuY29tCiEtLXx8MTk4NGJsb2cuY29tCi4xOTg0YmJzLm9yZwp8fDE5ODRi -YnMub3JnCi4xOTk4Y2RwLm9yZwouMWJhby5vcmcKfGh0dHA6Ly8xYmFvLm9yZwou -MWVldy5jb20KLjFtb2JpbGUuY29tCnxodHRwOi8vKi4xbW9iaWxlLnR3Cnx8MXBv -bmRvLnR2Ci4yLWhhbmQuaW5mbwouMjAwMGZ1bi5jb20vYmJzCi4yMDA4eGlhbnpo -YW5nLmluZm8KfHwyMDA4eGlhbnpoYW5nLmluZm8KfHwyMDE3LmhrCjIxYW5keS5j -b20vYmxvZwouMjFwcm9uLmNvbQoyMXNleHR1cnkuY29tCi4yMjgubmV0LnR3Cnx8 -MjRocnMuY2EKMjRzbWlsZS5vcmcKMmxpcHN0dWJlLmNvbQouMnNoYXJlZC5jb20K -MzBib3hlcy5jb20KLjMxNWx6LmNvbQp8fDMycmVkLmNvbQp8fDM2cmFpbi5jb20K -LjNhNWEuY29tCjNhcmFidHYuY29tCi4zYm95czJnaXJscy5jb20KLjNyZW4uY2EK -LjN0dWkubmV0Cnx8NGJsdWVzdG9uZXMuYml6CiEtLXx8NGNoYW4ub3JnCi40ZXZl -cnByb3h5LmNvbQp8fDRldmVycHJveHkuY29tCnx8NHJidHYuY29tCnx8NHNoYXJl -ZC5jb20KdGFpd2FubmF0aW9uLjUwd2Vicy5jb20KfHw1MS5jYQouNTFsdW9iZW4u -Y29tCnx8NTFsdW9iZW4uY29tCjVpMDEuY29tCi41aXNvdG9pNS5vcmcKLjVtYW9k -YW5nLmNvbQp8fDYzaS5jb20KLjY0bXVzZXVtLm9yZwo2NHRpYW53YW5nLmNvbQo2 -NHdpa2kuY29tCi42Ni5jYQo2NjZrYi5jb20KNnBhcmsuY29tCnx8NnBhcmsuY29t -Cnx8N2NhcHR1cmUuY29tCi43Y293LmNvbQouOC1kLmNvbQp8aHR0cDovLzgtZC5j -b20KODVjYy5uZXQKfGh0dHA6Ly84NXN0LmNvbQouODgxOTAzLmNvbS9wYWdlL3po -LXR3Lwp8fDg4MTkwMy5jb20KLjg4OC5jb20KLjg4OHBva2VyLmNvbQo4OS02NC5v -cmcKfHw4OS02NC5vcmcKLjhuZXdzLmNvbS50dwouOHoxLm5ldAp8fDh6MS5uZXQK -LjkwMDE3MDAuY29tCnxodHRwOi8vOTA4dGFpd2FuLm9yZy8KfHw5MXBvcm4uY29t -Ci45MmNjYXYuY29tCi45OTEuY29tCnxodHRwOi8vOTkxLmNvbQouOTlidGdjMDEu -Y29tCnx8OTlidGdjMDEuY29tCi45OWNuLmluZm8KfGh0dHA6Ly85OWNuLmluZm8K -fHw5YmlzLmNvbQp8fDliaXMubmV0CgohLS0tLS0tLS0tLS0tLS0tLS0tLS1BQS0t -LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLnRpYmV0LmEuc2UKfGh0dHA6Ly90aWJl -dC5hLnNlCnx8YS1ub3JtYWwtZGF5LmNvbQphNS5jb20ucnUKfGh0dHA6Ly9hYW1h -Y2F1LmNvbQohLS18aHR0cDovL2NkbiouYWJjLmNvbS8KLmFiYy5jb20KLmFiY2hp -bmVzZS5jb20KLmFibHdhbmcuY29tCi5hYm9sdW93YW5nLmNvbQp8fGFib2x1b3dh -bmcuY29tCi5hYm91dGdmdy5jb20KLmFicy5lZHUKLmFjY2ltLm9yZwouYWNlcm9z -LWRlLWhpc3BhbmlhLmNvbQouYWNldnBuLmNvbQp8fGFjZXZwbi5jb20KLmFjZzE4 -Lm1lCnxodHRwOi8vYWNnMTgubWUKfHxhY2drai5jb20KYWN0aW1lcy5jb20uYXUK -YWN0aXZwbi5jb20KfHxhY3RpdnBuLmNvbQp8fGFjdWxvLnVzCnx8YWRkaWN0ZWR0 -b2NvZmZlZS5kZQouYWRlbGFpZGViYnMuY29tL2JicwouYWRwbC5vcmcuaGsKfGh0 -dHA6Ly9hZHBsLm9yZy5oawouYWR1bHQtc2V4LWdhbWVzLmNvbQp8fGFkdWx0LXNl -eC1nYW1lcy5jb20KYWR1bHRmcmllbmRmaW5kZXIuY29tCmFkdWx0a2VlcC5uZXQv -cGVlcHNob3cvbWVtYmVycy9tYWluLmh0bQp8fGFkdmFuc2NlbmUuY29tCnx8YWR2 -ZXJ0ZmFuLmNvbQouYWUub3JnCnx8YWVuaGFuY2Vycy5jb20KfHxhZi5taWwKLmFm -YW50aWJicy5jb20KfGh0dHA6Ly9hZmFudGliYnMuY29tCi5haS1rYW4ubmV0Cnx8 -YWkta2FuLm5ldAphaS13ZW4ubmV0Ci5haXBoLm5ldAp8fGFpcGgubmV0Cnx8YWly -Y29uc29sZS5jb20KfGh0dHA6Ly9kb3dubG9hZC5haXJjcmFjay1uZy5vcmcKLmFp -cnZwbi5vcmcKfHxhaXJ2cG4ub3JnCi5haXNleC5jb20KfHxhaXQub3JnLnR3CmFp -d2Vpd2VpLmNvbQouYWl3ZWl3ZWlibG9nLmNvbQp8fGFpd2Vpd2VpYmxvZy5jb20K -fHx3d3cuYWpzYW5kcy5jb20KCiEhLS0tQWthbWFpLS0tCnxodHRwczovL2ZiY2Ru -Ki5ha2FtYWloZC5uZXQvCmEyNDguZS5ha2FtYWkubmV0Cnx8YTI0OC5lLmFrYW1h -aS5uZXQKdm9hLTExLmFrYWNhc3QuYWthbWFpc3RyZWFtLm5ldAoKLmFrYWRlbWl5 -ZS5vcmcvdWcKfGh0dHA6Ly9ha2FkZW1peWUub3JnL3VnCnx8YWtpYmEtb25saW5l -LmNvbQp8fGFsLXFpbW1haC5uZXQKfHxhbGFib3V0LmNvbQouYWxhbmhvdS5jb20K -fGh0dHA6Ly9hbGFuaG91LmNvbQp8fGFsYXNiYXJyaWNhZGFzLm9yZwphbGV4bHVy -Lm9yZwp8fGFsZm9yYXR0di5uZXQKLmFsaGF5YXQuY29tCmFsaWVuZ3UuY29tCnx8 -YWxrYXNpci5jb20KfHxhbGxjb25uZWN0ZWQuY28KLmFsbGRyYXduc2V4LmNvbQp8 -fGFsbGRyYXduc2V4LmNvbQphbGxnaXJsc2FsbG93ZWQub3JnCmFsbGlhbmNlLm9y -Zy5oawouYWxsaW5mYS5jb20KfGh0dHA6Ly9hbGxpbmZhLmNvbQouYWxsamFja3Bv -dHNjYXNpbm8uY29tCnx8YWxsbW92aWUuY29tCi5hbHBoYXBvcm5vLmNvbQp8fGFs -dGVybmF0ZS10b29scy5jb20KYWx2aW5hbGV4YW5kZXIuY29tCmFsd2F5c2RhdGEu -Y29tCnx8YWx3YXlzZGF0YS5jb20KfHxhbHdheXNkYXRhLm5ldAouYWx3YXlzdnBu -LmNvbQp8fGFsd2F5c3Zwbi5jb20KfHxhbTczMC5jb20uaGsKYW1hem9uLmNvbS9Q -cmlzb25lci1TdGF0ZS1TZWNyZXQtSm91cm5hbC1QcmVtaWVyCmFtZWJsby5qcAp8 -fGFtZWJsby5qcAp3d3cxLmFtZXJpY2FuLmVkdS90ZWQvaWNlL3RpYmV0Cnx8YW1l -cmljYW5ncmVlbmNhcmQuY29tCnxodHRwOi8vd3d3LmFtZXJpY29ycHMuZ292Cnx8 -YW1pYmxvY2tlZG9ybm90LmNvbQouYW1pZ29iYnMubmV0Ci5hbWl0YWJoYWZvdW5k -YXRpb24udXMKfGh0dHA6Ly9hbWl0YWJoYWZvdW5kYXRpb24udXMKLmFtbmVzdHku -b3JnCnx8YW1uZXN0eS5vcmcKLmFtbmVzdHkudHcKLmFtbmVzdHl1c2Eub3JnCnx8 -YW1uZXN0eXVzYS5vcmcKLmFtbnllbWFjaGVuLm9yZwouYW1vaWlzdC5jb20KYW5u -YXRhbS5jb20vY2hpbmVzZQp8fGFuY2hvcmZyZWUuY29tCiEtLUdIUwp8fGFuY3Nj -b25mLm9yZwp8fGFuZGZhcmF3YXkubmV0Cnx8YW5kcm9pZC14ODYub3JnCmFuZ2Vs -ZmlyZS5jb20vaGkvaGF5YXNoaQp8fGFuZ3VsYXJqcy5vcmcKYW5pbWVjcmF6eS5u -ZXQKLmFuaW1lc2hpcHB1dWRlbi5jb20KYW5pc2NhcnR1am8uY29tCnx8YW5pc2Nh -cnR1am8uY29tCnx8YW5vYmlpLmNvbQouYW5vbnltaXR5bmV0d29yay5jb20KfHxh -bm9ueW1pdHluZXR3b3JrLmNvbQouYW5vbnltaXplci5jb20KYW5vbnRleHQuY29t -Ci5hbnBvcG8uY29tCi5hbnN3ZXJpbmctaXNsYW0ub3JnCnxodHRwOi8vd3d3LmFu -dGQub3JnCnx8YW50aG9ueWNhbHphZGlsbGEuY29tCi5hbnRpd2F2ZS5uZXQKfGh0 -dHA6Ly9hbnRpd2F2ZS5uZXQKLmFueXNleC5jb20KfGh0dHA6Ly9hbnlzZXguY29t -Cnx8YW9iby5jb20uYXUKLmFvZnJpZW5kLmNvbQp8aHR0cDovL2FvZnJpZW5kLmNv -bQouYW9mcmllbmQuY29tLmF1Ci5hb2ppYW8ub3JnCnx8YW9sY2hhbm5lbHMuYW9s -LmNvbQp2aWRlby5hb2wuY2EvdmlkZW8tZGV0YWlsCnZpZGVvLmFvbC5jby51ay92 -aWRlby1kZXRhaWwKdmlkZW8uYW9sLmNvbQp8fHZpZGVvLmFvbC5jb20KfHxzZWFy -Y2guYW9sLmNvbQp3d3cuYW9sbmV3cy5jb20KfHxhb21pd2FuZy5jb20KdmlkZW8u -YXAub3JnCi5hcGV0dWJlLmNvbQp8fGFwaWFyeS5pbwouYXBpZ2VlLmNvbQp8fGFw -aWdlZS5jb20KYXBrLWRsLmNvbQphcGtkbGVyLmNvbS9hcGsvdmlldwouYXBwZG93 -bmxvYWRlci5uZXQvQW5kcm9pZAphcGtwdXJlLmNvbQp8fGFwa3B1cmUuY29tCiEt -LXx8YXBwYW5uaWUuY29tCmFwcGxlZGFpbHkuY29tCnx8YXBwc29ja3MubmV0Cnx8 -YXBwc3RvLnJlCnx8YXJjaGl2ZXMuZ292CmFyY2hpdmUuaXMKfHxhcmNoaXZlLm9y -ZwouYXJjdG9zaWEuY29tCnxodHRwOi8vYXJjdG9zaWEuY29tCnx8YXJlY2EtYmFj -a3VwLm9yZwouYXJldGh1c2Euc3UKfHxhcmV0aHVzYS5zdQp8fGFybGluZ3RvbmNl -bWV0ZXJ5Lm1pbAp8fGFybXkubWlsCnx8YXJzdGVjaG5pY2EuY29tCi5hcnQ0dGli -ZXQxOTk4Lm9yZwphcnRzeS5uZXQKfHxhc2FjcC5vcmcKLmFzYWhpY2hpbmVzZS5j -b20KfHxhc2FoaWNoaW5lc2UuY29tCmFzZGZnLmpwL2RhYnIKYXNnLnRvCnxodHRw -Oi8vamFwYW5maXJzdC5hc2lhbmZyZWVmb3J1bS5jb20vCi5hc2lhaGFydmVzdC5v -cmcKfHxhc2lhaGFydmVzdC5vcmcKYXNpYW5ld3MuaXQKfHxhc2lhbnNleGRpYXJ5 -LmNvbQp8fGFzaWFud29tZW5zZmlsbS5kZQouYXNpYXRncC5jb20KfHxhc2tzdHVk -ZW50LmNvbQouYXNreW56Lm5ldAp8fGFza3luei5uZXQKfHxhc3NlbWJsYS5jb20K -fHxhc3Rvbm1hcnRpbm5ld3MuY29tCnx8YXN0cmlsbC5jb20KfHxhdGMub3JnLmF1 -Ci5hdGNoaW5lc2UuY29tCnxodHRwOi8vYXRjaGluZXNlLmNvbQphdGdmdy5vcmcK -fHxhdGoub3JnLnR3Ci5hdGxhc3Bvc3QuY29tCnx8YXRsYXNwb3N0LmNvbQp8fGF0 -ZG10LmNvbQouYXRuZXh0LmNvbQp8fGF0bmV4dC5jb20KYXZhYXoub3JnCnx8YXZh -YXoub3JnCiEtLXx8YXZhc3QuY29tCi5hdmNpdHkudHYKLmF2Y29vbC5jb20KLmF2 -ZGIuaW4KfHxhdmRiLmluCi5hdmRiLnR2Cnx8YXZkYi50dgouYXZmYW50YXN5LmNv -bQp8fGF2aWRlbXV4Lm9yZwp8fGF2b2lzaW9uLmNvbQouYXZ5YWhvby5jb20KfHxh -eHVyZWZvcm1hYy5jb20KLmF6ZXJiYXljYW4udHYKYXplcmltaXguY29tCiEtLWJv -eHVuLmF6dXJld2Vic2l0ZXMubmV0IGRvZXNuJ3QgZXhpc3QuCmJveHVuKi5henVy -ZXdlYnNpdGVzLm5ldAp8fGJveHVuKi5henVyZXdlYnNpdGVzLm5ldAoKIS0tLS0t -LS0tLS0tLS0tLS0tLS0tQkItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmZvcnVt -LmJhYnkta2luZ2RvbS5jb20KYmFieW5ldC5jb20uaGsKYmFja2NoaW5hLmNvbQp8 -fGJhY2tjaGluYS5jb20KLmJhY2twYWNrZXJzLmNvbS50dy9mb3J1bQpiYWNrdG90 -aWFuYW5tZW4uY29tCi5iYWRqb2pvLmNvbQpiYWRvby5jb20KfGh0dHA6Ly8qMi5i -YWhhbXV0LmNvbS50dwp8fGJhaWR1LmpwCnx8YmFpbGFuZGFpbHkuY29tCnx8YmFp -eGluZy5tZQouYmFuYW5hLXZwbi5jb20KfHxiYW5hbmEtdnBuLmNvbQouYmFuZ2No -ZW4ubmV0CnxodHRwOi8vYmFuZ2NoZW4ubmV0Cnx8YmFuZ3lvdWxhdGVyLmNvbQpi -YW5uZWRib29rLm9yZwp8fGJhbm5lZGJvb2sub3JnCi5iYW5uZWRuZXdzLm9yZwou -YmFyZW5ha2VkaXNsYW0uY29tCnx8YmFybmFidS5jby51awpiYXJ0dnBuLmNvbQpi -YXl2b2ljZS5uZXQKfHxiYXl2b2ljZS5uZXQKZGFqdXNoYS5iYXl3b3Jkcy5jb20K -fHxiYmNoYXQudHYKfHxiYi1jaGF0LnR2Ci5iYmMuY28udWsvY2hpbmVzZQouYmJj -LmNvLnVrL25ld3Mvd29ybGQtYXNpYS1jaGluYQouYmJjLmNvLnVrL3R2Ci5iYmMu -Y28udWsvemhvbmd3ZW4KLmJiYy5jb20vemhvbmd3ZW4KbmV3cy5iYmMuY28udWsv -b250aGlzZGF5Km5ld3NpZF8yNDk2MDAwLzI0OTYyNzcKbmV3c2ZvcnVtcy5iYmMu -Y28udWsKLmJiY2NoaW5lc2UuY29tCnx8YmJjY2hpbmVzZS5jb20KfGh0dHA6Ly9i -YmMuaW4KLmJiZy5nb3YKLmJia3ouY29tL2ZvcnVtCi5iYm5yYWRpby5vcmcKYmJz -LXR3LmNvbQouYmJzZGlnZXN0LmNvbS90aHJlYWQKfHxiYnNmZWVkLmNvbQpiYnNs -YW5kLmNvbQouYmJzbW8uY29tCi5iYnNvbmUuY29tCmJidG95c3RvcmUuY29tCi5i -Y2FzdC5jby5uegouYmNjLmNvbS50dy9ib2FyZAouYmNjaGluZXNlLm5ldAouYmNt -b3JuaW5nLmNvbQpiZHNtdmlkZW9zLm5ldAouYmVhY29uZXZlbnRzLmNvbQouYmVi -by5jb20KfHxiZWJvLmNvbQouYmVldnBuLmNvbQp8fGJlZXZwbi5jb20KLmJlaGlu -ZGtpbmsuY29tCnx8YmVpamluZzE5ODkuY29tCmJlaWppbmdzcHJpbmcuY29tCnx8 -YmVpamluZ3NwcmluZy5jb20KLmJlbGFtaW9ubGluZS5jb20KYmVteXdpZmUuY2MK -YmVyaWMubWUKLmJlcmxpbnR3aXR0ZXJ3YWxsLmNvbQp8fGJlcmxpbnR3aXR0ZXJ3 -YWxsLmNvbQouYmVybS5jby5uegouYmVzdGZvcmNoaW5hLm9yZwp8fGJlc3Rmb3Jj -aGluYS5vcmcKfHxiZXN0dnBuLmNvbQouYmVzdHZwbnNlcnZlci5jb20KLmJlc3R2 +W0F1dG9Qcm94eSAwLjIuOV0KISBDaGVja3N1bTogYk1zbU53UENncXZCRjJzWGZu +Y2xoZwohIEV4cGlyZXM6IDZoCiEgVGl0bGU6IEdGV0xpc3Q0TEwKISBHRldMaXN0 +IHdpdGggRVZFUllUSElORyBpbmNsdWRlZAohIExhc3QgTW9kaWZpZWQ6IFNhdCwg +MjIgU2VwIDIwMTggMTc6MjE6NDcgLTA0MDAKIQohIEhvbWVQYWdlOiBodHRwczov +L2dpdGh1Yi5jb20vZ2Z3bGlzdC9nZndsaXN0CiEgTGljZW5zZTogaHR0cHM6Ly93 +d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvbGdwbC0yLjEudHh0CiEK +ISBHRldMaXN0IGlzIHVubGlrZWx5IHRvIGZ1bGx5IGNvbXByaXNlIHRoZSByZWFs +CiEgcnVsZXMgYmVpbmcgZGVwbG95ZWQgaW5zaWRlIEdGVyBzeXN0ZW0uIFdlIHRy +eQohIG91ciBiZXN0IHRvIGtlZXAgdGhlIGxpc3QgdXAgdG8gZGF0ZS4gUGxlYXNl +CiEgY29udGFjdCB1cyByZWdhcmRpbmcgVVJMIHN1Ym1pc3Npb24gLyByZW1vdmFs +LAohIG9yIHN1Z2dlc3Rpb24gLyBlbmhhbmNlbWVudCBhdCBpc3N1ZSB0cmFja2Vy +OgohIGh0dHBzOi8vZ2l0aHViLmNvbS9nZndsaXN0L2dmd2xpc3QvaXNzdWVzLy4K +CiEtLS0tLS0tLS00MDMvNDUxLzUyMCAmIFVSTCBSZWRpcmVjdHMtLS0tLS0tLS0K +IS0tZWhlbnRhaQp8aHR0cDovLzg1LjE3LjczLjMxLwohLS18fGFkb3JhbWEuY29t +Cnx8YWduZXNiLmZyCnx8YWtpYmEtd2ViLmNvbQp8fGFsdHJlYy5jb20KfHxhcGFy +dG1lbnRyYXRpbmdzLmNvbQp8fGFwYXJ0bWVudHMuY29tCnx8YXJlbmEudGFpcGVp +Cnx8YXNpYW5zcGlzcy5jb20KfHxhc3NpbXAub3JnCnx8YXRoZW5hZWl6b3UuY29t +Cnx8YXp1YnUudHYKfHxiYW5rbW9iaWxldmliZS5jb20KfHxiYW5vcnRlLmNvbQp8 +fGJhc2gtaGFja2Vycy5vcmcKfHxiZWVnLmNvbQp8fGdsb2JhbC5iaW5nLmNvbQp8 +fGJsb29tYmVyZ3ZpZXcuY29tCnx8Ym9va3RvcGlhLmNvbS5hdQp8fGJveXNtYXN0 +ZXIuY29tCnx8YnluZXQuY28uaWwKfHxjYXJmYXguY29tCi5jYXNpbm9iZWxsaW5p +LmNvbQp8fGNhc2lub2JlbGxpbmkuY29tCnx8Y2VudGF1cm8uY29tLmJyCnx8Y2hv +Yml0LmNjCnx8Y2xlYXJzdXJhbmNlLmNvbQp8fGltYWdlcy5jb21pY28udHcKfHxz +dGF0aWMuY29taWNvLnR3Cnx8Y29zdGNvLmNvbQp8fGNyb3NzZmlyZS5jby5rcgp8 +fGQycGFzcy5jb20KfHxkYXJwYS5taWwKfHxkYXdhbmdpZGMuY29tCnx8ZGVlemVy +LmNvbQp8fGRlc2lwcm8uZGUKfHxkaW5nY2hpbi5jb20udHcKfHxkaXNjb3JkYXBw +LmNvbQp8fGRpc2NvcmRhcHAubmV0Cnx8ZGlzaC5jb20KfGh0dHA6Ly9pbWcuZGxz +aXRlLmpwLwp8fGRtNTMwLm5ldApzaGFyZS5kbWh5Lm9yZwpAQHxodHRwczovL3No +YXJlLmRtaHkub3JnCnx8ZG1tLmNvLmpwCnxodHRwOi8vd3d3LmRtbS5jb20vbmV0 +Z2FtZQp8fGRudm9kLnR2Cnx8ZHZkcGFjLmNvbQp8fGVlc3RpLmVlCnx8ZXN1cmFu +Y2UuY29tCi5leHBla3QuY29tCnx8ZXhwZWt0LmNvbQouZXh0bWF0cml4LmNvbQp8 +fGV4dG1hdHJpeC5jb20KfHxmYWtrdS5uZXQKfHxmYXN0cGljLnJ1Cnx8ZmlsZXNv +ci5jb20KfHxmaW5hbmNldHdpdHRlci5jb20KfHxmbGlwYm9hcmQuY29tCnx8Zmxp +dHRvLmNvbQp8fGZuYWMuYmUKfHxmbmFjLmNvbQp8fGZ1bmt5aW1nLmNvbQp8fGZ4 +bmV0d29ya3MuY29tCnx8Zy1hcmVhLm9yZwp8fGdldHR5aW1hZ2VzLmNvbQp8fGdl +dHVwbG9hZGVyLmNvbQohLS18aHR0cHM6Ly9naXRodWIuY29tL3Byb2dyYW10aGlu +ay96aGFvCnxodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vcHJvZ3Jh +bXRoaW5rL3poYW8KfHxnbGFzczguZXUKfHxnbHlwZS5jb20KfHxnbzE0MS5jb20K +fHxndW8ubWVkaWEKfHxoYXV0ZWxvb2suY29tCnx8aGF1dGVsb29rY2RuLmNvbQp8 +fHdlZ28uaGVyZS5jb20KfHxobXZkaWdpdGFsLmNhCnx8aG12ZGlnaXRhbC5jb20K +fHxob21lZGVwb3QuY29tCnx8aG9vdmVycy5jb20KfHxodWx1LmNvbQp8fGh1bHVp +bS5jb20KfGh0dHA6Ly9zZWN1cmUuaHVzdGxlci5jb20KfGh0dHA6Ly9odXN0bGVy +Y2FzaC5jb20KfGh0dHA6Ly93d3cuaHVzdGxlcmNhc2guY29tCnx8aHlicmlkLWFu +YWx5c2lzLmNvbQp8fGNkbiouaS1zY21wLmNvbQp8fGlsb3ZlbG9uZ3RvZXMuY29t +CnxodHRwOi8vaW1nbWVnYS5jb20vKi5naWYuaHRtbAp8aHR0cDovL2ltZ21lZ2Eu +Y29tLyouanBnLmh0bWwKfGh0dHA6Ly9pbWdtZWdhLmNvbS8qLmpwZWcuaHRtbAp8 +aHR0cDovL2ltZ21lZ2EuY29tLyoucG5nLmh0bWwKfGh0dHA6Ly9pbWd1ci5jb20v +dXBsb2FkCnxodHRwczovL2ltZ3VyLmNvbS91cGxvYWQKfHxpbWxpdmUuY29tCnx8 +amF2aHViLm5ldAp8fGphdmh1Z2UuY29tCi5qYXZsaWJyYXJ5LmNvbQp8fGphdmxp +YnJhcnkuY29tCnx8amNwZW5uZXkuY29tCnx8amltcy5uZXQKfHxqdWt1am8tY2x1 +Yi5jb20KfHxqdWxpZXBvc3QuY29tCnx8a2F3YWlpa2F3YWlpLmpwCnx8a2VuZGF0 +aXJlLmNvbQp8fGtoYXRyaW1hemEub3JnCnx8a2tib3guY29tCnx8bGVpc3VyZXBy +by5jb20KfHxsaWZlbWlsZXMuY29tCnx8bG9uZ3RvZXMuY29tCnx8bG92ZXR2c2hv +dy5jb20KfGh0dHA6Ly93d3cubS1zcG9ydC5jby51awp8fG1hY2dhbWVzdG9yZS5j +b20KfHxtYWRvbm5hLWF2LmNvbQp8fG1hbmdhZm94LmNvbQp8fG1hbmdhZm94Lm1l +Cnx8bWFudGEuY29tCnx8bWF0b21lLXBsdXMuY29tCnx8bWF0b21lLXBsdXMubmV0 +Cnx8bWF0dHdpbGNveC5uZXQKfHxtZXRhcnRodW50ZXIuY29tCnx8bWZ4bWVkaWEu +Y29tCnx8a2IubW9uaXRvcndhcmUuY29tCnx8bW9uc3Rlci5jb20KfHxtb29keXou +Y29tCnx8bW9vbmJpbmdvLmNvbQp8fG1vcy5ydQp8fG1zaGEuZ292Cnx8bXV6dS50 +dgp8fG12Zy5qcAoubXliZXQuY29tCnx8bXliZXQuY29tCnx8bmF0aW9ud2lkZS5j +b20KfGh0dHA6Ly93d3cubmJjLmNvbS9saXZlCnx8bmVvLW1pcmFjbGUuY29tCnx8 +bmV0ZmxpeC5jb20KfHxuZmx4aW1nLmNvbQp8fG5mbHhpbWcubmV0Cnx8bmZseGV4 +dC5jb20KfHxuZmx4c28ubmV0Cnx8bmZseHZpZGVvLm5ldAp8fG5pYy5nb3YKfGh0 +dHA6Ly9tby5uaWdodGxpZmUxNDEuY29tCnx8bm9yZHN0cm9tLmNvbQp8fG5vcmRz +dHJvbWltYWdlLmNvbQp8fG5vcmRzdHJvbXJhY2suY29tCnx8bm90dGluZ2hhbXBv +c3QuY29tCnx8bnRkdHYuY3oKfHxzMS5udWRlenouY29tCnx8bnVzYXRyaXAuY29t +Cnx8bnV1dmVtLmNvbQp8fG9tbmk3LmpwCnx8b25hcHAuY29tCiEtLVdlIGFyZSBj +b25mdXNlZCBhcyB3ZWxsCnx8b250cmFjLmNvbQpAQHxodHRwOi8vYmxvZy5vbnRy +YWMuY29tCnx8cGFuZG9yYS5jb20KLnBhbmRvcmEudHYKfHxwYXJrYW5za3kuY29t +Cnx8cGhtc29jaWV0eS5vcmcKfGh0dHA6Ly8qLnBpbWcudHcvCnx8cHVyZTE4LmNv +bQp8fHB5dG9yY2gub3JnCnx8cXEuY28uemEKfHxyMTguY29tCnxodHRwOi8vcmFk +aWtvLmpwCnx8cmFtY2l0eS5jb20uYXUKfHxyZC5jb20KfHxyZGlvLmNvbQp8aHR0 +cHM6Ly9yaXNldXAubmV0Cnx8c2FkaXN0aWMtdi5jb20KfGh0dHA6Ly9jZG4qLnNl +YXJjaC54eHgvCnx8c2hpa3NoYS5jb20KfHxzbGFja2VyLmNvbQp8fHNtLW1pcmFj +bGUuY29tCnx8c295bGVudG5ld3Mub3JnCnx8c3BvdGlmeS5jb20KfHxzcHJlYWRz +aGlydC5lcwp8fHNwcmluZ2JvYXJkcGxhdGZvcm0uY29tCnx8c3ByaXRlLm9yZwpA +QHxodHRwOi8vc3RvcmUuc3ByaXRlLm9yZwp8fHN1cGVyb2theWFtYS5jb20KfHxz +dXBlcnBhZ2VzLmNvbQp8fHN3YWdidWNrcy5jb20KfHxzd2l0Y2gxLmpwCnx8dGFw +YW53YXAuY29tCnx8Z3NwLnRhcmdldC5jb20KfHxsb2dpbi50YXJnZXQuY29tCiEt +LUBAfHxpbnRsLnRhcmdldC5jb20KfHxyY2FtLnRhcmdldC5jb20KfHx0aGVib2R5 +c2hvcC11c2EuY29tCnx8dG1hLmNvLmpwCnx8dHJhY2ZvbmUuY29tCnx8dHJ5aGVh +cnQuanAKfHx0dXJudGFibGUuZm0KfHx0d2Vya2luZ2J1dHQuY29tCnx8dWxvcC5u +ZXQKfHx2ZWdhc3JlZC5jb20KfHx2ZXZvLmNvbQp8fHZpcC1lbnRlcnByaXNlLmNv +bQp8aHR0cDovL3ZpdS50di9jaC8KfGh0dHA6Ly92aXUudHYvZW5jb3JlLwp8fHZt +cHNvZnQuY29tCnxodHRwOi8vZWNzbS52cy5jb20vCnx8d2Fuei1mYWN0b3J5LmNv +bQp8fHNzbC53ZWJwYWNrLmRlCnx8d2hlcmV0b3dhdGNoLmNvbQp8fHdpbmdhbWVz +dG9yZS5jb20KfHx3aXpjcmFmdHMubmV0Cnx8dm9kLnd3ZS5jb20KfHx4ZmluaXR5 +LmNvbQp8fHlvdXdpbi5jb20KfHx5dG4uY28ua3IKfHx6YXR0b28uY29tCnx8emlt +LnZuCnx8em96b3Rvd24uY29tCgohIyMjIyMjIyMjIyMjIyNHZW5lcmFsIExpc3Qg +U3RhcnQjIyMjIyMjIyMjIyMjIyMKIS0tLS0tLS0tLS0tLS0tLS0tLS1QdXJlIElQ +LS0tLS0tLS0tLS0tLS0tLS0tLS0tCnx8MS4xLjEuMQoxNC4xMDIuMjUwLjE4CjE0 +LjEwMi4yNTAuMTkKNTAuNy4zMS4yMzA6ODg5OAoxNzQuMTQyLjEwNS4xNTMKNjku +NjUuMTkuMTYwCgohLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUlETi0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0KfHx4bi0tNGdxMTcxcC5jb20KfHx4bi0tY3pxNzVwdnYxYWo1 +Yy5vcmcKfHx4bi0taTJydThxMnFnLmNvbQp8fHhuLS1vaXEuY2MKfHx4bi0tcDhq +OWEwZDljOWEueG4tLXE5anliNGMKCiEtLS0tLS0tLS0tLS0tLS0tLUROUyBQb2lz +b25pbmctLS0tLS0tLS0tLS0tLS0tLQohLS0tQW1hem9uLS0tCiEtfHxjZG4taW1h +Z2VzLm1haWxjaGltcC5jb20KfGh0dHBzOi8vKi5zMy5hbWF6b25hd3MuY29tCnx8 +czMtYXAtc291dGhlYXN0LTIuYW1hem9uYXdzLmNvbQoKfHxhZ3JvLmhrCnx8YXBr +bWlycm9yLmNvbQp8fGJpcmQuc28KfHxidXNpbmVzc2luc2lkZXIuY29tCnx8Ym9v +bXNzci5jb20KfHxjYXN0Ym94LmZtCnx8Y21jbi5vcmcKfHxjbXguaW0KfHxkZXBv +c2l0cGhvdG9zLmNvbQp8fGZhbmdlcWlhbmcuY29tCnx8Zmx5enkyMDA1LmNvbQp8 +fGZyZWUtc3Muc2l0ZQp8fGJsb2cuZnVja2dmdzIzMy5vcmcKfHxnbG9iYWx2b2lj +ZXMub3JnCnx8Z2xvcnlzdGFyLm1lCnx8aGJvLmNvbQp8fGlwZnMuaW8KfHxqYXBh +bnRpbWVzLmNvLmpwCnx8amlqaS5jb20KfHxqaW54LmNvbQp8fGxpbmUtc2Nkbi5u +ZXQKfHxpLmxpdGhpdW0uY29tCnx8Y2xvdWQubWFpbC5ydQp8fGNkbi1pbWFnZXMu +bWFpbGNoaW1wLmNvbQp8fG1vaHUuY2x1Ygp8fG1vaHUubWwKfHxtYXN0b2Rvbi5o +b3N0Cnx8ZGljdGlvbmFyeS5nb28ubmUuanAKfHxnby5uZXNub2RlLmNvbQp8fG5p +a2tlaS5jb20KfHxub2ZpbGUuaW8KfHxub3cuY29tCnx8c3VrZWJlaS5ueWFhLnNp +Cnx8b25lamF2LmNvbQp8fHBhc3RlLmVlCnx8bXkucGNsb3VkLmNvbQp8fHBpY2Fj +b21pYy5jb20KfHxwaXhpdi5uZXQKfHxwcm90b252cG4uY29tCnx8cXVvcmEuY29t +Cnx8Y2RuLnNlYXRndXJ1LmNvbQp8fHNlY3VyZS5yYXhjZG4uY29tCnx8cmVkZC5p +dAp8fHJlZGRpdC5jb20KfHxyZWRkaXRtZWRpYS5jb20KfHxyZWRkaXRzdGF0aWMu +Y29tCnx8cnNkbG1vbml0b3IuY29tCnx8c2hhZG93c29ja3MuYmUKfHxzaGFkb3dz +b2NrczkuY29tCnx8dG4xLnNoZW1hbGV6LmNvbQp8fHRuMi5zaGVtYWxlei5jb20K +fHx0bjMuc2hlbWFsZXouY29tCnx8c3RhdGljLnNoZW1hbGV6LmNvbQp8fHNvc3Jl +YWRlci5jb20KfHxzdWxpYW4ubWUKfHxzdXBjaGluYS5jb20KfHx0ZWRkeXN1bi5j +b20KfHx0ZXh0bm93Lm1lCnx8dGluZXllLmNvbQp8fHR1YmVwb3JuY2xhc3NpYy5j +b20KfHx0d2l0Y2gudHYKfHx1a3UuaW0KfHx1bnNlZW4uaXMKfHxjbi51cHRvZG93 +bi5jb20KfHx1cmFiYW4ubWUKfHx2cnNtYXNoLmNvbQp8fHNjYWNoZS52encuY29t +Cnx8c2NhY2hlMS52encuY29tCnx8c2NhY2hlMi52encuY29tCnx8c3M3LnZ6dy5j +b20KfHx3ZW56aGFvLmNhCnx8d2hhdHNvbndlaWJvLmNvbQp8fHdpcmUuY29tCnx8 +eG0uY29tCnx8eHVlaHVhLnVzCgohLS0tRGlnaXRhbCBDdXJyZW5jeSBFeGNoYW5n +ZShDUllQVE8pLS0tCnx8YWxsY29pbi5jb20KfHxhZGNleC5jb20KfHxiY2V4LmNh +Cnx8Ymlib3guY29tCnx8YmlnLm9uZQp8fGJpbmFuY2UuY29tCnx8Yml0LXouY29t +Cnx8Yml0Y29pbndvcmxkLmNvbQp8fGJpdGZpbmV4LmNvbQp8fGJpdGlua2EuY29t +LmFyCnx8Yml0bWV4LmNvbQp8fGJ0Y2JhbmsuYmFuawp8fGJ0Y3RyYWRlLmltCnx8 +YzJjeC5jb20KfHxjaGFvZXguY29tCnx8Y29pbjJjby5pbgouY29pbmVnZy5jb20K +fHxjb2luZWdnLmNvbQp8fGNvaW5leC5jb20KIS0tfGh0dHBzOi8vd3d3LmNvaW5l +eGNoYW5nZS5pby8KfHxjb2luZ2kuY29tCnx8Y29pbnJhaWwuY28ua3IKfHxjb2lu +dG9iZS5jb20KfHxjb2ludXQuY29tCnx8ZGlzY29pbnMuY29tCnx8ZHJhZ29uZXgu +aW8KfHxlYnRjYmFuay5jb20KfHxldGhlcmRlbHRhLmNvbQp8fGV4bW8uY29tCnx8 +ZXhyYXRlcy5tZQp8fGV4eC5jb20KfHxmYXRidGMuY29tCnx8Z2F0ZS5pbwp8fGdh +dGVjb2luLmNvbQp8fGhpdGJ0Yy5jb20KfHxodW9iaS5jb20KfHxodW9iaS5wcm8K +fHxodW9iaXByby5jb20KfHxieC5pbi50aAp8fGpleC5jb20KfHxrZXguY29tCnx8 +a3NwY29pbi5jb20KfHxrdWNvaW4uY29tCnx8bGJhbmsuaW5mbwp8fGxpdmVjb2lu +Lm5ldAp8fG9leC5jb20KfHxva2V4LmNvbQp8fHJpZ2h0YnRjLmNvbQp8fHRvcGJ0 +Yy5jb20KfHx4YnRjZS5jb20KfHx5b2JpdC5uZXQKfHx6Yi5jb20KCiEtLS0tLS0t +LS0tLS0tLS0tRnJhdWRzICYgU2NhbXMtLS0tLS0tLS0tLS0tLS0tLQohIS0tLUNv +bnRlbnQgRmFybShmYWtlIDUwMCBlcnJvciktLS0KfHxyZWFkMDEuY29tCnx8a2tu +ZXdzLmNjCgpjaGluYS1tbW0uanAubmV0Ci5sc3hzenpnLmNvbQouY2hpbmEtbW1t +Lm5ldAp8fGNoaW5hLW1tbS5uZXQKY2hpbmEtbW1tLnNhLmNvbQoKIS0tLS0tLS0t +LS0tLS0tLS0tLS0tLUdyb3Vwcy0tLS0tLS0tLS0tLS0tLS0tLS0tCiEhLS0tQWZy +YWlkIEZyZWVETlMtLS0KLmFsbG93ZWQub3JnCi5ub3cuaW0KCiEhLS0tQW1hem9u +LS0tCnx8YW1hem9uLmNvLmpwCi5hbWF6b24uY29tL0RhbGFpLUxhbWEKYW1hem9u +LmNvbS9Qcmlzb25lci1TdGF0ZS1TZWNyZXQtSm91cm5hbC1QcmVtaWVyCnMzLWFw +LW5vcnRoZWFzdC0xLmFtYXpvbmF3cy5jb20KCiEhLS0tQU9MLS0tCnx8YW9sY2hh +bm5lbHMuYW9sLmNvbQp2aWRlby5hb2wuY2EvdmlkZW8tZGV0YWlsCnZpZGVvLmFv +bC5jby51ay92aWRlby1kZXRhaWwKdmlkZW8uYW9sLmNvbQp8fHZpZGVvLmFvbC5j +b20KfHxzZWFyY2guYW9sLmNvbQp3d3cuYW9sbmV3cy5jb20KCiEhLS0tQXZNb28t +LS0KLmF2bW8ucHcKIS0tfGh0dHA6Ly9hdm1vLnB3Ci5hdm1vby5jb20KfGh0dHA6 +Ly9hdm1vby5jb20KLmF2bW9vLm5ldAp8aHR0cDovL2F2bW9vLm5ldAp8fGF2bW9v +LnB3Ci5qYXZtb28ueHl6CnxodHRwOi8vamF2bW9vLnh5egouamF2dGFnLmNvbQp8 +aHR0cDovL2phdnRhZy5jb20KLmphdnpvby5jb20KfGh0dHA6Ly9qYXZ6b28uY29t +Ci50ZWxsbWUucHcKCiEhLS0tQkJDLS0tCiEtLS5iYmMuY28udWsvYmxvZ3MKIS0t +LmJiYy5jby51ay9jaGluZXNlCiEtLS5iYmMuY28udWsvbmV3cy93b3JsZC1hc2lh +LWNoaW5hCiEtLS5iYmMuY28udWsvdHYKIS0tLmJiYy5jby51ay96aG9uZ3dlbgoh +LS0uYmJjLmNvbS91a2NoaW5hCiEtLS5iYmMuY29tL3pob25nd2VuCiEtLS5iYmMu +Y29tJTJGemhvbmd3ZW4KIS0tbmV3cy5iYmMuY28udWsvb250aGlzZGF5Km5ld3Np +ZF8yNDk2MDAwLzI0OTYyNzcKIS0tbmV3c2ZvcnVtcy5iYmMuY28udWsKLmJiYy5j +b20KfHxiYmMuY29tCi5iYmMuY28udWsKfHxiYmMuY28udWsKfHxiYmNpLmNvLnVr +Ci5iYmNjaGluZXNlLmNvbQp8fGJiY2NoaW5lc2UuY29tCnxodHRwOi8vYmJjLmlu +CgohIS0tLUNoYW5nZUlQLS0tCi4xZHVtYi5jb20KLjI1dS5jb20KLjJ3YWt5LmNv +bQouMy1hLm5ldAouNGRxLmNvbQouNG15ZG9tYWluLmNvbQouNHB1LmNvbQouYWNt +ZXRveS5jb20KLmFsbW9zdG15LmNvbQouYW1lcmljYW51bmZpbmlzaGVkLmNvbQou +YXV0aG9yaXplZGRucy5uZXQKLmF1dGhvcml6ZWRkbnMub3JnCi5hdXRob3JpemVk +ZG5zLnVzCi5iaWdtb25leS5iaXoKLmNoYW5nZWlwLm5hbWUKLmNoYW5nZWlwLm5l +dAouY2hhbmdlaXAub3JnCi5jbGVhbnNpdGUuYml6Ci5jbGVhbnNpdGUuaW5mbwou +Y2xlYW5zaXRlLnVzCi5jb21wcmVzcy50bwouZGRucy5pbmZvCi5kZG5zLm1lLnVr +Ci5kZG5zLm1vYmkKLmRkbnMubXMKLmRkbnMubmFtZQouZGRucy51cwouZGhjcC5i +aXoKLmRucy1kbnMuY29tCi5kbnMtc3R1ZmYuY29tCi5kbnMwNC5jb20KLmRuczA1 +LmNvbQouZG5zMS51cwouZG5zMi51cwouZG5zZXQuY29tCi5kbnNyZC5jb20KLmRz +bXRwLmNvbQouZHVtYjEuY29tCi5keW5hbWljLWRucy5uZXQKLmR5bmFtaWNkbnMu +Yml6Ci5keW5hbWljZG5zLmNvLnVrCi5keW5hbWljZG5zLm1lLnVrCi5keW5hbWlj +ZG5zLm9yZy51awouZHluZG5zLnBybwouZHluc3NsLmNvbQouZWRucy5iaXoKLmVw +YWMudG8KLmVzbXRwLmJpegouZXp1YS5jb20KLmZhcXNlcnYuY29tCi5mYXJ0aXQu +Y29tCi5mcmVlZGRucy5jb20KLmZyZWV0Y3AuY29tCi5mcmVld3d3LmJpegouZnJl +ZXd3dy5pbmZvCi5mdHAxLmJpegouZnRwc2VydmVyLmJpegouZ2V0dHJpYWxzLmNv +bQouZ290LWdhbWUub3JnCi5ncjhkb21haW4uYml6Ci5ncjhuYW1lLmJpegouaHR0 +cHM0NDMubmV0Ci5odHRwczQ0My5vcmcKLmlrd2IuY29tCi5pbnN0YW50aHEuY29t +Ci5pb3dueW91ci5iaXoKLmlvd255b3VyLm9yZwouaXNhc2VjcmV0LmNvbQouaXRl +bWRiLmNvbQouaXRzYW9sLmNvbQouamV0b3MuY29tCi5qa3ViLmNvbQouanVuZ2xl +aGVhcnQuY29tCi5qdXN0ZGllZC5jb20KLmxmbGluay5jb20KLmxmbGlua3VwLmNv +bQoubGZsaW5rdXAubmV0Ci5sZmxpbmt1cC5vcmcKLmxvbmdtdXNpYy5jb20KLm1l +Zm91bmQuY29tCi5tb25leWhvbWUuYml6Ci5tcmJhc2ljLmNvbQoubXJib251cy5j +b20KLm1yZmFjZS5jb20KLm1yc2xvdmUuY29tCi5teTAzLmNvbQoubXlkYWQuaW5m +bwoubXlkZG5zLmNvbQoubXlmdHAuaW5mbwoubXlmdHAubmFtZQoubXlsZnR2LmNv +bQoubXltb20uaW5mbwoubXluZXRhdi5uZXQKLm15bmV0YXYub3JnCi5teW51bWJl +ci5vcmcKLm15cGljdHVyZS5pbmZvCi5teXBvcDMubmV0Ci5teXBvcDMub3JnCi5t +eXNlY29uZGFyeWRucy5jb20KLm15d3d3LmJpegoubXl6LmluZm8KLm5pbnRoLmJp +egoubnMwMS5iaXoKLm5zMDEuaW5mbwoubnMwMS51cwoubnMwMi5iaXoKLm5zMDIu +aW5mbwoubnMwMi51cwoubnMxLm5hbWUKLm5zMi5uYW1lCi5uczMubmFtZQoub2Ny +eS5jb20KLm9uZWR1bWIuY29tCi5vbm15cGMuYml6Ci5vbm15cGMuaW5mbwoub25t +eXBjLm5ldAoub25teXBjLm9yZwoub25teXBjLnVzCi5vcmdhbmljY3JhcC5jb20K +Lm90em8uY29tCi5vdXJob2JieS5jb20KLnBjYW55d2hlcmUubmV0Ci5wb3J0MjUu +Yml6Ci5wcm94eWRucy5jb20KLnFoaWdoLmNvbQoucXBvZS5jb20KLnJlYmF0ZXNy +dWxlLm5ldAouc2VsbGNsYXNzaWNzLmNvbQouc2VuZHNtdHAuY29tCi5zZXJ2ZXVz +ZXIuY29tCi5zZXJ2ZXVzZXJzLmNvbQouc2V4aWR1ZGUuY29tCi5zZXh4eHkuYml6 +Ci5zaXh0aC5iaXoKLnNxdWlybHkuaW5mbwouc3NsNDQzLm9yZwoudG9oLmluZm8K +LnRveXRoaWV2ZXMuY29tCi50cmlja2lwLm5ldAoudHJpY2tpcC5vcmcKLnZpenZh +ei5jb20KLndoYS5sYQoud2lrYWJhLmNvbQoud3d3MS5iaXoKLnd3d2hvc3QuYml6 +CkBAfGh0dHA6Ly94eC53d3dob3N0LmJpegoueDI0aHIuY29tCi54eHV6LmNvbQou +eHh4eS5iaXoKLnh4eHkuaW5mbwoueWd0by5jb20KLnlvdWRvbnRjYXJlLmNvbQou +eW91cnRyYXAuY29tCi56eW5zLmNvbQouenp1eC5jb20KCiEhLS0tQ2xvdWRGcm9u +dC0tLQpkMWIxODNzZzBudm51aC5jbG91ZGZyb250Lm5ldAp8aHR0cHM6Ly9kMWIx +ODNzZzBudm51aC5jbG91ZGZyb250Lm5ldApkMWMzN2dqd2EyNnRhYS5jbG91ZGZy +b250Lm5ldAp8aHR0cHM6Ly9kMWMzN2dqd2EyNnRhYS5jbG91ZGZyb250Lm5ldApk +M2MzM2hjZ2l3ZXYzLmNsb3VkZnJvbnQubmV0CnxodHRwczovL2QzYzMzaGNnaXdl +djMuY2xvdWRmcm9udC5uZXQKfHxkM3JocjdrZ210cnExdi5jbG91ZGZyb250Lm5l +dAoKISEtLS1EdEROUy0tLQohIyMjaHR0cHM6Ly93d3cuZHRkbnMuY29tL2R0c2l0 +ZS9mYXEKLjNkLWdhbWUuY29tCi40aXJjLmNvbQouYjBuZS5jb20KLmNoYXRub29r +LmNvbQouZGFya3RlY2gub3JnCi5kZWFmdG9uZS5jb20KLmR0ZG5zLm5ldAouZWZm +ZXJzLmNvbQouZXRvd25zLm5ldAouZXRvd25zLm9yZwouZmxuZXQub3JnCi5nb3Rn +ZWVrcy5jb20KLnNjaWVyb24uY29tCi5zbHlpcC5jb20KLnNseWlwLm5ldAouc3Vy +b290LmNvbQoKISEtLS1EeW5ETlMtLS0KISMjI2h0dHBzOi8vaGVscC5keW4uY29t +L2xpc3Qtb2YtZHluLWRucy1wcm8tcmVtb3RlLWFjY2Vzcy1kb21haW4tbmFtZXMv +Ci5ibG9nZG5zLm9yZwouZHluZG5zLm9yZwouZHluZG5zLWlwLmNvbQouZHluZG5z +LXBpY3MuY29tCi5mcm9tLXNkLmNvbQouZnJvbS1wci5jb20KLmlzLWEtaHVudGVy +LmNvbQoKISEtLS1EeW51LS0tCi5keW51LmNvbQouZHludS5uZXQKLmZyZWVkZG5z +Lm9yZwoKISEtLS1GYWNlYm9vay0tLQpjZG5pbnN0YWdyYW0uY29tCnx8Y2RuaW5z +dGFncmFtLmNvbQp8fGZhY2Vib29rLmJyCi5mYWNlYm9vay5jb20KfHxmYWNlYm9v +ay5jb20KIS0tL15odHRwcz86XC9cL1teXC9dK2ZhY2Vib29rXC5jb20vCkBAfHx2 +Ni5mYWNlYm9vay5jb20KfHxmYWNlYm9vay5kZXNpZ24KfHxjb25uZWN0LmZhY2Vi +b29rLm5ldAp8fGZhY2Vib29rLmh1Cnx8ZmFjZWJvb2suaW4KfHxmYWNlYm9vay5u +bAp8fGZhY2Vib29rLnNlCnx8ZmIuY29tCnx8ZmIubWUKfHxmYmNkbi5uZXQKfHxm +YnNieC5jb20KfHxmYmFkZGlucy5jb20KfHxmYndvcmttYWlsLmNvbQouaW5zdGFn +cmFtLmNvbQp8fGluc3RhZ3JhbS5jb20KfHxtLm1lCnx8bWVzc2VuZ2VyLmNvbQp8 +fG9jdWx1cy5jb20KfHxvY3VsdXNjZG4uY29tCnx8cm9ja3NkYi5vcmcKQEB8fGlw +Ni5zdGF0aWMuc2wtcmV2ZXJzZS5jb20KfHx0aGVmYWNlYm9vay5jb20KfHx3aGF0 +c2FwcC5jb20KfHx3aGF0c2FwcC5uZXQKCiEhLS0tRlRDaGluZXNlLS0tCnxodHRw +czovL3d3dy5mdGNoaW5lc2UuY29tCi5mdGNoaW5lc2UuY29tL2NoYW5uZWwvdmlk +ZW8KLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDI3NTMKLmZ0Y2hpbmVzZS5jb20v +c3RvcnkvMDAxMDI2NjE2Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTAyNjc0OQou +ZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwMjY4MDcKLmZ0Y2hpbmVzZS5jb20vc3Rv +cnkvMDAxMDI2ODA4Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTAyNjgzNAouZnRj +aGluZXNlLmNvbS9zdG9yeS8wMDEwMjY4ODAKLmZ0Y2hpbmVzZS5jb20vc3Rvcnkv +MDAxMDI3NDI5Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTAzMDM0MQouZnRjaGlu +ZXNlLmNvbS9zdG9yeS8wMDEwMzA1MDIKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAx +MDMwODAzCi5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTAzMTMxNwouZnRjaGluZXNl +LmNvbS9zdG9yeS8wMDEwMzI2MTcKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDMy +NjM2Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTAzMjY5MgouZnRjaGluZXNlLmNv +bS9zdG9yeS8wMDEwMzI3NjIKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDMzMTM4 +Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTAzNDkxNwouZnRjaGluZXNlLmNvbS9z +dG9yeS8wMDEwMzQ5MjYKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDM0OTI3Ci5m +dGNoaW5lc2UuY29tL3N0b3J5LzAwMTAzNDkyOAouZnRjaGluZXNlLmNvbS9zdG9y +eS8wMDEwMzQ5NTIKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDM1ODkwCi5mdGNo +aW5lc2UuY29tL3N0b3J5LzAwMTAzNTk3MgouZnRjaGluZXNlLmNvbS9zdG9yeS8w +MDEwMzU5OTMKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDM2NDE3Ci5mdGNoaW5l +c2UuY29tL3N0b3J5LzAwMTAzNzA5MAouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEw +MzcwOTEKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDM4MTc4Ci5mdGNoaW5lc2Uu +Y29tL3N0b3J5LzAwMTAzODE5OQouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwMzgy +MjAKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDM4ODE5Ci5mdGNoaW5lc2UuY29t +L3N0b3J5LzAwMTAzODg2MgouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwMzkwNjcK +LmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDM5MTc4Ci5mdGNoaW5lc2UuY29tL3N0 +b3J5LzAwMTAzOTIxMQouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwMzkyNzEKLmZ0 +Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDM5Mjk1Ci5mdGNoaW5lc2UuY29tL3N0b3J5 +LzAwMTAzOTM2OQouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwMzk0ODIKLmZ0Y2hp +bmVzZS5jb20vc3RvcnkvMDAxMDM5NTM0Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAw +MTAzOTU1NQouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwMzk1NzYKLmZ0Y2hpbmVz +ZS5jb20vc3RvcnkvMDAxMDM5NzEyCi5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTAz +OTc3OQouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwMzk4MDkKLmZ0Y2hpbmVzZS5j +b20vc3RvcnkvMDAxMDQwMTM0Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA0MDgz +NQouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNDA4OTAKLmZ0Y2hpbmVzZS5jb20v +c3RvcnkvMDAxMDQwOTE4Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA0MDk5Mgou +ZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNDEyMDkKLmZ0Y2hpbmVzZS5jb20vc3Rv +cnkvMDAxMDQyMTAwCi5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA0MjI1MgouZnRj +aGluZXNlLmNvbS9zdG9yeS8wMDEwNDIyNzIKLmZ0Y2hpbmVzZS5jb20vc3Rvcnkv +MDAxMDQyMjgwCi5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA0MzAyOQouZnRjaGlu +ZXNlLmNvbS9zdG9yeS8wMDEwNDMwNjYKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAx +MDQzMDk2Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA0MzEyNAouZnRjaGluZXNl +LmNvbS9zdG9yeS8wMDEwNDMxNTIKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDQz +MTg5Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA0MzQyOAouZnRjaGluZXNlLmNv +bS9zdG9yeS8wMDEwNDM0MzkKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDQzNTM0 +Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA0MzY3NQouZnRjaGluZXNlLmNvbS9z +dG9yeS8wMDEwNDM2ODAKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDQzNzAyCi5m +dGNoaW5lc2UuY29tL3N0b3J5LzAwMTA0Mzg0OQouZnRjaGluZXNlLmNvbS9zdG9y +eS8wMDEwNDQwOTkKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDQ0Nzc2Ci5mdGNo +aW5lc2UuY29tL3N0b3J5LzAwMTA0NDg3MQouZnRjaGluZXNlLmNvbS9zdG9yeS8w +MDEwNDQ4OTcKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDQ1MTE0Ci5mdGNoaW5l +c2UuY29tL3N0b3J5LzAwMTA0NTEzOQouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEw +NDUxODYKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDQ1NzU1Ci5mdGNoaW5lc2Uu +Y29tL3N0b3J5LzAwMTA0NjA4NwouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNDYx +MDUKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDQ2MTE4Ci5mdGNoaW5lc2UuY29t +L3N0b3J5LzAwMTA0NjEzMgouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNDY1MTcK +LmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDQ2ODIyCi5mdGNoaW5lc2UuY29tL3N0 +b3J5LzAwMTA0Njg2NgouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNDY5NDIKLmZ0 +Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDQ3MTgwCi5mdGNoaW5lc2UuY29tL3N0b3J5 +LzAwMTA0NzIwNgouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNDczMDQKLmZ0Y2hp +bmVzZS5jb20vc3RvcnkvMDAxMDQ3MzE3Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAw +MTA0NzM0NQouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNDczNTgKLmZ0Y2hpbmVz +ZS5jb20vc3RvcnkvMDAxMDQ3Mzc1Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA0 +NzM4MQouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNDc0MTMKLmZ0Y2hpbmVzZS5j +b20vc3RvcnkvMDAxMDQ3NDU2Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA0NzQ5 +MQouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNDc1NDUKLmZ0Y2hpbmVzZS5jb20v +c3RvcnkvMDAxMDQ3NTU4Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA0NzU2OAou +ZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNDc2MjcKLmZ0Y2hpbmVzZS5jb20vc3Rv +cnkvMDAxMDQ4MjkzCi5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA0ODM0MwouZnRj +aGluZXNlLmNvbS9zdG9yeS8wMDEwNDg3MTAKLmZ0Y2hpbmVzZS5jb20vc3Rvcnkv +MDAxMDQ5Mjg5Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA0OTM2MAouZnRjaGlu +ZXNlLmNvbS9zdG9yeS8wMDEwNDk4OTYKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAx +MDUwMTUyCi5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1MTAyNwouZnRjaGluZXNl +LmNvbS9zdG9yeS8wMDEwNTExNjEKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDUx +MzcyCi5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1MTQ3OQouZnRjaGluZXNlLmNv +bS9zdG9yeS8wMDEwNTIxMzgKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDUyMTYx +Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1MjUyNQouZnRjaGluZXNlLmNvbS9z +dG9yeS8wMDEwNTI1NDkKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDUyNzAxCi5m +dGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1Mjk2NQouZnRjaGluZXNlLmNvbS9zdG9y +eS8wMDEwNTMxNDkKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDUzMTUwCi5mdGNo +aW5lc2UuY29tL3N0b3J5LzAwMTA1MzIwMAouZnRjaGluZXNlLmNvbS9zdG9yeS8w +MDEwNTM0MjUKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDUzNDk2Ci5mdGNoaW5l +c2UuY29tL3N0b3J5LzAwMTA1MzUyNgouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEw +NTM5MDYKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDU0MDQ5Ci5mdGNoaW5lc2Uu +Y29tL3N0b3J5LzAwMTA1NDEwMwouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTQx +MDkKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDU0MTE5Ci5mdGNoaW5lc2UuY29t +L3N0b3J5LzAwMTA1NDEyMwouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTQxMzkK +LmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDU0MTY2Ci5mdGNoaW5lc2UuY29tL3N0 +b3J5LzAwMTA1NDE2OAouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTQxOTAKLmZ0 +Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDU0NDM3Ci5mdGNoaW5lc2UuY29tL3N0b3J5 +LzAwMTA1NDUyNgouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTQ2MDcKLmZ0Y2hp +bmVzZS5jb20vc3RvcnkvMDAxMDU0NjQ0Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAw +MTA1NDc4NgouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTQ4NDMKLmZ0Y2hpbmVz +ZS5jb20vc3RvcnkvMDAxMDU0OTI1Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1 +NDk0MAouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTUwNTEKLmZ0Y2hpbmVzZS5j +b20vc3RvcnkvMDAxMDU1MDYzCi5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1NTA2 +OQouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTUxMzYKLmZ0Y2hpbmVzZS5jb20v +c3RvcnkvMDAxMDU1MTcwCi5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1NTIwMgou +ZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTUyNDIKLmZ0Y2hpbmVzZS5jb20vc3Rv +cnkvMDAxMDU1MjYzCi5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1NTI3NAouZnRj +aGluZXNlLmNvbS9zdG9yeS8wMDEwNTUyOTkKLmZ0Y2hpbmVzZS5jb20vc3Rvcnkv +MDAxMDU1NDgwCi5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1NTU1MQouZnRjaGlu +ZXNlLmNvbS9zdG9yeS8wMDEwNTU1NTkKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAx +MDU1NTY2Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1NTg0MAouZnRjaGluZXNl +LmNvbS9zdG9yeS8wMDEwNTYwOTkKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDU2 +MTA4Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1NjEzMQouZnRjaGluZXNlLmNv +bS9zdG9yeS8wMDEwNTYzNzUKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDU2NDkx +Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1NjUyOQouZnRjaGluZXNlLmNvbS9z +dG9yeS8wMDEwNTY1MzQKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDU2NTM4Ci5m +dGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1NjU0MQouZnRjaGluZXNlLmNvbS9zdG9y +eS8wMDEwNTY1NTQKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDU2NTU3Ci5mdGNo +aW5lc2UuY29tL3N0b3J5LzAwMTA1NjU2MAouZnRjaGluZXNlLmNvbS9zdG9yeS8w +MDEwNTY1NjcKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDU2NTc0Ci5mdGNoaW5l +c2UuY29tL3N0b3J5LzAwMTA1NjU4OAouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEw +NTY1OTQKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDU2NTk2Ci5mdGNoaW5lc2Uu +Y29tL3N0b3J5LzAwMTA1NjY4NAouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTY4 +MzIKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDU2ODMzCi5mdGNoaW5lc2UuY29t +L3N0b3J5LzAwMTA1Njg1MQouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTY4NzQK +LmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDU2ODk2Ci5mdGNoaW5lc2UuY29tL3N0 +b3J5LzAwMTA1NjkyNwouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTcwMTEKLmZ0 +Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDU3MDE4Ci5mdGNoaW5lc2UuY29tL3N0b3J5 +LzAwMTA1NzA0NAouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTcxNjIKLmZ0Y2hp +bmVzZS5jb20vc3RvcnkvMDAxMDU3NTAwCi5mdGNoaW5lc2UuY29tL3N0b3J5LzAw +MTA1NzUwNAouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTc1MDkKLmZ0Y2hpbmVz +ZS5jb20vc3RvcnkvMDAxMDU3NTE4Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1 +NzUzMgouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTc1MzMKLmZ0Y2hpbmVzZS5j +b20vc3RvcnkvMDAxMDU3NTU2Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1NzU4 +MAouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTc2MzgKLmZ0Y2hpbmVzZS5jb20v +c3RvcnkvMDAxMDU3NjQ0Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1NzgxNwou +ZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTc4NzUKLmZ0Y2hpbmVzZS5jb20vc3Rv +cnkvMDAxMDU4MDA5Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1ODA1NgouZnRj +aGluZXNlLmNvbS9zdG9yeS8wMDEwNTgyMjQKLmZ0Y2hpbmVzZS5jb20vc3Rvcnkv +MDAxMDU4MjU3Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1ODI5NQouZnRjaGlu +ZXNlLmNvbS9zdG9yeS8wMDEwNTgzMjgKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAx +MDU4MzM5Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1ODM0NAouZnRjaGluZXNl +LmNvbS9zdG9yeS8wMDEwNTgzNTIKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDU4 +NDEzCi5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1ODQyMQouZnRjaGluZXNlLmNv +bS9zdG9yeS8wMDEwNTg0NDAKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDU4NDU4 +Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1ODQ2OAouZnRjaGluZXNlLmNvbS9z +dG9yeS8wMDEwNTg1NjEKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDU4NTY2Ci5m +dGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1ODU2NwouZnRjaGluZXNlLmNvbS9zdG9y +eS8wMDEwNTg1ODUKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDU4NjI4Ci5mdGNo +aW5lc2UuY29tL3N0b3J5LzAwMTA1ODY1NgouZnRjaGluZXNlLmNvbS9zdG9yeS8w +MDEwNTg2NjUKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDU4Njc4Ci5mdGNoaW5l +c2UuY29tL3N0b3J5LzAwMTA1ODY5MQouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEw +NTg3MjEKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDU4NzI4Ci5mdGNoaW5lc2Uu +Y29tL3N0b3J5LzAwMTA1OTQ2NAouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTk0 +ODQKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDU5NTM3Ci5mdGNoaW5lc2UuY29t +L3N0b3J5LzAwMTA1OTUzOAouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTk1NTEK +LmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDU5ODE4Ci5mdGNoaW5lc2UuY29tL3N0 +b3J5LzAwMTA1OTkxNAouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTk5MjAKLmZ0 +Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDU5OTU3Ci5mdGNoaW5lc2UuY29tL3N0b3J5 +LzAwMTA2MDA4OAouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNjAxNTYKLmZ0Y2hp +bmVzZS5jb20vc3RvcnkvMDAxMDYwMTU3Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAw +MTA2MDE2MAouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNjAxODEKLmZ0Y2hpbmVz +ZS5jb20vc3RvcnkvMDAxMDYwMTg1Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA2 +MDQ5MwouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNjA0OTUKLmZ0Y2hpbmVzZS5j +b20vc3RvcnkvMDAxMDYwNTkwCi5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA2MDg0 +NgouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNjA4NDcKLmZ0Y2hpbmVzZS5jb20v +c3RvcnkvMDAxMDYwODc1Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA2MDkyMQou +ZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNjA5NDYKLmZ0Y2hpbmVzZS5jb20vc3Rv +cnkvMDAxMDYxMTIwCi5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA2MTQ3NAouZnRj +aGluZXNlLmNvbS9zdG9yeS8wMDEwNjE1MjQKLmZ0Y2hpbmVzZS5jb20vc3Rvcnkv +MDAxMDYxNjQyCi5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA2MjAxNwouZnRjaGlu +ZXNlLmNvbS9zdG9yeS8wMDEwNjIwMjAKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAx +MDYyMDI4Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA2MjA5MgouZnRjaGluZXNl +LmNvbS9zdG9yeS8wMDEwNjIwOTYKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDYy +MTQ3Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA2MjE3NgouZnRjaGluZXNlLmNv +bS9zdG9yeS8wMDEwNjIxODgKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDYyMjU0 +Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA2MjM3NAouZnRjaGluZXNlLmNvbS9z +dG9yeS8wMDEwNjI0ODIKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDYyNDk2Ci5m +dGNoaW5lc2UuY29tL3N0b3J5LzAwMTA2MjUwMQouZnRjaGluZXNlLmNvbS9zdG9y +eS8wMDEwNjI1MDgKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDYyNTE5Ci5mdGNo +aW5lc2UuY29tL3N0b3J5LzAwMTA2MjU1NAouZnRjaGluZXNlLmNvbS9zdG9yeS8w +MDEwNjI3NDEKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDYyNzk0Ci5mdGNoaW5l +c2UuY29tL3N0b3J5LzAwMTA2MzE2MAouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEw +NjMzNTkKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDYzNTEyCi5mdGNoaW5lc2Uu +Y29tL3N0b3J5LzAwMTA2MzY2OAouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNjM2 +OTIKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDYzNzYzCi5mdGNoaW5lc2UuY29t +L3N0b3J5LzAwMTA2Mzc2NAouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNjM4MjYK +LmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDY0MTI3Ci5mdGNoaW5lc2UuY29tL3N0 +b3J5LzAwMTA2NDMxMgouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNjQ3MDUKLmZ0 +Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDY0ODA3Ci5mdGNoaW5lc2UuY29tL3N0b3J5 +LzAwMTA2NTEyMAouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNjUxNjgKLmZ0Y2hp +bmVzZS5jb20vc3RvcnkvMDAxMDY1MjQ5Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAw +MTA2NTI4NwouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNjUzMzcKLmZ0Y2hpbmVz +ZS5jb20vc3RvcnkvMDAxMDY1NTQxCi5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA2 +NTcxNQouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNjU3MzUKLmZ0Y2hpbmVzZS5j +b20vc3RvcnkvMDAxMDY1NzU2Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA2NTgw +MgouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNjYxMTIKLmZ0Y2hpbmVzZS5jb20v +c3RvcnkvMDAxMDY2MTM2Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA2NjE0MAou +ZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNjY0NjUKLmZ0Y2hpbmVzZS5jb20vc3Rv +cnkvMDAxMDY2ODgxCi5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA2Njk1MAouZnRj +aGluZXNlLmNvbS9zdG9yeS8wMDEwNjY5NTkKLmZ0Y2hpbmVzZS5jb20vc3Rvcnkv +MDAxMDY3NDM1Cnd3dy5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA2NzQ3OQouZnRj +aGluZXNlLmNvbS9zdG9yeS8wMDEwNjc1MjgKLmZ0Y2hpbmVzZS5jb20vc3Rvcnkv +MDAxMDY3NTQ1Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA2NzU3MgouZnRjaGlu +ZXNlLmNvbS9zdG9yeS8wMDEwNjc2NDgKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAx +MDY3NjUwCi5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA2NzY4MAouZnRjaGluZXNl +LmNvbS9zdG9yeS8wMDEwNjc2OTIKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDY3 +ODcxCi5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA2NzkyMwouZnRjaGluZXNlLmNv +bS9zdG9yeS8wMDEwNjgwNjIKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDY4MjQ4 +Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA2ODI3OAouZnRjaGluZXNlLmNvbS9z +dG9yeS8wMDEwNjgzNzkKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDY4NDgzCi5m +dGNoaW5lc2UuY29tL3N0b3J5LzAwMTA2ODUwNgouZnRjaGluZXNlLmNvbS9zdG9y +eS8wMDEwNjg1NDcKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDY4NjE2Ci5mdGNo +aW5lc2UuY29tL3N0b3J5LzAwMTA2ODYyMgouZnRjaGluZXNlLmNvbS9zdG9yeS8w +MDEwNjg3MDcKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDY5MTQ2Ci5mdGNoaW5l +c2UuY29tL3N0b3J5LzAwMTA2OTM3MwouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEw +Njk1MTYKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDY5NTE3Ci5mdGNoaW5lc2Uu +Y29tL3N0b3J5LzAwMTA2OTY4NwouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNjk3 +NDEKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDY5ODYxCi5mdGNoaW5lc2UuY29t +L3N0b3J5LzAwMTA2OTk1MgouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNzAwNTMK +LmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDcwMTc3Ci5mdGNoaW5lc2UuY29tL3N0 +b3J5LzAwMTA3MDMwNwouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNzA4MDkKLmZ0 +Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDcwOTkwCi5mdGNoaW5lc2UuY29tL3N0b3J5 +LzAwMTA3MTA0MgouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNzEwNDQKLmZ0Y2hp +bmVzZS5jb20vc3RvcnkvMDAxMDcxMTA2Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAw +MTA3MTE2NgouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNzExODEKZnRjaGluZXNl +LmNvbS9zdG9yeS8wMDEwNzEyMDAKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDcx +MjA4Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA3MTIzOAouZnRjaGluZXNlLmNv +bS9zdG9yeS8wMDEwNzE2ODMKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDcyMjcx +Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA3MjM0OAouZnRjaGluZXNlLmNvbS9z +dG9yeS8wMDEwNzI2NzcKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDcyNzk0Ci5m +dGNoaW5lc2UuY29tL3N0b3J5LzAwMTA3Mjg1MwouZnRjaGluZXNlLmNvbS9zdG9y +eS8wMDEwNzI4OTUKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDcyOTkzCi5mdGNo +aW5lc2UuY29tL3N0b3J5LzAwMTA3MzA0MwouZnRjaGluZXNlLmNvbS9zdG9yeS8w +MDEwNzMxMDMKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDczMTU3Ci5mdGNoaW5l +c2UuY29tL3N0b3J5LzAwMTA3MzIxNgouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEw +NzMyNDYKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDczMzA1Ci5mdGNoaW5lc2Uu +Y29tL3N0b3J5LzAwMTA3MzMwNwouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNzM0 +MDgKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDczNTM3Ci5mdGNoaW5lc2UuY29t +L3N0b3J5LzAwMTA3MzY3MgouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNzM4NDkK +LmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDczOTA2Ci5mdGNoaW5lc2UuY29tL3N0 +b3J5LzAwMTA3NDA4OQouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNzQxMTAKLmZ0 +Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDc0MTI4Ci5mdGNoaW5lc2UuY29tL3N0b3J5 +LzAwMTA3NDE1NwouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNzQyNDYKLmZ0Y2hp +bmVzZS5jb20vc3RvcnkvMDAxMDc0MzA3Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAw +MTA3NDM0NwouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNzQ0MjMKLmZ0Y2hpbmVz +ZS5jb20vc3RvcnkvMDAxMDc0NDU0Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA3 +NDQ2NwouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNzQ0OTMKLmZ0Y2hpbmVzZS5j +b20vc3RvcnkvMDAxMDc0NTUwCi5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA3NDU2 +MgouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNzQ2NTMKLmZ0Y2hpbmVzZS5jb20v +c3RvcnkvMDAxMDc0NjkzCi5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA3NDY5OQou +ZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNzQ3MTIKLmZ0Y2hpbmVzZS5jb20vc3Rv +cnkvMDAxMDc0NzEzCi5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA3NDc2OAouZnRj +aGluZXNlLmNvbS9zdG9yeS8wMDEwNzQ3ODIKLmZ0Y2hpbmVzZS5jb20vc3Rvcnkv +MDAxMDc0Nzk0Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA3NDgyMgouZnRjaGlu +ZXNlLmNvbS9zdG9yeS8wMDEwNzQ4NzQKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAx +MDc0ODkxCi5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA3NDkxOAouZnRjaGluZXNl +LmNvbS9zdG9yeS8wMDEwNzUwODEKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDc1 +MTM0Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA3NTIxNgouZnRjaGluZXNlLmNv +bS9zdG9yeS8wMDEwNzUyMzAKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDc1MjYy +Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA3NTI2OQouZnRjaGluZXNlLmNvbS9z +dG9yeS8wMDEwNzU0OTEKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDc1NTAwCi5m +dGNoaW5lc2UuY29tL3N0b3J5LzAwMTA3NTY1MAouZnRjaGluZXNlLmNvbS9zdG9y +eS8wMDEwNzU2NzgKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDc1NzAzCi5mdGNo +aW5lc2UuY29tL3N0b3J5LzAwMTA3NjA2NgouZnRjaGluZXNlLmNvbS9zdG9yeS8w +MDEwNzYxNDIKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDc2NDU5Ci5mdGNoaW5l +c2UuY29tL3N0b3J5LzAwMTA3NjQ3MAouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEw +NzY1MzgKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDc2NTczCi5mdGNoaW5lc2Uu +Y29tL3N0b3J5LzAwMTA3NjkwMQouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNzcw +NjcKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDc3MjM1Ci5mdGNoaW5lc2UuY29t +L3N0b3J5LzAwMTA3NzM0NAouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNzczOTAK +LmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDc3MzkyCi5mdGNoaW5lc2UuY29tL3N0 +b3J5LzAwMTA3NzQ2NQouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNzc0NjgKLmZ0 +Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDc3NDkyCi5mdGNoaW5lc2UuY29tL3N0b3J5 +LzAwMTA3Nzc0NQouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNzc3NjgKLmZ0Y2hp +bmVzZS5jb20vc3RvcnkvMDAxMDc3ODA0Ci5mdGNoaW5lc2UuY29tL3RhZy8lRTUl +OEQlODElRTUlODUlQUIlRTUlQjElOEElRTQlQjglODklRTQlQjglQUQlRTUlODUl +QTglRTQlQkMlOUEKLmZ0Y2hpbmVzZS5jb20vdGFnLyVFNiVCOCVBOSVFNSVBRSVC +NiVFNSVBRSU5RAouZnRjaGluZXNlLmNvbS90YWcvJUU4JTk2JTg0JUU3JTg2JTk5 +JUU2JTlEJUE1Ci5mdGNoaW5lc2UuY29tL3ZpZGVvLzE0MzcKLmZ0Y2hpbmVzZS5j +b20vdmlkZW8vMTg4MgouZnRjaGluZXNlLmNvbS92aWRlby8yNDQ2Ci5mdGNoaW5l +c2UuY29tL3ZpZGVvLzI2MDEKLmZ0Y2hpbmVzZS5jb20vY29tbWVudHMKCiEhLS0t +R29vZ2xlLS0tCiEjIyNodHRwczovL3d3dy5nb29nbGUuY29tL3N1cHBvcnRlZF9k +b21haW5zIyMjCiEuLi5HRldMaXN0IGRvZXNuJ3QgaW50ZW5kIHRvIHN1cHBvcnQg +dHlwb3NxdWF0dGluZy4uLgp8fDFlMTAwLm5ldAp8fDQ2NjQ1My5jb20KfHxhYmMu +eHl6Cnx8YWRtb2IuY29tCnx8YWRzZW5zZS5jb20KfHxhZ29vZ2xlYWRheS5jb20K +fHxhaS5nb29nbGUKfHxhbXBwcm9qZWN0Lm9yZwp8fGFuZHJvaWQuY29tCnx8YW5k +cm9pZGlmeS5jb20KfHxhcGkuYWkKLmFwcHNwb3QuY29tCnx8YXBwc3BvdC5jb20K +fHxhdXRvZHJhdy5jb20KfHxibG9nLmdvb2dsZQp8fGJsb2dibG9nLmNvbQpibG9n +c3BvdC5jb20KL15odHRwcz86XC9cL1teXC9dK2Jsb2dzcG90XC4oLiopLwouYmxv +Z3Nwb3QuaGsKLmJsb2dzcG90LmpwCi5ibG9nc3BvdC50dwohLS18fGNhcGl0YWxn +LmNvbQp8fGNlcnRpZmljYXRlLXRyYW5zcGFyZW5jeS5vcmcKfHxjaHJvbWUuY29t +Cnx8Y2hyb21lY2FzdC5jb20KfHxjaHJvbWVleHBlcmltZW50cy5jb20KfHxjaHJv +bWVyY2lzZS5jb20KfHxjaHJvbWVzdGF0dXMuY29tCnx8Y2hyb21pdW0ub3JnCnx8 +Y29tLmdvb2dsZQp8fGNyZWF0aXZlbGFiNS5jb20KfHxjcnJldi5jb20KfHxkYXRh +LXZvY2FidWxhcnkub3JnCnx8ZGVidWcuY29tCnx8ZGVlcG1pbmQuY29tCnx8ZGVq +YS5jb20KfHxkZXNpZ24uZ29vZ2xlCnx8ZGlnaXNmZXJhLmNvbQp8fGRvbWFpbnMu +Z29vZ2xlCnx8ZHVjay5jb20KfHxlbnZpcm9ubWVudC5nb29nbGUKfHxmZWVkYnVy +bmVyLmNvbQp8fGZpcmViYXNlaW8uY29tCnx8Zy5jbwp8fGdjci5pbwp8fGdldC5h +cHAKfHxnZXQuaG93Cnx8Z2V0bWRsLmlvCnx8Z2V0b3V0bGluZS5vcmcKfHxnZ3Bo +dC5jb20KfHxnbWFpbC5jb20KfHxnbW9kdWxlcy5jb20KfHxnb2RvYy5vcmcKfHxn +b2xhbmcub3JnCnx8Z29vLmdsCi5nb29nbGUuYWUKLmdvb2dsZS5hcwouZ29vZ2xl +LmFtCi5nb29nbGUuYXQKLmdvb2dsZS5hegouZ29vZ2xlLmJhCi5nb29nbGUuYmUK +Lmdvb2dsZS5iZwouZ29vZ2xlLmNhCi5nb29nbGUuY2QKLmdvb2dsZS5jaQouZ29v +Z2xlLmNvLmlkCi5nb29nbGUuY28uanAKLmdvb2dsZS5jby5rcgouZ29vZ2xlLmNv +Lm1hCi5nb29nbGUuY28udWsKLmdvb2dsZS5jb20KLmdvb2dsZS5kZQouZ29vZ2xl +LmRqCi5nb29nbGUuZGsKLmdvb2dsZS5lcwouZ29vZ2xlLmZpCi5nb29nbGUuZm0K +Lmdvb2dsZS5mcgouZ29vZ2xlLmdnCi5nb29nbGUuZ2wKLmdvb2dsZS5ncgouZ29v +Z2xlLmllCi5nb29nbGUuaXMKLmdvb2dsZS5pdAouZ29vZ2xlLmpvCi5nb29nbGUu +a3oKLmdvb2dsZS5sdgouZ29vZ2xlLm1uCi5nb29nbGUubXMKLmdvb2dsZS5ubAou +Z29vZ2xlLm51Ci5nb29nbGUubm8KLmdvb2dsZS5ybwouZ29vZ2xlLnJ1Ci5nb29n +bGUucncKLmdvb2dsZS5zYwouZ29vZ2xlLnNoCi5nb29nbGUuc2sKLmdvb2dsZS5z +bQouZ29vZ2xlLnNuCi5nb29nbGUudGsKLmdvb2dsZS50bQouZ29vZ2xlLnRvCi5n +b29nbGUudHQKLmdvb2dsZS52dQouZ29vZ2xlLndzCi9eaHR0cHM/OlwvXC8oW15c +L10rXC4pKmdvb2dsZVwuKGFjfGFkfGFlfGFmfGFsfGFtfGFzfGF0fGF6fGJhfGJl +fGJmfGJnfGJpfGJqfGJzfGJ0fGJ5fGNhfGNhdHxjZHxjZnxjZ3xjaHxjaXxjbHxj +bXxjby5hb3xjby5id3xjby5ja3xjby5jcnxjby5pZHxjby5pbHxjby5pbnxjby5q +cHxjby5rZXxjby5rcnxjby5sc3xjby5tYXxjb218Y29tLmFmfGNvbS5hZ3xjb20u +YWl8Y29tLmFyfGNvbS5hdXxjb20uYmR8Y29tLmJofGNvbS5ibnxjb20uYm98Y29t +LmJyfGNvbS5ienxjb20uY298Y29tLmN1fGNvbS5jeXxjb20uZG98Y29tLmVjfGNv +bS5lZ3xjb20uZXR8Y29tLmZqfGNvbS5naHxjb20uZ2l8Y29tLmd0fGNvbS5oa3xj +b20uam18Y29tLmtofGNvbS5rd3xjb20ubGJ8Y29tLmx5fGNvbS5tbXxjb20ubXR8 +Y29tLm14fGNvbS5teXxjb20ubmF8Y29tLm5mfGNvbS5uZ3xjb20ubml8Y29tLm5w +fGNvbS5vbXxjb20ucGF8Y29tLnBlfGNvbS5wZ3xjb20ucGh8Y29tLnBrfGNvbS5w +cnxjb20ucHl8Y29tLnFhfGNvbS5zYXxjb20uc2J8Y29tLnNnfGNvbS5zbHxjb20u +c3Z8Y29tLnRqfGNvbS50cnxjb20udHd8Y29tLnVhfGNvbS51eXxjb20udmN8Y29t +LnZufGNvLm16fGNvLm56fGNvLnRofGNvLnR6fGNvLnVnfGNvLnVrfGNvLnV6fGNv +LnZlfGNvLnZpfGNvLnphfGNvLnptfGNvLnp3fGN2fGN6fGRlfGRqfGRrfGRtfGR6 +fGVlfGVzfGV1fGZpfGZtfGZyfGdhfGdlfGdnfGdsfGdtfGdwfGdyfGd5fGhrfGhu +fGhyfGh0fGh1fGllfGltfGlxfGlzfGl0fGl0LmFvfGplfGpvfGtnfGtpfGt6fGxh +fGxpfGxrfGx0fGx1fGx2fG1kfG1lfG1nfG1rfG1sfG1ufG1zfG11fG12fG13fG14 +fG5lfG5sfG5vfG5yfG51fG9yZ3xwbHxwbnxwc3xwdHxyb3xyc3xydXxyd3xzY3xz +ZXxzaHxzaXxza3xzbXxzbnxzb3xzcnxzdHx0ZHx0Z3x0a3x0bHx0bXx0bnx0b3x0 +dHx1c3x2Z3x2bnx2dXx3cylcLy4qLwohLS18fGdvb2dsZS1hbmFseXRpY3MuY29t +CiEtLXx8Z29vZ2xlYWRzZXJ2aWNlcy5jb20KfHxnb29nbGVhcGlzLmNuCnx8Z29v +Z2xlYXBpcy5jb20KfHxnb29nbGVhcHBzLmNvbQp8fGdvb2dsZWFydHByb2plY3Qu +Y29tCnx8Z29vZ2xlYmxvZy5jb20KfHxnb29nbGVib3QuY29tCiEtLXx8Z29vZ2xl +Y2FwaXRhbC5jb20KfHxnb29nbGVjaGluYXdlYm1hc3Rlci5jb20KfHxnb29nbGVj +b2RlLmNvbQp8fGdvb2dsZWNvbW1lcmNlLmNvbQp8fGdvb2dsZWRvbWFpbnMuY29t +Cnx8Z29vZ2xlYXJ0aC5jb20KfHxnb29nbGVlYXJ0aC5jb20KfHxnb29nbGVkcml2 +ZS5jb20KfHxnb29nbGVncm91cHMuY29tCnx8Z29vZ2xlaG9zdGVkLmNvbQp8fGdv +b2dsZWlkZWFzLmNvbQp8fGdvb2dsZWluc2lkZXNlYXJjaC5jb20KfHxnb29nbGVs +YWJzLmNvbQp8fGdvb2dsZW1haWwuY29tCnx8Z29vZ2xlbWFzaHVwcy5jb20KfHxn +b29nbGVwYWdlY3JlYXRvci5jb20KfHxnb29nbGVwbGF5LmNvbQp8fGdvb2dsZXBs +dXMuY29tCnx8Z29vZ2xlc2Nob2xhci5jb20KfHxnb29nbGVzb3VyY2UuY29tCiEt +LXx8Z29vZ2xlc3luZGljYXRpb24uY29tCiEtLXx8Z29vZ2xldGFnbWFuYWdlci5j +b20KIS0tfHxnb29nbGV0YWdzZXJ2aWNlcy5jb20KfHxnb29nbGV1c2VyY29udGVu +dC5jb20KLmdvb2dsZXZpZGVvLmNvbQp8fGdvb2dsZXZpZGVvLmNvbQp8fGdvb2ds +ZXdlYmxpZ2h0LmNvbQp8fGdvb2dsZXppcC5uZXQKfHxncm91cHMuZ29vZ2xlLmNu +Cnx8Z3N0YXRpYy5jb20KIS0tfHxndi5jb20KfHxndnQwLmNvbQp8fGd2dDEuY29t +CkBAfHxyZWRpcmVjdG9yLmd2dDEuY29tCnx8Z3Z0My5jb20KfHxnd3Rwcm9qZWN0 +Lm9yZwp8fGh0bWw1cm9ja3MuY29tCnx8aWFtLnNveQp8fGlnb29nbGUuY29tCnx8 +aXRhc29mdHdhcmUuY29tCnx8bGVycy5nb29nbGUKfHxsaWtlLmNvbQp8fG1hZGV3 +aXRoY29kZS5jb20KfHxtYXRlcmlhbC5pbwp8fG5pYy5nb29nbGUKfHxvbjIuY29t +Cnx8cGFub3JhbWlvLmNvbQp8fHBpY2FzYXdlYi5jb20KfHxwb2x5bWVyLXByb2pl +Y3Qub3JnCnx8cXVlc3R2aXN1YWwuY29tCnx8YWRtaW4ucmVjYXB0Y2hhLm5ldAp8 +fGFwaS5yZWNhcHRjaGEubmV0Cnx8YXBpLXNlY3VyZS5yZWNhcHRjaGEubmV0Cnx8 +YXBpLXZlcmlmeS5yZWNhcHRjaGEubmV0Cnx8cmVkaG90bGFicy5jb20KfHxyZWdp +c3RyeS5nb29nbGUKfHxzYXZldGhlZGF0ZS5mb28KfHxzY2hlbWEub3JnCnx8c2hh +dHRlcmVkLmlvCnxodHRwOi8vc2lwbWw1Lm9yZy8KfHxzdG9yaWVzLmdvb2dsZQp8 +fHN5bmVyZ3lzZS5jb20KfHx0ZWFjaHBhcmVudHN0ZWNoLm9yZwp8fHRlbnNvcmZs +b3cub3JnCnx8dGhpbmt3aXRoZ29vZ2xlLmNvbQp8fHRpbHRicnVzaC5jb20KfHx1 +cmNoaW4uY29tCiEtLXx8d3d3Lmdvb2dsZQp8fHdhdmVwcm90b2NvbC5vcmcKfHx3 +YXltby5jb20KfHx3ZWJtcHJvamVjdC5vcmcKfHx3ZWJydGMub3JnCnx8d2hhdGJy +b3dzZXIub3JnCnx8d2lkZXZpbmUuY29tCnx8d2l0aGdvb2dsZS5jb20KfHx3aXRo +eW91dHViZS5jb20KfHx4LmNvbXBhbnkKfHx4bi0tbmdzdHItbHJhOGouY29tCnx8 +eW91dHUuYmUKLnlvdXR1YmUuY29tCnx8eW91dHViZS5jb20KfHx5b3V0dWJlLW5v +Y29va2llLmNvbQp8fHlvdXR1YmVlZHVjYXRpb24uY29tCnx8eW91dHViZWdhbWlu +Zy5jb20KfHx5dC5iZQp8fHl0aW1nLmNvbQp8fHp5bmFtaWNzLmNvbQoKISEtLS1L +aWNrQVNTLS0tCiEtLU9GRklDSUFMIFVSTCBsaXN0IGF0OiBodHRwczovL2thc3Rh +dHVzLmNvbQoKISEtLS1OYXVnaHR5QW1lcmljYS0tLQp8fG5hdWdodHlhbWVyaWNh +LmNvbQoKISEtLS1OWVRpbWVzLS0tCiEtLXx8ZDFmMWVyeWlxeWpzMHIuY2xvdWRm +cm9udC5uZXQKIS0tfHxkM2xhcjA5eGJ3bHNnZS5jbG91ZGZyb250Lm5ldAohLS18 +fGQzcTFxajlqenN1OG53LmNsb3VkZnJvbnQubmV0CiEtLXx8ZGM4eGwwbmR6bjJj +Yi5jbG91ZGZyb250Lm5ldAohLS18fGExLm55dC5jb20KIS0tfHxpbnQubnl0LmNv +bQohLS18fHMxLm55dC5jb20Kc3RhdGljMDEubnl0LmNvbQohLS18fHN0YXRpYzAx +Lm55dC5jb20KIS0tfHx0eXBlZmFjZS5ueXQuY29tCnx8bnl0LmNvbQpueXRjaGlu +YS5jb20Kbnl0Y24ubWUKfHxueXRjbi5tZQp8fG55dGNvLmNvbQp8aHR0cDovL255 +dGkubXMvCi5ueXRpbWVzLmNvbQp8fG55dGltZXMuY29tCnx8bnl0aW1nLmNvbQp1 +c2VyYXBpLm55dGxvZy5jb20KY24ubnl0c3R5bGUuY29tCnx8bnl0c3R5bGUuY29t +CgohIS0tLVN0ZWFtLS0tCi5zdGVhbWNvbW11bml0eS5jb20KfHxzdGVhbWNvbW11 +bml0eS5jb20KIS0tc3RlYW1jb21tdW5pdHkuY29tL3Byb2ZpbGVzLzc2NTYxMTk4 +MDYyNzcxNjA5CiEtLXN0ZWFtY29tbXVuaXR5LmNvbS9ncm91cHMvTGliZXRUaWJl +dAohLS1zdGVhbWNvbW11bml0eS5jb20vZ3JvdXBzL3pob25nZ29uZwohLS1zdGVh +bWNvbW11bml0eS5jb20vaWQvQ0pUX0phY2t0b24KfGh0dHA6Ly9zdG9yZS5zdGVh +bXBvd2VyZWQuY29tL2FwcC8zMzM2MDAKCiEhLS0tVGVsZWdyYW0tLS0KISEhLS0t +RG9tYWluLS0tCnx8dC5tZQp8fHVwZGF0ZXMudGRlc2t0b3AuY29tCnx8dGVsZWdy +YW0uZG9nCnx8dGVsZWdyYW0ubWUKfHx0ZWxlZ3JhbS5vcmcKLnRlbGVncmFtZG93 +bmxvYWQuY29tCnx8dGVsZXNjby5wZQohISEtLS1JUC0tLQoKISEtLS1Ud2l0dGVy +LS0tCnx8cGVyaXNjb3BlLnR2Ci5wc2NwLnR2Cnx8cHNjcC50dgoudC5jbwp8fHQu +Y28KLnR3ZWV0ZGVjay5jb20KfHx0d2VldGRlY2suY29tCnx8dHdpbWcuY29tCi50 +d2l0cGljLmNvbQp8fHR3aXRwaWMuY29tCi50d2l0dGVyLmNvbQp8fHR3aXR0ZXIu +Y29tCnx8dHdpdHRlci5qcAp8fHZpbmUuY28KCiEhLS0tVGFpd2FuLS0tCnx8Z292 +LnRhaXBlaQouZ292LnR3CnxodHRwczovL2Fpc3MuYW53cy5nb3YudHcKfHxhcmNo +aXZlcy5nb3YudHcKfHx0YWNjLmN3Yi5nb3YudHcKfHxkYXRhLmdvdi50dwp8fGVw +YS5nb3YudHcKfHxmYS5nb3YudHcKfHxmZGEuZ292LnR3Cnx8aHBhLmdvdi50dwp8 +fGltbWlncmF0aW9uLmdvdi50dwp8fGl0YWl3YW4uZ292LnR3Cnx8bWppYi5nb3Yu +dHcKfHxtb2VhaWMuZ292LnR3Cnx8bW9mYS5nb3YudHcKfHxtb2wuZ292LnR3Cnx8 +bXZkaXMuZ292LnR3Cnx8bmF0Lmdvdi50dwp8fG5oaS5nb3YudHcKfHxucGEuZ292 +LnR3Cnx8bnNjLmdvdi50dwp8fG50YmsuZ292LnR3Cnx8bnRibmEuZ292LnR3Cnx8 +bnRidC5nb3YudHcKfHxudHNuYS5nb3YudHcKfHxwY2MuZ292LnR3Cnx8c3RhdC5n +b3YudHcKfHx0YWlwZWkuZ292LnR3Cnx8dGFpd2Fuam9icy5nb3YudHcKfHx0aGIu +Z292LnR3Cnx8dGlwby5nb3YudHcKfHx3ZGEuZ292LnR3Cgp8fHRlY28taGsub3Jn +Cnx8dGVjby1tby5vcmcKCkBAfHxhZnR5Z2guZ292LnR3CkBAfHxhaWRlLmdvdi50 +dwpAQHx8dHBkZS5haWRlLmdvdi50dwpAQHx8YXJ0ZS5nb3YudHcKQEB8fGNodWt1 +YW5nLmdvdi50dwpAQHx8Y3diLmdvdi50dwpAQHx8Y3ljYWIuZ292LnR3CkBAfHxk +Ym5zYS5nb3YudHcKQEB8fGRmLmdvdi50dwpAQHx8ZWFzdGNvYXN0LW5zYS5nb3Yu +dHcKQEB8fGVydi1uc2EuZ292LnR3CkBAfHxncmIuZ292LnR3CkBAfHxneXNkLm55 +Yy5nb3YudHcKQEB8fGhjaGNjLmdvdi50dwpAQHx8aHNpbmNodS1jYy5nb3YudHcK +QEB8fGluZXIuZ292LnR3CkBAfHxrbHNpby5nb3YudHcKQEB8fGttc2VoLmdvdi50 +dwpAQHx8bHVuZ3RhbmhyLmdvdi50dwpAQHx8bWFvbGluLW5zYS5nb3YudHcKQEB8 +fG1hdHN1LW5ld3MuZ292LnR3CkBAfHxtYXRzdS1uc2EuZ292LnR3CkBAfHxtYXRz +dWNjLmdvdi50dwpAQHx8bW9lLmdvdi50dwpAQHx8bXZkaXMuZ292LnR3CkBAfHxu +YW5rYW4uZ292LnR3CkBAfHxuY3JlZS5nb3YudHcKQEB8fG5lY29hc3QtbnNhLmdv +di50dwpAQHx8c2lyYXlhLW5zYS5nb3YudHcKQEB8fGNyb21vdGMubmF0Lmdvdi50 +dwpAQHx8dGF4Lm5hdC5nb3YudHcKQEB8fG5lY29hc3QtbnNhLmdvdi50dwpAQHx8 +bmVyLmdvdi50dwpAQHx8bm1tYmEuZ292LnR3CkBAfHxubXAuZ292LnR3CkBAfHxu +bXZ0dGMuZ292LnR3CkBAfHxub3J0aGd1YW4tbnNhLmdvdi50dwpAQHx8bnBtLmdv +di50dwpAQHx8bnN0bS5nb3YudHcKQEB8fG50ZG1oLmdvdi50dwpAQHx8bnRsLmdv +di50dwpAQHx8bnRzZWMuZ292LnR3CkBAfHxudHVoLmdvdi50dwpAQHx8bnZyaS5n +b3YudHcKQEB8fHBlbmdodS1uc2EuZ292LnR3CkBAfHxwb3N0Lmdvdi50dwpAQHx8 +c2lyYXlhLW5zYS5nb3YudHcKQEB8fHN0ZHRpbWUuZ292LnR3CkBAfHxzdW5tb29u +bGFrZS5nb3YudHcKQEB8fHRhaXR1bmctaG91c2UuZ292LnR3CkBAfHx0YW95dWFu +Lmdvdi50dwpAQHx8dHBoY2MuZ292LnR3CkBAfHx0cmltdC1uc2EuZ292LnR3CkBA +fHx2Z2h0cGUuZ292LnR3CkBAfHx2Z2hrcy5nb3YudHcKQEB8fHZnaHRjLmdvdi50 +dwpAQHx8d2FuZmFuZy5nb3YudHcKQEB8fHlhdHNlbi5nb3YudHcKQEB8fHlkYS5n +b3YudHcKCiEtLUBAfHw0cHBwYy5nb3YudHcKIS0tQEB8fDkyMS5nb3YudHcKIS0t +QEB8fGRtdGlwLmdvdi50dwohLS1AQHx8ZXRyYWluaW5nLmdvdi50dwohLS1AQHx8 +Z3NuLWNlcnQubmF0Lmdvdi50dwohLS1AQHx8bmljaS5uYXQuZ292LnR3CiEtLUBA +fHxoY2MuZ292LnR3CiEtLUBAfHxoZW5nY2h1ZW4uZ292LnR3CiEtLUBAfHxraGNj +Lmdvdi50dwohLS1AQHx8a2htcy5nb3YudHcKIS0tQEB8fGtrLmdvdi50dwohLS1A +QHx8a2xjY2FiLmdvdi50dwohLS1AQHx8a2xyYS5nb3YudHcKIS0tQEB8fG5taC5n +b3YudHcKIS0tQEB8fG5tdGwuZ292LnR3CiEtLUBAfHxwYWJwLmdvdi50dwohLS1A +QHx8cGV0Lmdvdi50dwohLS1AQHx8dGNoYi5nb3YudHcKIS0tQEB8fHRjc2FjLmdv +di50dwohLS1AQHx8dG5jc2VjLmdvdi50dwp8fGtpbm1lbi5vcmcudHcKCiEhLS0t +VjJFWC0tLQoudjJleC5jb20KIS0tSW5jbHVkZWQgaW4gYWJvdmUgcnVsZTogZG5z +LnYyZXguY29tCkBAfGh0dHA6Ly92MmV4LmNvbQpAQHxodHRwOi8vY2RuLnYyZXgu +Y29tCkBAfGh0dHA6Ly9jbi52MmV4LmNvbQpAQHxodHRwOi8vaGsudjJleC5jb20K +QEB8aHR0cDovL2kudjJleC5jb20KQEB8aHR0cDovL2xheC52MmV4LmNvbQpAQHxo +dHRwOi8vbmV1ZS52MmV4LmNvbQpAQHxodHRwOi8vcGFnZXNwZWVkLnYyZXguY29t +CkBAfGh0dHA6Ly9zdGF0aWMudjJleC5jb20KQEB8aHR0cDovL3dvcmtzcGFjZS52 +MmV4LmNvbQpAQHxodHRwOi8vd3d3LnYyZXguY29tCgohIS0tLVlhaG9vLS0tCnx8 +ZGF0YS5mbHVycnkuY29tCnBhZ2UuYmlkLnlhaG9vLmNvbQp0dy5iaWQueWFob28u +Y29tCnxodHRwczovL3R3LmJpZC55YWhvby5jb20KYmxvZ3MueWFob28uY28uanAK +fHxzZWFyY2gueWFob28uY28uanAKYnV5LnlhaG9vLmNvbS50dy9nZHNhbGUKaGsu +eWFob28uY29tCmhrLmtub3dsZWRnZS55YWhvby5jb20KdHcubW9uZXkueWFob28u +Y29tCmhrLm15YmxvZy55YWhvby5jb20KbmV3cy55YWhvby5jb20vY2hpbmEtYmxv +Y2tzLWJiYwp8fGhrLm5ld3MueWFob28uY29tCmhrLnJkLnlhaG9vLmNvbQpoay5z +ZWFyY2gueWFob28uY29tL3NlYXJjaApoay52aWRlby5uZXdzLnlhaG9vLmNvbS92 +aWRlbwptZW1lLnlhaG9vLmNvbQohLS10dy55YWhvby5jb20KdHcuYW5zd2Vycy55 +YWhvby5jb20KfGh0dHBzOi8vdHcuYW5zd2Vycy55YWhvby5jb20KfHx0dy5rbm93 +bGVkZ2UueWFob28uY29tCnx8dHcubWFsbC55YWhvby5jb20KdHcueWFob28uY29t +Cnx8dHcubW9iaS55YWhvby5jb20KdHcubXlibG9nLnlhaG9vLmNvbQp8fHR3Lm5l +d3MueWFob28uY29tCnB1bHNlLnlhaG9vLmNvbQp1cGNvbWluZy55YWhvby5jb20K +dmlkZW8ueWFob28uY29tCnx8eWFob28uY29tLmhrCnx8ZHVja2R1Y2tnby1vd25l +ZC1zZXJ2ZXIueWFob28ubmV0CgohLS0tLS0tLS0tLS0tLS0tLS0tTnVtZXJpY3Mt +LS0tLS0tLS0tLS0tLS0tLS0tLS0KLjAzMGJ1eS5jb20KLjByei50dwp8aHR0cDov +LzByei50dwoxLWFwcGxlLmNvbS50dwp8fDEtYXBwbGUuY29tLnR3Ci4xMC50dAou +MTAwa2Uub3JnCi4xMDAwZ2lyaS5uZXQKfHwxMDAwZ2lyaS5uZXQKLjEwY29uZGl0 +aW9uc29mbG92ZS5jb20KfHwxMG11c3VtZS5jb20KMTIzcmYuY29tCi4xMmJldC5j +b20KfHwxMmJldC5jb20KLjEydnBuLmNvbQouMTJ2cG4ubmV0Cnx8MTJ2cG4uY29t +Cnx8MTJ2cG4ubmV0Ci4xMzguY29tCjE0MWhvbmdrb25nLmNvbS9mb3J1bQp8fDE0 +MWpqLmNvbQouMTQxdHViZS5jb20KLjE2ODguY29tLmF1Ci4xNzNuZy5jb20KfHwx +NzNuZy5jb20KLjE3N3BpYy5pbmZvCi4xN3QxN3AuY29tCnx8MThib2FyZC5jb20K +fHwxOGJvYXJkLmluZm8KMThvbmx5Z2lybHMuY29tCi4xOHAycC5jb20KLjE4dmly +Z2luc2V4LmNvbQouMTk0OWVyLm9yZwp6aGFvLjE5ODQuY2l0eQp8fHpoYW8uMTk4 +NC5jaXR5CjE5ODRiYnMuY29tCnx8MTk4NGJicy5jb20KIS0tfHwxOTg0YmxvZy5j +b20KLjE5ODRiYnMub3JnCnx8MTk4NGJicy5vcmcKLjE5OTF3YXkuY29tCnx8MTk5 +MXdheS5jb20KLjE5OThjZHAub3JnCi4xYmFvLm9yZwp8aHR0cDovLzFiYW8ub3Jn +Ci4xZWV3LmNvbQouMW1vYmlsZS5jb20KfGh0dHA6Ly8qLjFtb2JpbGUudHcKfHwx +cG9uZG8udHYKLjItaGFuZC5pbmZvCi4yMDAwZnVuLmNvbS9iYnMKLjIwMDh4aWFu +emhhbmcuaW5mbwp8fDIwMDh4aWFuemhhbmcuaW5mbwp8fDIwMTcuaGsKMjFhbmR5 +LmNvbS9ibG9nCi4yMXByb24uY29tCjIxc2V4dHVyeS5jb20KLjIyOC5uZXQudHcK +fHwyMzNhYmMuY29tCnx8MjRocnMuY2EKMjRzbWlsZS5vcmcKMmxpcHN0dWJlLmNv +bQouMnNoYXJlZC5jb20KMzBib3hlcy5jb20KLjMxNWx6LmNvbQp8fDMycmVkLmNv +bQp8fDM2cmFpbi5jb20KLjNhNWEuY29tCjNhcmFidHYuY29tCi4zYm95czJnaXJs +cy5jb20KLjNwcm94eS5ydQouM3Jlbi5jYQouM3R1aS5uZXQKfHw0Ymx1ZXN0b25l +cy5iaXoKLjRjaGFuLmNvbQohLS18fDRjaGFuLm9yZwouNGV2ZXJwcm94eS5jb20K +fHw0ZXZlcnByb3h5LmNvbQp8fDRyYnR2LmNvbQp8fDRzaGFyZWQuY29tCnRhaXdh +bm5hdGlvbi41MHdlYnMuY29tCnx8NTEuY2EKfHw1MWphdi5vcmcKLjUxbHVvYmVu +LmNvbQp8fDUxbHVvYmVuLmNvbQouNTI3OC5jYwo1YWltaWt1LmNvbQo1aTAxLmNv +bQouNWlzb3RvaTUub3JnCi41bWFvZGFuZy5jb20KfHw2M2kuY29tCi42NG11c2V1 +bS5vcmcKNjR0aWFud2FuZy5jb20KNjR3aWtpLmNvbQouNjYuY2EKNjY2a2IuY29t +CjZwYXJrLmNvbQp8fDZwYXJrLmNvbQp8fDZwYXJrZXIuY29tCnx8N2NhcHR1cmUu +Y29tCi43Y293LmNvbQouOC1kLmNvbQp8aHR0cDovLzgtZC5jb20KODVjYy5uZXQK +Ljg1Y2MudXMKfGh0dHA6Ly84NWNjLnVzCnxodHRwOi8vODVzdC5jb20KLjg4MTkw +My5jb20vcGFnZS96aC10dy8KfHw4ODE5MDMuY29tCi44ODguY29tCi44ODhwb2tl +ci5jb20KODkuNjQuY2hhcnRlci5jb25zdGl0dXRpb25hbGlzbS5zb2x1dGlvbnMK +ODktNjQub3JnCnx8ODktNjQub3JnCi44bmV3cy5jb20udHcKLjh6MS5uZXQKfHw4 +ejEubmV0Ci45MDAxNzAwLmNvbQp8aHR0cDovLzkwOHRhaXdhbi5vcmcvCnx8OTFw +b3JuLmNvbQp8fDkxdnBzLmNsdWIKLjkyY2Nhdi5jb20KLjk5MS5jb20KfGh0dHA6 +Ly85OTEuY29tCi45OWJ0Z2MwMS5jb20KfHw5OWJ0Z2MwMS5jb20KLjk5Y24uaW5m +bwp8aHR0cDovLzk5Y24uaW5mbwp8fDliaXMuY29tCnx8OWJpcy5uZXQKCiEtLS0t +LS0tLS0tLS0tLS0tLS0tLUFBLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoudGli +ZXQuYS5zZQp8aHR0cDovL3RpYmV0LmEuc2UKfHxhLW5vcm1hbC1kYXkuY29tCmE1 +LmNvbS5ydQp8aHR0cDovL2FhbWFjYXUuY29tCiEtLXxodHRwOi8vY2RuKi5hYmMu +Y29tLwouYWJjLmNvbQouYWJjLm5ldC5hdQp8fGFiYy5uZXQuYXUKLmFiY2hpbmVz +ZS5jb20KYWJjbGl0ZS5uZXQKfGh0dHBzOi8vd3d3LmFiY2xpdGUubmV0Ci5hYmx3 +YW5nLmNvbQouYWJvbHVvd2FuZy5jb20KfHxhYm9sdW93YW5nLmNvbQouYWJvdXRn +ZncuY29tCi5hYnMuZWR1Ci5hY2NpbS5vcmcKLmFjZXJvcy1kZS1oaXNwYW5pYS5j +b20KLmFjZXZwbi5jb20KfHxhY2V2cG4uY29tCi5hY2cxOC5tZQp8aHR0cDovL2Fj +ZzE4Lm1lCnx8YWNna2ouY29tCi5hY21lZGlhMzY1LmNvbQouYWNudy5jb20uYXUK +YWN0Zm9ydGliZXQub3JnCmFjdGltZXMuY29tLmF1CmFjdGl2cG4uY29tCnx8YWN0 +aXZwbi5jb20KfHxhY3Vsby51cwp8fGFkZGljdGVkdG9jb2ZmZWUuZGUKLmFkZWxh +aWRlYmJzLmNvbS9iYnMKLmFkcGwub3JnLmhrCnxodHRwOi8vYWRwbC5vcmcuaGsK +LmFkdWx0LXNleC1nYW1lcy5jb20KfHxhZHVsdC1zZXgtZ2FtZXMuY29tCmFkdWx0 +ZnJpZW5kZmluZGVyLmNvbQphZHVsdGtlZXAubmV0L3BlZXBzaG93L21lbWJlcnMv +bWFpbi5odG0KfHxhZHZhbnNjZW5lLmNvbQp8fGFkdmVydGZhbi5jb20KLmFlLm9y +Zwp8fGFlbmhhbmNlcnMuY29tCnx8YWYubWlsCi5hZmFudGliYnMuY29tCnxodHRw +Oi8vYWZhbnRpYmJzLmNvbQouYWkta2FuLm5ldAp8fGFpLWthbi5uZXQKYWktd2Vu +Lm5ldAouYWlwaC5uZXQKfHxhaXBoLm5ldAouYWlyYXNpYS5jb20KfHxhaXJjb25z +b2xlLmNvbQp8aHR0cDovL2Rvd25sb2FkLmFpcmNyYWNrLW5nLm9yZwouYWlydnBu +Lm9yZwp8fGFpcnZwbi5vcmcKLmFpc2V4LmNvbQp8fGFpdC5vcmcudHcKYWl3ZWl3 +ZWkuY29tCi5haXdlaXdlaWJsb2cuY29tCnx8YWl3ZWl3ZWlibG9nLmNvbQp8fHd3 +dy5hanNhbmRzLmNvbQoKISEtLS1Ba2FtYWktLS0KYTI0OC5lLmFrYW1haS5uZXQK +fHxhMjQ4LmUuYWthbWFpLm5ldAoKcmZhbGl2ZTEuYWthY2FzdC5ha2FtYWlzdHJl +YW0ubmV0CnZvYS0xMS5ha2FjYXN0LmFrYW1haXN0cmVhbS5uZXQKCiEhLS00MDMK +fHxhYmVtYXR2LmFrYW1haXplZC5uZXQKfHxsaW5lYXItYWJlbWF0di5ha2FtYWl6 +ZWQubmV0Cnx8dm9kLWFiZW1hdHYuYWthbWFpemVkLm5ldAoKfGh0dHBzOi8vZmJj +ZG4qLmFrYW1haWhkLm5ldC8KIS0tfHxmYmV4dGVybmFsLWEuYWthbWFpaGQubmV0 +CiEtLXx8ZmJzdGF0aWMtYS5ha2FtYWloZC5uZXQKIS0tfGh0dHBzOi8vaWdjZG4q +LmFrYW1haWhkLm5ldApydGhrbGl2ZTItbGguYWthbWFpaGQubmV0CgouYWthZGVt +aXllLm9yZy91Zwp8aHR0cDovL2FrYWRlbWl5ZS5vcmcvdWcKfHxha2liYS1vbmxp +bmUuY29tCnx8YWtvdy5vcmcKLmFsLWlzbGFtLmNvbQp8fGFsLXFpbW1haC5uZXQK +fHxhbGFib3V0LmNvbQouYWxhbmhvdS5jb20KfGh0dHA6Ly9hbGFuaG91LmNvbQou +YWxhcmFiLnFhCnx8YWxhc2JhcnJpY2FkYXMub3JnCmFsZXhsdXIub3JnCnx8YWxm +b3JhdHR2Lm5ldAouYWxoYXlhdC5jb20KLmFsaWNlamFwYW4uY28uanAKYWxpZW5n +dS5jb20KfHxhbGthc2lyLmNvbQp8fGFsbGNvbm5lY3RlZC5jbwouYWxsZHJhd25z +ZXguY29tCnx8YWxsZHJhd25zZXguY29tCi5hbGxlcnZwbi5jb20KfHxhbGxmaW5l +Z2lybHMuY29tCi5hbGxnaXJsbWFzc2FnZS5jb20KYWxsZ2lybHNhbGxvd2VkLm9y +ZwouYWxsZ3JhdnVyZS5jb20KYWxsaWFuY2Uub3JnLmhrCi5hbGxpbmZhLmNvbQp8 +aHR0cDovL2FsbGluZmEuY29tCi5hbGxqYWNrcG90c2Nhc2luby5jb20KfHxhbGxt +b3ZpZS5jb20KfHxhbG1hc2Rhcm5ld3MuY29tCi5hbHBoYXBvcm5vLmNvbQp8fGFs +dGVybmF0ZS10b29scy5jb20KYWx0ZXJuYXRpdmV0by5uZXQvc29mdHdhcmUKYWx2 +aW5hbGV4YW5kZXIuY29tCmFsd2F5c2RhdGEuY29tCnx8YWx3YXlzZGF0YS5jb20K +fHxhbHdheXNkYXRhLm5ldAouYWx3YXlzdnBuLmNvbQp8fGFsd2F5c3Zwbi5jb20K +fHxhbTczMC5jb20uaGsKYW1lYmxvLmpwCnx8YW1lYmxvLmpwCnd3dzEuYW1lcmlj +YW4uZWR1L3RlZC9pY2UvdGliZXQKfHxhbWVyaWNhbmdyZWVuY2FyZC5jb20KfGh0 +dHA6Ly93d3cuYW1lcmljb3Jwcy5nb3YKfHxhbWlibG9ja2Vkb3Jub3QuY29tCi5h +bWlnb2Jicy5uZXQKLmFtaXRhYmhhZm91bmRhdGlvbi51cwp8aHR0cDovL2FtaXRh +YmhhZm91bmRhdGlvbi51cwouYW1uZXN0eS5vcmcKfHxhbW5lc3R5Lm9yZwp8fGFt +bmVzdHkub3JnLmhrCi5hbW5lc3R5LnR3Ci5hbW5lc3R5dXNhLm9yZwp8fGFtbmVz +dHl1c2Eub3JnCi5hbW55ZW1hY2hlbi5vcmcKLmFtb2lpc3QuY29tCi5hbXRiLXRh +aXBlaS5vcmcKYW5kcm9pZHBsdXMuY28vYXBrCi5hbmR5Z29kLmNvbQp8aHR0cDov +L2FuZHlnb2QuY29tCmFubmF0YW0uY29tL2NoaW5lc2UKfHxhbmNob3JmcmVlLmNv +bQohLS1HSFMKfHxhbmNzY29uZi5vcmcKfHxhbmRmYXJhd2F5Lm5ldAp8fGFuZHJv +aWQteDg2Lm9yZwphbmdlbGZpcmUuY29tL2hpL2hheWFzaGkKfHxhbmd1bGFyanMu +b3JnCmFuaW1lY3JhenkubmV0Ci5hbmltZXNoaXBwdXVkZW4uY29tCmFuaXNjYXJ0 +dWpvLmNvbQp8fGFuaXNjYXJ0dWpvLmNvbQp8fGFub2JpaS5jb20KYW5vbnltaXNl +LnVzCi5hbm9ueW1pdHluZXR3b3JrLmNvbQouYW5vbnltaXplci5jb20KYW5vbnRl +eHQuY29tCi5hbnBvcG8uY29tCi5hbnN3ZXJpbmctaXNsYW0ub3JnCnxodHRwOi8v +d3d3LmFudGQub3JnCnx8YW50aG9ueWNhbHphZGlsbGEuY29tCi5hbnRpMTk4NC5j +b20KYW50aWNocmlzdGVuZG9tLmNvbQouYW50aXdhdmUubmV0CnxodHRwOi8vYW50 +aXdhdmUubmV0Ci5hbnlwb3JuLmNvbQouYW55c2V4LmNvbQp8aHR0cDovL2FueXNl +eC5jb20KfHxhb2JvLmNvbS5hdQouYW9mcmllbmQuY29tCnxodHRwOi8vYW9mcmll +bmQuY29tCi5hb2ZyaWVuZC5jb20uYXUKLmFvamlhby5vcmcKfHxhb21pd2FuZy5j +b20KdmlkZW8uYXAub3JnCi5hcGV0dWJlLmNvbQp8fGFwaWFyeS5pbwouYXBpZ2Vl +LmNvbQp8fGFwaWdlZS5jb20KYXBrLWRsLmNvbQphcGtkbGVyLmNvbS9hcGsvdmll +dwouYXBrbW9uay5jb20vYXBwCnx8YXBrcGx6LmNvbQphcGtwdXJlLmNvbQp8fGFw +a3B1cmUuY29tCi5hcGx1c3Zwbi5jb20KIS0tfHxhcHBhbm5pZS5jb20KLmFwcGRv +d25sb2FkZXIubmV0L0FuZHJvaWQKLmFwcGxlZGFpbHkuY29tCnx8YXBwbGVkYWls +eS5jb20KYXBwbGVkYWlseS5jb20uaGsKfHxhcHBsZWRhaWx5LmNvbS5oawphcHBs +ZWRhaWx5LmNvbS50dwp8fGFwcGxlZGFpbHkuY29tLnR3Ci5hcHBzaG9wcGVyLmNv +bQp8aHR0cDovL2FwcHNob3BwZXIuY29tCnx8YXBwc29ja3MubmV0Cnx8YXBwc3Rv +LnJlCi5hcHRvaWRlLmNvbQp8fGFwdG9pZGUuY29tCnx8YXJjaGl2ZXMuZ292Ci5h +cmNoaXZlLmZvCnx8YXJjaGl2ZS5mbwouYXJjaGl2ZS5pcwp8fGFyY2hpdmUuaXMK +LmFyY2hpdmUubGkKfHxhcmNoaXZlLmxpCnx8YXJjaGl2ZS5vcmcKYXJjaGl2ZS50 +b2RheQp8aHR0cHM6Ly9hcmNoaXZlLnRvZGF5Ci5hcmN0b3NpYS5jb20KfGh0dHA6 +Ly9hcmN0b3NpYS5jb20KfHxhcmVjYS1iYWNrdXAub3JnCi5hcmV0aHVzYS5zdQp8 +fGFyZXRodXNhLnN1Cnx8YXJsaW5ndG9uY2VtZXRlcnkubWlsCnx8YXJteS5taWwK +LmFydDR0aWJldDE5OTgub3JnCmFydG9mcGVhY2Vmb3VuZGF0aW9uLm9yZwphcnRz +eS5uZXQKfHxhc2FjcC5vcmcKLmFzYWhpY2hpbmVzZS5jb20KfHxhc2FoaWNoaW5l +c2UuY29tCmFzZGZnLmpwL2RhYnIKYXNnLnRvCi5hc2lhLWdhbWluZy5jb20KLmFz +aWFoYXJ2ZXN0Lm9yZwp8fGFzaWFoYXJ2ZXN0Lm9yZwphc2lhbmV3cy5pdAp8aHR0 +cDovL2phcGFuZmlyc3QuYXNpYW5mcmVlZm9ydW0uY29tLwp8fGFzaWFuc2V4ZGlh +cnkuY29tCnx8YXNpYW53b21lbnNmaWxtLmRlCi5hc2lhdGdwLmNvbQouYXNpYXRv +ZGF5LnVzCnx8YXNrc3R1ZGVudC5jb20KLmFza3luei5uZXQKfHxhc2t5bnoubmV0 +Cnx8YXNzZW1ibGEuY29tCnx8YXN0cmlsbC5jb20KfHxhdGMub3JnLmF1Ci5hdGNo +aW5lc2UuY29tCnxodHRwOi8vYXRjaGluZXNlLmNvbQphdGdmdy5vcmcKLmF0bGFz +cG9zdC5jb20KfHxhdGxhc3Bvc3QuY29tCnx8YXRkbXQuY29tCi5hdGxhbnRhMTY4 +LmNvbS9mb3J1bQouYXRuZXh0LmNvbQp8fGF0bmV4dC5jb20KaWNlLmF1ZGlvbm93 +LmNvbQouYXYuY29tCnx8YXYubW92aWUKLmF2LWUtYm9keS5jb20KYXZhYXoub3Jn +Cnx8YXZhYXoub3JnCiEtLXx8YXZhc3QuY29tCi5hdmJvZHkudHYKLmF2Y2l0eS50 +dgouYXZjb29sLmNvbQouYXZkYi5pbgp8fGF2ZGIuaW4KLmF2ZGIudHYKfHxhdmRi +LnR2Ci5hdmZhbnRhc3kuY29tCi5hdmdsZS5jb20KfHxhdmdsZS5jb20KfHxhdmlk +ZW11eC5vcmcKfHxhdm9pc2lvbi5jb20KLmF2eWFob28uY29tCnx8YXh1cmVmb3Jt +YWMuY29tCi5hemVyYmF5Y2FuLnR2CmF6ZXJpbWl4LmNvbQohLS1ib3h1bi5henVy +ZXdlYnNpdGVzLm5ldCBkb2Vzbid0IGV4aXN0Lgpib3h1biouYXp1cmV3ZWJzaXRl +cy5uZXQKfHxib3h1biouYXp1cmV3ZWJzaXRlcy5uZXQKCiEtLS0tLS0tLS0tLS0t +LS0tLS0tLUJCLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpmb3J1bS5iYWJ5LWtp +bmdkb20uY29tCmJhYnluZXQuY29tLmhrCmJhY2tjaGluYS5jb20KfHxiYWNrY2hp +bmEuY29tCi5iYWNrcGFja2Vycy5jb20udHcvZm9ydW0KYmFja3RvdGlhbmFubWVu +LmNvbQouYmFkaXVjYW8uY29tCnx8YmFkaXVjYW8uY29tCi5iYWRqb2pvLmNvbQpi +YWRvby5jb20KfGh0dHA6Ly8qMi5iYWhhbXV0LmNvbS50dwp8fGJhaWR1LmpwCi5i +YWlqaWUub3JnCnxodHRwOi8vYmFpamllLm9yZwp8fGJhaWxhbmRhaWx5LmNvbQp8 +fGJhaXhpbmcubWUKfHxiYWtnZWVraG9tZS50awouYmFuYW5hLXZwbi5jb20KfHxi +YW5hbmEtdnBuLmNvbQouYmFuZHdhZ29uaG9zdC5jb20KfHxiYW5kd2Fnb25ob3N0 +LmNvbQouYmFuZ2Jyb3NuZXR3b3JrLmNvbQouYmFuZ2NoZW4ubmV0CnxodHRwOi8v +YmFuZ2NoZW4ubmV0Cnx8YmFuZ3lvdWxhdGVyLmNvbQpiYW5uZWRib29rLm9yZwp8 +fGJhbm5lZGJvb2sub3JnCi5iYW5uZWRuZXdzLm9yZwouYmFyYW1hbmdhb25saW5l +LmNvbQp8aHR0cDovL2JhcmFtYW5nYW9ubGluZS5jb20KLmJhcmVuYWtlZGlzbGFt +LmNvbQp8fGJhcm5hYnUuY28udWsKYmFydHZwbi5jb20KLmJhc3RpbGxlcG9zdC5j +b20KYmF5dm9pY2UubmV0Cnx8YmF5dm9pY2UubmV0CmRhanVzaGEuYmF5d29yZHMu +Y29tCnx8YmJjaGF0LnR2Cnx8YmItY2hhdC50dgouYmJnLmdvdgouYmJrei5jb20v +Zm9ydW0KLmJibnJhZGlvLm9yZwpiYnMtdHcuY29tCi5iYnNkaWdlc3QuY29tL3Ro +cmVhZAp8fGJic2ZlZWQuY29tCmJic2xhbmQuY29tCi5iYnNtby5jb20KLmJic29u +ZS5jb20KYmJ0b3lzdG9yZS5jb20KLmJjYXN0LmNvLm56Ci5iY2MuY29tLnR3L2Jv +YXJkCi5iY2NoaW5lc2UubmV0Ci5iY21vcm5pbmcuY29tCmJkc212aWRlb3MubmV0 +Ci5iZWFjb25ldmVudHMuY29tCi5iZWJvLmNvbQp8fGJlYm8uY29tCi5iZWV2cG4u +Y29tCnx8YmVldnBuLmNvbQouYmVoaW5ka2luay5jb20KfHxiZWlqaW5nMTk4OS5j +b20KYmVpamluZ3NwcmluZy5jb20KfHxiZWlqaW5nc3ByaW5nLmNvbQouYmVpamlu +Z3p4Lm9yZwp8aHR0cDovL2JlaWppbmd6eC5vcmcKLmJlbGFtaW9ubGluZS5jb20K +LmJlbGwud2lraQp8aHR0cDovL2JlbGwud2lraQpiZW15d2lmZS5jYwpiZXJpYy5t +ZQouYmVybGludHdpdHRlcndhbGwuY29tCnx8YmVybGludHdpdHRlcndhbGwuY29t +Ci5iZXJtLmNvLm56Ci5iZXN0Zm9yY2hpbmEub3JnCnx8YmVzdGZvcmNoaW5hLm9y +ZwouYmVzdGdvcmUuY29tCi5iZXN0cG9ybnN0YXJkYi5jb20KfHxiZXN0dnBuLmNv +bQouYmVzdHZwbmFuYWx5c2lzLmNvbQouYmVzdHZwbnNlcnZlci5jb20KLmJlc3R2 cG5zZXJ2aWNlLmNvbQouYmVzdHZwbnVzYS5jb20KfHxiZXQzNjUuY29tCi5iZXRm -YWlyLmNvbQouYmV0dGVydnBuLmNvbQp8fGJldHRlcnZwbi5jb20KLmJldHR3ZWVu -LmNvbQp8fGJldHR3ZWVuLmNvbQp8fGJldHZpY3Rvci5jb20KLmJld3d3Lm5ldAou -YmV5b25kZmlyZXdhbGwuY29tCnx8YmZubi5vcmcKfHxiZnNoLmhrCi5iZ3Zwbi5j -b20KfHxiZ3Zwbi5jb20KYmlhbnRhaWxhamlhby5jb20KYmlhbnRhaWxhamlhby5p -bgouYmlibGVzZm9yYW1lcmljYS5vcmcKfGh0dHA6Ly9iaWJsZXNmb3JhbWVyaWNh -Lm9yZwouYmljMjAxMS5vcmcKYmlnZm9vbHMuY29tCnx8YmlnamFwYW5lc2VzZXgu -Y29tCi5iaWduZXdzLm9yZwp8fGJpZ25ld3Mub3JnCi5iaWdzb3VuZC5vcmcKfGh0 -dHA6Ly9iaWxseXBhbi5jb20vd2lraQp8fGJpbGx5d3IuY29tCmJpcGljLm5ldAou -Yml0LmRvCnxodHRwOi8vYml0LmRvCi5iaXQubHkKfGh0dHA6Ly9iaXQubHkKIS0t -fHxiaXRidWNrZXQub3JnCnx8Yml0Y29pbnRhbGsub3JnCi5iaXRzaGFyZS5jb20K -fHxiaXRzaGFyZS5jb20KYml0c25vb3AuY29tCmJpemhhdC5jb20KfHxibC1kb3Vq -aW5zb3Vrby5jb20KLmJqbmV3bGlmZS5vcmcKYmp6Yy5vcmcKfHxianpjLm9yZwou -YmxhY2tsb2dpYy5jb20KLmJsYWNrdnBuLmNvbQp8fGJsYWNrdnBuLmNvbQp0b3Iu -YmxpbmdibGluZ3NxdWFkLm5ldAouYmxpbmt4LmNvbQp8fGJsaW5reC5jb20KYmxp -bncuY29tCi5ibGlwLnR2Cnx8YmxpcC50di8KLmJsb2NrY24uY29tCnx8YmxvY2tj -bi5jb20KfHxibG9nLmRlCnx8YmxvZ2Jsb2cuY29tCi5ibG9nY2F0YWxvZy5jb20K -fHxibG9nY2F0YWxvZy5jb20KfHxibG9nY2l0eS5tZQouYmxvZ2dlci5jb20KfHxi -bG9nZ2VyLmNvbQpibG9naW1nLmpwCnx8YmxvZy5rYW5neWUub3JnCi5ibG9nbGlu -ZXMuY29tCnx8YmxvZ2xpbmVzLmNvbQp8fGJsb2dsb3Zpbi5jb20KcmNvbnZlcnNh -dGlvbi5ibG9ncy5jb20KYmxvZ3RkLm5ldAouYmxvZ3RkLm9yZwp8aHR0cDovL2Js -b2d0ZC5vcmcKfHxibG9vZHNoZWQubmV0Ci5ibG9vbWJlcmcuY24KfHxibG9vbWJl -cmcuY24KLmJsb29tYmVyZy5jb20KfHxibG9vbWJlcmcuY29tCmJsb29tYmVyZy5k -ZQp8fGJsb29tYmVyZy5kZQp8fGJsb29tZm9ydHVuZS5jb20KYmx1ZWFuZ2VsbGl2 -ZS5jb20KLmJtZmlubi5jb20KfHxibnJtZXRhbC5jb20KYm9hcmRyZWFkZXIuY29t -L3RocmVhZAp8fGJvYXJkcmVhZGVyLmNvbQouYm9kLmFzaWEKfGh0dHA6Ly9ib2Qu -YXNpYQouYm9kb2c4OC5jb20KLmJvbGVodnBuLm5ldAp8fGJvbGVodnBuLm5ldApi -b25ib25tZS5jb20KLmJvbmJvbnNleC5jb20KLmJvbmdhY2Ftcy5jb20KfHxib29i -c3RhZ3JhbS5jb20KfHxib29rLmNvbS50dwpib29rZXB1Yi5jb20KfHxib29rcy5j -b20udHcKfHxib3RhbndhbmcuY29tCi5ib3QubnUKLmJvd2VucHJlc3MuY29tCnx8 -Ym93ZW5wcmVzcy5jb20KfHxhcHAuYm94LmNvbQpkbC5ib3gubmV0Cnx8ZGwuYm94 -Lm5ldAouYm94cG4uY29tCnx8Ym94cG4uY29tCmJveHVuLmNvbQp8fGJveHVuLmNv -bQouYm94dW4udHYKfHxib3h1bi50dgpib3h1bmJsb2cuY29tCnx8Ym94dW5ibG9n -LmNvbQouYm94dW5jbHViLmNvbQpib3lhbmd1LmNvbQouYm95ZnJpZW5kdHYuY29t -Ci5ib3lzZm9vZC5jb20KfHxici5zdAouYnJhaW55cXVvdGUuY29tL3F1b3Rlcy9h -dXRob3JzL2QvZGFsYWlfbGFtYQp8fGJyYW5kb25odXRjaGluc29uLmNvbQp8fGJy -YXVtZWlzdGVyLm9yZwouYnJhdm90dWJlLm5ldAp8fGJyYXZvdHViZS5uZXQKLmJy -YXp6ZXJzLmNvbQp8fGJyYXp6ZXJzLmNvbQouYnJlYWsuY29tCnx8YnJlYWsuY29t -CmJyZWFrZ2Z3LmNvbQouYnJlYWtpbmd0d2VldHMuY29tCnx8YnJlYWtpbmd0d2Vl -dHMuY29tCnx8YnJlYWt3YWxsLm5ldApicmlpYW4uY29tLzY1MTEvZnJlZWdhdGUK -LmJyaWVmZHJlYW0uY29tLyVFNyVCNCVBMCVFNiVBMyVCQQpicml6emx5LmNvbQp8 -fGJyaXp6bHkuY29tCmJyb2FkYm9vay5jb20KLmJyb2FkcHJlc3NpbmMuY29tCnx8 -YnJvYWRwcmVzc2luYy5jb20KYmJzLmJyb2NrYmJzLmNvbQpicnVjZXdhbmcubmV0 -Ci5icnV0YWx0Z3AuY29tCnx8YnJ1dGFsdGdwLmNvbQp8fGJ0OTUuY29tCnxodHRw -Oi8vYnRkaWdnLm9yZwouYnRrdS5tZQp8fGJ0a3UubWUKfHxidGt1Lm9yZwouYnRz -cHJlYWQuY29tCi5idWRhZWR1Lm9yZwp8fGJ1ZGFlZHUub3JnCi5idWRkaGlzdGNo -YW5uZWwudHYKLmJ1ZmZlcmVkLmNvbQp8aHR0cDovL2J1ZmZlcmVkLmNvbQouYnVs -bG9nLm9yZwp8fGJ1bGxvZy5vcmcKLmJ1bGxvZ2dlci5jb20KfHxidWxsb2dnZXIu -Y29tCmJ1bmJ1bmhrLmNvbQouYnVzYXlhcmkuY29tCnxodHRwOi8vYnVzYXlhcmku -Y29tCi5idXNpbmVzc2luc2lkZXIuY29tL2JpbmctY291bGQtYmUtY2Vuc29yaW5n -LXNlYXJjaC1yZXN1bHRzLTIwMTQKLmJ1c2luZXNzaW5zaWRlci5jb20vY2hpbmEt -YmFua3MtcHJlcGFyaW5nLWZvci1kZWJ0LWltcGxvc2lvbi0yMDE0Ci5idXNpbmVz -c2luc2lkZXIuY29tL2hvbmcta29uZy1hY3RpdmlzdHMtZGVmeS1wb2xpY2UtdGVh -ci1nYXMtYXMtcHJvdGVzdHMtY29udGludWUtb3Zlcm5pZ2h0LTIwMTQKLmJ1c2lu -ZXNzaW5zaWRlci5jb20vaW50ZXJuZXQtb3V0YWdlcy1yZXBvcnRlZC1pbi1ub3J0 -aC1rb3JlYS0yMDE0Ci5idXNpbmVzc2luc2lkZXIuY29tL2lwaG9uZS02LWlzLWFw -cHJvdmVkLWZvci1zYWxlLWluLWNoaW5hLTIwMTQKLmJ1c2luZXNzaW5zaWRlci5j -b20vbmZsLWFubm91bmNlcnMtc3VyZmFjZS10YWJsZXRzLTIwMTQKLmJ1c2luZXNz -aW5zaWRlci5jb20vdW1icmVsbGEtbWFuLWhvbmcta29uZy0yMDE0CnxodHRwOi8v -c3RhdGljKi5idXNpbmVzc2luc2lkZXIuY29tLwp8aHR0cDovL3d3dy5idXNpbmVz -c2luc2lkZXIuY29tLmF1LyoKLmJ1c2luZXNzd2Vlay5jb20KLmJ1c3Uub3JnL25l -d3MKfGh0dHA6Ly9idXN1Lm9yZy9uZXdzCmJ1c3l0cmFkZS5jb20KLmJ1dWdhYS5j -b20KLmJ1enpoYW5kLmNvbQouYnV6emhhbmQubmV0CmJ3c2ouaGsKfHxieC50bApo -b2x6LmJ5ZXRob3N0OC5jb20KCiEtLS0tLS0tLS0tLS0tLS0tLS0tLUNDLS0tLS0t -LS0tLS0tLS0tLS0tLS0tLS0tLQouYy1zcGFudmlkZW8ub3JnCnx8Yy1zcGFudmlk -ZW8ub3JnCnx8Yy1lc3Qtc2ltcGxlLmNvbQouYzEwMHRpYmV0Lm9yZwp8fGNhYmxl -Z2F0ZXNlYXJjaC5uZXQKLmNhY2hpbmVzZS5jb20KLmNhY253LmNvbQp8aHR0cDov -L2NhY253LmNvbQouY2FjdHVzdnBuLmNvbQp8fGNhY3R1c3Zwbi5jb20KLmNhZmVw -cmVzcy5jb20KLmNhaHIub3JnLnR3Ci5jYWxhbWVvLmNvbS9ib29rcwpjbi5jYWxh -bWVvLmNvbQp8aHR0cDovL2NuLmNhbGFtZW8uY29tCi5jYWxnYXJ5Y2hpbmVzZS5j -YQouY2FsZ2FyeWNoaW5lc2UuY29tCi5jYWxnYXJ5Y2hpbmVzZS5uZXQKfGh0dHA6 -Ly9ibG9nLmNhbGlicmUtZWJvb2suY29tCmZhbHVuLmNhbHRlY2guZWR1Ci5pdHMu -Y2FsdGVjaC5lZHUvfmZhbHVuLwouY2FtNC5jb20KLmNhbTQuanAKLmNhbTQuc2cK -LmNhbWZyb2cuY29tCnx8Y2FtZnJvZy5jb20KfHxjYW1zLmNvbQouY2Ftcy5vcmcu -c2cKY2FuYWRhbWVldC5jb20KfGh0dHA6Ly9iYnMuY2FudG9uZXNlLmFzaWEvCiEt -LWh0dHA6Ly93d3cuY2FudG9uZXNlLmFzaWEvYWN0aW9uLWJicy5odG1sCi5jYW55 -dS5vcmcKfGh0dHA6Ly9jYW55dS5vcmcKLmNhby5pbQouY2FvYmlhbi5pbmZvCnx8 -Y2FvYmlhbi5pbmZvCmNhb2NoYW5ncWluZy5jb20KfHxjYW9jaGFuZ3FpbmcuY29t -Ci5jYXAub3JnLmhrCnx8Y2FwLm9yZy5oawouY2FyYWJpbmFzeXBpc3RvbGFzLmNv -bQpjYXJkaW5hbGt1bmdmb3VuZGF0aW9uLm9yZwpjYXJtb3RvcnNob3cuY29tCi5j -YXJ0b29ubW92ZW1lbnQuY29tCi5jYXNhZGVsdGliZXRiY24ub3JnCi5jYXNhdGli -ZXQub3JnLm14CnxodHRwOi8vY2FzYXRpYmV0Lm9yZy5teApjYXJpLmNvbS5teQp8 -fGNhcmliYmVhbmNvbS5jb20KLmNhc2lub2tpbmcuY29tCi5jYXNpbm9yaXZhLmNv -bQp8fGNhdGNoMjIubmV0Cnx8Y2F0ZmlnaHRwYXlwZXJ2aWV3Lnh4eAouY2F0aG9s -aWMub3JnLmhrCnx8Y2F0aG9saWMub3JnLmhrCmNhdGhvbGljLm9yZy50dwp8fGNh -dGhvbGljLm9yZy50dwouY2F0aHZvaWNlLm9yZy50dwp8fGNhdHR0LmNvbQouY2Jj -LmNhCnx8Y2JjLmNhCi5jYnNuZXdzLmNvbS92aWRlbwouY2J0Yy5vcmcuaGsKIS0u -Y2NjLmRlCiEtfHxjY2MuZGUKLmNjZHRyLm9yZwp8fGNjZHRyLm9yZwouY2NoZXJl -LmNvbQp8fGNjaGVyZS5jb20KLmNjaW0ub3JnCi5jY2xpZmUuY2EKY2NsaWZlLm9y -ZwpjY2xpZmVmbC5vcmcKLmNjdGhlcmUuY29tCnx8Y2N0aGVyZS5jb20KLmNjdG9u -Z2Jhby5jb20vYXJ0aWNsZS8yMDc4NzMyCmNjdWUuY2EKY2N1ZS5jb20KLmNjdm9p -Y2UuY2EKLmNjdy5vcmcudHcKLmNnZGVwb3Qub3JnCnxodHRwOi8vY2dkZXBvdC5v -cmcKfHxjZGJvb2sub3JnCnx8Y2RkLm1lCi5jZGVmLm9yZwp8fGNkZWYub3JnCnx8 -Y2RpZy5pbmZvCmNkanAub3JnCnx8Y2RqcC5vcmcKY2RuaW5zdGFncmFtLmNvbQp8 -fGNkbmluc3RhZ3JhbS5jb20KLmNkbmV3cy5jb20udHcKY2RwMTk4OS5vcmcKY2Rw -MTk5OC5vcmcKfHxjZHAxOTk4Lm9yZwpjZHAyMDA2Lm9yZwp8fGNkcDIwMDYub3Jn -Ci5jZHBhLnVybC50dwpjZHBldS5vcmcKY2RwdXNhLm9yZwpjZHB3ZWIub3JnCnx8 -Y2Rwd2ViLm9yZwpjZHB3dS5vcmcKfHxjZHB3dS5vcmcKfHxjZHcuY29tCi5jZWNj -Lmdvdgp8fGNlY2MuZ292Cnx8Y2VsbHVsby5pbmZvCnx8Y2VuZXdzLmV1Cnx8Y2Vu -dGVyZm9yaHVtYW5yZXByb2QuY29tCnx8Y2VudHJhbG5hdGlvbi5jb20KLmNlbnR1 -cnlzLm5ldAp8aHR0cDovL2NlbnR1cnlzLm5ldAouY2Zoa3Mub3JnLmhrCi5jZnRm -Yy5jb20KLmNnc3QuZWR1Ci5jaGFuZ2Uub3JnCnx8Y2hhbmdlLm9yZwouY2hhbmdw -LmNvbQp8fGNoYW5ncC5jb20KLmNoYW5nc2EubmV0CnxodHRwOi8vY2hhbmdzYS5u -ZXQKLmNoYXBtMjUuY29tCi5jaGF0dXJiYXRlLmNvbQouY2h1YW5nLXllbi5vcmcK -Y2hlbmdtaW5nbWFnLmNvbQouY2hlbmd1YW5nY2hlbmcuY29tCnx8Y2hlbmd1YW5n -Y2hlbmcuY29tCi5jaGVucG9rb25nLmNvbQouY2hlbnBva29uZy5uZXQKfGh0dHA6 -Ly9jaGVucG9rb25nLm5ldAp8fGNoZXJyeXNhdmUuY29tCi5jaGhvbmdiaS5vcmcK -Y2hpY2Fnb25jbXR2LmNvbQp8aHR0cDovL2NoaWNhZ29uY210di5jb20KLmNoaW5h -LXdlZWsuY29tCmNoaW5hMTAxLmNvbQp8fGNoaW5hMTAxLmNvbQp8fGNoaW5hMTgu -b3JnCnx8Y2hpbmEyMS5jb20KY2hpbmEyMS5vcmcKfHxjaGluYTIxLm9yZwouY2hp -bmE1MDAwLnVzCmNoaW5hYWZmYWlycy5vcmcKfHxjaGluYWFmZmFpcnMub3JnCnx8 -Y2hpbmFhaWQubWUKY2hpbmFhaWQudXMKY2hpbmFhaWQub3JnCmNoaW5hYWlkLm5l -dApjaGluYWNvbW1lbnRzLm9yZwp8fGNoaW5hY29tbWVudHMub3JnCmNoaW5hY2hh -bmdlLm9yZwpjaGluYWNoYW5uZWwuaGsKfHxjaGluYWNoYW5uZWwuaGsKLmNoaW5h -Y2l0eW5ld3MuYmUKLmNoaW5hZGlhbG9ndWUubmV0Ci5jaGluYWRpZ2l0YWx0aW1l -cy5uZXQKfHxjaGluYWRpZ2l0YWx0aW1lcy5uZXQKLmNoaW5hZWxlY3Rpb25zLm9y -Zwp8fGNoaW5hZWxlY3Rpb25zLm9yZwouY2hpbmFld2Vla2x5LmNvbQp8fGNoaW5h -ZXdlZWtseS5jb20KfHxjaGluYWZyZWVwcmVzcy5vcmcKLmNoaW5hZ2F0ZS5jb20K -Y2hpbmFnZWVrcy5vcmcKY2hpbmFnZncub3JnCnx8Y2hpbmFnZncub3JnCi5jaGlu -YWdyZWVucGFydHkub3JnCnx8Y2hpbmFncmVlbnBhcnR5Lm9yZwouY2hpbmFob3Jp -em9uLm9yZwp8fGNoaW5haG9yaXpvbi5vcmcKLmNoaW5haHVzaC5jb20KY2hpbmFs -YWJvcndhdGNoLm9yZwpjaGluYWxhd3RyYW5zbGF0ZS5jb20KLmNoaW5hcG9zdC5j -b20udHcvdGFpd2FuL25hdGlvbmFsL25hdGlvbmFsLW5ld3MKY2hpbmF4Y2hpbmEu -Y29tL2hvd3RvCi5jaGluYWlucGVyc3BlY3RpdmUuY29tCmNoaW5haW5wZXJzcGVj -dGl2ZS5uZXQvQXJ0U2hvdy5hc3B4Pwp8fGNoaW5haW5wZXJzcGVjdGl2ZS5uZXQK -LmNoaW5haW5wZXJzcGVjdGl2ZS5vcmcKfHxjaGluYWlucGVyc3BlY3RpdmUub3Jn -Cnx8Y2hpbmFpbnRlcmltZ292Lm9yZwpjaGluYWxhd2FuZHBvbGljeS5jb20KLmNo -aW5hbXVsZS5jb20KfHxjaGluYW11bGUuY29tCmNoaW5hbXoub3JnCi5jaGluYXBy -ZXNzLmNvbS5teQp8fGNoaW5hcHJlc3MuY29tLm15Ci5jaGluYXJpZ2h0c2lhLm9y -ZwpjaGluYXNtaWxlLm5ldC9mb3J1bXMKY2hpbmFzb2NpYWxkZW1vY3JhdGljcGFy -dHkuY29tCnx8Y2hpbmFzb2NpYWxkZW1vY3JhdGljcGFydHkuY29tCmNoaW5hc291 -bC5vcmcKfHxjaGluYXNvdWwub3JnCi5jaGluYXN1Y2tzLm5ldAouY2hpbmF0aW1l -cy5jb20vcmVhbHRpbWVuZXdzLzI2MDQwOS8KfHxjaGluYXRvcHNleC5jb20KLmNo -aW5hdG93bi5jb20uYXUKY2hpbmF0d2VlcHMuY29tCmNoaW5hd2F5Lm9yZwouY2hp -bmF3b3JrZXIuaW5mbwp8fGNoaW5hd29ya2VyLmluZm8KY2hpbmF5b3V0aC5vcmcu -aGsKY2hpbmF5dWFubWluLm9yZwp8fGNoaW5heXVhbm1pbi5vcmcKLmNoaW5lc2Ut -aGVybWl0Lm5ldApjaGluZXNlLWxlYWRlcnMub3JnCmNoaW5lc2UtbWVtb3JpYWwu -b3JnCi5jaGluZXNlZGFpbHkuY29tCnx8Y2hpbmVzZWRhaWx5bmV3cy5jb20KLmNo -aW5lc2VkZW1vY3JhY3kuY29tCnx8Y2hpbmVzZWRlbW9jcmFjeS5jb20KfHxjaGlu -ZXNlZ2F5Lm9yZwouY2hpbmVzZW4uZGUKfHxjaGluZXNlbi5kZQouY2hpbmVzZXBl -bi5vcmcKLmNoaW5lc2V0YWxrcy5uZXQvY2gKLmNoaW5nY2hlb25nLmNvbQp8fGNo -aW5nY2hlb25nLmNvbQouY2hpbm1hbi5uZXQKfGh0dHA6Ly9jaGlubWFuLm5ldApj -aGl0aHUub3JnCmNobi5jaG9zdW4uY29tCi5jaHJkbmV0LmNvbQp8aHR0cDovL2No -cmRuZXQuY29tCi5jaHJpc3RpYW5mcmVlZG9tLm9yZwp8aHR0cDovL2NocmlzdGlh -bmZyZWVkb20ub3JnCmNocmlzdGlhbnN0dWR5LmNvbQp8fGNocmlzdGlhbnN0dWR5 -LmNvbQpjaHJpc3R1c3JleC5vcmcvd3d3MS9zZGMKfHxjaHJvbWVhZGJsb2NrLmNv -bQpjaHVidW4uY29tCmNodWl6aS5uZXQKfHxjaHJpc3RpYW50aW1lcy5vcmcuaGsK -LmNocmxhd3llcnMuaGsKfGh0dHA6Ly9jaHJsYXd5ZXJzLmhrCi5jaHVyY2hpbmhv -bmdrb25nLm9yZy9iNS9pbmRleC5waHAKfGh0dHA6Ly9jaHVyY2hpbmhvbmdrb25n -Lm9yZy9iNS9pbmRleC5waHAKLmNpbmVhc3RlbnRyZWZmLmRlCi5jaXBmZy5vcmcK -fHxjaXJjbGV0aGViYXlmb3J0aWJldC5vcmcKfGh0dHA6Ly9jaXRpemVubGFiLm9y -Zwp8aHR0cDovL3d3dy5jaXRpemVubGFiLm9yZwp8fGNpdGl6ZW5zY29tbWlzc2lv -bi5oawouY2l0aXplbmxhYi5vcmcKY2l0aXplbnNyYWRpby5vcmcKLmNpdHkzNjUu -Y2EKfGh0dHA6Ly9jaXR5MzY1LmNhCmNpdHk5eC5jb20KLmNpdHl0YWxrLnR3L2V2 -ZW50Ci5jaXZpY3BhcnR5LmhrCnx8Y2l2aWNwYXJ0eS5oawpjaXZpbGhyZnJvbnQu -b3JnCnx8Y2l2aWxocmZyb250Lm9yZwouY2l2aWxpYW5ndW5uZXIuY29tCi5jaXZp -bG1lZGlhLnR3Cnx8Y2l2aWxtZWRpYS50dwpwc2lwaG9uLmNpdmlzZWMub3JnCnx8 -dnBuLmNqYi5uZXQKLmNrMTAxLmNvbQp8fGNrMTAxLmNvbQouY2xhcmlvbnByb2pl -Y3Qub3JnL25ld3MvaXNsYW1pYy1zdGF0ZS1pc2lzLWlzaWwtcHJvcGFnYW5kYQp8 -fGNsYXNzaWNhbGd1aXRhcmJsb2cubmV0Ci5jbGIub3JnLmhrCmNsZWFyaGFybW9u -eS5uZXQKY2xlYXJ3aXNkb20ubmV0CmNsaW5pY2EtdGliZXQucnUKLmNsaXBmaXNo -LmRlCmNsb2FrcG9pbnQuY29tCnx8Y2x1YjEwNjkuY29tCmNtaS5vcmcudHcKfGh0 -dHA6Ly93d3cuY21vaW5jLm9yZwpjbXAuaGt1LmhrCmhrdXBvcC5oa3UuaGsKfHxj -bXVsZS5jb20KfHxjbXVsZS5vcmcKfHxjbXMuZ292Ci5jbjYuZXUKfHxjbmEuY29t -LnR3Ci5jbmFiYy5jb20KLmNuZC5vcmcKfHxjbmQub3JnCmRvd25sb2FkLmNuZXQu -Y29tL0ZyZWVnYXRlCi5jbmV4Lm9yZy5jbgouY25pbmV1LmNvbQp3aWtpLmNuaXR0 -ZXIuY29tCi5jbm4uY29tL3ZpZGVvCi5jbnBvbGl0aWNzLm9yZwp8fGNucG9saXRp -Y3Mub3JnCi5jbi1wcm94eS5jb20KfGh0dHA6Ly9jbi1wcm94eS5jb20KLmNucHJv -eHkuY29tCmJsb2cuY255ZXMuY29tCm5ld3MuY255ZXMuY29tCnx8Y29hdC5jby5q -cAouY29jaGluYS5jbwp8fGNvY2hpbmEuY28KfHxjb2NoaW5hLm9yZwouY29kZTE5 -ODQuY29tLzY0CnxodHRwOi8vZ29hZ2VudC5jb2RlcGxleC5jb20KfHxjb2Rlc2hh -cmUuaW8KfHxjb2Rlc2t1bHB0b3Iub3JnCnxodHRwOi8vdG9zaC5jb21lZHljZW50 -cmFsLmNvbQpjb21lZnJvbWNoaW5hLmNvbQp8fGNvbWVmcm9tY2hpbmEuY29tCi5j -b21pYy1tZWdhLm1lCmNvbW1hbmRhcm1zLmNvbQp8fGNvbW1lbnRzaGsuY29tCi5j -b21tdW5pc3RjcmltZXMub3JnCnx8Y29tbXVuaXN0Y3JpbWVzLm9yZwp8fGNvbW11 -bml0eWNob2ljZWN1LmNvbQp8fGNvbXBpbGVoZWFydC5jb20KLmNvbnRhY3RtYWdh -emluZS5uZXQKLmNvbnZpby5uZXQKLmNvb2JheS5jb20KfGh0dHA6Ly93d3cuY29v -bDE4LmNvbS9iYnMqLwouY29vbGFsZXIuY29tCnx8Y29vbGFsZXIuY29tCmNvb2xk -ZXIuY29tCnx8Y29vbGRlci5jb20KfHxjb29sbG91ZC5vcmcudHcKLmNvb2xuY3V0 -ZS5jb20KY29ydW1jb2xsZWdlLmNvbQouY29zLW1vZS5jb20KfGh0dHA6Ly9jb3Mt -bW9lLmNvbQp8fGNvdWNoZGJ3aWtpLmNvbQp8fGNvdHdlZXQuY29tCmNwai5vcmcK -fHxjcGoub3JnLwpjcmFja2xlLmNvbQp8fGNyYWNrbGUuY29tCnx8Y3JjaGluYS5v -cmcKY3JkLW5ldC5vcmcKY3JlYWRlcnMubmV0Cnx8Y3JlYWRlcnMubmV0Ci5jcmVh -ZGVyc25ldC5jb20KfHxjcmlzdHlsaS5jb20KLmNyb2NvdHViZS5jb20KfGh0dHA6 -Ly9jcm9jb3R1YmUuY29tCi5jcm9zc3RoZXdhbGwubmV0Cnx8Y3Jvc3N0aGV3YWxs -Lm5ldApjc2RwYXJ0eS5jb20KfHxjc2RwYXJ0eS5jb20KfHxjc3VjaGVuLmRlCi5j -dGFvLm9yZwouY3RmcmllbmQubmV0Ci5jdGl0di5jb20udHcKY3RzLmNvbS50dwp8 -aHR0cDovL2xpYnJhcnkudXNjLmN1aGsuZWR1LmhrLwp8aHR0cDovL21qbHNoLnVz -Yy5jdWhrLmVkdS5oay8KLmN1aGthY3Mub3JnL35iZW5uZwouY3VpaHVhLm9yZwp8 -fGN1aWh1YS5vcmcKLmN1aXdlaXBpbmcubmV0Cnx8Y3Vpd2VpcGluZy5uZXQKfHxj -dWx0dXJlLnR3Ci5jdW1sb3VkZXIuY29tCnx8Y3VtbG91ZGVyLmNvbQp8fGN1cnZl -ZmlzaC5jb20KLmN1c3UuaGsKfHxjdXN1LmhrCi5jdy5jb20udHcKfGh0dHA6Ly9m -b3J1bS5jeWJlcmN0bS5jb20KY3liZXJnaG9zdHZwbi5jb20KfHxjeWJlcmdob3N0 -dnBuLmNvbQp8fGN5bnNjcmliZS5jb20KY3l0b2RlLnVzCnx8aWZhbi5jei5jYwp8 -fG1pa2UuY3ouY2MKfHxuaWMuY3ouY2MKCiEtLS0tLS0tLS0tLS0tLS0tLS0tLURE -LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpjbC5kMHoubmV0Ci5kMTAwLm5ldAou -ZDJiYXkuY29tCnxodHRwOi8vZDJiYXkuY29tCi5kYWJyLmNvLnVrCnx8ZGFici5j -by51awpkYWJyLmV1CmRhYnIubW9iaQp8fGRhYnIubW9iaQp8fGRhYnIubWUKZGFk -YXppbS5jb20KfHxkYWRhemltLmNvbQouZGFkaTM2MC5jb20KZGFmYWdvb2QuY29t -CmRhZmFoYW8uY29tCi5kYWlkb3N0dXAucnUKfGh0dHA6Ly9kYWlkb3N0dXAucnUK -LmRhaWxpZGFpbGkuY29tCnx8ZGFpbGlkYWlsaS5jb20KLmRhaWx5bW90aW9uLmNv -bQp8fGRhaWx5bW90aW9uLmNvbQpkYWlwaGFwaW5mby5uZXQKLmRhaml5dWFuLmNv -bQp8fGRhaml5dWFuLmRlCmRhaml5dWFuLmV1CmRhbGFpbGFtYS5jb20KLmRhbGFp -bGFtYS5tbgp8aHR0cDovL2RhbGFpbGFtYS5tbgouZGFsYWlsYW1hLnJ1Cnx8ZGFs -YWlsYW1hLnJ1CmRhbGFpbGFtYTgwLm9yZwouZGFsYWlsYW1hLWFyY2hpdmVzLm9y -ZwouZGFsYWlsYW1hY2VudGVyLm9yZwp8aHR0cDovL2RhbGFpbGFtYWNlbnRlci5v -cmcKZGFsYWlsYW1hZmVsbG93cy5vcmcKLmRhbGFpbGFtYWZpbG0uY29tCi5kYWxh -aWxhbWFmb3VuZGF0aW9uLm9yZwouZGFsYWlsYW1haGluZGkuY29tCi5kYWxhaWxh -bWFpbmF1c3RyYWxpYS5vcmcKLmRhbGFpbGFtYWphcGFuZXNlLmNvbQouZGFsYWls -YW1hcHJvdGVzdGVycy5pbmZvCi5kYWxhaWxhbWFxdW90ZXMub3JnCi5kYWxhaWxh -bWF0cnVzdC5vcmcKLmRhbGFpbGFtYXZpc2l0Lm9yZy5uegouZGFsYWlsYW1hd29y -bGQuY29tCnx8ZGFsYWlsYW1hd29ybGQuY29tCmRhbGlhbm1lbmcub3JnCnx8ZGFs -aWFubWVuZy5vcmcKLmRhbGl1bGlhbi5vcmcKfHxkYWxpdWxpYW4ub3JnCi5kYW5r -ZTRjaGluYS5uZXQKfHxkYW5rZTRjaGluYS5uZXQKLmRhbndlaS5vcmcKZGFvbGFu -Lm5ldApkYXJrdG95Lm5ldAp8fGRhc3RyYXNzaS5vcmcKLmRhdmlkLWtpbGdvdXIu -Y29tCnxodHRwOi8vZGF2aWQta2lsZ291ci5jb20KZGF4YS5jbgp8fGRheGEuY24K -Y24uZGF5YWJvb2suY29tCi5kYXlsaWZlLmNvbS90b3BpYy9kYWxhaV9sYW1hCnx8 -ZGIudHQKLmRiYy5oay9tYWluCnx8ZGNhcmQudHcKZGNtaWxpdGFyeS5jb20KLmRk -Yy5jb20udHcKLmRkaHcuaW5mbwohLS1DaGFuZ2VJUAouZGRucy5tcwpkZG5zLm5l -dAp8fGRlLXNjaS5vcmcKLmRlLXNjaS5vcmcKcGFja2FnZXMuZGViaWFuLm9yZy96 -aC1jbi9sZW5ueS9ncGFzcwp8fGRlY29kZXQuY28KCiEtLU9yaWdpbjpjZG4taTMw -JF8KIS0tRXhjZXB0aW9uOiBIb21lcGFnZSBhY2Nlc3Mgd2l0aG91dCByc3QKIS0t -S2V5d29yZCBpcyAkXwouZGVmaW5lYmFiZS5jb20KCnx8ZGVsY2FtcC5uZXQKZGVs -aWNpb3VzLmNvbS9HRldib29rbWFyawouZGVtb2NyYXRzLm9yZwp8fGRlbW9jcmF0 -cy5vcmcKfHxkZXNjLnNlCnx8ZGVzc2NpLmNvbQouZGVzdHJveS1jaGluYS5qcAp8 -fGRldXRzY2hlLXdlbGxlLmRlCiEtLXx8ZGV2aWFudGFydC5jb20KIS0tfHxkZXZp -YW50YXJ0Lm5ldAp8fGRldmlvLnVzCnx8ZGV2cG4uY29tCnx8ZGZhcy5taWwKZGZu -Lm9yZwpkaGFybWFrYXJhLm5ldAouZGhhcmFtc2FsYW5ldC5jb20KLmRpYW95dWlz -bGFuZHMub3JnCnx8ZGlhb3l1aXNsYW5kcy5vcmcKfGh0dHA6Ly9kaWdpbGFuZC50 -dy8KfHxkaWdpdGFsbm9tYWRzcHJvamVjdC5vcmcKLmRpaWdvLmNvbQp8fGRpaWdv -LmNvbQp8fGRpbGJlci5zZQp8fGZ1cmwubmV0Ci5kaXBpdHkuY29tCnx8ZGlyZWN0 -Y3JlYXRpdmUuY29tCiEtLXx8ZGlzY29ncy5jb20KIS0tQEB8fGNkbi5kaXNjb2dz -LmNvbQp8aHR0cHM6Ly9zZWFyY2guZGlzY29ubmVjdC5tZQouZGlzY3Vzcy5jb20u -aGsKfHxkaXNjdXNzLmNvbS5oawouZGlzY3VzczR1LmNvbQpkaXNwLmNjCi5kaXNx -dXMuY29tCnx8ZGlzcXVzLmNvbQouZGl0LWluYy51cwp8fGRpdC1pbmMudXMKLmRp -emhpZGl6aGkuY29tCnx8ZGl6aHV6aGlzaGFuZy5jb20KZGphbmdvc25pcHBldHMu -b3JnCi5kam9yei5jb20KfHxkam9yei5jb20KfHxkbC1sYWJ5LmpwCnx8ZGxzaXRl -LmNvbQp8fGRtY2RuLm5ldAouZG5zY3J5cHQub3JnCnx8ZG5zY3J5cHQub3JnCnx8 -ZG5zMmdvLmNvbQp8fGRuc3NlYy5uZXQKZG9jdG9ydm9pY2Uub3JnCgohLS1Eb2dG -YXJ0TmV0d29yawouZG9nZmFydG5ldHdvcmsuY29tL3RvdXIKZ2xvcnlob2xlLmNv -bQoKLmRvamluLmNvbQouZG9rLWZvcnVtLm5ldAp8fGRvbGMuZGUKfHxkb2xmLm9y -Zy5oawp8fGRvbGxmLmNvbQouZG9tYWluLmNsdWIudHcKLmRvbWFpbnRvZGF5LmNv -bS5hdQpkb25ndGFpd2FuZy5jb20KfHxkb25ndGFpd2FuZy5jb20KLmRvbmd0YWl3 -YW5nLm5ldAp8fGRvbmd0YWl3YW5nLm5ldAouZG9uZ3lhbmdqaW5nLmNvbQouZG9u -dGZpbHRlci51cwp8fGRvbnRtb3ZldG9jaGluYS5jb20KLmRvcmplc2h1Z2Rlbi5j -b20KLmRvdHBsYW5lLmNvbQp8fGRvdHBsYW5lLmNvbQp8fGRvdHN1Yi5jb20KfHxk -b3Vnc2NyaXB0cy5jb20KfHxkb3VqaW5jYWZlLmNvbQpkb3dlaS5vcmcKIS0tfHxk -b3h5Z2VuLm9yZwpkcGhrLm9yZwpkcHAub3JnLnR3Cnx8ZHBwLm9yZy50dwp8fGRw -ci5pbmZvCnx8ZHJhZ29uc3ByaW5ncy5vcmcKfHxkcmF3LmlvCnx8ZHJlYW1tYXNr -Lm9yZwouZHJlcHVuZy5vcmcKfHxkcmdhbi5uZXQKLmRybWluZ3hpYS5vcmcKfGh0 -dHA6Ly9kcm1pbmd4aWEub3JnCnx8ZHJvcGJveC5jb20KfHxkcm9wYm94dXNlcmNv -bnRlbnQuY29tCmRyc3VuYWNhZGVteS5jb20KLmRydHViZXIuY29tCi5kc2NuLmlu -Zm8KfGh0dHA6Ly9kc2NuLmluZm8KLmRzdGsuZGsKfGh0dHA6Ly9kc3RrLmRrCnx8 -ZHRpYmxvZy5jb20KfHxkdGljLm1pbApkdGlzZXJ2Mi5jb20KLmR0d2FuZy5vcmcK -LmR1Y2tkbnMub3JnCnxodHRwOi8vZHVja2Rucy5vcmcKLmR1Y2tkdWNrZ28uY29t -Cnx8ZHVja2R1Y2tnby5jb20KLmR1Y2tsb2FkLmNvbS9kb3dubG9hZAp8fGR1Y2tt -eWxpZmUuY29tCi5kdWdhLmpwCnxodHRwOi8vZHVnYS5qcAouZHVpaHVhLm9yZwp8 -fGR1aWh1YS5vcmcKfHxkdWlodWFocmpvdXJuYWwub3JnCi5kdW93ZWl0aW1lcy5j -b20KfHxkdW93ZWl0aW1lcy5jb20KZHVwaW5nLm5ldAp8fGR1cGxpY2F0aS5jb20K -ZHVwb2xhLmNvbQpkdXBvbGEubmV0Ci5kdXNoaS5jYQp8fGR2b3Jhay5vcmcKLmR3 -LmNvbQp8aHR0cDovL3d3dy5kdy5jb20KfHxkdy5kZQouZHctd29ybGQuY29tCnx8 -ZHctd29ybGQuY29tCi5kdy13b3JsZC5kZQp8aHR0cDovL2R3LXdvcmxkLmRlCnd3 -dy5kd2hlZWxlci5jb20KZHduZXdzLmNvbQp8fGR3bmV3cy5jb20KZHduZXdzLm5l -dAp8fGR3bmV3cy5uZXQKeHlzLmR4aW9uZy5jb20KfHxkeW5hd2ViaW5jLmNvbQou -ZHluZG5zLm9yZwouZHp6ZS5jb20KCiEtLS0tLS0tLS0tLS0tLS0tLS0tLUVFLS0t -LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp8fGUtY2xhc3NpY2FsLmNvbS50dwp8fGUt -Z29sZC5jb20KLmUtZ29sZC5jb20KfHxnLmUtaGVudGFpLm9yZwp8fGxvZmkuZS1o -ZW50YWkub3JnCmUtaW5mby5vcmcudHcKLmUtdHJhZGVybGFuZC5uZXQvYm9hcmQK -LmUtem9uZS5jb20uaGsvZGlzY3V6CnxodHRwOi8vZS16b25lLmNvbS5oay9kaXNj -dXoKLmUxMjMuaGsKfGh0dHA6Ly9lMTIzLmhrLwouZWFybHl0aWJldC5jb20KfGh0 -dHA6Ly9lYXJseXRpYmV0LmNvbQouZWFydGhjYW0uY29tCi5lYXJ0aHZwbi5jb20K -ZWFzdGVybi1hcmsuY29tCi5lYXN0ZXJubGlnaHRuaW5nLm9yZwouZWFzdHR1cmtl -c3Rhbi5jb20KfGh0dHA6Ly93d3cuZWFzdHR1cmtpc3Rhbi5uZXQvCi5lYXN0dHVy -a2lzdGFuLWdvdi5vcmcKLmVhc3R0dXJraXN0YW5jYy5vcmcKLmVhc3R0dXJraXN0 -YW5nb3Zlcm5tZW50aW5leGlsZS51cwp8fGVhc3R0dXJraXN0YW5nb3Zlcm5tZW50 -aW5leGlsZS51cwouZWFzeWNhLmNhCi5lYXN5cGljLmNvbQouZWJvbnktYmVhdXR5 -LmNvbQplYm9va2Jyb3dzZS5jb20KZWJvb2tlZS5jb20KfHxlY2ZhLm9yZy50dwpl -Y21pbmlzdHJ5Lm5ldAouZWNvbm9taXN0LmNvbQpiYnMuZWNzdGFydC5jb20KfHxl -ZGdlY2FzdGNkbi5uZXQKL3R3aW1nXC5lZGdlc3VpdGVcLm5ldFwvXC8/YXBwbGVk -YWlseS8KZWRpY3lwYWdlcy5jb20KLmVkbW9udG9uY2hpbmEuY24KLmVkbW9udG9u -c2VydmljZS5jb20KZWRvb3JzLmNvbQouZWR1YnJpZGdlLmNvbQp8fGVkdWJyaWRn -ZS5jb20KLmVkdXByby5vcmcKfHxlZXZwbi5jb20KZWZjYy5vcmcuaGsKLmVmdWt0 -LmNvbQp8aHR0cDovL2VmdWt0LmNvbQp8fGVpYy1hdi5jb20KLmVpc2JiLmNvbQou -ZWtzaXNvemx1ay5jb20KfHxla3Npc296bHVrLmNvbQplbGVjdGlvbnNtZXRlci5j -b20KfHxlbGVwaGFudHZwbi5jb20KfHxlbGdvb2cuaW0KfHxlbHBhaXMuY29tCi5l -bHRvbmRpc25leS5jb20KLmVtYWdhLmNvbS9pbmZvLzM0MDcKZW1pbHlsYXUub3Jn -LmhrCi5lbXBmaWwuY29tCi5lbXVsZS1lZDJrLmNvbQp8aHR0cDovL2VtdWxlLWVk -MmsuY29tCi5lbXVsZWZhbnMuY29tCnxodHRwOi8vZW11bGVmYW5zLmNvbQouZW11 -cGFyYWRpc2UubWUKfHxlbmV3c3RyZWUuY29tCi5lbmZhbC5kZQpjaGluZXNlLmVu -Z2FkZ2V0LmNvbQplbmdsaXNoZm9yZXZlcnlvbmUub3JnCnx8ZW5nbGlzaGZyb21l -bmdsYW5kLmNvLnVrCi5lbmxpZ2h0ZW4ub3JnLnR3Cnx8ZW50ZXJtYXAuY29tCi5l -bnRudC5jb20KfGh0dHA6Ly9lbnRudC5jb20KLmVwaXNjb3BhbGNodXJjaC5vcmcK -LmVwb2NoaGsuY29tCnxodHRwOi8vZXBvY2hoay5jb20KZXBvY2h0aW1lcy1iZy5j -b20KfHxlcG9jaHRpbWVzLWJnLmNvbQplcG9jaHRpbWVzLXJvbWFuaWEuY29tCnx8 -ZXBvY2h0aW1lcy1yb21hbmlhLmNvbQplcG9jaHRpbWVzLmNvLmlsCnx8ZXBvY2h0 -aW1lcy5jby5pbAplcG9jaHRpbWVzLmNvLmtyCnx8ZXBvY2h0aW1lcy5jby5rcgpl -cG9jaHRpbWVzLmNvbQp8fGVwb2NodGltZXMuY29tCi5lcG9jaHRpbWVzLmN6CmVw -b2NodGltZXMuZGUKZXBvY2h0aW1lcy5mcgouZXBvY2h0aW1lcy5pZQouZXBvY2h0 -aW1lcy5pdAplcG9jaHRpbWVzLmpwCmVwb2NodGltZXMucnUKZXBvY2h0aW1lcy5z -ZQplcG9jaHRpbWVzdHIuY29tCi5lcG9jaHdlZWsuY29tCnx8ZXBvY2h3ZWVrLmNv -bQp8fGVwb2Nod2Vla2x5LmNvbQouZXBvcm5lci5jb20KLmVxdWluZW5vdy5jb20K -ZXJhYmFydS5uZXQKLmVyYXlzb2Z0LmNvbS50cgouZXJlcHVibGlrLmNvbQouZXJp -Z2h0cy5uZXQKfHxlcmlnaHRzLm5ldAouZXJrdHYuY29tCnxodHRwOi8vZXJrdHYu -Y29tCnx8ZXJuZXN0bWFuZGVsLm9yZwp8fGVyb2RhaXplbnN5dS5jb20KfHxlcm9k -b3VqaW53b3JsZC5jb20KfHxlcm9tYW5nYS1raW5nZG9tLmNvbQp8fGVyb21hbmdh -ZG91emluLmNvbQouZXJvbW9uLm5ldAp8aHR0cDovL2Vyb21vbi5uZXQKLmVyb3By -b2ZpbGUuY29tCi5lcm90aWNzYWxvb24ubmV0Ci5lc2xpdGUuY29tL3Byb2R1Y3QK -LmVzbGl0ZS5jb20vU2VhcmNoX0JXLmFzcHg/cQp3aWtpLmVzdS5pbS8lRTglOUIl -QTQlRTglOUIlQTQlRTglQUYlQUQlRTUlQkQlOTUKLmV0YWEub3JnLmF1CmV0YWl3 -YW5uZXdzLmNvbQp8fGV0aXplci5vcmcKfHxldG9ra2kuY29tCi5ldHRvZGF5Lm5l -dApldHZvbmxpbmUuaGsKLmV1Lm9yZwp8fGV1Lm9yZwouZXVjYXNpbm8uY29tCi5l -dWxhbS5jb20KZWVhcy5ldXJvcGEuZXUvZGVsZWdhdGlvbnMvY2hpbmEvcHJlc3Nf -Y29ybmVyL2FsbF9uZXdzL25ld3MvMjAxNS8yMDE1MDcxNl96aAplZWFzLmV1cm9w -YS5ldS9zdGF0ZW1lbnRzLWVlYXMvMjAxNS8xNTEwMjIKLmV2c2Nob29sLm5ldAp8 -aHR0cDovL2V2c2Nob29sLm5ldAp8fGV4YmxvZy5qcAp8fGJsb2cuZXhibG9nLmNv -LmpwCkBAfHx3d3cuZXhibG9nLmpwCi5leGNocmlzdGlhbi5oawp8fGV4Y2hyaXN0 -aWFuLmhrCnxodHRwOi8vYmxvZy5leGNpdGUuY28uanAKfHxleG1vcm1vbi5vcmcK -fHxleHBhdHNoaWVsZC5jb20KZXhwZXJ0cy11bml2ZXJzLmNvbQp8fGV4cGxvYWRl -ci5uZXQKLmV4cHJlc3N2cG4uY29tCnxodHRwOi8vZXhwcmVzc3Zwbi5jb20KLmV4 -dHJlbWV0dWJlLmNvbQpleWV2aW8uanAKfHxleWV2aW8uanAKLmV5bnkuY29tCnx8 -ZXlueS5jb20KLmV6cGMudGsvY2F0ZWdvcnkvc29mdAouZXpwZWVyLmNvbQoKIS0t -LS0tLS0tLS0tLS0tLS0tLS0tRkYtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnx8 -ZmFjZWJvb2txdW90ZXM0dS5jb20KLmZhY2VsZXNzLm1lCnx8ZmFjZWxlc3MubWUK -fGh0dHA6Ly9mYWNlc29mdGliZXRhbnNlbGZpbW1vbGF0b3JzLmluZm8KfHxmYWNl -c29mbnlmdy5jb20KLmZhaXRoMTAwLm9yZwp8aHR0cDovL2ZhaXRoMTAwLm9yZwoK -IS0tRW5oYW5jZW1lbnQ6CiEtLWh0dHA6Ly9mYWl0aGZ1bGV5ZS5jb20uZGV0YWls -LndlYnNpdGUvCiEtLWh0dHA6Ly9mYWl0aGZ1bGV5ZS5jb20uaXBhZGRyZXNzLmNv -bS8KLmZhaXRoZnVsZXllLmNvbQoKfHxmYWl0aHRoZWRvZy5pbmZvCi5mYWtrdS5u -ZXQKLmZhbHNlZmlyZS5jb20KfHxmYWxzZWZpcmUuY29tCmZhbHVuLWNvLm9yZwpm -YWx1bmFydC5vcmcKfHxmYWx1bmFzaWEuaW5mbwpmYWx1bmRhZmEub3JnCmZhbHVu -ZGFmYS1kYy5vcmcKfHxmYWx1bmRhZmEtZmxvcmlkYS5vcmcKfHxmYWx1bmRhZmEt -bmMub3JnCnx8ZmFsdW5kYWZhLXBhLm5ldApmYWx1bi1ueS5uZXQKfHxmYWx1bmRh -ZmFpbmRpYS5vcmcKZmFsdW5kYWZhbXVzZXVtLm9yZwouZmFsdW5nb25nLmRlCmZh -bHVuZ29uZy5vcmcudWsKfHxmYWx1bmhyLm9yZwpmYWx1bmluZm8uZGUKZmFsdW5p -bmZvLm5ldAouZmFsdW5waWxpcGluYXMubmV0Cnx8ZmFsdW53b3JsZC5uZXQKZmFt -aWx5ZmVkLm9yZwp8fGZhbmdsaXpoaS5pbmZvCnx8ZmFuZ29uZy5vcmcKZmFuZ29u -Z2hlaWtlLmNvbQouZmFucWlhbmcudGsKZmFucWlhbmdob3UuY29tCnx8ZmFucWlh -bmdob3UuY29tCmZhcGR1LmNvbQpmYXByb3h5LmNvbQohLS0uZmFyeGlhbi5jb20K -LmZhd2FuZ2h1aWh1aS5vcmcKfHxmYmNkbi5uZXQKZmFucWlhbmd5YWtleGkubmV0 -CmZhaWwuaGsKfHxmYW11bmlvbi5jb20KLmZhbi1xaWFuZy5jb20KLmZhbmdiaW54 -aW5nLmNvbQp8fGZhbmdiaW54aW5nLmNvbQpmYW5nZW1pbmcuY29tCi5mYW5nbWlu -Y24ub3JnCnx8ZmFuZ21pbmNuLm9yZwp8fGZhbnN3b25nLmNvbQouZmFueXVlLmlu -Zm8KLmZhcndlc3RjaGluYS5jb20KCiEtLUZhc3RseQplbi5mYXZvdHRlci5uZXQK -IS0tfHxybncuZ2xvYmFsLnNzbC5mYXN0bHkubmV0CnxodHRwczovLypnbG9iYWwu -c3NsLmZhc3RseS5uZXQvCnx8ZmFzdC53aXN0aWEuY29tCgp8fGZhc3Rzc2guY29t -Cnx8ZmFzdHN0b25lLm9yZwpmYXZzdGFyLmZtCnx8ZmF2c3Rhci5mbQpmYXlkYW8u -Y29tL3dlYmxvZwp8fGZiLmNvbQpmYi5tZQp8fGZiLm1lCnx8ZmJzYnguY29tCmZj -Mi5jb20KLmZjMmNoaW5hLmNvbQouZmMyY24uY29tCnx8ZmMyY24uY29tCmZjMmJs -b2cubmV0CnxodHRwOi8vdXlndXIuZmMyd2ViLmNvbS8KdmlkZW8uZmRib3guY29t -Ci5mZGM4OS5qcAp8fGZvdXJmYWNlLm5vZGVzbm9vcC5jb20KIS0tZmVlZGJvb2tz -Lm1vYmkKfHxmZWVsc3NoLmNvbQpmZWVyLmNvbQouZmVpZmVpc3MuY29tCnxodHRw -Oi8vZmVpdGlhbmFjYWRlbXkub3JnCi5mZWl0aWFuLWNhbGlmb3JuaWEub3JnCnx8 -ZmVtaW5pc3R0ZWFjaGVyLmNvbQouZmVuZ3poZW5naHUuY29tCnx8ZmVuZ3poZW5n -aHUuY29tCi5mZW5nemhlbmdodS5uZXQKfHxmZW5nemhlbmdodS5uZXQKLmZldmVy -bmV0LmNvbQp8aHR0cDovL2ZmLmltCmZmZmZmLmF0CmZmbGljay5jb20KZmdtdHYu -bmV0Ci5mZ210di5vcmcKLmZocmVwb3J0cy5uZXQKfGh0dHA6Ly9maHJlcG9ydHMu -bmV0Ci5maWxlZmx5ZXIuY29tCnx8ZmlsZWZseWVyLmNvbQp8aHR0cDovL2ZlZWRz -LmZpbGVmb3J1bS5jb20KLmZpbGVzMm1lLmNvbQouZmlsZXNlcnZlLmNvbS9maWxl -CmZpbGx0aGVzcXVhcmUub3JnCmZpbG1pbmdmb3J0aWJldC5vcmcKLmZpbHRoZHVt -cC5jb20KfHxmaW5hbGlvbi5qcAouZmluY2h2cG4uY29tCnx8ZmluY2h2cG4uY29t -CiEtLWZpbmRib29rLnR3CmZpbmRtZXNwb3QuY29tCi5maW5nZXJkYWlseS5jb20K -ZmlubGVyLm5ldAouZmlyZWZveGZhbi5jYwp8aHR0cDovL2ZpcmVmb3hmYW4uY2MK -LmZpcmVvZmxpYmVydHkub3JnCnx8ZmlyZW9mbGliZXJ0eS5vcmcKLmZpcmV0d2Vl -dC5pbwp8fGZpcmV0d2VldC5pbwohLS18fGZsYWdmb3gubmV0Ci5mbGFnc29ubGlu -ZS5pdApmbGVzaGJvdC5jb20KLmZsZXVyc2Rlc2xldHRyZXMuY29tCnxodHRwOi8v -ZmxldXJzZGVzbGV0dHJlcy5jb20KfHxmbGdnLnVzCgohLS18fGZhcm02LnN0YXRp -Y2ZsaWNrci5jb20KIS0tLmZsaWNrci5jb20vcGhvdG9zLzQ2MjMxMDc3QE4wNgoh -LS0uZmxpY2tyLmNvbS9ncm91cHMvYWl3ZWl3ZWkKIS0tLmZsaWNrci5jb20vcGhv -dG9zL2RpZ2l0YWxib3kxMDAKIS0tLmZsaWNrci5jb20vcGhvdG9zL2Z6aGVuZ2h1 -CiEtLS5mbGlja3IuY29tL3Bob3Rvcy9sb25lbHlmb3gKIS0tZmxpY2tyLmNvbS9w -aG90b3MvdmFudmFuLzUyOTkyNTE1NwohLS0uZmxpY2tyLmNvbS9waG90b3Mvd2lu -dGVya2FuYWwKIS0tLmZsaWNrci5jb20vcGhvdG9zL3pvbGEKfHxmbGlja3IuY29t -Cnx8c3RhdGljZmxpY2tyLmNvbQoKZmxpY2tyaGl2ZW1pbmQubmV0Ci5mbGluZy5j -b20KfHxmbGlwa2FydC5jb20KfGh0dHA6Ly9jbi5mbW5ub3cuY29tCmZvZmxkZnJh +YWlyLmNvbQp8fGJldHRlcm5ldC5jbwouYmV0dGVydnBuLmNvbQp8fGJldHRlcnZw +bi5jb20KLmJldHR3ZWVuLmNvbQp8fGJldHR3ZWVuLmNvbQp8fGJldHZpY3Rvci5j +b20KLmJld3d3Lm5ldAouYmV5b25kZmlyZXdhbGwuY29tCnx8YmZubi5vcmcKfHxi +ZnNoLmhrCi5iZ3Zwbi5jb20KfHxiZ3Zwbi5jb20KLmJpYW5sZWkuY29tCkBAfHxi +aWFubGVpLmNvbQpiaWFudGFpbGFqaWFvLmNvbQpiaWFudGFpbGFqaWFvLmluCi5i +aWJsZXNmb3JhbWVyaWNhLm9yZwp8aHR0cDovL2JpYmxlc2ZvcmFtZXJpY2Eub3Jn +Ci5iaWMyMDExLm9yZwpiaWdmb29scy5jb20KfHxiaWdqYXBhbmVzZXNleC5jb20K +LmJpZ25ld3Mub3JnCnx8YmlnbmV3cy5vcmcKLmJpZ3NvdW5kLm9yZwouYmlsaXdv +cmxkLmNvbQp8aHR0cDovL2JpbGl3b3JsZC5jb20KfGh0dHA6Ly9iaWxseXBhbi5j +b20vd2lraQouYmludXgubWUKYWkuYmlud2FuZy5tZS9jb3VwbGV0CmJpcGljLm5l +dAouYml0LmRvCnxodHRwOi8vYml0LmRvCi5iaXQubHkKfGh0dHA6Ly9iaXQubHkK +IS0tfHxiaXRidWNrZXQub3JnCnx8Yml0Y29pbnRhbGsub3JnCi5iaXRzaGFyZS5j +b20KfHxiaXRzaGFyZS5jb20KYml0c25vb3AuY29tCi5iaXR2aXNlLmNvbQp8fGJp +dHZpc2UuY29tCmJpemhhdC5jb20KfHxibC1kb3VqaW5zb3Vrby5jb20KLmJqbmV3 +bGlmZS5vcmcKLmJqcy5vcmcKYmp6Yy5vcmcKfHxianpjLm9yZwouYmxhY2tsb2dp +Yy5jb20KLmJsYWNrdnBuLmNvbQp8fGJsYWNrdnBuLmNvbQpibGV3cGFzcy5jb20K +dG9yLmJsaW5nYmxpbmdzcXVhZC5uZXQKLmJsaW5reC5jb20KfHxibGlua3guY29t +CmJsaW53LmNvbQouYmxpcC50dgp8fGJsaXAudHYvCi5ibG9ja2NuLmNvbQp8fGJs +b2NrY24uY29tCnx8YmxvY2tsZXNzLmNvbQp8fGJsb2cuZGUKLmJsb2cuanAKfGh0 +dHA6Ly9ibG9nLmpwCkBAfHxqcHVzaC5jbgouYmxvZ2NhdGFsb2cuY29tCnx8Ymxv +Z2NhdGFsb2cuY29tCnx8YmxvZ2NpdHkubWUKLmJsb2dnZXIuY29tCnx8YmxvZ2dl +ci5jb20KYmxvZ2ltZy5qcAp8fGJsb2cua2FuZ3llLm9yZwouYmxvZ2xpbmVzLmNv +bQp8fGJsb2dsaW5lcy5jb20KfHxibG9nbG92aW4uY29tCnJjb252ZXJzYXRpb24u +YmxvZ3MuY29tCmJsb2d0ZC5uZXQKLmJsb2d0ZC5vcmcKfGh0dHA6Ly9ibG9ndGQu +b3JnCnx8Ymxvb2RzaGVkLm5ldAouYmxvb21iZXJnLmNuCnx8Ymxvb21iZXJnLmNu +Ci5ibG9vbWJlcmcuY29tCnx8Ymxvb21iZXJnLmNvbQpibG9vbWJlcmcuZGUKfHxi +bG9vbWJlcmcuZGUKfHxibG9vbWZvcnR1bmUuY29tCmJsdWVhbmdlbGxpdmUuY29t +Ci5ibWZpbm4uY29tCi5ibmV3cy5jbwp8fGJuZXdzLmNvCnx8Ym5ybWV0YWwuY29t +CmJvYXJkcmVhZGVyLmNvbS90aHJlYWQKfHxib2FyZHJlYWRlci5jb20KLmJvZC5h +c2lhCnxodHRwOi8vYm9kLmFzaWEKLmJvZG9nODguY29tCi5ib2xlaHZwbi5uZXQK +fHxib2xlaHZwbi5uZXQKYm9uYm9ubWUuY29tCi5ib25ib25zZXguY29tCi5ib25m +b3VuZGF0aW9uLm9yZwouYm9uZ2FjYW1zLmNvbQp8fGJvb2JzdGFncmFtLmNvbQp8 +fGJvb2suY29tLnR3CmJvb2tlcHViLmNvbQp8fGJvb2tzLmNvbS50dwp8fGJvdGFu +d2FuZy5jb20KLmJvdC5udQouYm93ZW5wcmVzcy5jb20KfHxib3dlbnByZXNzLmNv +bQp8fGFwcC5ib3guY29tCmRsLmJveC5uZXQKfHxkbC5ib3gubmV0Ci5ib3hwbi5j +b20KfHxib3hwbi5jb20KYm94dW4uY29tCnx8Ym94dW4uY29tCi5ib3h1bi50dgp8 +fGJveHVuLnR2CmJveHVuYmxvZy5jb20KfHxib3h1bmJsb2cuY29tCi5ib3h1bmNs +dWIuY29tCmJveWFuZ3UuY29tCi5ib3lmcmllbmR0di5jb20KLmJveXNmb29kLmNv +bQp8fGJyLnN0Ci5icmFpbnlxdW90ZS5jb20vcXVvdGVzL2F1dGhvcnMvZC9kYWxh +aV9sYW1hCnx8YnJhbmRvbmh1dGNoaW5zb24uY29tCnx8YnJhdW1laXN0ZXIub3Jn +Ci5icmF2b3R1YmUubmV0Cnx8YnJhdm90dWJlLm5ldAouYnJhenplcnMuY29tCnx8 +YnJhenplcnMuY29tCi5icmVhay5jb20KfHxicmVhay5jb20KYnJlYWtnZncuY29t +Cnx8YnJlYWtnZncuY29tCmJyZWFraW5nOTExLmNvbQouYnJlYWtpbmd0d2VldHMu +Y29tCnx8YnJlYWtpbmd0d2VldHMuY29tCnx8YnJlYWt3YWxsLm5ldApicmlpYW4u +Y29tLzY1MTEvZnJlZWdhdGUKLmJyaWVmZHJlYW0uY29tLyVFNyVCNCVBMCVFNiVB +MyVCQQpicml6emx5LmNvbQp8fGJyaXp6bHkuY29tCnx8YnJrbWQuY29tCmJyb2Fk +Ym9vay5jb20KLmJyb2FkcHJlc3NpbmMuY29tCnx8YnJvYWRwcmVzc2luYy5jb20K +YmJzLmJyb2NrYmJzLmNvbQpicnVjZXdhbmcubmV0Ci5icnV0YWx0Z3AuY29tCnx8 +YnJ1dGFsdGdwLmNvbQouYnQybWFnLmNvbQp8fGJ0OTUuY29tCi5idGFpYS5jb20K +LmJ0YnRhdi5jb20KfGh0dHA6Ly9idGRpZ2cub3JnCi5idGt1Lm1lCnx8YnRrdS5t +ZQp8fGJ0a3Uub3JnCi5idHNwcmVhZC5jb20KLmJ0c3luY2tleXMuY29tCi5idWRh +ZWR1Lm9yZwp8fGJ1ZGFlZHUub3JnCi5idWRkaGFuZXQuY29tLnR3L3pmcm9wL3Rp +YmV0Ci5idWRkaGlzdGNoYW5uZWwudHYKLmJ1ZmZlcmVkLmNvbQp8aHR0cDovL2J1 +ZmZlcmVkLmNvbQouYnVsbG9nLm9yZwp8fGJ1bGxvZy5vcmcKLmJ1bGxvZ2dlci5j +b20KfHxidWxsb2dnZXIuY29tCmJ1bmJ1bmhrLmNvbQouYnVzYXlhcmkuY29tCnxo +dHRwOi8vYnVzYXlhcmkuY29tCi5idXNpbmVzc2luc2lkZXIuY29tL2JpbmctY291 +bGQtYmUtY2Vuc29yaW5nLXNlYXJjaC1yZXN1bHRzLTIwMTQKLmJ1c2luZXNzaW5z +aWRlci5jb20vY2hpbmEtYmFua3MtcHJlcGFyaW5nLWZvci1kZWJ0LWltcGxvc2lv +bi0yMDE0Ci5idXNpbmVzc2luc2lkZXIuY29tL2hvbmcta29uZy1hY3RpdmlzdHMt +ZGVmeS1wb2xpY2UtdGVhci1nYXMtYXMtcHJvdGVzdHMtY29udGludWUtb3Zlcm5p +Z2h0LTIwMTQKLmJ1c2luZXNzaW5zaWRlci5jb20vaW50ZXJuZXQtb3V0YWdlcy1y +ZXBvcnRlZC1pbi1ub3J0aC1rb3JlYS0yMDE0Ci5idXNpbmVzc2luc2lkZXIuY29t +L2lwaG9uZS02LWlzLWFwcHJvdmVkLWZvci1zYWxlLWluLWNoaW5hLTIwMTQKLmJ1 +c2luZXNzaW5zaWRlci5jb20vbmZsLWFubm91bmNlcnMtc3VyZmFjZS10YWJsZXRz +LTIwMTQKLmJ1c2luZXNzaW5zaWRlci5jb20vcGFuYW1hLXBhcGVycwouYnVzaW5l +c3NpbnNpZGVyLmNvbS91bWJyZWxsYS1tYW4taG9uZy1rb25nLTIwMTQKfGh0dHA6 +Ly93d3cuYnVzaW5lc3NpbnNpZGVyLmNvbS5hdS8qCi5idXNpbmVzc3dlZWsuY29t +Ci5idXN1Lm9yZy9uZXdzCnxodHRwOi8vYnVzdS5vcmcvbmV3cwpidXN5dHJhZGUu +Y29tCi5idXVnYWEuY29tCi5idXp6aGFuZC5jb20KLmJ1enpoYW5kLm5ldAouYnV6 +em9yYW5nZS5jb20KfHxidXp6b3JhbmdlLmNvbQp8fGJ2cG4uY29tCmJ3c2ouaGsK +fHxieC50bAoKIS0tLS0tLS0tLS0tLS0tLS0tLS0tQ0MtLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tCi5jLXNwYW52aWRlby5vcmcKfHxjLXNwYW52aWRlby5vcmcKfHxj +LWVzdC1zaW1wbGUuY29tCi5jMTAwdGliZXQub3JnCnx8Y2FibGVnYXRlc2VhcmNo +Lm5ldAouY2FjaGluZXNlLmNvbQouY2FjbncuY29tCnxodHRwOi8vY2FjbncuY29t +Ci5jYWN0dXN2cG4uY29tCnx8Y2FjdHVzdnBuLmNvbQouY2FmZXByZXNzLmNvbQou +Y2Foci5vcmcudHcKLmNhbGFtZW8uY29tL2Jvb2tzCmNuLmNhbGFtZW8uY29tCnxo +dHRwOi8vY24uY2FsYW1lby5jb20KLmNhbGdhcnljaGluZXNlLmNhCi5jYWxnYXJ5 +Y2hpbmVzZS5jb20KLmNhbGdhcnljaGluZXNlLm5ldAp8aHR0cDovL2Jsb2cuY2Fs +aWJyZS1lYm9vay5jb20KfGh0dHA6Ly9nb29nbGUuY2Fsc3RhdGUuZWR1CmZhbHVu +LmNhbHRlY2guZWR1Ci5pdHMuY2FsdGVjaC5lZHUvfmZhbHVuLwouY2FtNC5jb20K +LmNhbTQuanAKLmNhbTQuc2cKLmNhbWZyb2cuY29tCnx8Y2FtZnJvZy5jb20KfHxj +YW1zLmNvbQouY2Ftcy5vcmcuc2cKY2FuYWRhbWVldC5jb20KLmNhbmFscG9ybm8u +Y29tCnxodHRwOi8vYmJzLmNhbnRvbmVzZS5hc2lhLwohLS1odHRwOi8vd3d3LmNh +bnRvbmVzZS5hc2lhL2FjdGlvbi1iYnMuaHRtbAouY2FueXUub3JnCnx8Y2FueXUu +b3JnCi5jYW8uaW0KLmNhb2JpYW4uaW5mbwp8fGNhb2JpYW4uaW5mbwpjYW9jaGFu +Z3FpbmcuY29tCnx8Y2FvY2hhbmdxaW5nLmNvbQouY2FwLm9yZy5oawp8fGNhcC5v +cmcuaGsKLmNhcmFiaW5hc3lwaXN0b2xhcy5jb20KY2FyZGluYWxrdW5nZm91bmRh +dGlvbi5vcmcKY2FybW90b3JzaG93LmNvbQpzcy5jYXJyeXpob3UuY29tCi5jYXJ0 +b29ubW92ZW1lbnQuY29tCnx8Y2FydG9vbm1vdmVtZW50LmNvbQouY2FzYWRlbHRp +YmV0YmNuLm9yZwouY2FzYXRpYmV0Lm9yZy5teAp8aHR0cDovL2Nhc2F0aWJldC5v +cmcubXgKY2FyaS5jb20ubXkKfHxjYXJpYmJlYW5jb20uY29tCi5jYXNpbm9raW5n +LmNvbQouY2FzaW5vcml2YS5jb20KfHxjYXRjaDIyLm5ldAouY2F0Y2hnb2QuY29t +CnxodHRwOi8vY2F0Y2hnb2QuY29tCnx8Y2F0ZmlnaHRwYXlwZXJ2aWV3Lnh4eAou +Y2F0aG9saWMub3JnLmhrCnx8Y2F0aG9saWMub3JnLmhrCmNhdGhvbGljLm9yZy50 +dwp8fGNhdGhvbGljLm9yZy50dwouY2F0aHZvaWNlLm9yZy50dwp8fGNhdHR0LmNv +bQouY2JjLmNhCnx8Y2JjLmNhCi5jYnNuZXdzLmNvbS92aWRlbwouY2J0Yy5vcmcu +aGsKIS0uY2NjLmRlCiEtfHxjY2MuZGUKfHxjY2NhdC5jYwp8fGNjY2F0LmNvCi5j +Y2R0ci5vcmcKfHxjY2R0ci5vcmcKLmNjaGVyZS5jb20KfHxjY2hlcmUuY29tCi5j +Y2ltLm9yZwouY2NsaWZlLmNhCmNjbGlmZS5vcmcKY2NsaWZlZmwub3JnCi5jY3Ro +ZXJlLmNvbQp8fGNjdGhlcmUuY29tCi5jY3Rtd2ViLm5ldAouY2N0b25nYmFvLmNv +bS9hcnRpY2xlLzIwNzg3MzIKY2N1ZS5jYQpjY3VlLmNvbQouY2N2b2ljZS5jYQou +Y2N3Lm9yZy50dwouY2dkZXBvdC5vcmcKfGh0dHA6Ly9jZ2RlcG90Lm9yZwp8fGNk +Ym9vay5vcmcKLmNkY3BhcnR5LmNvbQouY2RlZi5vcmcKfHxjZGVmLm9yZwp8fGNk +aWcuaW5mbwpjZGpwLm9yZwp8fGNkanAub3JnCi5jZG4tYXBwbGUuY29tCnx8Y2Ru +LWFwcGxlLmNvbQouY2RuZXdzLmNvbS50dwpjZHAxOTg5Lm9yZwpjZHAxOTk4Lm9y +Zwp8fGNkcDE5OTgub3JnCmNkcDIwMDYub3JnCnx8Y2RwMjAwNi5vcmcKLmNkcGEu +dXJsLnR3CmNkcGV1Lm9yZwpjZHB1c2Eub3JnCmNkcHdlYi5vcmcKfHxjZHB3ZWIu +b3JnCmNkcHd1Lm9yZwp8fGNkcHd1Lm9yZwp8fGNkdy5jb20KLmNlY2MuZ292Cnx8 +Y2VjYy5nb3YKfHxjZWxsdWxvLmluZm8KfHxjZW5ld3MuZXUKfHxjZW50ZXJmb3Jo +dW1hbnJlcHJvZC5jb20KfHxjZW50cmFsbmF0aW9uLmNvbQouY2VudHVyeXMubmV0 +CnxodHRwOi8vY2VudHVyeXMubmV0Ci5jZmhrcy5vcmcuaGsKLmNmb3MuZGUKLmNm +dGZjLmNvbQouY2dzdC5lZHUKLmNoYW5nZS5vcmcKfHxjaGFuZ2Uub3JnCi5jaGFu +Z3AuY29tCnx8Y2hhbmdwLmNvbQouY2hhbmdzYS5uZXQKfGh0dHA6Ly9jaGFuZ3Nh +Lm5ldAouY2hhbm5lbDhuZXdzLnNnL25ld3M4Ci5jaGFwbTI1LmNvbQouY2hhdHVy +YmF0ZS5jb20KLmNodWFuZy15ZW4ub3JnCmNoZW5nbWluZ21hZy5jb20KLmNoZW5n +dWFuZ2NoZW5nLmNvbQp8fGNoZW5ndWFuZ2NoZW5nLmNvbQouY2hlbnBva29uZy5j +b20KLmNoZW5wb2tvbmcubmV0CnxodHRwOi8vY2hlbnBva29uZy5uZXQKfHxjaGVy +cnlzYXZlLmNvbQouY2hob25nYmkub3JnCmNoaWNhZ29uY210di5jb20KfGh0dHA6 +Ly9jaGljYWdvbmNtdHYuY29tCi5jaGluYS13ZWVrLmNvbQpjaGluYTEwMS5jb20K +fHxjaGluYTEwMS5jb20KfHxjaGluYTE4Lm9yZwp8fGNoaW5hMjEuY29tCmNoaW5h +MjEub3JnCnx8Y2hpbmEyMS5vcmcKLmNoaW5hNTAwMC51cwpjaGluYWFmZmFpcnMu +b3JnCnx8Y2hpbmFhZmZhaXJzLm9yZwp8fGNoaW5hYWlkLm1lCmNoaW5hYWlkLnVz +CmNoaW5hYWlkLm9yZwpjaGluYWFpZC5uZXQKY2hpbmFjb21tZW50cy5vcmcKfHxj +aGluYWNvbW1lbnRzLm9yZwouY2hpbmFjaGFuZ2Uub3JnCnx8Y2hpbmFjaGFuZ2Uu +b3JnCmNoaW5hY2hhbm5lbC5oawp8fGNoaW5hY2hhbm5lbC5oawouY2hpbmFjaXR5 +bmV3cy5iZQouY2hpbmFkaWFsb2d1ZS5uZXQKLmNoaW5hZGlnaXRhbHRpbWVzLm5l +dAp8fGNoaW5hZGlnaXRhbHRpbWVzLm5ldAouY2hpbmFlbGVjdGlvbnMub3JnCnx8 +Y2hpbmFlbGVjdGlvbnMub3JnCi5jaGluYWV3ZWVrbHkuY29tCnx8Y2hpbmFld2Vl +a2x5LmNvbQp8fGNoaW5hZnJlZXByZXNzLm9yZwouY2hpbmFnYXRlLmNvbQpjaGlu +YWdlZWtzLm9yZwpjaGluYWdmdy5vcmcKfHxjaGluYWdmdy5vcmcKLmNoaW5hZ29u +ZXQuY29tCi5jaGluYWdyZWVucGFydHkub3JnCnx8Y2hpbmFncmVlbnBhcnR5Lm9y +ZwouY2hpbmFob3Jpem9uLm9yZwp8fGNoaW5haG9yaXpvbi5vcmcKLmNoaW5haHVz +aC5jb20KLmNoaW5haW5wZXJzcGVjdGl2ZS5jb20KfHxjaGluYWludGVyaW1nb3Yu +b3JnCmNoaW5hbGFib3J3YXRjaC5vcmcKY2hpbmFsYXd0cmFuc2xhdGUuY29tCi5j +aGluYXBvc3QuY29tLnR3L3RhaXdhbi9uYXRpb25hbC9uYXRpb25hbC1uZXdzCmNo +aW5heGNoaW5hLmNvbS9ob3d0bwpjaGluYWxhd2FuZHBvbGljeS5jb20KLmNoaW5h +bXVsZS5jb20KfHxjaGluYW11bGUuY29tCmNoaW5hbXoub3JnCi5jaGluYXByZXNz +LmNvbS5teQp8fGNoaW5hcHJlc3MuY29tLm15Ci5jaGluYS1yZXZpZXcuY29tLnVh +CnxodHRwOi8vY2hpbmEtcmV2aWV3LmNvbS51YQouY2hpbmFyaWdodHNpYS5vcmcK +Y2hpbmFzbWlsZS5uZXQvZm9ydW1zCmNoaW5hc29jaWFsZGVtb2NyYXRpY3BhcnR5 +LmNvbQp8fGNoaW5hc29jaWFsZGVtb2NyYXRpY3BhcnR5LmNvbQpjaGluYXNvdWwu +b3JnCnx8Y2hpbmFzb3VsLm9yZwouY2hpbmFzdWNrcy5uZXQKLmNoaW5hdGltZXMu +Y29tL3JlYWx0aW1lbmV3cy8yNjA0MDkvCnx8Y2hpbmF0b3BzZXguY29tCi5jaGlu +YXRvd24uY29tLmF1CmNoaW5hdHdlZXBzLmNvbQpjaGluYXdheS5vcmcKLmNoaW5h +d29ya2VyLmluZm8KfHxjaGluYXdvcmtlci5pbmZvCmNoaW5heW91dGgub3JnLmhr +CmNoaW5heXVhbm1pbi5vcmcKfHxjaGluYXl1YW5taW4ub3JnCi5jaGluZXNlLWhl +cm1pdC5uZXQKY2hpbmVzZS1sZWFkZXJzLm9yZwpjaGluZXNlLW1lbW9yaWFsLm9y +ZwouY2hpbmVzZWRhaWx5LmNvbQp8fGNoaW5lc2VkYWlseW5ld3MuY29tCi5jaGlu +ZXNlZGVtb2NyYWN5LmNvbQp8fGNoaW5lc2VkZW1vY3JhY3kuY29tCnx8Y2hpbmVz +ZWdheS5vcmcKLmNoaW5lc2VuLmRlCnx8Y2hpbmVzZW4uZGUKLmNoaW5lc2VuZXdz +Lm5ldC5hdS8KLmNoaW5lc2VwZW4ub3JnCi5jaGluZXNldGFsa3MubmV0L2NoCnx8 +Y2hpbmVzZXVwcmVzcy5jb20KLmNoaW5nY2hlb25nLmNvbQp8fGNoaW5nY2hlb25n +LmNvbQouY2hpbm1hbi5uZXQKfGh0dHA6Ly9jaGlubWFuLm5ldApjaGl0aHUub3Jn +CnxodHRwOi8vY2huLmNob3N1bi5jb20KY25uZXdzLmNob3N1bi5jb20vY2xpZW50 +L25ld3Mvdml3LmFzcD9jYXRlPUMwMSZtY2F0ZQouY2hyZG5ldC5jb20KfGh0dHA6 +Ly9jaHJkbmV0LmNvbQouY2hyaXN0aWFuZnJlZWRvbS5vcmcKfGh0dHA6Ly9jaHJp +c3RpYW5mcmVlZG9tLm9yZwpjaHJpc3RpYW5zdHVkeS5jb20KfHxjaHJpc3RpYW5z +dHVkeS5jb20KY2hyaXN0dXNyZXgub3JnL3d3dzEvc2RjCi5jaHVib2xkLmNvbQpj +aHVidW4uY29tCmNodWl6aS5uZXQKY2hyaXN0aWFudGltZXMub3JnLmhrCi5jaHJs +YXd5ZXJzLmhrCnxodHRwOi8vY2hybGF3eWVycy5oawouY2h1cmNoaW5ob25na29u +Zy5vcmcvYjUvaW5kZXgucGhwCnxodHRwOi8vY2h1cmNoaW5ob25na29uZy5vcmcv +YjUvaW5kZXgucGhwCi5jaHVzaGlnYW5nZHJ1Zy5jaAouY2llbmVuLmNvbQouY2lu +ZWFzdGVudHJlZmYuZGUKLmNpcGZnLm9yZwp8fGNpcmNsZXRoZWJheWZvcnRpYmV0 +Lm9yZwp8fGNpcm9zYW50aWxsaS5jb20KLmNpdGl6ZW5jbi5jb20KfHxjaXRpemVu +Y24uY29tCnxodHRwOi8vY2l0aXplbmxhYi5vcmcKfGh0dHA6Ly93d3cuY2l0aXpl +bmxhYi5vcmcKfHxjaXRpemVuc2NvbW1pc3Npb24uaGsKLmNpdGl6ZW5sYWIub3Jn +CmNpdGl6ZW5zcmFkaW8ub3JnCi5jaXR5MzY1LmNhCnxodHRwOi8vY2l0eTM2NS5j +YQpjaXR5OXguY29tCnx8Y2l0eXBvcHVsYXRpb24uZGUKLmNpdHl0YWxrLnR3L2V2 +ZW50Ci5jaXZpY3BhcnR5LmhrCnx8Y2l2aWNwYXJ0eS5oawouY2l2aWxkaXNvYmVk +aWVuY2Vtb3ZlbWVudC5vcmcKY2l2aWxocmZyb250Lm9yZwp8fGNpdmlsaHJmcm9u +dC5vcmcKLmNpdmlsaWFuZ3VubmVyLmNvbQouY2l2aWxtZWRpYS50dwp8fGNpdmls +bWVkaWEudHcKcHNpcGhvbi5jaXZpc2VjLm9yZwp8fHZwbi5jamIubmV0Ci5jazEw +MS5jb20KfHxjazEwMS5jb20KLmNsYXJpb25wcm9qZWN0Lm9yZy9uZXdzL2lzbGFt +aWMtc3RhdGUtaXNpcy1pc2lsLXByb3BhZ2FuZGEKfHxjbGFzc2ljYWxndWl0YXJi +bG9nLm5ldAouY2xiLm9yZy5oawpjbGVhcmhhcm1vbnkubmV0CmNsZWFyd2lzZG9t +Lm5ldApjbGluaWNhLXRpYmV0LnJ1Ci5jbGlwZmlzaC5kZQpjbG9ha3BvaW50LmNv +bQp8fGNsdWIxMDY5LmNvbQpjbWkub3JnLnR3CnxodHRwOi8vd3d3LmNtb2luYy5v +cmcKY21wLmhrdS5oawpoa3Vwb3AuaGt1LmhrCnx8Y211bGUuY29tCnx8Y211bGUu +b3JnCnx8Y21zLmdvdgp8aHR0cDovL3Zwbi5jbXUuZWR1CnxodHRwOi8vdnBuLnN2 +LmNtdS5lZHUKLmNuNi5ldQouY25hLmNvbS50dwp8fGNuYS5jb20udHcKLmNuYWJj +LmNvbQouY25kLm9yZwp8fGNuZC5vcmcKZG93bmxvYWQuY25ldC5jb20KLmNuZXgu +b3JnLmNuCi5jbmluZXUuY29tCndpa2kuY25pdHRlci5jb20KLmNubi5jb20vdmlk +ZW8KLmNucG9saXRpY3Mub3JnCnx8Y25wb2xpdGljcy5vcmcKLmNuLXByb3h5LmNv +bQp8aHR0cDovL2NuLXByb3h5LmNvbQouY25wcm94eS5jb20KYmxvZy5jbnllcy5j +b20KbmV3cy5jbnllcy5jb20KfHxjb2F0LmNvLmpwCi5jb2NoaW5hLmNvCnx8Y29j +aGluYS5jbwp8fGNvY2hpbmEub3JnCi5jb2RlMTk4NC5jb20vNjQKfGh0dHA6Ly9n +b2FnZW50LmNvZGVwbGV4LmNvbQp8fGNvZGVzaGFyZS5pbwp8fGNvZGVza3VscHRv +ci5vcmcKfGh0dHA6Ly90b3NoLmNvbWVkeWNlbnRyYWwuY29tCmNvbWVmcm9tY2hp +bmEuY29tCnx8Y29tZWZyb21jaGluYS5jb20KLmNvbWljLW1lZ2EubWUKY29tbWFu +ZGFybXMuY29tCnx8Y29tbWVudHNoay5jb20KLmNvbW11bmlzdGNyaW1lcy5vcmcK +fHxjb21tdW5pc3RjcmltZXMub3JnCnx8Y29tbXVuaXR5Y2hvaWNlY3UuY29tCnx8 +Y29tcGlsZWhlYXJ0LmNvbQp8fGNvbm9oYS5qcAouY29udGFjdG1hZ2F6aW5lLm5l +dAouY29udmlvLm5ldAouY29vYmF5LmNvbQp8aHR0cDovL3d3dy5jb29sMTguY29t +L2JicyovCi5jb29sYWxlci5jb20KfHxjb29sYWxlci5jb20KY29vbGRlci5jb20K +fHxjb29sZGVyLmNvbQp8fGNvb2xsb3VkLm9yZy50dwouY29vbG5jdXRlLmNvbQp8 +fGNvb2xzdHVmZmluYy5jb20KY29ydW1jb2xsZWdlLmNvbQouY29zLW1vZS5jb20K +fGh0dHA6Ly9jb3MtbW9lLmNvbQouY29zcGxheWphdi5wbAp8aHR0cDovL2Nvc3Bs +YXlqYXYucGwKLmNvdHdlZXQuY29tCnx8Y290d2VldC5jb20KLmNvdXJzZWhlcm8u +Y29tCnx8Y291cnNlaGVyby5jb20KY3BqLm9yZwp8fGNwai5vcmcKLmNxOTkudXMK +fGh0dHA6Ly9jcTk5LnVzCmNyYWNrbGUuY29tCnx8Y3JhY2tsZS5jb20KLmNyYXp5 +cy5jYwouY3JhenlzaGl0LmNvbQp8fGNyY2hpbmEub3JnCmNyZC1uZXQub3JnCmNy +ZWFkZXJzLm5ldAp8fGNyZWFkZXJzLm5ldAouY3JlYWRlcnNuZXQuY29tCnx8Y3Jp +c3R5bGkuY29tCi5jcm9jb3R1YmUuY29tCnxodHRwOi8vY3JvY290dWJlLmNvbQou +Y3Jvc3N0aGV3YWxsLm5ldAp8fGNyb3NzdGhld2FsbC5uZXQKLmNyb3NzdnBuLm5l +dAp8fGNyb3NzdnBuLm5ldAp8fGNydWNpYWwuY29tCmNzZHBhcnR5LmNvbQp8fGNz +ZHBhcnR5LmNvbQp8fGNzdWNoZW4uZGUKLmNzdy5vcmcudWsKLmN0Lm9yZy50dwp8 +fGN0Lm9yZy50dwouY3Rhby5vcmcKLmN0ZnJpZW5kLm5ldAouY3RpdHYuY29tLnR3 +CmN0cy5jb20udHcKfGh0dHA6Ly9saWJyYXJ5LnVzYy5jdWhrLmVkdS5oay8KfGh0 +dHA6Ly9tamxzaC51c2MuY3Voay5lZHUuaGsvCi5jdWhrYWNzLm9yZy9+YmVubmcK +LmN1aWh1YS5vcmcKfHxjdWlodWEub3JnCi5jdWl3ZWlwaW5nLm5ldAp8fGN1aXdl +aXBpbmcubmV0Cnx8Y3VsdHVyZS50dwouY3VtbG91ZGVyLmNvbQp8fGN1bWxvdWRl +ci5jb20KfHxjdXJ2ZWZpc2guY29tCi5jdXN1LmhrCnx8Y3VzdS5oawouY3V0c2Nl +bmVzLm5ldAouY3cuY29tLnR3Cnx8Y3cuY29tLnR3CnxodHRwOi8vZm9ydW0uY3li +ZXJjdG0uY29tCmN5YmVyZ2hvc3R2cG4uY29tCnx8Y3liZXJnaG9zdHZwbi5jb20K +fHxjeW5zY3JpYmUuY29tCmN5dG9kZS51cwp8fGlmYW4uY3ouY2MKfHxtaWtlLmN6 +LmNjCnx8bmljLmN6LmNjCgohLS0tLS0tLS0tLS0tLS0tLS0tLS1ERC0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0KLmQtZnVreXUuY29tCnxodHRwOi8vZC1mdWt5dS5j +b20KY2wuZDB6Lm5ldAouZDEwMC5uZXQKfHxkMTAwLm5ldAouZDJiYXkuY29tCnxo +dHRwOi8vZDJiYXkuY29tCi5kYWJyLmNvLnVrCnx8ZGFici5jby51awpkYWJyLmV1 +CmRhYnIubW9iaQp8fGRhYnIubW9iaQp8fGRhYnIubWUKZGFkYXppbS5jb20KfHxk +YWRhemltLmNvbQouZGFkaTM2MC5jb20KLmRhZmFiZXQuY29tCmRhZmFnb29kLmNv +bQpkYWZhaGFvLmNvbQouZGFmb2gub3JnCi5kYWZ0cG9ybi5jb20KLmRhZ2VsaWpr +c2VzdGFuZGFhcmQubmwKLmRhaWRvc3R1cC5ydQp8aHR0cDovL2RhaWRvc3R1cC5y +dQouZGFpbGlkYWlsaS5jb20KfHxkYWlsaWRhaWxpLmNvbQouZGFpbHltb3Rpb24u +Y29tCnx8ZGFpbHltb3Rpb24uY29tCmRhaXBoYXBpbmZvLm5ldAouZGFqaXl1YW4u +Y29tCnx8ZGFqaXl1YW4uZGUKZGFqaXl1YW4uZXUKZGFsYWlsYW1hLmNvbQouZGFs +YWlsYW1hLm1uCnxodHRwOi8vZGFsYWlsYW1hLm1uCi5kYWxhaWxhbWEucnUKfHxk +YWxhaWxhbWEucnUKZGFsYWlsYW1hODAub3JnCi5kYWxhaWxhbWEtYXJjaGl2ZXMu +b3JnCi5kYWxhaWxhbWFjZW50ZXIub3JnCnxodHRwOi8vZGFsYWlsYW1hY2VudGVy +Lm9yZwpkYWxhaWxhbWFmZWxsb3dzLm9yZwouZGFsYWlsYW1hZmlsbS5jb20KLmRh +bGFpbGFtYWZvdW5kYXRpb24ub3JnCi5kYWxhaWxhbWFoaW5kaS5jb20KLmRhbGFp +bGFtYWluYXVzdHJhbGlhLm9yZwouZGFsYWlsYW1hamFwYW5lc2UuY29tCi5kYWxh +aWxhbWFwcm90ZXN0ZXJzLmluZm8KLmRhbGFpbGFtYXF1b3Rlcy5vcmcKLmRhbGFp +bGFtYXRydXN0Lm9yZwouZGFsYWlsYW1hdmlzaXQub3JnLm56Ci5kYWxhaWxhbWF3 +b3JsZC5jb20KfHxkYWxhaWxhbWF3b3JsZC5jb20KZGFsaWFubWVuZy5vcmcKfHxk +YWxpYW5tZW5nLm9yZwouZGFsaXVsaWFuLm9yZwp8fGRhbGl1bGlhbi5vcmcKLmRh +bmtlNGNoaW5hLm5ldAp8fGRhbmtlNGNoaW5hLm5ldAouZGFud2VpLm9yZwpkYW9s +YW4ubmV0Ci5kYW96aG9uZ3hpbmcub3JnCmRhcmt0b3kubmV0Cnx8ZGFzdHJhc3Np +Lm9yZwpibG9nLmRhdW0ubmV0L19ibG9nCi5kYXZpZC1raWxnb3VyLmNvbQp8aHR0 +cDovL2RhdmlkLWtpbGdvdXIuY29tCmRheGEuY24KfHxkYXhhLmNuCmNuLmRheWFi +b29rLmNvbQouZGF5bGlmZS5jb20vdG9waWMvZGFsYWlfbGFtYQp8fGRiLnR0Ci5k +YmMuaGsvbWFpbgp8fGRjYXJkLnR3CmRjbWlsaXRhcnkuY29tCi5kZGMuY29tLnR3 +Ci5kZGh3LmluZm8KfHxkZS1zY2kub3JnCi5kZS1zY2kub3JnCnBhY2thZ2VzLmRl +Ymlhbi5vcmcvemgtY24vbGVubnkvZ3Bhc3MKfHxkZWNvZGV0LmNvCgohLS1Pcmln +aW46Y2RuLWkzMCRfCiEtLUV4Y2VwdGlvbjogSG9tZXBhZ2UgYWNjZXNzIHdpdGhv +dXQgcnN0CiEtLUtleXdvcmQgaXMgJF8KLmRlZmluZWJhYmUuY29tCgp8fGRlbGNh +bXAubmV0CmRlbGljaW91cy5jb20vR0ZXYm9va21hcmsKLmRlbW9jcmF0cy5vcmcK +fHxkZW1vY3JhdHMub3JnCnx8ZGVzYy5zZQp8fGRlc3NjaS5jb20KLmRlc3Ryb3kt +Y2hpbmEuanAKfHxkZXV0c2NoZS13ZWxsZS5kZQohLS18fGRldmlhbnRhcnQuY29t +CiEtLXx8ZGV2aWFudGFydC5uZXQKfHxkZXZpby51cwp8fGRldnBuLmNvbQp8fGRm +YXMubWlsCmRmbi5vcmcKZGhhcm1ha2FyYS5uZXQKLmRoYXJhbXNhbGFuZXQuY29t +Ci5kaWFveXVpc2xhbmRzLm9yZwp8fGRpYW95dWlzbGFuZHMub3JnCi5kaWZhbmd3 +ZW5nZS5vcmcKfGh0dHA6Ly9kaWdpbGFuZC50dy8KfHxkaWdpdGFsbm9tYWRzcHJv +amVjdC5vcmcKLmRpaWdvLmNvbQp8fGRpaWdvLmNvbQp8fGRpbGJlci5zZQp8fGZ1 +cmwubmV0Ci5kaXBpdHkuY29tCnx8ZGlyZWN0Y3JlYXRpdmUuY29tCiEtLXx8ZGlz +Y29ncy5jb20KIS0tQEB8fGNkbi5kaXNjb2dzLmNvbQp8aHR0cHM6Ly9zZWFyY2gu +ZGlzY29ubmVjdC5tZQouZGlzY3Vzcy5jb20uaGsKfHxkaXNjdXNzLmNvbS5oawou +ZGlzY3VzczR1LmNvbQpkaXNwLmNjCi5kaXNxdXMuY29tCnx8ZGlzcXVzLmNvbQou +ZGl0LWluYy51cwp8fGRpdC1pbmMudXMKLmRpemhpZGl6aGkuY29tCnx8ZGl6aHV6 +aGlzaGFuZy5jb20KZGphbmdvc25pcHBldHMub3JnCi5kam9yei5jb20KfHxkam9y +ei5jb20KfHxkbC1sYWJ5LmpwCnx8ZGxzaXRlLmNvbQp8fGRseW91dHViZS5jb20K +fHxkbWNkbi5uZXQKLmRuc2NyeXB0Lm9yZwp8fGRuc2NyeXB0Lm9yZwp8fGRuczJn +by5jb20KfHxkbnNzZWMubmV0CmRvY3RvcnZvaWNlLm9yZwoKIS0tRG9nRmFydE5l +dHdvcmsKLmRvZ2ZhcnRuZXR3b3JrLmNvbS90b3VyCmdsb3J5aG9sZS5jb20KCi5k +b2ppbi5jb20KLmRvay1mb3J1bS5uZXQKfHxkb2xjLmRlCnx8ZG9sZi5vcmcuaGsK +fHxkb2xsZi5jb20KLmRvbWFpbi5jbHViLnR3Ci5kb21haW50b2RheS5jb20uYXUK +Y2hpbmVzZS5kb25nYS5jb20KZG9uZ3RhaXdhbmcuY29tCnx8ZG9uZ3RhaXdhbmcu +Y29tCi5kb25ndGFpd2FuZy5uZXQKfHxkb25ndGFpd2FuZy5uZXQKLmRvbmd5YW5n +amluZy5jb20KfGh0dHA6Ly9kYW5ib29ydS5kb25tYWkudXMKLmRvbnRmaWx0ZXIu +dXMKfHxkb250bW92ZXRvY2hpbmEuY29tCi5kb3JqZXNodWdkZW4uY29tCi5kb3Rw +bGFuZS5jb20KfHxkb3RwbGFuZS5jb20KfHxkb3RzdWIuY29tCi5kb3R2cG4uY29t +Cnx8ZG90dnBuLmNvbQouZG91Yi5pbwp8fGRvdWIuaW8KfHxkb3Vnc2NyaXB0cy5j +b20KfHxkb3Vob2thbmtvLm5ldAp8fGRvdWppbmNhZmUuY29tCmRvd2VpLm9yZwpk +cGhrLm9yZwpkcHAub3JnLnR3Cnx8ZHBwLm9yZy50dwp8fGRwci5pbmZvCnx8ZHJh +Z29uc3ByaW5ncy5vcmcKIS0tfHxkcmF3LmlvCi5kcmVhbWFtYXRldXJzLmNvbQou +ZHJlcHVuZy5vcmcKfHxkcmdhbi5uZXQKLmRybWluZ3hpYS5vcmcKfGh0dHA6Ly9k +cm1pbmd4aWEub3JnCnx8ZHJvcGJvb2tzLnR2Cnx8ZHJvcGJveC5jb20KfHxhcGku +ZHJvcGJveGFwaS5jb20KfHxub3RpZnkuZHJvcGJveGFwaS5jb20KfHxkcm9wYm94 +dXNlcmNvbnRlbnQuY29tCmRyc3VuYWNhZGVteS5jb20KLmRydHViZXIuY29tCi5k +c2NuLmluZm8KfGh0dHA6Ly9kc2NuLmluZm8KLmRzdGsuZGsKfGh0dHA6Ly9kc3Rr +LmRrCnx8ZHRpYmxvZy5jb20KfHxkdGljLm1pbAouZHR3YW5nLm9yZwouZHVhbnpo +aWh1LmNvbQouZHVja2Rucy5vcmcKfGh0dHA6Ly9kdWNrZG5zLm9yZwouZHVja2R1 +Y2tnby5jb20KfHxkdWNrZHVja2dvLmNvbQouZHVja2xvYWQuY29tL2Rvd25sb2Fk +Cnx8ZHVja215bGlmZS5jb20KLmR1Z2EuanAKfGh0dHA6Ly9kdWdhLmpwCi5kdWlo +dWEub3JnCnx8ZHVpaHVhLm9yZwp8fGR1aWh1YWhyam91cm5hbC5vcmcKLmR1bnlh +YnVsdGVuaS5uZXQKLmR1b3dlaXRpbWVzLmNvbQp8fGR1b3dlaXRpbWVzLmNvbQpk +dXBpbmcubmV0Cnx8ZHVwbGljYXRpLmNvbQpkdXBvbGEuY29tCmR1cG9sYS5uZXQK +LmR1c2hpLmNhCnx8ZHZvcmFrLm9yZwouZHcuY29tCnx8ZHcuY29tCnx8ZHcuZGUK +LmR3LXdvcmxkLmNvbQp8fGR3LXdvcmxkLmNvbQouZHctd29ybGQuZGUKfGh0dHA6 +Ly9kdy13b3JsZC5kZQp3d3cuZHdoZWVsZXIuY29tCmR3bmV3cy5jb20KfHxkd25l +d3MuY29tCmR3bmV3cy5uZXQKfHxkd25ld3MubmV0Cnh5cy5keGlvbmcuY29tCnx8 +ZHluYXdlYmluYy5jb20KLmR6emUuY29tCgohLS0tLS0tLS0tLS0tLS0tLS0tLS1F +RS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KfHxlLWNsYXNzaWNhbC5jb20udHcK +fHxlLWdvbGQuY29tCi5lLWdvbGQuY29tCi5lLWhlbnRhaS5vcmcKfHxlLWhlbnRh +aS5vcmcKLmUtaGVudGFpZGIuY29tCnxodHRwOi8vZS1oZW50YWlkYi5jb20KZS1p +bmZvLm9yZy50dwouZS10cmFkZXJsYW5kLm5ldC9ib2FyZAouZS16b25lLmNvbS5o +ay9kaXNjdXoKfGh0dHA6Ly9lLXpvbmUuY29tLmhrL2Rpc2N1egouZTEyMy5oawp8 +fGUxMjMuaGsKLmVhcmx5dGliZXQuY29tCnxodHRwOi8vZWFybHl0aWJldC5jb20K +LmVhcnRoY2FtLmNvbQouZWFydGh2cG4uY29tCnx8ZWFydGh2cG4uY29tCmVhc3Rl +cm4tYXJrLmNvbQouZWFzdGVybmxpZ2h0bmluZy5vcmcKLmVhc3R0dXJrZXN0YW4u +Y29tCnxodHRwOi8vd3d3LmVhc3R0dXJraXN0YW4ubmV0LwouZWFzdHR1cmtpc3Rh +bi1nb3Yub3JnCi5lYXN0dHVya2lzdGFuY2Mub3JnCi5lYXN0dHVya2lzdGFuZ292 +ZXJubWVudGluZXhpbGUudXMKfHxlYXN0dHVya2lzdGFuZ292ZXJubWVudGluZXhp +bGUudXMKLmVhc3ljYS5jYQouZWFzeXBpYy5jb20KLmVib255LWJlYXV0eS5jb20K +ZWJvb2ticm93c2UuY29tCmVib29rZWUuY29tCnx8ZWNmYS5vcmcudHcKdXNodWFy +ZW5jaXR5LmVjaGFpbmhvc3QuY29tCnx8ZWNpbWcudHcKZWNtaW5pc3RyeS5uZXQK +LmVjb25vbWlzdC5jb20KYmJzLmVjc3RhcnQuY29tCmVkZ2VjYXN0Y2RuLm5ldAp8 +fGVkZ2VjYXN0Y2RuLm5ldAovdHdpbWdcLmVkZ2VzdWl0ZVwubmV0XC9cLz9hcHBs +ZWRhaWx5LwplZGljeXBhZ2VzLmNvbQouZWRtb250b25jaGluYS5jbgouZWRtb250 +b25zZXJ2aWNlLmNvbQplZG9vcnMuY29tCi5lZHVicmlkZ2UuY29tCnx8ZWR1YnJp +ZGdlLmNvbQouZWR1cHJvLm9yZwp8fGVldnBuLmNvbQplZmNjLm9yZy5oawouZWZ1 +a3QuY29tCnxodHRwOi8vZWZ1a3QuY29tCnx8ZWljLWF2LmNvbQp8fGVpcmVpbmlr +b3RhZXJ1a2FpLmNvbQouZWlzYmIuY29tCi5la3Npc296bHVrLmNvbQp8fGVrc2lz +b3psdWsuY29tCmVsZWN0aW9uc21ldGVyLmNvbQp8fGVsZ29vZy5pbQouZWxwYWlz +LmNvbQp8fGVscGFpcy5jb20KLmVsdG9uZGlzbmV5LmNvbQouZW1hZ2EuY29tL2lu +Zm8vMzQwNwplbWlseWxhdS5vcmcuaGsKLmVtYW5uYS5jb20vY2hpbmVzZVRyYWRp +dGlvbmFsCmJpdGMuYm1lLmVtb3J5LmVkdS9+bHpob3UvYmxvZ3MKLmVtcGZpbC5j +b20KLmVtdWxlLWVkMmsuY29tCnxodHRwOi8vZW11bGUtZWQyay5jb20KLmVtdWxl +ZmFucy5jb20KfGh0dHA6Ly9lbXVsZWZhbnMuY29tCi5lbXVwYXJhZGlzZS5tZQou +ZW5hbnlhbmcubXkKIS0tLmVuYW55YW5nLm15L25ld3MvMjAxNzA1MDIvJUU3JUJF +JThFJUU1JTlCJUJEJUU0JUI5JThCJUU5JTlGJUIzJUU1JUE0JUE3JUU1JTlDJUIw +JUU5JTlDJTg3JUUzJTgwJThBJUU4JThCJUI5JUU2JTlFJTlDJUUzJTgwJThCJUU3 +JThCJUFDJUU1JUFFJUI2Cnx8ZW5ld3N0cmVlLmNvbQouZW5mYWwuZGUKY2hpbmVz +ZS5lbmdhZGdldC5jb20KfHxlbmdhZ2VkYWlseS5vcmcKZW5nbGlzaGZvcmV2ZXJ5 +b25lLm9yZwp8fGVuZ2xpc2hmcm9tZW5nbGFuZC5jby51awplbmdsaXNocGVuLm9y +ZwouZW5saWdodGVuLm9yZy50dwp8fGVudGVybWFwLmNvbQouZW50bnQuY29tCnxo +dHRwOi8vZW50bnQuY29tCi5lcGlzY29wYWxjaHVyY2gub3JnCi5lcG9jaGhrLmNv +bQp8aHR0cDovL2Vwb2NoaGsuY29tCmVwb2NodGltZXMtYmcuY29tCnx8ZXBvY2h0 +aW1lcy1iZy5jb20KZXBvY2h0aW1lcy1yb21hbmlhLmNvbQp8fGVwb2NodGltZXMt +cm9tYW5pYS5jb20KZXBvY2h0aW1lcy5jby5pbAp8fGVwb2NodGltZXMuY28uaWwK +ZXBvY2h0aW1lcy5jby5rcgp8fGVwb2NodGltZXMuY28ua3IKZXBvY2h0aW1lcy5j +b20KfHxlcG9jaHRpbWVzLmNvbQouZXBvY2h0aW1lcy5jegplcG9jaHRpbWVzLmRl +CmVwb2NodGltZXMuZnIKLmVwb2NodGltZXMuaWUKLmVwb2NodGltZXMuaXQKZXBv +Y2h0aW1lcy5qcAplcG9jaHRpbWVzLnJ1CmVwb2NodGltZXMuc2UKZXBvY2h0aW1l +c3RyLmNvbQouZXBvY2h3ZWVrLmNvbQp8fGVwb2Nod2Vlay5jb20KfHxlcG9jaHdl +ZWtseS5jb20KLmVwb3JuZXIuY29tCi5lcXVpbmVub3cuY29tCmVyYWJhcnUubmV0 +Ci5lcmFjb20uY29tLnR3Ci5lcmF5c29mdC5jb20udHIKLmVyZXB1Ymxpay5jb20K +LmVyaWdodHMubmV0Cnx8ZXJpZ2h0cy5uZXQKLmVya3R2LmNvbQp8aHR0cDovL2Vy +a3R2LmNvbQp8fGVybmVzdG1hbmRlbC5vcmcKfHxlcm9kYWl6ZW5zeXUuY29tCnx8 +ZXJvZG91amlubG9nLmNvbQp8fGVyb2RvdWppbndvcmxkLmNvbQp8fGVyb21hbmdh +LWtpbmdkb20uY29tCnx8ZXJvbWFuZ2Fkb3V6aW4uY29tCi5lcm9tb24ubmV0Cnxo +dHRwOi8vZXJvbW9uLm5ldAouZXJvcHJvZmlsZS5jb20KLmVyb3RpY3NhbG9vbi5u +ZXQKLmVzbGl0ZS5jb20KfHxlc2xpdGUuY29tCiEtLS5lc2xpdGUuY29tL3Byb2R1 +Y3QKIS0tLmVzbGl0ZS5jb20vU2VhcmNoX0JXLmFzcHg/cQp3aWtpLmVzdS5pbS8l +RTglOUIlQTQlRTglOUIlQTQlRTglQUYlQUQlRTUlQkQlOTUKLmV0YWEub3JnLmF1 +Ci5ldGFkdWx0LmNvbQpldGFpd2FubmV3cy5jb20KfHxldGl6ZXIub3JnCnx8ZXRv +a2tpLmNvbQohLS0uZXR0b2RheS5uZXQKLmV0dG9kYXkubmV0L25ld3MvMjAxNTEy +MTYvNjE0MDgxCmV0dm9ubGluZS5oawouZXUub3JnCnx8ZXUub3JnCi5ldWNhc2lu +by5jb20KLmV1bGFtLmNvbQouZXVyZWthdnB0LmNvbQp8fGV1cmVrYXZwdC5jb20K +ZWVhcy5ldXJvcGEuZXUvZGVsZWdhdGlvbnMvY2hpbmEvcHJlc3NfY29ybmVyL2Fs +bF9uZXdzL25ld3MvMjAxNS8yMDE1MDcxNl96aAplZWFzLmV1cm9wYS5ldS9zdGF0 +ZW1lbnRzLWVlYXMvMjAxNS8xNTEwMjIKLmV2c2Nob29sLm5ldAp8aHR0cDovL2V2 +c2Nob29sLm5ldAp8fGV4YmxvZy5qcAp8fGJsb2cuZXhibG9nLmNvLmpwCkBAfHx3 +d3cuZXhibG9nLmpwCi5leGNocmlzdGlhbi5oawp8fGV4Y2hyaXN0aWFuLmhrCnxo +dHRwOi8vYmxvZy5leGNpdGUuY28uanAKfHxleG1vcm1vbi5vcmcKfHxleHBhdHNo +aWVsZC5jb20KLmV4cGVjdGhpbS5jb20KfHxleHBlY3RoaW0uY29tCmV4cGVydHMt +dW5pdmVycy5jb20KfHxleHBsb2FkZXIubmV0Ci5leHByZXNzdnBuLmNvbQp8fGV4 +cHJlc3N2cG4uY29tCi5leHRyZW1ldHViZS5jb20KZXlldmlvLmpwCnx8ZXlldmlv +LmpwCi5leW55LmNvbQp8fGV5bnkuY29tCi5lenBjLnRrL2NhdGVnb3J5L3NvZnQK +LmV6cGVlci5jb20KCiEtLS0tLS0tLS0tLS0tLS0tLS0tLUZGLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLQp8fGZhY2Vib29rcXVvdGVzNHUuY29tCi5mYWNlbGVzcy5t +ZQp8fGZhY2VsZXNzLm1lCnxodHRwOi8vZmFjZXNvZnRpYmV0YW5zZWxmaW1tb2xh +dG9ycy5pbmZvCnx8ZmFjZXNvZm55ZncuY29tCi5mYWl0aDEwMC5vcmcKfGh0dHA6 +Ly9mYWl0aDEwMC5vcmcKCiEtLUVuaGFuY2VtZW50OgohLS1odHRwOi8vZmFpdGhm +dWxleWUuY29tLmRldGFpbC53ZWJzaXRlLwohLS1odHRwOi8vZmFpdGhmdWxleWUu +Y29tLmlwYWRkcmVzcy5jb20vCi5mYWl0aGZ1bGV5ZS5jb20KCnx8ZmFpdGh0aGVk +b2cuaW5mbwouZmFra3UubmV0Ci5mYWxzZWZpcmUuY29tCnx8ZmFsc2VmaXJlLmNv +bQpmYWx1bi1jby5vcmcKZmFsdW5hcnQub3JnCnx8ZmFsdW5hc2lhLmluZm8KfGh0 +dHA6Ly9mYWx1bmF1Lm9yZwouZmFsdW5hei5uZXQKZmFsdW5kYWZhLm9yZwpmYWx1 +bmRhZmEtZGMub3JnCnx8ZmFsdW5kYWZhLWZsb3JpZGEub3JnCnx8ZmFsdW5kYWZh +LW5jLm9yZwp8fGZhbHVuZGFmYS1wYS5uZXQKfHxmYWx1bmRhZmEtc2FjcmFtZW50 +by5vcmcKZmFsdW4tbnkubmV0Cnx8ZmFsdW5kYWZhaW5kaWEub3JnCmZhbHVuZGFm +YW11c2V1bS5vcmcKLmZhbHVuZ29uZy5jbHViCi5mYWx1bmdvbmcuZGUKZmFsdW5n +b25nLm9yZy51awp8fGZhbHVuaHIub3JnCmZhbHVuaW5mby5kZQpmYWx1bmluZm8u +bmV0Ci5mYWx1bnBpbGlwaW5hcy5uZXQKfHxmYWx1bndvcmxkLm5ldApmYW1pbHlm +ZWQub3JnCi5mYW5nZW1pbmcuY29tCnx8ZmFuZ2xpemhpLmluZm8KfHxmYW5nb25n +Lm9yZwpmYW5nb25naGVpa2UuY29tCi5mYW5xaWFuZy50awpmYW5xaWFuZ2hvdS5j +b20KfHxmYW5xaWFuZ2hvdS5jb20KLmZhbnFpYW5nemhlLmNvbQp8fGZhbnFpYW5n +emhlLmNvbQpmYXBkdS5jb20KZmFwcm94eS5jb20KIS0tLmZhcnhpYW4uY29tCi5m +YXdhbmdodWlodWkub3JnCmZhbnFpYW5neWFrZXhpLm5ldApmYWlsLmhrCnx8ZmFt +dW5pb24uY29tCi5mYW4tcWlhbmcuY29tCi5mYW5nYmlueGluZy5jb20KfHxmYW5n +YmlueGluZy5jb20KZmFuZ2VtaW5nLmNvbQouZmFuZ21pbmNuLm9yZwp8fGZhbmdt +aW5jbi5vcmcKLmZhbmhhb2RhbmcuY29tCnx8ZmFuc3dvbmcuY29tCi5mYW55dWUu +aW5mbwouZmFyd2VzdGNoaW5hLmNvbQoKIS0tRmFzdGx5CmVuLmZhdm90dGVyLm5l +dAohLS18fHJudy5nbG9iYWwuc3NsLmZhc3RseS5uZXQKIS0tfGh0dHBzOi8vKmds +b2JhbC5zc2wuZmFzdGx5Lm5ldC8Kbnl0aW1lcy5tYXAuZmFzdGx5Lm5ldAp8fG55 +dGltZXMubWFwLmZhc3RseS5uZXQKfHxmYXN0Lndpc3RpYS5jb20KCnx8ZmFzdHNz +aC5jb20KfHxmYXN0c3RvbmUub3JnCmZhdnN0YXIuZm0KfHxmYXZzdGFyLmZtCmZh +eWRhby5jb20vd2VibG9nCnx8ZmJzYnguY29tCi5mYzIuY29tCi5mYzJjaGluYS5j +b20KLmZjMmNuLmNvbQp8fGZjMmNuLmNvbQpmYzJibG9nLm5ldAp8aHR0cDovL3V5 +Z3VyLmZjMndlYi5jb20vCnZpZGVvLmZkYm94LmNvbQouZmRjNjQuZGUKLmZkYzY0 +Lm9yZwouZmRjODkuanAKfHxmb3VyZmFjZS5ub2Rlc25vb3AuY29tCiEtLWZlZWRi +b29rcy5tb2JpCnx8ZmVlbHNzaC5jb20KZmVlci5jb20KLmZlaWZlaXNzLmNvbQp8 +aHR0cDovL2ZlaXRpYW5hY2FkZW15Lm9yZwouZmVpdGlhbi1jYWxpZm9ybmlhLm9y +Zwp8fGZlbWluaXN0dGVhY2hlci5jb20KLmZlbmd6aGVuZ2h1LmNvbQp8fGZlbmd6 +aGVuZ2h1LmNvbQouZmVuZ3poZW5naHUubmV0Cnx8ZmVuZ3poZW5naHUubmV0Ci5m +ZXZlcm5ldC5jb20KfGh0dHA6Ly9mZi5pbQpmZmZmZi5hdApmZmxpY2suY29tCi5m +ZnZwbi5jb20KZmdtdHYubmV0Ci5mZ210di5vcmcKLmZocmVwb3J0cy5uZXQKfGh0 +dHA6Ly9maHJlcG9ydHMubmV0Ci5maWdwcmF5ZXIuY29tCnx8ZmlncHJheWVyLmNv +bQouZmlsZWZseWVyLmNvbQp8fGZpbGVmbHllci5jb20KfGh0dHA6Ly9mZWVkcy5m +aWxlZm9ydW0uY29tCi5maWxlczJtZS5jb20KLmZpbGVzZXJ2ZS5jb20vZmlsZQpm +aWxsdGhlc3F1YXJlLm9yZwpmaWxtaW5nZm9ydGliZXQub3JnCi5maWx0aGR1bXAu +Y29tCi5maW5jaHZwbi5jb20KfHxmaW5jaHZwbi5jb20KIS0tZmluZGJvb2sudHcK +ZmluZG1lc3BvdC5jb20KfHxmaW5keW91dHViZS5jb20KfHxmaW5keW91dHViZS5u +ZXQKLmZpbmdlcmRhaWx5LmNvbQpmaW5sZXIubmV0Ci5maXJlYXJtc3dvcmxkLm5l +dAp8aHR0cDovL2ZpcmVhcm1zd29ybGQubmV0Ci5maXJlb2ZsaWJlcnR5Lm9yZwp8 +fGZpcmVvZmxpYmVydHkub3JnCi5maXJldHdlZXQuaW8KfHxmaXJldHdlZXQuaW8K +IS0tfHxmbGFnZm94Lm5ldAouZmxhZ3NvbmxpbmUuaXQKZmxlc2hib3QuY29tCi5m +bGV1cnNkZXNsZXR0cmVzLmNvbQp8aHR0cDovL2ZsZXVyc2Rlc2xldHRyZXMuY29t +Cnx8ZmxnZy51cwp8fGZsZ2p1c3RpY2Uub3JnCgohLS18fGZhcm02LnN0YXRpY2Zs +aWNrci5jb20KIS0tLmZsaWNrci5jb20vcGhvdG9zLzQ2MjMxMDc3QE4wNgohLS0u +ZmxpY2tyLmNvbS9ncm91cHMvYWl3ZWl3ZWkKIS0tLmZsaWNrci5jb20vcGhvdG9z +L2RpZ2l0YWxib3kxMDAKIS0tLmZsaWNrci5jb20vcGhvdG9zL2Z6aGVuZ2h1CiEt +LS5mbGlja3IuY29tL3Bob3Rvcy9sb25lbHlmb3gKIS0tZmxpY2tyLmNvbS9waG90 +b3MvdmFudmFuLzUyOTkyNTE1NwohLS0uZmxpY2tyLmNvbS9waG90b3Mvd2ludGVy +a2FuYWwKIS0tLmZsaWNrci5jb20vcGhvdG9zL3pvbGEKfHxmbGlja3IuY29tCnx8 +c3RhdGljZmxpY2tyLmNvbQoKZmxpY2tyaGl2ZW1pbmQubmV0Ci5mbGlja3JpdmVy +LmNvbQouZmxpbmcuY29tCnx8ZmxpcGthcnQuY29tCnx8ZmxvZy50dwouZmx5dnBu +LmNvbQp8fGZseXZwbi5jb20KfGh0dHA6Ly9jbi5mbW5ub3cuY29tCmZvZmxkZnJh ZGlvLm9yZwpibG9nLmZvb2xzbW91bnRhaW4uY29tCi5mb3J1bTRoay5jb20KZmFu Z29uZy5mb3J1bXMtZnJlZS5jb20KcGlvbmVlci13b3JrZXIuZm9ydW1zLWZyZWUu Y29tCiEtLWZvdXJzcXVhcmUuY29tCiEtLXxodHRwOi8vNHNxLmNvbQp8aHR0cHM6 -Ly9zcyouNHNxaS5uZXQKfHxmb3RvcC5uZXQKdmlkZW8uZm94YnVzaW5lc3MuY29t -CnxodHRwOi8vZm94Z2F5LmNvbQp8fGZyaW5nZW5ldHdvcmsuY29tCnx8ZmxlY2hl -aW50aGVwZWNoZS5mcgouZm9jaGsub3JnCnxodHRwOi8vZm9jaGsub3JnCnx8Zm9j -dXN0YWl3YW4udHcKLmZvY3VzdnBuLmNvbQp8fGZvZmcub3JnCi5mb2ZnLWV1cm9w -ZS5uZXQKLmZvb29vby5jb20KfHxmb29vb28uY29tCmZvb3R3aWJhbGwuY29tCnx8 -Zm91cnRoaW50ZXJuYXRpb25hbC5vcmcKfHxmb3hkaWUudXMKfHxmb3hzdWIuY29t -CmZveHRhbmcuY29tCi5mcG10Lm9yZwp8aHR0cDovL2ZwbXQub3JnCi5mcG10LnR3 -Ci5mcG10LW9zZWwub3JnCnx8ZnBtdG1leGljby5vcmcKZnFvay5vcmcKfHxmcXJv -dXRlci5jb20KfHxmcmFua2xjLmNvbQouZnJlYWtzaGFyZS5jb20KfGh0dHA6Ly9m -cmVha3NoYXJlLmNvbQp8fGZyZWU0dS5jb20uYXIKZnJlZS1nYXRlLm9yZwouZnJl -ZS5mci9hZHNsCnx8YWxsb25saW51eC5mcmVlLmZyCnx8ZGltaXRyaWsuZnJlZS5m -cgpraW5lb3guZnJlZS5mcgp8fHB1dHR5Y20uZnJlZS5mcgp8fGZyZWVhbGltLmNv -bQp3aGl0ZWJlYXIuZnJlZWJlYXJibG9nLm9yZwp8fGZyZWVicm93c2VyLm9yZwou -ZnJlZWNoYWwuY29tCi5mcmVlY24udG9wCnxodHRwOi8vZnJlZWNuLnRvcAouZnJl -ZWRvbWNoaW5hLmluZm8KfHxmcmVlZG9tY2hpbmEuaW5mbwouZnJlZWRvbWhvdXNl -Lm9yZwp8fGZyZWVkb21ob3VzZS5vcmcKLmZyZWVkb21zaGVyYWxkLm9yZwp8fGZy -ZWVkb21zaGVyYWxkLm9yZwouZnJlZWZxLmNvbQouZnJlZWZ1Y2t2aWRzLmNvbQou -ZnJlZWdhby5jb20KfHxmcmVlZ2FvLmNvbQouZnJlZS1oYWRhLW5vdy5vcmcKZnJl -ZWlsaGFtdG9odGkub3JnCi5mcmVlbG90dG8uY29tCnx8ZnJlZWxvdHRvLmNvbQpm -cmVlbWFuMi5jb20KLmZyZWVvcGVudnBuLmNvbQpmcmVlbW9yZW4uY29tCmZyZWVt -b3JlbmV3cy5jb20KZnJlZW11c2Uub3JnL2FyY2hpdmVzLzc4OQpmcmVlbmV0LWNo -aW5hLm9yZwpmcmVlbmV3c2NuLmNvbQpjbi5mcmVlb25lcy5jb20KLmZyZWVvei5v -cmcvYmJzCnx8ZnJlZW96Lm9yZwp8fGZyZWVzc2gudXMKZnJlZTR1LmNvbS5hcgou -ZnJlZS1zc2guY29tCnx8ZnJlZS1zc2guY29tCi5mcmVlZG9tY29sbGVjdGlvbi5v -cmcvaW50ZXJ2aWV3cy9yZWJpeWFfa2FkZWVyCi5mcmVlZm9ydW1zLm9yZwp8fGZy -ZWVuZXRwcm9qZWN0Lm9yZwouZnJlZW96Lm9yZwouZnJlZXRpYmV0Lm5ldAp8fGZy -ZWV0aWJldC5vcmcKLmZyZWV0aWJldGFuaGVyb2VzLm9yZwp8aHR0cDovL2ZyZWV0 -aWJldGFuaGVyb2VzLm9yZwouZnJlZXZpZXdtb3ZpZXMuY29tCi5mcmVldnBuLm1l -CnxodHRwOi8vZnJlZXZwbi5tZQp8fGZyZWV3YWxscGFwZXI0Lm1lCi5mcmVld2Vi -cy5jb20KfHxmcmVld2VpYm8uY29tCi5mcmVleGlud2VuLmNvbQouZnJlZXlvdXR1 -YmVwcm94eS5uZXQKfHxmcmVleW91dHViZXByb3h5Lm5ldApmcmllbmRmZWVkLmNv -bQpmcmllbmRmZWVkLW1lZGlhLmNvbS9lOTlhNGViZTJmYjRjMTk4NWMyYTU4Nzc1 -ZWI0NDIyOTYxYWE1YTJlCmZyaWVuZHMtb2YtdGliZXQub3JnCi5mcmllbmRzb2Z0 -aWJldC5vcmcKZnJlZWNoaW5hLm5ldAp8aHR0cDovL3d3dy56ZW5zdXIuZnJlZXJr -LmNvbS8KZnJlZXZwbi5ubApmcmVleWVsbG93LmNvbQpoay5mcmllbmRkeS5jb20v -aGsKfGh0dHA6Ly9hZHVsdC5mcmllbmRmaW5kZXIuY29tLwouZnJpbmcuY29tCnx8 -ZnJpbmcuY29tCi5mcm9tY2hpbmF0b3VzYS5uZXQKfHxmcm9tbWVsLm5ldAouZnJv -bnRsaW5lZGVmZW5kZXJzLm9yZwp8fGZzY2tlZC5vcmcKLmZzdXJmLmNvbQouZnRj -aGluZXNlLmNvbS9jaGFubmVsL3ZpZGVvCi5mdGNoaW5lc2UuY29tL3N0b3J5LzAw -MTAyNzUzCi5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTAyNjgwNwouZnRjaGluZXNl -LmNvbS9zdG9yeS8wMDEwMzI2OTIKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDM3 -MDkwCi5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTAzNzA5MQouZnRjaGluZXNlLmNv -bS9zdG9yeS8wMDEwMzgyMjAKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDQwODkw -Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA0MjEwMAouZnRjaGluZXNlLmNvbS9z -dG9yeS8wMDEwNDIyNTIKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDQyMjcyCi5m -dGNoaW5lc2UuY29tL3N0b3J5LzAwMTA0NDc3NgouZnRjaGluZXNlLmNvbS9zdG9y -eS8wMDEwNDU3NTUKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDQ2MTE4Ci5mdGNo -aW5lc2UuY29tL3N0b3J5LzAwMTA0NzM0NQouZnRjaGluZXNlLmNvbS9zdG9yeS8w -MDEwNDczNzUKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDQ3NTQ1Ci5mdGNoaW5l -c2UuY29tL3N0b3J5LzAwMTA0ODcxMAouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEw -NDkzNjAKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDUyOTY1Ci5mdGNoaW5lc2Uu -Y29tL3N0b3J5LzAwMTA1MzUyNgouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTQx -MDMKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDU0MTY4Ci5mdGNoaW5lc2UuY29t -L3N0b3J5LzAwMTA1NDUyNgouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTQ2NDQK -LmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDU1Mjk5Ci5mdGNoaW5lc2UuY29tL3N0 -b3J5LzAwMTA1NTU1MQouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTY1MjkKLmZ0 -Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDU2NTU0Ci5mdGNoaW5lc2UuY29tL3N0b3J5 -LzAwMTA1NjU4OAouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTY1NjcKLmZ0Y2hp -bmVzZS5jb20vc3RvcnkvMDAxMDU3NTA5Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAw -MTA1NzUzMwouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTgyOTUKLmZ0Y2hpbmVz -ZS5jb20vc3RvcnkvMDAxMDU4MzQ0Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1 -ODQ1OAouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTg0NjgKLmZ0Y2hpbmVzZS5j -b20vc3RvcnkvMDAxMDU4NTYxCi5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1ODU2 -NgouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTg1NjcKLmZ0Y2hpbmVzZS5jb20v -c3RvcnkvMDAxMDU4NTg1Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1ODYyOAou -ZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTg2NzgKLmZ0Y2hpbmVzZS5jb20vc3Rv -cnkvMDAxMDU5NDg0Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1OTUzOAouZnRj -aGluZXNlLmNvbS9zdG9yeS8wMDEwNTk4MTgKLmZ0Y2hpbmVzZS5jb20vc3Rvcnkv -MDAxMDU5OTE0Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1OTkyMAouZnRjaGlu -ZXNlLmNvbS9zdG9yeS8wMDEwNjAxODEKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAx -MDYwNDkzCi5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA2MDQ5NQouZnRjaGluZXNl -LmNvbS9zdG9yeS8wMDEwNjA5MjEKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDYx -MTIwCi5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA2MjAyOAouZnRjaGluZXNlLmNv -bS9zdG9yeS8wMDEwNjIxNzYKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDYyNDgy -Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA2MjUwOAouZnRjaGluZXNlLmNvbS9z -dG9yeS8wMDEwNjI3NDEKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDYyNzk0Ci5m -dGNoaW5lc2UuY29tL3N0b3J5LzAwMTA2MzE2MAouZnRjaGluZXNlLmNvbS9zdG9y -eS8wMDEwNjM2OTIKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDY1Mjg3Ci5mdGNo -aW5lc2UuY29tL3N0b3J5LzAwMTA2NjQ2NQouZnRjaGluZXNlLmNvbS9zdG9yeS8w -MDEwNjY5NTkKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDY3NDM1Cnd3dy5mdGNo -aW5lc2UuY29tL3N0b3J5LzAwMTA2NzQ3OQouZnRjaGluZXNlLmNvbS9zdG9yeS8w -MDEwNjc1NDUKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDY3NjQ4Ci5mdGNoaW5l -c2UuY29tL3N0b3J5LzAwMTA2NzY1MAouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEw -NjgyNDgKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDY4Mjc4Ci5mdGNoaW5lc2Uu -Y29tL3N0b3J5LzAwMTA2ODM3OQouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNjg0 -ODMKLmZ0Y2hpbmVzZS5jb20vdmlkZW8vMTQzNwouZnRjaGluZXNlLmNvbS9jb21t -ZW50cwpmdWNkLmNvbQouZnVja2NubmljLm5ldAp8fGZ1Y2tjbm5pYy5uZXQKZnVj -a2dmdy5vcmcKfHxmdWxsZXJjb25zaWRlcmF0aW9uLmNvbQpmdWx1ZS5jb20KLmZ1 -bmYudHcKZnVucC5jb20KLmZ1cS5jb20KLmZ1cmhoZGwub3JnCnx8ZnVyaW5rYW4u -Y29tCi5mdXR1cmVjaGluYWZvcnVtLm9yZwp8fGZ1dHVyZW1lc3NhZ2Uub3JnCi5m -dXguY29tCi5mdXlpbi5uZXQKLmZ1eWluZGlhbnRhaS5vcmcKLmZ1eXUub3JnLnR3 -Cnx8ZncuY20KZnpoOTk5LmNvbQpmemg5OTkubmV0CmZ6bG0uY29tCgohLS0tLS0t -LS0tLS0tLS0tLS0tLS1HRy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLmc2aGVu -dGFpLmNvbQp8aHR0cDovL2c2aGVudGFpLmNvbQp8fGctcXVlZW4uY29tCnx8Z2Fi -b2NvcnAuY29tCi5nYWVwcm94eS5jb20KLmdhZm9ydW0ub3JnCi5nYWxheHltYWNh -dS5jb20KfHxnYWxlbnd1LmNvbQouZ2Fsc3RhcnMubmV0Cnx8Z2FtZTczNS5jb20K -Z2FtZWJhc2UuY29tLnR3CmdhbWVqb2x0LmNvbQp8aHR0cDovL3dpa2kuZ2FtZXJw -LmpwCnx8Z2FtZXIuY29tLnR3Ci5nYW1lci5jb20udHcKLmdhbWV6LmNvbS50dwp8 -fGdhbWV6LmNvbS50dwouZ2Ftb3VzYS5jb20KLmdhb21pbmcubmV0Cnx8Z2FvbWlu -Zy5uZXQKZ2FuZ2VzLmNvbQouZ2FvcGkubmV0CnxodHRwOi8vZ2FvcGkubmV0Ci5n -YW96aGlzaGVuZy5vcmcKLmdhb3poaXNoZW5nLm5ldApnYXJkZW5uZXR3b3Jrcy5j -b20KfHxnYXJkZW5uZXR3b3Jrcy5vcmcKIS0tSVAgb2YgR2FyZGVuIE5ldHdvcmsK -NzIuNTIuODEuMjIKfHxnYXJ0bGl2ZS5jb20KfHxnYXRoZXIuY29tCmdhdGkub3Jn -LnR3Ci5nYXlidWJibGUuY29tCi5nYXljbi5uZXQKfHxnYXltYXAuY2MKLmdheXR1 -YmUuY29tCi5nYXpvdHViZS5jb20KfHxnYXpvdHViZS5jb20KfHxnY2Mub3JnLmhr -Cnx8Z2Nsb29uZXkuY29tCi5nY3BuZXdzLmNvbQp8aHR0cDovL2djcG5ld3MuY29t -Ci5nZGJ0Lm5ldC9mb3J1bQpnZHpmLm9yZwp8fGdlZWstYXJ0Lm5ldApnZWVrZXJo -b21lLmNvbS8yMDEwLzAzL3hpeGlhbmctcHJvamVjdC1jcm9zcy1nZncKfHxnZWVr -aGVhcnQuaW5mbwp8fGdlZWttYW51YWxzLmNvbQouZ2VsYm9vcnUuY29tCnxodHRw -Oi8vZ2VsYm9vcnUuY29tCiEtLXx8Z2VudWl0ZWMuY29tCi5nZW9jaXRpZXMuY28u -anAKLmdlb2NpdGllcy5jb20vU2lsaWNvblZhbGxleS9DaXJjdWl0LzU2ODMvZG93 -bmxvYWQuaHRtbApoay5nZW9jaXRpZXMuY29tCmdlb2NpdGllcy5qcAp8fGdlb2hv -dC5jb20KfHxnZW9tZXRyaWN0b29scy5jb20KLmdlcmVmb3VuZGF0aW9uLm9yZwou -Z2V0Y2h1LmNvbQouZ2V0Y2xvYWsuY29tCnx8Z2V0Y2xvYWsuY29tCnx8Z2V0Zm94 -eXByb3h5Lm9yZwouZ2V0ZnJlZWR1ci5jb20KfHxnZXRnb20uY29tCi5nZXRsYW50 -ZXJuLm9yZwp8fGdldGxhbnRlcm4ub3JnCi5nZXRqZXRzby5jb20vZm9ydW0KZ2V0 -aXRvbi5jb20KLmdldHNvY2lhbHNjb3BlLmNvbQpnZmJ2LmRlCi5nZmdvbGQuY29t -LmhrCi5nZnNhbGUuY29tCnx8Z2ZzYWxlLmNvbQpnZncub3JnLnVhCi5nZncucHJl -c3MKfGh0dHA6Ly9nZncucHJlc3MKLmdnc3NsLmNvbQp8fGdnc3NsLmNvbQp8fGdo -b3N0Lm9yZwouZ2hvc3RwYXRoLmNvbQp8fGdob3N0cGF0aC5jb20KfHxnaHV0Lm9y -Zwp8fGdpZ2Etd2ViLmpwCnxodHRwOi8vdHcuZ2lnYWNpcmNsZS5jb20KfGh0dHA6 -Ly9jbi5naWdhbmV3cy5jb20vCmdpZ3Bvcm5vLnJ1Cnx8Z2lybGJhbmtlci5jb20K -LmdpdC5pbwp8fGdpdC5pbwp8aHR0cDovL3NvZnR3YXJlZG93bmxvYWQuZ2l0Ym9v -a3MuaW8KCi5naXRodWIuY29tCnxodHRwczovL2dpc3QuZ2l0aHViLmNvbQp8aHR0 -cDovL2N0aGxvLmdpdGh1Yi5pby9oa3R2CnxodHRwOi8vb25pb25oYWNrZXIuZ2l0 -aHViLmlvCnxodHRwOi8vd3NnemFvLmdpdGh1Yi5pby9wb3N0L2dmdy1icmVhawoK -Lmdpemxlbi5uZXQKfHxnaXpsZW4ubmV0Ci5namN6ei5jb20KfHxnbGVubmhpbHRv -bi5jb20KZ2xvYmFsamloYWQubmV0Cmdsb2JhbG1lZGlhb3V0cmVhY2guY29tCmds -b2JhbG11c2V1bW9uY29tbXVuaXNtLm9yZwp8fGdsb2JhbHJlc2N1ZS5uZXQKLmds -b2JhbHRtLm9yZwouZ2xvYmFsdm9pY2Vzb25saW5lLm9yZwp8fGdsb2JhbHZvaWNl -c29ubGluZS5vcmcKLmdsb2NrLmNvbQpnbHVja21hbi5jb20vRGFsYWlMYW1hCmdt -YmQuY24KfHxnbWh6Lm9yZwp8aHR0cDovL3d3dy5nbWlkZGxlLmNvbQp8aHR0cDov -L3d3dy5nbWlkZGxlLm5ldAouZ21sbC5vcmcKfHxnbmNpLm9yZy5oawpnby1wa2ku -Y29tCnx8Z29hZ2VudC5iaXoKfHxnb2FnZW50cGx1cy5jb20KZ29iZXQuY2MKZ29k -Zm9vdHN0ZXBzLm9yZwp8fGdvZGZvb3RzdGVwcy5vcmcKZ29kbnMud29yawpnb2Rz -ZGlyZWN0Y29udGFjdC5jby51awouZ29kc2RpcmVjdGNvbnRhY3Qub3JnCmdvZHNk -aXJlY3Rjb250YWN0Lm9yZy50dwouZ29kc2ltbWVkaWF0ZWNvbnRhY3QuY29tCnx8 -Z29oYXBweS5jb20udHcKLmdva2JheXJhay5jb20KLmdvbGRiZXQuY29tCnx8Z29s -ZGJldHNwb3J0cy5jb20KLmdvbGRlbmZyb2cuY29tCnx8Z29sZGVuZnJvZy5jb20K -LmdvbGRzdGVwLm5ldAp8fGdvbGR3YXZlLmNvbQpnb25nbWVuZy5pbmZvCmdvbmdt -LmluCmdvbmdtaW5saWxpYW5nLmNvbQouZ29uZ3d0LmNvbQp8aHR0cDovL2dvbmd3 -dC5jb20KYmxvZy5nb28ubmUuanAvZHVjay10YWlsXzIwMDkKLmdvb2RyZWFkcy5j -b20KfHxnb29kcmVhZHMuY29tCi5nb29kcmVhZGVycy5jb20KfHxnb29kcmVhZGVy -cy5jb20KLmdvb2R0di5jb20udHcKLmdvb2R0di50dgp8fGdvb2ZpbmQuY29tCi5n -b29nbGVzaWxlLmNvbQouZ29wZXRpdGlvbi5jb20KfHxnb3BldGl0aW9uLmNvbQou -Z29wcm94aW5nLm5ldAouZ290cnVzdGVkLmNvbQp8fGdvdHJ1c3RlZC5jb20KfHxn -b3R3LmNhCnx8Z3JhbW1hbHkuY29tCmdyYW5kdHJpYWwub3JnCi5ncmFwaGlzLm5l -LmpwCnx8Z3JhcGhpcy5uZS5qcAohLS18fHMuZ3JhdmF0YXIuY29tCmdyZWF0Zmly -ZXdhbGwuYml6Cnx8Z3JlYXRmaXJld2FsbG9mY2hpbmEubmV0Ci5ncmVhdGZpcmV3 -YWxsb2ZjaGluYS5vcmcKfHxncmVhdGZpcmV3YWxsb2ZjaGluYS5vcmcKfHxncmVl -bmZpZWxkYm9va3N0b3JlLmNvbS5oawouZ3JlZW5wYXJ0eS5vcmcudHcKfHxncmVl -bnBlYWNlLm9yZwouZ3JlZW5yZWFkaW5ncy5jb20vZm9ydW0KZ3JlYXQtZmlyZXdh -bGwuY29tCmdyZWF0LXJvYy5vcmcKZ3JlYXRyb2Mub3JnCmdyZWF0emhvbmdodWEu -b3JnCi5ncmVlbnBlYWNlLmNvbS50dwouZ3JlZW52cG4ubmV0Cnx8Z3JlZW52cG4u -bmV0Ci5ncmVlbnZwbi5vcmcKZ3MtZGlzY3Vzcy5jb20KfHxndHJpY2tzLmNvbQpn -dWFuY2hhLm9yZwouZ3VhcmRzdGVyLmNvbQouZ3VuLXdvcmxkLm5ldApndW5zYW5k -YW1tby5jb20KfHxndXR0ZXJ1bmNlbnNvcmVkLmNvbQp8fGd2bS5jb20udHcKLmd6 -bS50dgp8fGd6b25lLWFuaW1lLmluZm8KCiEtLS0tLS0tLS0tLS0tR29vZ2xlIGdo -cy0tLS0tCiEtfHxmZWVkcy5jYnNuZXdzLmNvbQohLXx8d3d3LmNoaW5lc2VhbGJ1 -bWFydC5jb20KfHxjbGVtZW50aW5lLXBsYXllci5vcmcKIS18fGNsZW1lc2hhLm9y -ZwohLXx8d3d3LmNsb3VkZ2lybGZyaWVuZC5jb20KIS18fGNvY29hd2l0aGxvdmUu -Y29tCiEtfHxibG9nLmNvbnRyb2xzcGFjZS5vcmcKIS1ECiEtfHx3d3cuZGFpbHln -eWFuLmNvbQohLXx8ZGFpbHl0b2RvLm9yZwohLXx8YmxvZy5kYW5tYXJuZXIuY29t -CiEtfHxnaXRodWIuZGFubWFybmVyLmNvbQohLXx8ZGVzaWduLXNlZWRzLmNvbQoh -LXx8ZGVzaWduZXJzLWFydGlzdHMuY29tCiEtfHxtYWlsLmRpeWFuZy5vcmcKIS18 -fGJsb2cuZG91Z2hlbGxtYW5uLmNvbQohLXx8ZG93bmZvcmV2ZXJ5b25lb3JqdXN0 -bWUuY29tCiEtfHxkcm9pZHNlY3VyaXR5LmNvbQohLXx8d3d3LmRyb3Btb2Nrcy5j -b20KIS18fGR1bWJsaXR0bGVtYW4uY29tCiEtRQplY2hvZm9uLmNvbQohLXx8ZWNo -b2Zvbi5jb20KIS18fGVwYy1qYXYuY29tCiEtfHxldmVyZGFyay5pbmZvCiEtfHxl -dmhlYWQuY29tCiEtRgohLXx8ZmFjaWxlbG9naW4uY29tCiEtfHwqLmZhdGR1Y2su -b3JnCiEtfHxibG9nLmZkY24ub3JnCiEtfHxmZnRvZ28uY29tCiEtfHxmbGlnaHRz -aW10YWxrLmNvbQohLXx8bWNsZWUuZm9vbG1lLm5ldAohLXx8d3d3LmZyaWVuZGRl -Y2suY29tCiEtfHxmcmluZ2VzcG9pbGVycy5jb20KIS18fGZyaW5nZXRlbGV2aXNp -b24uY29tCiEtfHxmdW5wZWEuY29tCiEtRwohLXx8YmxvZy5nYXRlaW4ub3JnCiEt -fHxmZWVkcy5nYXdrZXIuY29tCiEtfHxnZWVrdGFuZy5jb20KIS18fGdlb2hvdC51 -cwohLXx8Z2V0YXJvdW5kLmNvbQohLXx8Z21lci5uZXQKIS18fHd3dy5nbW90ZS5v -cmcKIS18fGJsb2cuZ28yd2ViMjAubmV0CiEtfHxnb29nbGUtbWVsYW5nZS5jb20K -fHxnb2xhbmcub3JnCiEtfHxmYW1lLmdvbnpvbGFicy5vcmcKIS18fGdvdmVjbi5v -cmcKIS18fGdxdWV1ZXMuY29tCiEtfHxncmFwaHljYWxjLmNvbQp8fGdyZWFzZXNw -b3QubmV0CiEtfHxibG9nLmdyb3dsZm9yd2luZG93cy5jb20KIS1ICiEtfHxoY20u -Y29tLnR3CiEtfHxibG9nLmhlYWRpdXMuY29tCiEtfHxob2diYXlzb2Z0d2FyZS5j -b20KIS18fGJsb2cuaG90b3Qub3JnCiEtfHxmZWVkcy5ob3dzdHVmZndvcmtzLmNv -bQohLXx8aHVoYWl0YWkuY29tCiEtfHxibG9nLmh1bWFucmlnaHRzZmlyc3Qub3Jn -CiEtSQohLXx8c2l0ZS5pY3UtcHJvamVjdC5vcmcKIS18fGlnb3J3YXJlLmNvbQoh -LXx8aWhhczEzMzdjb2RlLmNvbQohLXx8aW5rbm91dmVhdS5jb20KIS18fGlub3Rl -LnR3CiEtfHxpcm9uaGVsbWV0LmNvbQohLXx8aXdmd2NmLmNvbQohLUoKIS18fGJs -b2cuamFuZ210LmNvbQohLXx8YmxvZy5qYXlmaWVsZHMuY29tCiEtfHx0LmppZWNp -aS5jb20KIS18fGJsb2cuam9pbnQubmV0CiEtfHxibG9nLmpzcXVhcmVkamF2YXNj -cmlwdC5jb20KIS18fGJsb2cuanRid29ybGQuY29tCiEtSwohLXx8a2F0aHlzY2h3 -YWxiZS5jb20KIS18fHRvbWF0b3Zwbi5rZWl0aG1veWVyLmNvbQohLXx8d3d3Lmtl -aXRobW95ZXIuY29tCiEtfHxrZW5kYWx2YW5keWtlLmNvbQohLXx8YmxvZy5rZW5n -YW8udHcKIS18fGxvZy5rZXNvLmNuCiEtfHx3d3cua2hhbmFjYWRlbXkub3JnCnx8 -d3d3LmtsaXAubWUKIS18fHVzYmxvYWRlcmd4LmtvdXJlaW8ubmV0CiEtfHxibG9n -Lmtvd2FsY3p5ay5pbmZvCiEtTAohLXx8bGFieXJpbnRoMi5jb20KIS18fGxhcnNn -ZW9yZ2UuY29tCiEtfHxibG9nLmxhc3RwYXNzLmNvbQohLXx8ZG9jcy5sYXRleGxh -Yi5vcmcKIS18fGxlYW5lc3NheXMuY29tCiEtfHxibG9nLmxpZGFvYmluZy5pbmZv -CiEtfHxsb2cubGlnaHRvcnkubmV0CiEtfHxmZWVkcy5saW1pLm5ldAohLXx8d3d3 -LmxpdGVhcHBsaWNhdGlvbnMuY29tCiEtfHxibG9nLmxpdWthbmd4dS5pbmZvCiEt -fHx0d2l0dGVyLmxpdWthbmd4dS5pbmZvCiEtfHxvYXNpc25ld3Nyb29tLmxpdmU0 -ZXZlci51cwohLXx8d3d3LmxvY2tlcmdub21lLmNvbQohLXx8bG9jcWwuY29tCkBA -fHxzaXRlLmxvY3FsLmNvbQohLXx8ZmVlZHMubG9pY2xlbWV1ci5jb20KIS18fGJs -b2cubG91aXNncmF5LmNvbQohLU0KIS18fG1hZGVieXNvZmEuY29tCiEtfHxtYWRl -bW9pc2VsbGVyb2JvdC5jb20KIS18fG1hc2FtaXhlcy5jb20KIS18fHd3dy5tZXRh -bXVzZS5uZXQKIS18fGJsb2cubWV0YXNwbG9pdC5jb20KIS18fG1pbGF6aS5jb20K -IS18fHd3dy5taW5pd2VhdGhlci5jb20KIS18fHR3aXR0ZXIubWlzc2l1LmNvbQoh -LXx8cGx1cmt0b3AtYnV0dG9uLm1tZGF5cy5jb20KIS18fGZlZWRzLm1vYmlsZXJl -YWQuY29tCiEtfHx3d3cubW9kZXJuaXpyLmNvbQohLXx8d3d3Lm1vZGsuaXQKIS18 -fG15dHdpc2hpcnQuY29tCiEtTgohLXx8YmxvZy5uZXRmbGl4LmNvbQohLXx8Ymxv -Zy5uaWhpbG9naWMuZGsKIS18fG50bGsub3JnCiEtfHxudnF1YW4ub3JnCiEtfHxu -b2dvb2RhdGNvZGluZy5jb20KIS18fGJsb2cubm90ZG90Lm5ldAohLXx8d3d3Lm5v -dGlmeS5pbwohLU8KIS18fGJsb2cub2J2aW91cy5jb20KIS18fG9uZWJpZ2ZsdWtl -LmNvbQohLXx8b3ZlcnN0aW11bGF0ZS5jb20KIS1QCiEtfHxwY2dlZWtibG9nLmNv -bQohLXx8ZmVlZHMucGRmY2htLm5ldAohLXx8ZmVlZHMucGVvcGxlLmNvbQohLXx8 -YmxvZy5wZXJzaXN0ZW50LmluZm8KIS18fGNocm9tZS5wbGFudHN2c3pvbWJpZXMu -Y29tCiEtfHxwb3J0YWJsZXNvZnQub3JnLnJ1CiEtfHxwcmFzYW5uYXRlY2gubmV0 -CiEtfHx0YWxrLm5ld3MucHRzLm9yZy50dwohLXx8cHl0aG9uLWV4Y2VsLm9yZwoh -LVEKIS1SCiEtfHxyLWNoYXJ0LmNvbQohLXx8cmFtZXNoc3VicmFtYW5pYW4ub3Jn -CiEtfHxyYXBpZC5wawohLXx8YmxvZy5yZWRkaXQuY29tCiEtfHxibG9nLnJlbmFu -c2UuY29tCiEtfHxyb2JlcnRtYW8uY29tCiEtfHx3d3cucm9tZW8tZm94dHJvdC5j -b20KIS1TCiEtfHxzYWxtaXl1Y2suY29tCiEtfHxzYW1zYWwuY29tCiEtfHxibG9n -LnNlZW1pbmdsZWUuY29tCiEtfHxibG9nLnNmbG93LmNvbQohLXx8YmxvZy5zaWdm -cGUuY29tCiEtfHxzaW1wbGV0ZXh0LndzCiEtfHx3d3cuc2t1bHB0Lm9yZwohLXx8 -cnNzLnNsYXNoZG90Lm9yZwohLXx8c25pcHBldHNhcHAuY29tCiEtfHx3LnNucy5s -eQohLXx8d3d3LnNvY2lhbG5tb2JpbGUuY29tCiEtfHx3d3cuc29jaWFsd2hvaXMu -Y29tCiEtfHxzcGlyaXRqYi5vcmcKIS18fHNzYm9vay5jb20KIS18fHNzaGZvcndh -cmRpbmcuY29tCiEtfHxzdGF0aW9uZXJpYS5jb20KfHxzdGVwaGFuaWVyZWQuY29t -CiEtfHxzdW5qaWRvbmcubmV0CiEtfHxzeW5pdW1zb2Z0d2FyZS5jb20KQEB8fGRv -d25sb2FkLnN5bml1bXNvZnR3YXJlLmNvbQohLVQKIS18fHRhZ3hlZG8uY29tCiEt -fHxibG9nLnRhdG9lYmEub3JnCiEtfHx3d3cudGVjaGZvYi5jb20KIS18fHRlYWNo -cGFyZW50c3RlY2gub3JnCiEtfHx0aGU4cGVuLmNvbQohLXx8dGhlaXBob25ld2lr -aS5jb20KIS18fGJsb2cudGhlc2lsZW50bnVtYmVyLm1lCiEtfHx0aGVzcG9udHku -Y29tCiEtfHx0aGV1bHRyYWxpbnguY29tCiEtfHxibG9nLnRoaW5rLWFzeW5jLmNv -bQohLXx8dG9ybmFkb3dlYi5vcmcKIS18fHRyYW5zcGFyZW50dXB0aW1lLmNvbQoh -LXx8dHJpYW5ndWxhdGlvbmJsb2cuY29tCiEtfHxibG9nLnRzdW5hbmV0Lm5ldAoh -LXx8ZW4udHV4ZXJvLmNvbQohLXx8dHdhenp1cC5jb20KIS18fHR3ZWV0c3dlbGwu -Y29tCiEtfHx0d2liZXMuY29tCiEtfHxhcnQudHdnZy5vcmcKIS18fHR3aXZlcnQu -Y29tCiEtVQp8aHR0cDovL3ViMC5jYwohLXx8am9ubnkudWJ1bnR1LXR3Lm5ldAoh -LXx8YmxvZy51bW9ua2V5Lm5ldAohLVYKIS18fHRwLnZiYXAuY29tLmF1CiEtfHx3 -d3cudmlydHVvdXNyb20uY29tCiEtfHxibG9nLnZpc2lib3RlY2guY29tCiEtVwoh -LXx8d2F2ZXByb3RvY29sLm9yZwohLXx8d3d3LndhdmVzYW5kYm94LmNvbQohLXx8 -d2ViZmVlLm9yZy5ydQohLXx8YmxvZy53ZWJtcHJvamVjdC5vcmcKIS18fHdlYnVw -ZDgub3JnCiEtfHx3d3cud2hhdGJyb3dzZXIub3JnCiEtfHx3d3cud2hlcmVkb3lv -dWdvLm5ldAohLXx8d2lsbGhhaW5zLmNvbQohLXx8ZmVlZHMud2lyZWQuY29tCiEt -fHx3aXNlbWFwcGluZy5vcmcKd296eS5pbgohLXx8d296eS5pbi8KIS18fGJsb2cu -d3VuZGVyY291bnRlci5jb20KIS1YCiEtfHx4ZGVsdGEub3JnCiEtfHx4aWFvZ2Fv -emkub3JnCiEtfHx4aWxvdS51cwohLXx8eHp5Lm9yZy5ydQohLVkKIS18fHlvb3Bl -ci5iZQohLXx8dHNvbmcueXVueGkubmV0CiEtWgoKZ29zcGVsaGVyYWxkLmNvbQp8 -fGdvc3BlbGhlcmFsZC5jb20KfGh0dHA6Ly9oay5ncmFkY29ubmVjdGlvbi5jb20v -Cnx8Z3Jhbmdvcnoub3JnCnx8Z3JheWxvZzIub3JnCmdyZWF0ZmlyZS5vcmcKfHxn -cmVhdGZpcmUub3JnCmdyZWF0ZmlyZXdhbGxvZmNoaW5hLm9yZwp8fGdyZWF0cm9j -LnR3Cnx8Z3N0YXRpYy5jb20KLmd1LWNodS1zdW0ub3JnCnxodHRwOi8vZ3UtY2h1 -LXN1bS5vcmcKZ3Vpc2hhbi5vcmcKfHxndWlzaGFuLm9yZwp8fGd1bnNhbWVyaWNh -LmNvbQpndXJ1b25saW5lLmhrCnxodHRwOi8vZ3ZsaWIuY29tCi5neWFsd2FyaW5w -b2NoZS5jb20KLmd5YXRzb3N0dWRpby5jb20KCiEtLS0tLS0tLS0tLS0tLS0tLS0t -LUhILS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp8fGgtY2hpbmEub3JnCi5oLW1v -ZS5jb20KfGh0dHA6Ly9oLW1vZS5jb20KaDFuMWNoaW5hLm9yZwouaGFjZy5jbHVi -Cnx8aGFjZy5jbHViCi5oYWNnLmluCnxodHRwOi8vaGFjZy5pbgouaGFjZy5saQp8 -aHR0cDovL2hhY2cubGkKLmhhY2cucmVkCnxodHRwOi8vaGFjZy5yZWQKLmhhY2tl -bi5jYy9iYnMKfHxoYWNrdGhhdHBob25lLm5ldApoYWhsby5jb20KfHxoYWtrYXR2 -Lm9yZy50dwp8aHR0cDovL2Jicy5oYW5taW56dS5vcmcvCi5oYW51bnlpLmNvbQp8 -aHR0cDovL2FlLmhhbzEyMy5jb20KfGh0dHA6Ly9hci5oYW8xMjMuY29tCnxodHRw -Oi8vYnIuaGFvMTIzLmNvbQp8aHR0cDovL2VuLmhhbzEyMy5jb20KfGh0dHA6Ly9p -ZC5oYW8xMjMuY29tCnxodHRwOi8vanAuaGFvMTIzLmNvbQp8aHR0cDovL21hLmhh -bzEyMy5jb20KfGh0dHA6Ly9teC5oYW8xMjMuY29tCnxodHRwOi8vc2EuaGFvMTIz -LmNvbQp8aHR0cDovL3RoLmhhbzEyMy5jb20KfGh0dHA6Ly90dy5oYW8xMjMuY29t -CnxodHRwOi8vdm4uaGFvMTIzLmNvbQp8aHR0cDovL2hrLmhhbzEyM2ltZy5jb20K -fGh0dHA6Ly9sZC5oYW8xMjNpbWcuY29tCnx8aGFwcHktdnBuLmNvbQp8fGhhcmRz -ZXh0dWJlLmNvbQouaGFydW55YWh5YS5jb20KfGh0dHA6Ly9oYXJ1bnlhaHlhLmNv -bQp8fGhhc2Fvd2FsbC5jb20KYmJzLmhhc2kud2FuZwpoYXZlOC5jb20KQEB8fGhh -eWdvLmNvbQp8fGhkdHZiLm5ldAouaGR6b2cuY29tCnxodHRwOi8vaGR6b2cuY29t -Cnx8aGVhcnR5aXQuY29tCi5oZWMuc3UKfGh0dHA6Ly9oZWMuc3UKLmhlY2FpdG91 -Lm5ldAp8fGhlY2FpdG91Lm5ldAouaGVjaGFqaS5jb20KfHxoZWNoYWppLmNvbQp8 -fGhlZWFjdC5lZHUudHcKLmhlZ3JlLWFydC5jb20KfHxjZG4uaGVsaXhzdHVkaW9z -Lm5ldAp8fGhlbHBsaW5mZW4uY29tCnx8aGVsbG9hbmRyb2lkLmNvbQp8fGhlbGxv -cXVlZXIuY29tCmhlbGxvdHh0LmNvbQp8fGhlbGxvdHh0LmNvbQouaGVudGFpLnRv -Ci5oZWxsb3VrLm9yZy9mb3J1bS9sb2ZpdmVyc2lvbgouaGVscGVhY2hwZW9wbGUu -Y29tCnx8aGVscGVhY2hwZW9wbGUuY29tCnx8aGVscHN0ZXIuZGUKLmhlbHB6aHVs -aW5nLm9yZwpoZW50YWl0dWJlLnR2Ci5oZW50YWl2aWRlb3dvcmxkLmNvbQoKISMj -IyMjIyMjIyMjLS1IZXJva3UtLSMjIyMjIyMjIyMKfHxnZXRjbG91ZGFwcC5jb20K -fHxjbC5seQpAQHx8Zi5jbC5seQp8fGdldHNtYXJ0bGlua3MuY29tCnx8Z2l0LXNj -bS5jb20KCmhlcWluZ2xpYW4ubmV0Cnx8aGV1bmdrb25nZGlzY3Vzcy5jb20KIS0t -R29vZ2xlIGVtcGxveWVlIHdpdGhpbiBHb29nbGUgSVAKfHxoZXh4ZWgubmV0CmFw -cC5oZXl3aXJlLmNvbQouaGV5em8uY29tCi5oZ3NlYXYuY29tCi5oaGRjYjNvZmZp -Y2Uub3JnCmhpLW9uLm9yZy50dwpoaWRkZW4tYWR2ZW50Lm9yZwp8fGhpZGRlbi1h -ZHZlbnQub3JnCmhpZGVjbG91ZC5jb20vYmxvZy8yMDA4LzA3LzI5L2Z1Y2stYmVp -amluZy1vbHltcGljcy5odG1sCnx8aGlkZS5tZQouaGlkZWlwdnBuLmNvbQp8fGhp -ZGVpcHZwbi5jb20KLmhpZGVtYW4ubmV0Cnx8aGlkZW1hbi5uZXQKaGlkZW1lLm5s -Ci5oaWRlbXlhc3MuY29tCnx8aGlkZW15YXNzLmNvbQpoaWRlbXljb21wLmNvbQp8 -fGhpZGVteWNvbXAuY29tCi5oaWhpZm9ydW0uY29tCnxodHRwOi8vaGloaWZvcnVt -LmNvbQp8fGhpaGlzdG9yeS5uZXQKLmhpZ2Z3LmNvbQpoaWdocGVha3NwdXJlZWFy -dGguY29tCnx8aGlnaHJvY2ttZWRpYS5jb20KfHxoaWl0Y2guY29tCnx8aGlraW5n -Z2Z3Lm9yZwouaGlsaXZlLnR2CgouaGltYWxheWFuLWZvdW5kYXRpb24ub3JnCmhp -bWFsYXlhbmdsYWNpZXIuY29tCi5oaW1lbWl4LmNvbQp8fGhpbWVtaXguY29tCi5o -aW1lbWl4Lm5ldAp0aW1lcy5oaW5ldC5uZXQKaGl6YnV0dGFocmlyLm9yZwpoaXpi -LXV0LXRhaHJpci5pbmZvCmhpemItdXQtdGFocmlyLm9yZwouaGpjbHViLmluZm8K -LmhrLXB1Yi5jb20vZm9ydW0KfGh0dHA6Ly9oay1wdWIuY29tCi5oazAxLmNvbQou -aGszMjE2OC5jb20KfHxoazMyMTY4LmNvbQouaGthdHZuZXdzLmNvbQpoa2JjLm5l -dAouaGtiZi5vcmcKLmhrYm9va2NpdHkuY29tCnx8aGtib29rY2l0eS5jb20KLmhr -Y2h1cmNoLm9yZwouaGtjbWkuZWR1Cnx8aGtjb2MuY29tCmhrZGF5Lm5ldAouaGtk -YWlseW5ld3MuY29tLmhrL2NoaW5hLnBocApoa2RmLm9yZwouaGtlai5jb20KLmhr -ZXBjLmNvbS9mb3J1bS92aWV3dGhyZWFkLnBocD90aWQ9MTE1MzMyMgpjaGluYS5o -a2V0LmNvbQp8fGhrZmFhLmNvbQpoa2ZyZWV6b25lLmNvbQpoa2Zyb250Lm9yZwpt -LmhrZ2FsZGVuLmNvbQp8aHR0cHM6Ly9tLmhrZ2FsZGVuLmNvbQpoa2dvbGRlbi5j -b20KLmhrZ3JlZW5yYWRpby5vcmcvaG9tZQouaGtoZWFkbGluZS5jb20qYmxvZwou -aGtoZWFkbGluZS5jb20vaW5zdGFudG5ld3MKaGtoa2hrLmNvbQpoa2hyYy5vcmcu -aGsKaGtocm0ub3JnLmhrCnx8aGtpcC5vcmcudWsKMTk4OXJlcG9ydC5oa2phLm9y -Zy5oawpoa2pjLmNvbQouaGtqcC5vcmcKLmhrbGZ0LmNvbQouaGtsdHMub3JnLmhr -Cnx8aGtsdHMub3JnLmhrCm5ld3MuaGtwZWFudXQuY29tCmhrcHR1Lm9yZwouaGty -ZXBvcnRlci5jb20KfHxoa3JlcG9ydGVyLmNvbQp8aHR0cDovL2hrdXBvcC5oa3Uu -aGsvCi5oa3VzdS5uZXQKfHxoa3VzdS5uZXQKLmhrdndldC5jb20KLmhrd2NjLm9y -Zy5oawp8fGhrem9uZS5vcmcKaG5qaGouY29tCnx8aG5qaGouY29tCi5obm50dWJl -LmNvbQp8fGhvbGEuY29tCnx8aG9sYS5vcmcKaG9seW1vdW50YWluY24uY29tCmhv -bHlzcGlyaXRzcGVha3Mub3JnCnx8aG9seXNwaXJpdHNwZWFrcy5vcmcKfHxkZXJl -a2hzdS5ob21laXAubmV0Ci5ob21lcGVydmVyc2lvbi5jb20KfGh0dHA6Ly9ob21l -c2VydmVyc2hvdy5jb20KfGh0dHA6Ly9vbGQuaG9uZXluZXQub3JnL3NjYW5zL3Nj -YW4zMS9zdWIvZG91Z19lcmljL3NwYW1fdHJhbnNsYXRpb24uaHRtbAouaG9uZ2tv -bmdmcC5jb20KfHxob25na29uZ2ZwLmNvbQpob25nbWVpbWVpLmNvbQp8fGhvbmd6 -aGkubGkKaG9vdHN1aXRlLmNvbQp8fGhvb3RzdWl0ZS5jb20KLmhvcHRvLm9yZwou -aG9ybnlnYW1lci5jb20KLmhvdGF2LnR2CmhvdGZyb2cuY29tLnR3CmhvdGdvby5j -b20KLmhvdHBvcm5zaG93LmNvbQpob3Rwb3QuaGsKLmhvdHNoYW1lLmNvbQp8fGhv -dHNwb3RzaGllbGQuY29tCi5ob3R2cG4uY29tCnx8aG90dnBuLmNvbQp8fGhvdWdh -aWdlLmNvbQp8fGhvd3RvZm9yZ2UuY29tCi5ocWNkcC5vcmcKfHxocWNkcC5vcmcK -fHxocWphcGFuZXNlc2V4LmNvbQpocW1vdmllcy5jb20KLmhyY2lyLmNvbQouaHJj -Y2hpbmEub3JnCi5ocmVhLm9yZwouaHJpY2hpbmEub3JnCnx8aHJpY2hpbmEub3Jn -Ci5ocncub3JnCnx8aHJ3Lm9yZwpocndlYi5vcmcKfHxoc2pwLm5ldAp8fGhzc2Vs -aXRlLmNvbQp8aHR0cDovL2hzdC5uZXQudHcKLmhzdGVybi5uZXQKLmhzdHQubmV0 -Ci5odGtvdS5uZXQKfHxodGtvdS5uZXQKfHxodG1sZG9nLmNvbQouaHVhLXl1ZS5u -ZXQKaHVhZ2xhZC5jb20KLmh1YW5naHVhZ2FuZy5vcmcKfHxodWFuZ2h1YWdhbmcu -b3JnCi5odWFuZ3lpeXUuY29tCi5odWFyZW4udXMKfHxodWFyZW4udXMKaHVheGlh -LW5ld3MuY29tCmh1YXhpYWJhby5vcmcKaHVheGluLnBoCnx8aHVheXV3b3JsZC5v -cmcKLmh1ZmZpbmd0b25wb3N0LmNvbS9yZWJpeWEta2FkZWVyCnx8aHVnb3JveS5l -dQp8fGh1aGFpdGFpLmNvbQp8fGh1aGFtaGlyZS5jb20KaHVpeWkuaW4KLmh1bGtz -aGFyZS5jb20KaHVtYW5yaWdodHNicmllZmluZy5vcmcKfHxodW5nLXlhLmNvbQp8 -fGh1bmdlcnN0cmlrZWZvcmFpZHMub3JnCnx8aHVwaW5nLm5ldApodXJnb2tiYXly -YWsuY29tCi5odXJyaXlldC5jb20udHIKLmh1dDIucnUKfHxodXRpYW55aS5uZXQK -aHV0b25nOS5uZXQKaHV5YW5kZXguY29tCnx8aHdheXVlLm9yZy50dwp8fGh3aW5m -by5jb20KfGh0dHA6Ly9mYW5nLWxpemhpLmh4d2sub3JnLwpoeHdxLm9yZwp8fGh5 -cGVycmF0ZS5jb20KZWJvb2suaHlyZWFkLmNvbS50dwp8fGVib29rLmh5cmVhZC5j -b20udHcKCiEtLS0tLS0tLS0tLS0tLS0tLS0tLUlJLS0tLS0tLS0tLS0tLS0tLS0t -LS0tLS0tLQp8fGkxLmhrCnx8aTJwMi5kZQp8fGkycnVubmVyLmNvbQp8fGk4MTho -ay5jb20KLmktY2FibGUuY29tCi5pLXBhcnQuY29tLnR3Cmlhc2suY2EKfHxpYXNr -LmNhCmlhc2suYnoKfHxpYXNrLmJ6Ci5pYXYxOS5jb20KaWJpYmxpby5vcmcvcHVi -L3BhY2thZ2VzL2NjaWMKLmlibGlzdC5jb20KfHxpYmxvZ3NlcnYtZi5uZXQKaWJy -b3Mub3JnCnxodHRwOi8vY24uaWJ0aW1lcy5jb20KLmlidnBuLmNvbQp8fGlidnBu -LmNvbQppY2Ftcy5jb20KYmxvZ3MuaWNlcm9ja2V0LmNvbS90YWcKLmljaWoub3Jn -Cnx8aWNpai5vcmcKfHxpY2wtZmkub3JnCi5pY29jby5jb20KfHxpY29jby5jb20K -CiEtLTM4LjEwMy4xNjUuNTAKfHxmdXJiby5vcmcKIS0tfHxpY29uZmFjdG9yeS5j -b20KfHx3YXJibGVyLmljb25mYWN0b3J5Lm5ldAoKfHxpY29ucGFwZXIub3JnCiEt -LSBHb29nbGUgUGFnZXMKfHxpY3UtcHJvamVjdC5vcmcKdy5pZGFpd2FuLmNvbS9m -b3J1bQppZGVtb2NyYWN5LmFzaWEKLmlkZW50aS5jYQp8fGlkZW50aS5jYQp8fGlk -aW9tY29ubmVjdGlvbi5jb20KfGh0dHA6Ly93d3cuaWRsY295b3RlLmNvbQouaWRv -dWdhLmNvbQouaWRyZWFteC5jb20KZm9ydW0uaWRzYW0uY29tCi5pZHYudHcKaWVh -c3luZXdzLm5ldAouaWVkMmsubmV0Ci5pZW5lcmd5MS5jb20KfGh0dHA6Ly9pZi50 -dHQvCmlmYW5xaWFuZy5jb20KLmlmYW5yLmNvbS84NTcKLmlmY3NzLm9yZwp8fGlm -Y3NzLm9yZwppZmpjLm9yZwouaWZ0LnR0CnxodHRwOi8vaWZ0LnR0Cnx8aWZyZWV3 -YXJlcy5jb20KfHxpZ2NkLm5ldAouaWdmdy5uZXQKfHxpZ2Z3Lm5ldAouaWdtZy5k -ZQp8fGlnbml0ZWRldHJvaXQubmV0Ci5pZ290bWFpbC5jb20udHcKfHxpZ3ZpdGEu -Y29tCnx8aWhha2thLm5ldAouaWhhby5vcmcvZHo1Cnx8aWljbnMuY29tCnx8aWxs -dXNpb25mYWN0b3J5LmNvbQp8fGlsb3ZlODAuYmUKfHxpbS50dgpAQHx8bXl2bG9n -LmltLnR2Cnx8aW04OC50dwouaW1hZ2VmYXAuY29tCnx8aW1hZ2VmYXAuY29tCnx8 -aW1hZ2VmbGVhLmNvbQppbWFnZXNoYWNrLnVzCnx8aW1hZ2V2ZW51ZS5jb20KfHxp -bWFnZXppbGxhLm5ldAouaW1iLm9yZwp8aHR0cDovL2ltYi5vcmcKCiEtLUlNREIK -fGh0dHA6Ly93d3cuaW1kYi5jb20vbmFtZS9ubTA0ODI3MzAKLmltZGIuY29tL3Rp -dGxlL3R0MDgxOTM1NAouaW1kYi5jb20vdGl0bGUvdHQxNTQwMDY4Ci5pbWRiLmNv -bS90aXRsZS90dDQ5MDg2NDQKCi5pbWcubHkKfHxpbWcubHkKLmlta2V2LmNvbQp8 -fGlta2V2LmNvbQouaW1saXZlLmNvbQouaW1tb3JhbC5qcAppbXBhY3Qub3JnLmF1 -CmltcHAubW4KfGh0dHA6Ly90ZWNoMi5pbi5jb20vdmlkZW8vCmluOTkub3JnCmlu -LWRpc2d1aXNlLmNvbQouaW5jYXBkbnMubmV0Ci5pbmNsb2FrLmNvbQp8fGluY2xv -YWsuY29tCnx8aW5jcmVkaWJveC5mcgp8fGluZGlhbmRlZmVuc2VuZXdzLmluCnRp -bWVzb2ZpbmRpYS5pbmRpYXRpbWVzLmNvbSpkYWxhaQouaW5kaWVtZXJjaC5jb20K -fHxpbmRpZW1lcmNoLmNvbQppbmZvLWdyYWYuZnIKd2Vic2l0ZS5pbmZvcm1lci5j -b20KLmluaXRpYXRpdmVzZm9yY2hpbmEub3JnCi5pbmt1aS5jb20KLmlubWVkaWFo -ay5uZXQKfHxpbm1lZGlhaGsubmV0Cnx8aW5uZXJtb25nb2xpYS5vcmcKfGh0dHA6 -Ly9ibG9nLmlub3JlYWRlci5jb20KLmlub3RlLnR3Ci5pbnNlY2FtLm9yZwp8aHR0 -cDovL2luc2VjYW0ub3JnCi5pbnN0YWdyYW0uY29tCnx8aW5zdGFncmFtLmNvbQou -aW5zdGl0dXQtdGliZXRhaW4ub3JnCnx8aW50ZXJmYWNlYWRkaWN0aW9uLmNvbQp8 -fGludGVybmF0aW9uYWxyaXZlcnMub3JnCnxodHRwOi8vaW50ZXJuZXQub3JnLwpp -bnRlcm5ldGRlZmVuc2VsZWFndWUub3JnCmludGVybmV0ZnJlZWRvbS5vcmcKIS0t -fHxpbnRlcnBvbC5pbnQKfHxpbnRlcm5ldHBvcGN1bHR1cmUuY29tCmlueGlhbi5j -b20KfHxpbnhpYW4uY29tCmlwYWx0ZXIuY29tCnx8aXBjZi5vcmcudHcKfHxpcGhv -bmU0aG9uZ2tvbmcuY29tCnx8aXBob25laGFja3MuY29tCnx8aXBob25ldGFpd2Fu -Lm9yZwp8fGlwaG9uaXguZnIKfHxpcGljdHVyZS5ydQouaXBqZXRhYmxlLm5ldAp8 -fGlwamV0YWJsZS5uZXQKLmlwb2Jhci5jb20vcmVhZC5waHA/Ci5pcG9ydGFsLm1l -CnxodHRwOi8vaXBvcnRhbC5tZQp8fGlwcG90di5jb20KLmlwcmVkYXRvci5zZQp8 -fGlwcmVkYXRvci5zZQouaXB0di5jb20udHcKfHxpcHZhbmlzaC5jb20KaXJlZG1h -aWwub3JnCmNoaW5lc2UuaXJpYi5pcgp8fGlyb25pY3NvZnR3YXJlLmNvbQp8fGly -b25iaWdmb29scy5jb21weXRob24ubmV0Cnx8aXJvbnB5dGhvbi5uZXQKLmlzLmdk -Ci5pc2xhbS5vcmcuaGsKfGh0dHA6Ly9pc2xhbS5vcmcuaGsKLmlzbGFtYXdhcmVu -ZXNzLm5ldC9Bc2lhL0NoaW5hCi5pc2xhbWhvdXNlLmNvbQp8fGlzbGFtaG91c2Uu -Y29tCi5pc2xhbWljaXR5LmNvbQouaXNsYW1pY3BsdXJhbGlzbS5vcmcKLmlzbGFt -dG9kYXkubmV0Ci5pc2FhY21hby5jb20KfHxpc2FhY21hby5jb20KfHxpc2dyZWF0 -Lm9yZwp8fGlzbWFlbGFuLmNvbQouaXNtYWxsdGl0cy5jb20KfHxpc21wcm9mZXNz -aW9uYWwubmV0Cmlzb2h1bnQuY29tCnx8aXNyYWJveC5jb20KLmlzdGFycy5jby5u -egpvdmVyc2VhLmlzdGFyc2hpbmUuY29tCnx8b3ZlcnNlYS5pc3RhcnNoaW5lLmNv -bQpibG9nLmlzdGVmLmluZm8vMjAwNy8xMC8yMS9teWVudHVubmVsCi5pc3RpcWxh -bGhld2VyLmNvbQouaXN0b2NrcGhvdG8uY29tCmlzdW5hZmZhaXJzLmNvbQppc3Vu -dHYuY29tCml0YWJvby5pbmZvCnx8aXRhYm9vLmluZm8KLml0YWxpYXRpYmV0Lm9y -Zwpkb3dubG9hZC5pdGhvbWUuY29tLnR3Cml0aGVscC5pdGhvbWUuY29tLnR3Cnx8 -aXRzaGlkZGVuLmNvbQouaXRza3kuaXQKLml0d2VldC5uZXQKfGh0dHA6Ly9pdHdl -ZXQubmV0Ci5pdTQ1LmNvbQp8fGl1aHJkZi5vcmcKLml1a3NreS5jb20KLml2YWN5 -LmNvbQp8fGl2YWN5LmNvbQouaXZlcnljZC5jb20KLml2cG4ubmV0CiEtLXx8aXZw -bi5uZXQKfHxpeHF1aWNrLmNvbQouaXh4eC5jb20KaXlvdXBvcnQuY29tCnx8aXlv -dXBvcnQuY29tCi5pemFvYmFvLnVzCnx8Z21vem9tZy5pemlob3N0Lm9yZwouaXps -ZXMubmV0Ci5pemxlc2VtLm9yZwoKIS0tLS0tLS0tLS0tLS0tLS0tLS0tSkotLS0t -LS0tLS0tLS0tLS0tLS0tLS0tLS0tCnx8ai5tcApibG9nLmphY2tqaWEuY29tCmph -bWFhdC5vcmcKLmphbXlhbmdub3JidS5jb20KfGh0dHA6Ly9qYW15YW5nbm9yYnUu -Y29tCnx8amFud29uZ3Bob3RvLmNvbQp8fGphcGFuLXdob3Jlcy5jb20KLmphdjY4 -LnR2Ci5qYXZoaXAuY29tCi5qYXZha2liYS5vcmcKfGh0dHA6Ly9qYXZha2liYS5v -cmcKLmphdmJ1cy5jb20KfHxqYXZmb3IubWUKLmphdm1vby5jb20KLmphdnNlZW4u -Y29tCnxodHRwOi8vamF2c2Vlbi5jb20KamJ0YWxrcy5jYwpqYnRhbGtzLmNvbQpq -YnRhbGtzLm15Ci5qZHdzeS5jb20KamVhbnlpbS5jb20KfHxqZ29vZGllcy5jb20K -LmppYW5nd2VpcGluZy5jb20KfHxqaWFuZ3dlaXBpbmcuY29tCnx8amlhb3lvdTgu -Y29tCi5qaWVodWEuY3oKfHxoay5qaWVwYW5nLmNvbQp8fHR3LmppZXBhbmcuY29t -CmppZXNoaWJhb2Jhby5jb20KNTZjdW4wNC5qaWdzeS5jb20Kamlnb25nMTAyNC5j -b20KZGFvZHUxNC5qaWdzeS5jb20Kc3BlY3hpbnpsLmppZ3N5LmNvbQp3bGNuZXcu -amlnc3kuY29tCmppbmJ1c2hlLm9yZwp8fGppbmJ1c2hlLm9yZwouamluZ3NpbS5v -cmcKemhhby5qaW5oYWkuZGUKamluZ3Bpbi5vcmcKfHxqaW5ncGluLm9yZwpqaW5w -aWFud2FuZy5jb20KYWMuamlydWFuLm5ldAp8fGppdG91Y2guY29tCi5qaXp6dGhp +Ly9zcyouNHNxaS5uZXQKdmlkZW8uZm94YnVzaW5lc3MuY29tCnxodHRwOi8vZm94 +Z2F5LmNvbQp8fGZyaW5nZW5ldHdvcmsuY29tCnx8ZmxlY2hlaW50aGVwZWNoZS5m +cgouZm9jaGsub3JnCnxodHRwOi8vZm9jaGsub3JnCnx8Zm9jdXN0YWl3YW4udHcK +LmZvY3VzdnBuLmNvbQp8fGZvZmcub3JnCi5mb2ZnLWV1cm9wZS5uZXQKLmZvb29v +by5jb20KfHxmb29vb28uY29tCmZvb3R3aWJhbGwuY29tCi5mb3RpbGUubWUKfHxm +b3VydGhpbnRlcm5hdGlvbmFsLm9yZwp8fGZveGRpZS51cwp8fGZveHN1Yi5jb20K +Zm94dGFuZy5jb20KLmZwbXQub3JnCnxodHRwOi8vZnBtdC5vcmcKLmZwbXQudHcK +LmZwbXQtb3NlbC5vcmcKfHxmcG10bWV4aWNvLm9yZwpmcW9rLm9yZwp8fGZxcm91 +dGVyLmNvbQp8fGZyYW5rbGMuY29tCi5mcmVha3NoYXJlLmNvbQp8aHR0cDovL2Zy +ZWFrc2hhcmUuY29tCnx8ZnJlZTR1LmNvbS5hcgpmcmVlLWdhdGUub3JnCi5mcmVl +LWhhZGEtbm93Lm9yZwpmcmVlLXByb3h5LmN6Ci5mcmVlLmZyL2Fkc2wKa2luZW94 +LmZyZWUuZnIKdGliZXRsaWJyZS5mcmVlLmZyCnx8ZnJlZWFsaW0uY29tCndoaXRl +YmVhci5mcmVlYmVhcmJsb2cub3JnCnx8ZnJlZWJyb3dzZXIub3JnCi5mcmVlY2hh +bC5jb20KLmZyZWVkb21jaGluYS5pbmZvCnx8ZnJlZWRvbWNoaW5hLmluZm8KLmZy +ZWVkb21ob3VzZS5vcmcKfHxmcmVlZG9taG91c2Uub3JnCi5mcmVlZG9tc2hlcmFs +ZC5vcmcKfHxmcmVlZG9tc2hlcmFsZC5vcmcKLmZyZWVmcS5jb20KLmZyZWVmdWNr +dmlkcy5jb20KLmZyZWVnYW8uY29tCnx8ZnJlZWdhby5jb20KZnJlZWlsaGFtdG9o +dGkub3JnCi5mcmVla3dvbnB5b25nLm9yZwp8fHNhdmVsaXV4aWFvYm8uY29tCi5m +cmVlbG90dG8uY29tCnx8ZnJlZWxvdHRvLmNvbQpmcmVlbWFuMi5jb20KLmZyZWVv +cGVudnBuLmNvbQpmcmVlbW9yZW4uY29tCmZyZWVtb3JlbmV3cy5jb20KZnJlZW11 +c2Uub3JnL2FyY2hpdmVzLzc4OQpmcmVlbmV0LWNoaW5hLm9yZwpmcmVlbmV3c2Nu +LmNvbQpjbi5mcmVlb25lcy5jb20KLmZyZWVvei5vcmcvYmJzCnx8ZnJlZW96Lm9y +Zwp8fGZyZWVzc2gudXMKZnJlZTR1LmNvbS5hcgouZnJlZS1zc2guY29tCnx8ZnJl +ZS1zc2guY29tCi5mcmVlY2hpbmEubmV3cy8KfHxmcmVlY2hpbmFmb3J1bS5vcmcK +fHxmcmVlY2hpbmF3ZWliby5jb20KLmZyZWVkb21jb2xsZWN0aW9uLm9yZy9pbnRl +cnZpZXdzL3JlYml5YV9rYWRlZXIKLmZyZWVmb3J1bXMub3JnCnx8ZnJlZW5ldHBy +b2plY3Qub3JnCi5mcmVlb3oub3JnCi5mcmVldGliZXQubmV0Cnx8ZnJlZXRpYmV0 +Lm9yZwouZnJlZXRpYmV0YW5oZXJvZXMub3JnCnxodHRwOi8vZnJlZXRpYmV0YW5o +ZXJvZXMub3JnCi5mcmVldmlld21vdmllcy5jb20KLmZyZWV2cG4ubWUKfGh0dHA6 +Ly9mcmVldnBuLm1lCnx8ZnJlZXdhbGxwYXBlcjQubWUKLmZyZWV3ZWJzLmNvbQou +ZnJlZXdlY2hhdC5jb20KfHxmcmVld2VjaGF0LmNvbQpmcmVld2VpYm8uY29tCnx8 +ZnJlZXdlaWJvLmNvbQouZnJlZXhpbndlbi5jb20KLmZyZWV5b3V0dWJlcHJveHku +bmV0Cnx8ZnJlZXlvdXR1YmVwcm94eS5uZXQKZnJpZW5kZmVlZC5jb20KZnJpZW5k +ZmVlZC1tZWRpYS5jb20vZTk5YTRlYmUyZmI0YzE5ODVjMmE1ODc3NWViNDQyMjk2 +MWFhNWEyZQpmcmllbmRzLW9mLXRpYmV0Lm9yZwouZnJpZW5kc29mdGliZXQub3Jn +CmZyZWVjaGluYS5uZXQKfGh0dHA6Ly93d3cuemVuc3VyLmZyZWVyay5jb20vCmZy +ZWV2cG4ubmwKZnJlZXllbGxvdy5jb20KaGsuZnJpZW5kZHkuY29tL2hrCnxodHRw +Oi8vYWR1bHQuZnJpZW5kZmluZGVyLmNvbS8KLmZyaW5nLmNvbQp8fGZyaW5nLmNv +bQouZnJvbWNoaW5hdG91c2EubmV0Cnx8ZnJvbW1lbC5uZXQKLmZyb250bGluZWRl +ZmVuZGVycy5vcmcKLmZyb290dnBuLmNvbQp8fGZyb290dnBuLmNvbQp8fGZzY2tl +ZC5vcmcKLmZzdXJmLmNvbQouZnR2LmNvbS50dwpmdWNkLmNvbQouZnVja2Nubmlj +Lm5ldAp8fGZ1Y2tjbm5pYy5uZXQKZnVja2dmdy5vcmcKfHxmdWxsZXJjb25zaWRl +cmF0aW9uLmNvbQpmdWx1ZS5jb20KLmZ1bmYudHcKZnVucC5jb20KLmZ1cS5jb20K +LmZ1cmhoZGwub3JnCnx8ZnVyaW5rYW4uY29tCi5mdXR1cmVjaGluYWZvcnVtLm9y +Zwp8fGZ1dHVyZW1lc3NhZ2Uub3JnCi5mdXguY29tCi5mdXlpbi5uZXQKLmZ1eWlu +ZGlhbnRhaS5vcmcKLmZ1eXUub3JnLnR3Cnx8ZncuY20KLmZ4Y20tY2hpbmVzZS5j +b20KfHxmeGNtLWNoaW5lc2UuY29tCmZ6aDk5OS5jb20KZnpoOTk5Lm5ldApmemxt +LmNvbQoKIS0tLS0tLS0tLS0tLS0tLS0tLS0tR0ctLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tCi5nNmhlbnRhaS5jb20KfGh0dHA6Ly9nNmhlbnRhaS5jb20KfHxnLXF1 +ZWVuLmNvbQp8fGdhYm9jb3JwLmNvbQouZ2FlcHJveHkuY29tCi5nYWZvcnVtLm9y +ZwouZ2FsYXh5bWFjYXUuY29tCnx8Z2FsZW53dS5jb20KLmdhbHN0YXJzLm5ldAp8 +fGdhbWU3MzUuY29tCmdhbWViYXNlLmNvbS50dwpnYW1lam9sdC5jb20KfGh0dHA6 +Ly93aWtpLmdhbWVycC5qcAp8fGdhbWVyLmNvbS50dwouZ2FtZXIuY29tLnR3Ci5n +YW1lei5jb20udHcKfHxnYW1lei5jb20udHcKLmdhbW91c2EuY29tCi5nYW9taW5n +Lm5ldAp8fGdhb21pbmcubmV0Cmdhbmdlcy5jb20KLmdhb3BpLm5ldAp8aHR0cDov +L2dhb3BpLm5ldAouZ2Fvemhpc2hlbmcub3JnCi5nYW96aGlzaGVuZy5uZXQKZ2Fy +ZGVubmV0d29ya3MuY29tCnx8Z2FyZGVubmV0d29ya3Mub3JnCiEtLUlQIG9mIEdh +cmRlbiBOZXR3b3JrCjcyLjUyLjgxLjIyCnx8Z2FydGxpdmUuY29tCnx8Z2F0ZS1w +cm9qZWN0LmNvbQp8fGdhdGhlci5jb20KLmdhdGhlcnByb3h5LmNvbQpnYXRpLm9y +Zy50dwouZ2F5YnViYmxlLmNvbQouZ2F5Y24ubmV0Ci5nYXlodWIuY29tCnx8Z2F5 +bWFwLmNjCi5nYXltZW5yaW5nLmNvbQouZ2F5dHViZS5jb20KIS0tfHxnYXl0dWJl +LmNvbQp8fGltYWdlcy1nYXl0dWJlLmNvbQouZ2F5d2F0Y2guY29tCnxodHRwOi8v +Z2F5d2F0Y2guY29tCi5nYXpvdHViZS5jb20KfHxnYXpvdHViZS5jb20KfHxnY2Mu +b3JnLmhrCnx8Z2Nsb29uZXkuY29tCnx8Z2NtYXNpYS5jb20KLmdjcG5ld3MuY29t +CnxodHRwOi8vZ2NwbmV3cy5jb20KLmdkYnQubmV0L2ZvcnVtCmdkemYub3JnCnx8 +Z2Vlay1hcnQubmV0CmdlZWtlcmhvbWUuY29tLzIwMTAvMDMveGl4aWFuZy1wcm9q +ZWN0LWNyb3NzLWdmdwp8fGdlZWtoZWFydC5pbmZvCi5nZWtpa2FtZS5jb20KfGh0 +dHA6Ly9nZWtpa2FtZS5jb20KLmdlbGJvb3J1LmNvbQp8aHR0cDovL2dlbGJvb3J1 +LmNvbQohLS18fGdlbnVpdGVjLmNvbQouZ2VvY2l0aWVzLmNvLmpwCi5nZW9jaXRp +ZXMuY29tL1NpbGljb25WYWxsZXkvQ2lyY3VpdC81NjgzL2Rvd25sb2FkLmh0bWwK +aGsuZ2VvY2l0aWVzLmNvbQpnZW9jaXRpZXMuanAKLmdlcmVmb3VuZGF0aW9uLm9y +Zwp8fGdldGFzdHJpbGwuY29tCi5nZXRjaHUuY29tCi5nZXRjbG9hay5jb20KfHxn +ZXRjbG9hay5jb20KfHxnZXRmb3h5cHJveHkub3JnCi5nZXRmcmVlZHVyLmNvbQp8 +fGdldGdvbS5jb20KLmdldGkycC5uZXQKfHxnZXRpMnAubmV0Ci5nZXRsYW50ZXJu +Lm9yZwp8fGdldGxhbnRlcm4ub3JnCi5nZXRqZXRzby5jb20vZm9ydW0KZ2V0aXRv +bi5jb20KLmdldHNvY2lhbHNjb3BlLmNvbQp8fGdldHN5bmMuY29tCmdmYnYuZGUK +LmdmZ29sZC5jb20uaGsKLmdmc2FsZS5jb20KfHxnZnNhbGUuY29tCmdmdy5vcmcu +dWEKLmdmdy5wcmVzcwp8fGdmdy5wcmVzcwouZ2dzc2wuY29tCnx8Z2dzc2wuY29t +CiEtLXx8Z2hvc3Qub3JnCi5naG9zdHBhdGguY29tCnx8Z2hvc3RwYXRoLmNvbQp8 +fGdodXQub3JnCi5naWFudGVzc25pZ2h0LmNvbQp8aHR0cDovL2dpYW50ZXNzbmln +aHQuY29tCi5naWZyZWUuY29tCnx8Z2lnYS13ZWIuanAKdHcuZ2lnYWNpcmNsZS5j +b20KfGh0dHA6Ly9jbi5naWdhbmV3cy5jb20vCmdpZ3Bvcm5vLnJ1Cnx8Z2lybGJh +bmtlci5jb20KLmdpdC5pbwp8fGdpdC5pbwp8aHR0cDovL3NvZnR3YXJlZG93bmxv +YWQuZ2l0Ym9va3MuaW8KCiEtLS1HaXRIdWItLS0KZ2l0aHViLmNvbS9nZXRsYW50 +ZXJuCnxodHRwczovL2dpc3QuZ2l0aHViLmNvbQpodHRwOi8vY3RobG8uZ2l0aHVi +LmlvL2hrdHYKaGFoYXhpeGkuZ2l0aHViLmlvCnxodHRwczovL2hhaGF4aXhpLmdp +dGh1Yi5pbwp8fGhhb2VsLmdpdGh1Yi5pbwohLS18aHR0cDovL29uaW9uaGFja2Vy +LmdpdGh1Yi5pbwp8fHNpa2FvemhlMTk5Ny5naXRodWIuaW8KfHxzb2RhdGVhLmdp +dGh1Yi5pbwp8fHRlcm1pbnVzMjA0OS5naXRodWIuaW8Kd3NnemFvLmdpdGh1Yi5p +bwp8aHR0cHM6Ly93c2d6YW8uZ2l0aHViLmlvCiEtLS5naXRodWIuaW8KCi5naXps +ZW4ubmV0Cnx8Z2l6bGVuLm5ldAouZ2pjenouY29tCnx8Z2pjenouY29tCmdsb2Jh +bGppaGFkLm5ldApnbG9iYWxtZWRpYW91dHJlYWNoLmNvbQpnbG9iYWxtdXNldW1v +bmNvbW11bmlzbS5vcmcKfHxnbG9iYWxyZXNjdWUubmV0Ci5nbG9iYWx0bS5vcmcK +Lmdsb2JhbHZvaWNlc29ubGluZS5vcmcKfHxnbG9iYWx2b2ljZXNvbmxpbmUub3Jn +Cnx8Z2xvYmFsdnBuLm5ldAouZ2xvY2suY29tCmdsdWNrbWFuLmNvbS9EYWxhaUxh +bWEKZ21iZC5jbgp8fGdtaHoub3JnCnxodHRwOi8vd3d3LmdtaWRkbGUuY29tCnxo +dHRwOi8vd3d3LmdtaWRkbGUubmV0Ci5nbWxsLm9yZwp8fGduY2kub3JnLmhrCmdv +LXBraS5jb20KfHxnb2FnZW50LmJpegp8fGdvYWdlbnRwbHVzLmNvbQpnb2JldC5j +Ywpnb2Rmb290c3RlcHMub3JnCnx8Z29kZm9vdHN0ZXBzLm9yZwpnb2Rucy53b3Jr +CmdvZHNkaXJlY3Rjb250YWN0LmNvLnVrCi5nb2RzZGlyZWN0Y29udGFjdC5vcmcK +Z29kc2RpcmVjdGNvbnRhY3Qub3JnLnR3Ci5nb2RzaW1tZWRpYXRlY29udGFjdC5j +b20KLmdvZ290dW5uZWwuY29tCnx8Z29oYXBweS5jb20udHcKLmdva2JheXJhay5j +b20KLmdvbGRiZXQuY29tCnx8Z29sZGJldHNwb3J0cy5jb20KfHxnb2xkZW5leWV2 +YXVsdC5jb20KLmdvbGRlbmZyb2cuY29tCnx8Z29sZGVuZnJvZy5jb20KLmdvbGRq +aXp6LmNvbQp8aHR0cDovL2dvbGRqaXp6LmNvbQouZ29sZHN0ZXAubmV0Cnx8Z29s +ZHdhdmUuY29tCmdvbmdtZW5nLmluZm8KZ29uZ20uaW4KZ29uZ21pbmxpbGlhbmcu +Y29tCi5nb25nd3QuY29tCnxodHRwOi8vZ29uZ3d0LmNvbQpibG9nLmdvby5uZS5q +cC9kdWNrLXRhaWxfMjAwOQouZ29vZGF5Lnh5egp8aHR0cDovL2dvb2RheS54eXoK +Lmdvb2RyZWFkcy5jb20KfHxnb29kcmVhZHMuY29tCi5nb29kcmVhZGVycy5jb20K +fHxnb29kcmVhZGVycy5jb20KLmdvb2R0di5jb20udHcKLmdvb2R0di50dgp8fGdv +b2ZpbmQuY29tCi5nb29nbGVzaWxlLmNvbQouZ29wZXRpdGlvbi5jb20KfHxnb3Bl +dGl0aW9uLmNvbQouZ29wcm94aW5nLm5ldAouZ290cnVzdGVkLmNvbQp8fGdvdHJ1 +c3RlZC5jb20KfHxnb3R3LmNhCnx8Z3JhbW1hbHkuY29tCmdyYW5kdHJpYWwub3Jn +Ci5ncmFwaGlzLm5lLmpwCnx8Z3JhcGhpcy5uZS5qcAp8fGdyYXBocWwub3JnCiEt +LXx8cy5ncmF2YXRhci5jb20KZ3JlYXRmaXJld2FsbC5iaXoKfHxncmVhdGZpcmV3 +YWxsb2ZjaGluYS5uZXQKLmdyZWF0ZmlyZXdhbGxvZmNoaW5hLm9yZwp8fGdyZWF0 +ZmlyZXdhbGxvZmNoaW5hLm9yZwp8fGdyZWVuZmllbGRib29rc3RvcmUuY29tLmhr +Ci5ncmVlbnBhcnR5Lm9yZy50dwp8fGdyZWVucGVhY2Uub3JnCi5ncmVlbnJlYWRp +bmdzLmNvbS9mb3J1bQpncmVhdC1maXJld2FsbC5jb20KZ3JlYXQtcm9jLm9yZwpn +cmVhdHJvYy5vcmcKZ3JlYXR6aG9uZ2h1YS5vcmcKLmdyZWVucGVhY2UuY29tLnR3 +Ci5ncmVlbnZwbi5uZXQKfHxncmVlbnZwbi5uZXQKLmdyZWVudnBuLm9yZwp8fGdy +b3R0eS1tb25kYXkuY29tCmdzLWRpc2N1c3MuY29tCnx8Z3RyaWNrcy5jb20KZ3Vh +bmNoYS5vcmcKZ3VhbmVyeXUuY29tCi5ndWFyZHN0ZXIuY29tCi5ndW4td29ybGQu +bmV0Cmd1bnNhbmRhbW1vLmNvbQp8fGd1dHRlcnVuY2Vuc29yZWQuY29tCnx8Z3Zt +LmNvbS50dwouZ3ptLnR2Cnx8Z3pvbmUtYW5pbWUuaW5mbwoKIS0tLS0tLS0tLS0t +LS1HSFMtLS0tLQohLXx8ZmVlZHMuY2JzbmV3cy5jb20KIS18fHd3dy5jaGluZXNl +YWxidW1hcnQuY29tCnx8Y2xlbWVudGluZS1wbGF5ZXIub3JnCiEtfHxjbGVtZXNo +YS5vcmcKIS18fHd3dy5jbG91ZGdpcmxmcmllbmQuY29tCiEtfHxjb2NvYXdpdGhs +b3ZlLmNvbQohLXx8YmxvZy5jb250cm9sc3BhY2Uub3JnCiEtRAohLXx8d3d3LmRh +aWx5Z3lhbi5jb20KIS18fGRhaWx5dG9kby5vcmcKIS18fGJsb2cuZGFubWFybmVy +LmNvbQohLXx8Z2l0aHViLmRhbm1hcm5lci5jb20KIS18fGRlc2lnbi1zZWVkcy5j +b20KIS18fGRlc2lnbmVycy1hcnRpc3RzLmNvbQohLXx8bWFpbC5kaXlhbmcub3Jn +CiEtfHxibG9nLmRvdWdoZWxsbWFubi5jb20KIS18fGRvd25mb3JldmVyeW9uZW9y +anVzdG1lLmNvbQohLXx8ZHJvaWRzZWN1cml0eS5jb20KIS18fHd3dy5kcm9wbW9j +a3MuY29tCiEtfHxkdW1ibGl0dGxlbWFuLmNvbQohLUUKZWNob2Zvbi5jb20KIS18 +fGVjaG9mb24uY29tCiEtfHxlcGMtamF2LmNvbQohLXx8ZXZlcmRhcmsuaW5mbwoh +LXx8ZXZoZWFkLmNvbQohLUYKIS18fGZhY2lsZWxvZ2luLmNvbQohLXx8Ki5mYXRk +dWNrLm9yZwohLXx8YmxvZy5mZGNuLm9yZwohLXx8ZmZ0b2dvLmNvbQohLXx8Zmxp +Z2h0c2ltdGFsay5jb20KIS18fG1jbGVlLmZvb2xtZS5uZXQKIS18fHd3dy5mcmll +bmRkZWNrLmNvbQohLXx8ZnJpbmdlc3BvaWxlcnMuY29tCiEtfHxmcmluZ2V0ZWxl +dmlzaW9uLmNvbQohLXx8ZnVucGVhLmNvbQohLUcKIS18fGJsb2cuZ2F0ZWluLm9y +ZwohLXx8ZmVlZHMuZ2F3a2VyLmNvbQohLXx8Z2Vla3RhbmcuY29tCiEtfHxnZW9o +b3QudXMKIS18fGdldGFyb3VuZC5jb20KIS18fGdtZXIubmV0CiEtfHx3d3cuZ21v +dGUub3JnCiEtfHxibG9nLmdvMndlYjIwLm5ldAohLXx8Z29vZ2xlLW1lbGFuZ2Uu +Y29tCiEtfHxmYW1lLmdvbnpvbGFicy5vcmcKIS18fGdvdmVjbi5vcmcKIS18fGdx +dWV1ZXMuY29tCiEtfHxncmFwaHljYWxjLmNvbQp8fGdyZWFzZXNwb3QubmV0CiEt +fHxibG9nLmdyb3dsZm9yd2luZG93cy5jb20KIS1ICiEtfHxoY20uY29tLnR3CiEt +fHxibG9nLmhlYWRpdXMuY29tCiEtfHxob2diYXlzb2Z0d2FyZS5jb20KIS18fGJs +b2cuaG90b3Qub3JnCiEtfHxmZWVkcy5ob3dzdHVmZndvcmtzLmNvbQohLXx8aHVo +YWl0YWkuY29tCiEtfHxibG9nLmh1bWFucmlnaHRzZmlyc3Qub3JnCiEtSQohLXx8 +c2l0ZS5pY3UtcHJvamVjdC5vcmcKIS18fGlnb3J3YXJlLmNvbQohLXx8aWhhczEz +Mzdjb2RlLmNvbQohLXx8aW5rbm91dmVhdS5jb20KIS18fGlub3RlLnR3CiEtfHxp +cm9uaGVsbWV0LmNvbQohLXx8aXdmd2NmLmNvbQohLUoKIS18fGJsb2cuamFuZ210 +LmNvbQohLXx8YmxvZy5qYXlmaWVsZHMuY29tCiEtfHxibG9nLmpvaW50Lm5ldAoh +LXx8YmxvZy5qc3F1YXJlZGphdmFzY3JpcHQuY29tCiEtfHxibG9nLmp0Yndvcmxk +LmNvbQohLUsKIS18fGthdGh5c2Nod2FsYmUuY29tCiEtfHx0b21hdG92cG4ua2Vp +dGhtb3llci5jb20KIS18fHd3dy5rZWl0aG1veWVyLmNvbQohLXx8a2VuZGFsdmFu +ZHlrZS5jb20KIS18fGJsb2cua2VuZ2FvLnR3CiEtfHxsb2cua2Vzby5jbgohLXx8 +d3d3LmtoYW5hY2FkZW15Lm9yZwp8fHd3dy5rbGlwLm1lCiEtfHx1c2Jsb2FkZXJn +eC5rb3VyZWlvLm5ldAohLXx8YmxvZy5rb3dhbGN6eWsuaW5mbwohLUwKIS18fGxh +YnlyaW50aDIuY29tCiEtfHxsYXJzZ2VvcmdlLmNvbQohLXx8YmxvZy5sYXN0cGFz +cy5jb20KIS18fGRvY3MubGF0ZXhsYWIub3JnCiEtfHxsZWFuZXNzYXlzLmNvbQoh +LXx8YmxvZy5saWRhb2JpbmcuaW5mbwohLXx8bG9nLmxpZ2h0b3J5Lm5ldAohLXx8 +ZmVlZHMubGltaS5uZXQKIS18fHd3dy5saXRlYXBwbGljYXRpb25zLmNvbQohLXx8 +YmxvZy5saXVrYW5neHUuaW5mbwohLXx8dHdpdHRlci5saXVrYW5neHUuaW5mbwoh +LXx8b2FzaXNuZXdzcm9vbS5saXZlNGV2ZXIudXMKIS18fHd3dy5sb2NrZXJnbm9t +ZS5jb20KIS18fGxvY3FsLmNvbQpAQHx8c2l0ZS5sb2NxbC5jb20KIS18fGZlZWRz +LmxvaWNsZW1ldXIuY29tCiEtfHxibG9nLmxvdWlzZ3JheS5jb20KIS1NCiEtfHxt +YWRlYnlzb2ZhLmNvbQohLXx8bWFkZW1vaXNlbGxlcm9ib3QuY29tCiEtfHxtYXNh +bWl4ZXMuY29tCiEtfHx3d3cubWV0YW11c2UubmV0CiEtfHxibG9nLm1ldGFzcGxv +aXQuY29tCiEtfHxtaWxhemkuY29tCiEtfHx3d3cubWluaXdlYXRoZXIuY29tCiEt +fHx0d2l0dGVyLm1pc3NpdS5jb20KIS18fHBsdXJrdG9wLWJ1dHRvbi5tbWRheXMu +Y29tCiEtfHxmZWVkcy5tb2JpbGVyZWFkLmNvbQohLXx8d3d3Lm1vZGVybml6ci5j +b20KIS18fHd3dy5tb2RrLml0CiEtfHxteXR3aXNoaXJ0LmNvbQohLU4KIS18fGJs +b2cubmV0ZmxpeC5jb20KIS18fGJsb2cubmloaWxvZ2ljLmRrCiEtfHxudGxrLm9y +ZwohLXx8bnZxdWFuLm9yZwohLXx8bm9nb29kYXRjb2RpbmcuY29tCiEtfHxibG9n +Lm5vdGRvdC5uZXQKIS18fHd3dy5ub3RpZnkuaW8KIS1PCiEtfHxibG9nLm9idmlv +dXMuY29tCiEtfHxvbmViaWdmbHVrZS5jb20KIS18fG92ZXJzdGltdWxhdGUuY29t +CiEtUAohLXx8cGNnZWVrYmxvZy5jb20KIS18fGZlZWRzLnBkZmNobS5uZXQKIS18 +fGZlZWRzLnBlb3BsZS5jb20KIS18fGJsb2cucGVyc2lzdGVudC5pbmZvCiEtfHxj +aHJvbWUucGxhbnRzdnN6b21iaWVzLmNvbQohLXx8cG9ydGFibGVzb2Z0Lm9yZy5y +dQohLXx8cHJhc2FubmF0ZWNoLm5ldAohLXx8dGFsay5uZXdzLnB0cy5vcmcudHcK +IS18fHB5dGhvbi1leGNlbC5vcmcKIS1RCiEtUgohLXx8ci1jaGFydC5jb20KIS18 +fHJhbWVzaHN1YnJhbWFuaWFuLm9yZwohLXx8cmFwaWQucGsKIS18fGJsb2cucmVu +YW5zZS5jb20KIS18fHJvYmVydG1hby5jb20KIS18fHd3dy5yb21lby1mb3h0cm90 +LmNvbQohLVMKIS18fHNhbG1peXVjay5jb20KIS18fHNhbXNhbC5jb20KIS18fGJs +b2cuc2VlbWluZ2xlZS5jb20KIS18fGJsb2cuc2Zsb3cuY29tCiEtfHxibG9nLnNp +Z2ZwZS5jb20KIS18fHNpbXBsZXRleHQud3MKIS18fHd3dy5za3VscHQub3JnCiEt +fHxyc3Muc2xhc2hkb3Qub3JnCiEtfHxzbmlwcGV0c2FwcC5jb20KIS18fHcuc25z +Lmx5CiEtfHx3d3cuc29jaWFsbm1vYmlsZS5jb20KIS18fHd3dy5zb2NpYWx3aG9p +cy5jb20KIS18fHNwaXJpdGpiLm9yZwohLXx8c3Nib29rLmNvbQohLXx8c3NoZm9y +d2FyZGluZy5jb20KIS18fHN0YXRpb25lcmlhLmNvbQp8fHN0ZXBoYW5pZXJlZC5j +b20KIS18fHN1bmppZG9uZy5uZXQKIS18fHN5bml1bXNvZnR3YXJlLmNvbQpAQHx8 +ZG93bmxvYWQuc3luaXVtc29mdHdhcmUuY29tCiEtVAohLXx8dGFneGVkby5jb20K +IS18fGJsb2cudGF0b2ViYS5vcmcKIS18fHd3dy50ZWNoZm9iLmNvbQohLXx8dGVh +Y2hwYXJlbnRzdGVjaC5vcmcKIS18fHRoZThwZW4uY29tCiEtfHx0aGVpcGhvbmV3 +aWtpLmNvbQohLXx8YmxvZy50aGVzaWxlbnRudW1iZXIubWUKIS18fHRoZXNwb250 +eS5jb20KIS18fHRoZXVsdHJhbGlueC5jb20KIS18fGJsb2cudGhpbmstYXN5bmMu +Y29tCiEtfHx0b3JuYWRvd2ViLm9yZwohLXx8dHJhbnNwYXJlbnR1cHRpbWUuY29t +CiEtfHx0cmlhbmd1bGF0aW9uYmxvZy5jb20KIS18fGJsb2cudHN1bmFuZXQubmV0 +CiEtfHxlbi50dXhlcm8uY29tCiEtfHx0d2F6enVwLmNvbQohLXx8dHdlZXRzd2Vs +bC5jb20KIS18fHR3aWJlcy5jb20KIS18fGFydC50d2dnLm9yZwohLXx8dHdpdmVy +dC5jb20KIS1VCnxodHRwOi8vdWIwLmNjCiEtfHxqb25ueS51YnVudHUtdHcubmV0 +CiEtfHxibG9nLnVtb25rZXkubmV0CiEtVgohLXx8dHAudmJhcC5jb20uYXUKIS18 +fHd3dy52aXJ0dW91c3JvbS5jb20KIS18fGJsb2cudmlzaWJvdGVjaC5jb20KIS1X +CiEtfHx3YXZlcHJvdG9jb2wub3JnCiEtfHx3d3cud2F2ZXNhbmRib3guY29tCiEt +fHx3ZWJmZWUub3JnLnJ1CiEtfHxibG9nLndlYm1wcm9qZWN0Lm9yZwohLXx8d2Vi +dXBkOC5vcmcKIS18fHd3dy53aGF0YnJvd3Nlci5vcmcKIS18fHd3dy53aGVyZWRv +eW91Z28ubmV0CiEtfHx3aWxsaGFpbnMuY29tCiEtfHxmZWVkcy53aXJlZC5jb20K +IS18fHdpc2VtYXBwaW5nLm9yZwp3b3p5LmluCiEtfHx3b3p5LmluLwohLXx8Ymxv +Zy53dW5kZXJjb3VudGVyLmNvbQohLVgKIS18fHhkZWx0YS5vcmcKIS18fHhpYW9n +YW96aS5vcmcKIS18fHhpbG91LnVzCiEtfHx4enkub3JnLnJ1CiEtWQohLXx8eW9v +cGVyLmJlCiEtfHx0c29uZy55dW54aS5uZXQKIS1aCgpnb3NwZWxoZXJhbGQuY29t +Cnx8Z29zcGVsaGVyYWxkLmNvbQp8aHR0cDovL2hrLmdyYWRjb25uZWN0aW9uLmNv +bS8KfHxncmFuZ29yei5vcmcKZ3JlYXRmaXJlLm9yZwp8fGdyZWF0ZmlyZS5vcmcK +Z3JlYXRmaXJld2FsbG9mY2hpbmEub3JnCnx8Z3JlYXRyb2MudHcKLmd0cy12cG4u +Y29tCnxodHRwOi8vZ3RzLXZwbi5jb20KLmd1LWNodS1zdW0ub3JnCnxodHRwOi8v +Z3UtY2h1LXN1bS5vcmcKLmd1YWd1YXNzLmNvbQp8aHR0cDovL2d1YWd1YXNzLmNv +bQouZ3VhZ3Vhc3Mub3JnCnxodHRwOi8vZ3VhZ3Vhc3Mub3JnCi5ndWFuZ21pbmcu +Y29tLm15Cmd1aXNoYW4ub3JnCnx8Z3Vpc2hhbi5vcmcKLmd1bXJvYWQuY29tCnx8 +Z3Vtcm9hZC5jb20KfHxndW5zYW1lcmljYS5jb20KZ3VydW9ubGluZS5oawp8aHR0 +cDovL2d2bGliLmNvbQouZ3lhbHdhcmlucG9jaGUuY29tCi5neWF0c29zdHVkaW8u +Y29tCgohLS0tLS0tLS0tLS0tLS0tLS0tLS1ISC0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0KLmg1MjguY29tCi5oNWRtLmNvbQouaDVnYWxnYW1lLm1lCnx8aC1jaGlu +YS5vcmcKLmgtbW9lLmNvbQp8aHR0cDovL2gtbW9lLmNvbQpoMW4xY2hpbmEub3Jn +Ci5oYWNnLmNsdWIKfHxoYWNnLmNsdWIKLmhhY2cuaW4KfGh0dHA6Ly9oYWNnLmlu +Ci5oYWNnLmxpCnxodHRwOi8vaGFjZy5saQouaGFjZy5tZQp8aHR0cDovL2hhY2cu +bWUKLmhhY2cucmVkCnxodHRwOi8vaGFjZy5yZWQKLmhhY2tlbi5jYy9iYnMKLmhh +Y2tlci5vcmcKfHxoYWNrdGhhdHBob25lLm5ldApoYWhsby5jb20KfHxoYWtrYXR2 +Lm9yZy50dwouaGFuZGNyYWZ0ZWRzb2Z0d2FyZS5vcmcKfGh0dHA6Ly9iYnMuaGFu +bWluenUub3JnLwouaGFudW55aS5jb20KLmhhby5uZXdzL25ld3MKfGh0dHA6Ly9h +ZS5oYW8xMjMuY29tCnxodHRwOi8vYXIuaGFvMTIzLmNvbQp8aHR0cDovL2JyLmhh +bzEyMy5jb20KfGh0dHA6Ly9lbi5oYW8xMjMuY29tCnxodHRwOi8vaWQuaGFvMTIz +LmNvbQp8aHR0cDovL2pwLmhhbzEyMy5jb20KfGh0dHA6Ly9tYS5oYW8xMjMuY29t +CnxodHRwOi8vbXguaGFvMTIzLmNvbQp8aHR0cDovL3NhLmhhbzEyMy5jb20KfGh0 +dHA6Ly90aC5oYW8xMjMuY29tCnxodHRwOi8vdHcuaGFvMTIzLmNvbQp8aHR0cDov +L3ZuLmhhbzEyMy5jb20KfGh0dHA6Ly9oay5oYW8xMjNpbWcuY29tCnxodHRwOi8v +bGQuaGFvMTIzaW1nLmNvbQp8fGhhcHB5LXZwbi5jb20KLmhhcHJveHkub3JnCnx8 +aGFyZHNleHR1YmUuY29tCi5oYXJ1bnlhaHlhLmNvbQp8aHR0cDovL2hhcnVueWFo +eWEuY29tCmJicy5oYXNpLndhbmcKaGF2ZTguY29tCkBAfHxoYXlnby5jb20KLmhj +bGlwcy5jb20KfHxoZGx0Lm1lCnx8aGR0dmIubmV0Ci5oZHpvZy5jb20KfGh0dHA6 +Ly9oZHpvZy5jb20KfHxoZWFydHlpdC5jb20KLmhlYXZ5LXIuY29tCi5oZWMuc3UK +fGh0dHA6Ly9oZWMuc3UKLmhlY2FpdG91Lm5ldAp8fGhlY2FpdG91Lm5ldAouaGVj +aGFqaS5jb20KfHxoZWNoYWppLmNvbQp8fGhlZWFjdC5lZHUudHcKLmhlZ3JlLWFy +dC5jb20KfGh0dHA6Ly9oZWdyZS1hcnQuY29tCnx8Y2RuLmhlbGl4c3R1ZGlvcy5u +ZXQKfHxoZWxwbGluZmVuLmNvbQp8fGhlbGxvYW5kcm9pZC5jb20KfHxoZWxsb3F1 +ZWVyLmNvbQouaGVsbG9zcy5wdwpoZWxsb3R4dC5jb20KfHxoZWxsb3R4dC5jb20K +LmhlbnRhaS50bwouaGVsbG91ay5vcmcvZm9ydW0vbG9maXZlcnNpb24KLmhlbHBl +YWNocGVvcGxlLmNvbQp8fGhlbHBlYWNocGVvcGxlLmNvbQp8fGhlbHBzdGVyLmRl +Ci5oZWxwemh1bGluZy5vcmcKaGVudGFpdHViZS50dgouaGVudGFpdmlkZW93b3Js +ZC5jb20KCiEjIyMjIyMjIyMjIy0tSGVyb2t1LS0jIyMjIyMjIyMjCiEtLXx8Z2V0 +Y2xvdWRhcHAuY29tCiEtLXx8Y2wubHkKIS0tQEB8fGYuY2wubHkKIS0tRUMyIERO +UyBQb2lzb25lZAp8fGlkLmhlcm9rdS5jb20KCmhlcWluZ2xpYW4ubmV0Cnx8aGV1 +bmdrb25nZGlzY3Vzcy5jb20KLmhleGllc2hlLmNvbQp8fGhleGllc2hlLmNvbQp8 +fGhleGllc2hlLnh5egohLS1Hb29nbGUgZW1wbG95ZWUgd2l0aGluIEdvb2dsZSBJ +UAp8fGhleHhlaC5uZXQKYXBwLmhleXdpcmUuY29tCi5oZXl6by5jb20KLmhnc2Vh +di5jb20KLmhoZGNiM29mZmljZS5vcmcKLmhodGhlc2FreWF0cml6aW4ub3JnCmhp +LW9uLm9yZy50dwpoaWRkZW4tYWR2ZW50Lm9yZwp8fGhpZGRlbi1hZHZlbnQub3Jn +CmhpZGVjbG91ZC5jb20vYmxvZy8yMDA4LzA3LzI5L2Z1Y2stYmVpamluZy1vbHlt +cGljcy5odG1sCnx8aGlkZS5tZQouaGlkZWluLm5ldAouaGlkZWlwdnBuLmNvbQp8 +fGhpZGVpcHZwbi5jb20KLmhpZGVtYW4ubmV0Cnx8aGlkZW1hbi5uZXQKaGlkZW1l +Lm5sCnx8aGlkZW15Lm5hbWUKLmhpZGVteWFzcy5jb20KfHxoaWRlbXlhc3MuY29t +CmhpZGVteWNvbXAuY29tCnx8aGlkZW15Y29tcC5jb20KLmhpaGlmb3J1bS5jb20K +LmhpaGlzdG9yeS5uZXQKfHxoaWhpc3RvcnkubmV0Ci5oaWdmdy5jb20KaGlnaHBl +YWtzcHVyZWVhcnRoLmNvbQp8fGhpZ2hyb2NrbWVkaWEuY29tCnx8aGlpdGNoLmNv +bQp8fGhpa2luZ2dmdy5vcmcKLmhpbGl2ZS50dgouaGltYWxheWFuLWZvdW5kYXRp +b24ub3JnCmhpbWFsYXlhbmdsYWNpZXIuY29tCi5oaW1lbWl4LmNvbQp8fGhpbWVt +aXguY29tCi5oaW1lbWl4Lm5ldAp0aW1lcy5oaW5ldC5uZXQKLmhpdG9taS5sYQp8 +aHR0cDovL2hpdG9taS5sYQouaGl3aWZpLmNvbQpAQHx8aGl3aWZpLmNvbQpoaXpi +dXR0YWhyaXIub3JnCmhpemItdXQtdGFocmlyLmluZm8KaGl6Yi11dC10YWhyaXIu +b3JnCi5oamNsdWIuaW5mbwouaGstcHViLmNvbS9mb3J1bQp8aHR0cDovL2hrLXB1 +Yi5jb20KLmhrMDEuY29tCnx8aGswMS5jb20KLmhrMzIxNjguY29tCnx8aGszMjE2 +OC5jb20KfHxoa2FjZy5jb20KfHxoa2FjZy5uZXQKLmhrYXR2bmV3cy5jb20KaGti +Yy5uZXQKLmhrYmYub3JnCi5oa2Jvb2tjaXR5LmNvbQp8fGhrYm9va2NpdHkuY29t +Ci5oa2NodXJjaC5vcmcKaGtjaS5vcmcuaGsKLmhrY21pLmVkdQp8fGhrY25ld3Mu +Y29tCnx8aGtjb2MuY29tCmhrZGF5Lm5ldAouaGtkYWlseW5ld3MuY29tLmhrL2No +aW5hLnBocApoa2RmLm9yZwouaGtlai5jb20KLmhrZXBjLmNvbS9mb3J1bS92aWV3 +dGhyZWFkLnBocD90aWQ9MTE1MzMyMgpjaGluYS5oa2V0LmNvbQp8fGhrZmFhLmNv +bQpoa2ZyZWV6b25lLmNvbQpoa2Zyb250Lm9yZwptLmhrZ2FsZGVuLmNvbQp8aHR0 +cHM6Ly9tLmhrZ2FsZGVuLmNvbQpoa2dvbGRlbi5jb20KLmhrZ3JlZW5yYWRpby5v +cmcvaG9tZQouaGtoZWFkbGluZS5jb20qYmxvZwouaGtoZWFkbGluZS5jb20vaW5z +dGFudG5ld3MKaGtoa2hrLmNvbQpoa2hyYy5vcmcuaGsKaGtocm0ub3JnLmhrCnx8 +aGtpcC5vcmcudWsKMTk4OXJlcG9ydC5oa2phLm9yZy5oawpoa2pjLmNvbQouaGtq +cC5vcmcKLmhrbGZ0LmNvbQouaGtsdHMub3JnLmhrCnx8aGtsdHMub3JnLmhrCm5l +d3MuaGtwZWFudXQuY29tCmhrcHR1Lm9yZwouaGtyZXBvcnRlci5jb20KfHxoa3Jl +cG9ydGVyLmNvbQp8aHR0cDovL2hrdXBvcC5oa3UuaGsvCi5oa3VzdS5uZXQKfHxo +a3VzdS5uZXQKLmhrdndldC5jb20KLmhrd2NjLm9yZy5oawp8fGhrem9uZS5vcmcK +Lmhtb25naG90LmNvbQp8aHR0cDovL2htb25naG90LmNvbQouaG12LmNvLmpwLwpo +bmpoai5jb20KfHxobmpoai5jb20KLmhubnR1YmUuY29tCnx8aG9sYS5jb20KfHxo +b2xhLm9yZwpob2x5bW91bnRhaW5jbi5jb20KaG9seXNwaXJpdHNwZWFrcy5vcmcK +fHxob2x5c3Bpcml0c3BlYWtzLm9yZwp8fGRlcmVraHN1LmhvbWVpcC5uZXQKLmhv +bWVwZXJ2ZXJzaW9uLmNvbQp8aHR0cDovL2hvbWVzZXJ2ZXJzaG93LmNvbQp8aHR0 +cDovL29sZC5ob25leW5ldC5vcmcvc2NhbnMvc2NhbjMxL3N1Yi9kb3VnX2VyaWMv +c3BhbV90cmFuc2xhdGlvbi5odG1sCi5ob25na29uZ2ZwLmNvbQp8fGhvbmdrb25n +ZnAuY29tCmhvbmdtZWltZWkuY29tCnx8aG9uZ3poaS5saQouaG9vdHN1aXRlLmNv +bQp8fGhvb3RzdWl0ZS5jb20KLmhvcGVkaWFsb2d1ZS5vcmcKfGh0dHA6Ly9ob3Bl +ZGlhbG9ndWUub3JnCi5ob3B0by5vcmcKLmhvcm55Z2FtZXIuY29tCi5ob3JueXRy +aXAuY29tCnxodHRwOi8vaG9ybnl0cmlwLmNvbQouaG90YXYudHYKLmhvdGVscy5j +bgpob3Rmcm9nLmNvbS50dwpob3Rnb28uY29tCi5ob3Rwb3Juc2hvdy5jb20KaG90 +cG90LmhrCi5ob3RzaGFtZS5jb20KfHxob3RzcG90c2hpZWxkLmNvbQouaG90dnBu +LmNvbQp8fGhvdHZwbi5jb20KfHxob3VnYWlnZS5jb20KfHxob3d0b2ZvcmdlLmNv +bQp8fGhveHguY29tCi5ocWNkcC5vcmcKfHxocWNkcC5vcmcKfHxocWphcGFuZXNl +c2V4LmNvbQpocW1vdmllcy5jb20KLmhyY2lyLmNvbQouaHJjY2hpbmEub3JnCi5o +cmVhLm9yZwouaHJpY2hpbmEub3JnCnx8aHJpY2hpbmEub3JnCi5ocncub3JnCnx8 +aHJ3Lm9yZwpocndlYi5vcmcKfHxoc2pwLm5ldAp8fGhzc2VsaXRlLmNvbQp8aHR0 +cDovL2hzdC5uZXQudHcKLmhzdGVybi5uZXQKLmhzdHQubmV0Ci5odGtvdS5uZXQK +fHxodGtvdS5uZXQKLmh1YS15dWUubmV0Ci5odWFnbGFkLmNvbQp8fGh1YWdsYWQu +Y29tCi5odWFuZ2h1YWdhbmcub3JnCnx8aHVhbmdodWFnYW5nLm9yZwouaHVhbmd5 +aXl1LmNvbQouaHVhcmVuLnVzCnx8aHVhcmVuLnVzCi5odWFyZW40dXMuY29tCi5o +dWFzaGFuZ25ld3MuY29tCnxodHRwOi8vaHVhc2hhbmduZXdzLmNvbQpiYnMuaHVh +c2luZy5vcmcKaHVheGlhLW5ld3MuY29tCmh1YXhpYWJhby5vcmcKaHVheGluLnBo +Cnx8aHVheXV3b3JsZC5vcmcKLmh1ZmZpbmd0b25wb3N0LmNvbS9yZWJpeWEta2Fk +ZWVyCnx8aHVnb3JveS5ldQp8fGh1aGFpdGFpLmNvbQp8fGh1aGFtaGlyZS5jb20K +aHVpeWkuaW4KLmh1bGtzaGFyZS5jb20KaHVtYW5yaWdodHNicmllZmluZy5vcmcK +fHxodW5nLXlhLmNvbQp8fGh1bmdlcnN0cmlrZWZvcmFpZHMub3JnCnx8aHVwaW5n +Lm5ldApodXJnb2tiYXlyYWsuY29tCi5odXJyaXlldC5jb20udHIKLmh1dDIucnUK +fHxodXRpYW55aS5uZXQKaHV0b25nOS5uZXQKaHV5YW5kZXguY29tCi5od2FkemFu +LnR3Cnx8aHdheXVlLm9yZy50dwp8fGh3aW5mby5jb20KfHxoeHdrLm9yZwpoeHdx +Lm9yZwp8fGh5cGVycmF0ZS5jb20KZWJvb2suaHlyZWFkLmNvbS50dwp8fGVib29r +Lmh5cmVhZC5jb20udHcKCiEtLS0tLS0tLS0tLS0tLS0tLS0tLUlJLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLQp8fGkxLmhrCnx8aTJwMi5kZQp8fGkycnVubmVyLmNv +bQp8fGk4MThoay5jb20KLmktY2FibGUuY29tCi5pLXBhcnQuY29tLnR3Ci5pYW10 +b3BvbmUuY29tCmlhc2suY2EKfHxpYXNrLmNhCmlhc2suYnoKfHxpYXNrLmJ6Ci5p +YXYxOS5jb20KaWJpYmxpby5vcmcvcHViL3BhY2thZ2VzL2NjaWMKLmlibGlzdC5j +b20KfHxpYmxvZ3NlcnYtZi5uZXQKaWJyb3Mub3JnCnxodHRwOi8vY24uaWJ0aW1l +cy5jb20KLmlidnBuLmNvbQp8fGlidnBuLmNvbQppY2Ftcy5jb20KYmxvZ3MuaWNl +cm9ja2V0LmNvbS90YWcKLmljaWoub3JnCnx8aWNpai5vcmcKfHxpY2wtZmkub3Jn +Ci5pY29jby5jb20KfHxpY29jby5jb20KCiEtLTM4LjEwMy4xNjUuNTAKfHxmdXJi +by5vcmcKIS0tfHxpY29uZmFjdG9yeS5jb20KfHx3YXJibGVyLmljb25mYWN0b3J5 +Lm5ldAoKfHxpY29ucGFwZXIub3JnCiEtLSBHb29nbGUgUGFnZXMKfHxpY3UtcHJv +amVjdC5vcmcKdy5pZGFpd2FuLmNvbS9mb3J1bQp8fGlkZGRkZy5jb20KaWRlbW9j +cmFjeS5hc2lhCi5pZGVudGkuY2EKfHxpZGVudGkuY2EKfHxpZGlvbWNvbm5lY3Rp +b24uY29tCnxodHRwOi8vd3d3LmlkbGNveW90ZS5jb20KLmlkb3VnYS5jb20KLmlk +cmVhbXguY29tCmZvcnVtLmlkc2FtLmNvbQouaWR2LnR3Ci5pZWFzeTUuY29tCnxo +dHRwOi8vaWVhc3k1LmNvbQouaWVkMmsubmV0Ci5pZW5lcmd5MS5jb20KfGh0dHA6 +Ly9pZi50dHQvCmlmYW5xaWFuZy5jb20KLmlmY3NzLm9yZwp8fGlmY3NzLm9yZwpp +ZmpjLm9yZwouaWZ0LnR0CnxodHRwOi8vaWZ0LnR0Cnx8aWZyZWV3YXJlcy5jb20K +fHxpZ2NkLm5ldAouaWdmdy5uZXQKfHxpZ2Z3Lm5ldAouaWdmdy50ZWNoCnx8aWdm +dy50ZWNoCi5pZ21nLmRlCnx8aWduaXRlZGV0cm9pdC5uZXQKLmlnb3RtYWlsLmNv +bS50dwp8fGlndml0YS5jb20KfHxpaGFra2EubmV0Ci5paGFvLm9yZy9kejUKfHxp +aWNucy5jb20KLmlrc3Rhci5jb20KfHxpbGx1c2lvbmZhY3RvcnkuY29tCnx8aWxv +dmU4MC5iZQp8fGltLnR2CkBAfHxteXZsb2cuaW0udHYKfHxpbTg4LnR3Ci5pbWdj +aGlsaS5uZXQKfGh0dHA6Ly9pbWdjaGlsaS5uZXQKLmltYWdlYWIuY29tCi5pbWFn +ZWZhcC5jb20KfHxpbWFnZWZhcC5jb20KfHxpbWFnZWZsZWEuY29tCmltYWdlc2hh +Y2sudXMKfHxpbWFnZXZlbnVlLmNvbQp8fGltYWdlemlsbGEubmV0Ci5pbWIub3Jn +CnxodHRwOi8vaW1iLm9yZwoKIS0tSU1EQgp8aHR0cDovL3d3dy5pbWRiLmNvbS9u +YW1lL25tMDQ4MjczMAouaW1kYi5jb20vdGl0bGUvdHQwODE5MzU0Ci5pbWRiLmNv +bS90aXRsZS90dDE1NDAwNjgKLmltZGIuY29tL3RpdGxlL3R0NDkwODY0NAoKLmlt +Zy5seQp8fGltZy5seQouaW1rZXYuY29tCnx8aW1rZXYuY29tCi5pbWxpdmUuY29t +Ci5pbW1vcmFsLmpwCmltcGFjdC5vcmcuYXUKaW1wcC5tbgp8aHR0cDovL3RlY2gy +LmluLmNvbS92aWRlby8KaW45OS5vcmcKaW4tZGlzZ3Vpc2UuY29tCi5pbmNhcGRu +cy5uZXQKLmluY2xvYWsuY29tCnx8aW5jbG9hay5jb20KfHxpbmNyZWRpYm94LmZy +Cnx8aW5kaWFuZGVmZW5zZW5ld3MuaW4KdGltZXNvZmluZGlhLmluZGlhdGltZXMu +Y29tL2RhbGFpCnRpbWVzb2ZpbmRpYS5pbmRpYXRpbWVzLmNvbS9kZWZhdWx0aW50 +ZXJzdGl0aWFsLmNtcwouaW5kaWVtZXJjaC5jb20KfHxpbmRpZW1lcmNoLmNvbQpp +bmZvLWdyYWYuZnIKd2Vic2l0ZS5pbmZvcm1lci5jb20KLmluaXRpYXRpdmVzZm9y +Y2hpbmEub3JnCi5pbmt1aS5jb20KLmlubWVkaWFoay5uZXQKfHxpbm1lZGlhaGsu +bmV0Cnx8aW5uZXJtb25nb2xpYS5vcmcKfGh0dHA6Ly9ibG9nLmlub3JlYWRlci5j +b20KLmlub3RlLnR3Ci5pbnNlY2FtLm9yZwp8aHR0cDovL2luc2VjYW0ub3JnCnx8 +aW5zaWRldm9hLmNvbQouaW5zdGl0dXQtdGliZXRhaW4ub3JnCnxodHRwOi8vaW50 +ZXJuZXQub3JnLwppbnRlcm5ldGRlZmVuc2VsZWFndWUub3JnCmludGVybmV0ZnJl +ZWRvbS5vcmcKIS0tfHxpbnRlcnBvbC5pbnQKfHxpbnRlcm5ldHBvcGN1bHR1cmUu +Y29tCmlueGlhbi5jb20KfHxpbnhpYW4uY29tCmlwYWx0ZXIuY29tCiEtLXx8aXBj +Zi5vcmcudHcKLmlwZmlyZS5vcmcKfHxpcGhvbmU0aG9uZ2tvbmcuY29tCnx8aXBo +b25laGFja3MuY29tCnx8aXBob25ldGFpd2FuLm9yZwp8fGlwaG9uaXguZnIKfHxp +cGljdHVyZS5ydQouaXBqZXRhYmxlLm5ldAp8fGlwamV0YWJsZS5uZXQKLmlwb2Jh +ci5jb20vcmVhZC5waHA/Cmlwb29jay5jb20vaW1nCi5pcG9ydGFsLm1lCnxodHRw +Oi8vaXBvcnRhbC5tZQp8fGlwcG90di5jb20KLmlwcmVkYXRvci5zZQp8fGlwcmVk +YXRvci5zZQouaXB0di5jb20udHcKfHxpcHR2YmluLmNvbQp8fGlwdmFuaXNoLmNv +bQppcmVkbWFpbC5vcmcKY2hpbmVzZS5pcmliLmlyCnx8aXJvbmJpZ2Zvb2xzLmNv +bXB5dGhvbi5uZXQKfHxpcm9ucHl0aG9uLm5ldAouaXJvbnNvY2tldC5jb20KfHxp +cm9uc29ja2V0LmNvbQouaXMuZ2QKLmlzbGFoaGFiZXIubmV0Ci5pc2xhbS5vcmcu +aGsKfGh0dHA6Ly9pc2xhbS5vcmcuaGsKLmlzbGFtYXdhcmVuZXNzLm5ldC9Bc2lh +L0NoaW5hCi5pc2xhbWhvdXNlLmNvbQp8fGlzbGFtaG91c2UuY29tCi5pc2xhbWlj +aXR5LmNvbQouaXNsYW1pY3BsdXJhbGlzbS5vcmcKLmlzbGFtdG9kYXkubmV0Ci5p +c2FhY21hby5jb20KfHxpc2FhY21hby5jb20KfHxpc2dyZWF0Lm9yZwp8fGlzbWFl +bGFuLmNvbQouaXNtYWxsdGl0cy5jb20KfHxpc21wcm9mZXNzaW9uYWwubmV0Cmlz +b2h1bnQuY29tCnx8aXNyYWJveC5jb20KLmlzc3V1LmNvbQp8fGlzc3V1LmNvbQou +aXN0YXJzLmNvLm56Cm92ZXJzZWEuaXN0YXJzaGluZS5jb20KfHxvdmVyc2VhLmlz +dGFyc2hpbmUuY29tCmJsb2cuaXN0ZWYuaW5mby8yMDA3LzEwLzIxL215ZW50dW5u +ZWwKLmlzdGlxbGFsaGV3ZXIuY29tCi5pc3RvY2twaG90by5jb20KaXN1bmFmZmFp +cnMuY29tCmlzdW50di5jb20KaXRhYm9vLmluZm8KfHxpdGFib28uaW5mbwouaXRh +bGlhdGliZXQub3JnCmRvd25sb2FkLml0aG9tZS5jb20udHcKaXRoZWxwLml0aG9t +ZS5jb20udHcKfHxpdHNoaWRkZW4uY29tCi5pdHNreS5pdAouaXR3ZWV0Lm5ldAp8 +aHR0cDovL2l0d2VldC5uZXQKLml1NDUuY29tCi5pdWhyZGYub3JnCnx8aXVocmRm +Lm9yZwouaXVrc2t5LmNvbQouaXZhY3kuY29tCnx8aXZhY3kuY29tCi5pdmVyeWNk +LmNvbQouaXZwbi5uZXQKIS0tfHxpdnBuLm5ldAp8fGl4cXVpY2suY29tCi5peHh4 +LmNvbQppeW91cG9ydC5jb20KfHxpeW91cG9ydC5jb20KLml6YW9iYW8udXMKfHxn +bW96b21nLml6aWhvc3Qub3JnCi5pemxlcy5uZXQKLml6bGVzZW0ub3JnCgohLS0t +LS0tLS0tLS0tLS0tLS0tLS1KSi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KfHxq +Lm1wCmJsb2cuamFja2ppYS5jb20KamFtYWF0Lm9yZwouamFteWFuZ25vcmJ1LmNv +bQp8aHR0cDovL2phbXlhbmdub3JidS5jb20KLmphbmR5eC5jb20KfHxqYW53b25n +cGhvdG8uY29tCnx8amFwYW4td2hvcmVzLmNvbQouamF2LmNvbQouamF2MTAxLmNv +bQouamF2MmJlLmNvbQp8fGphdjJiZS5jb20KLmphdjY4LnR2Ci5qYXZha2liYS5v +cmcKfGh0dHA6Ly9qYXZha2liYS5vcmcKLmphdmJ1cy5jb20KfHxqYXZidXMuY29t +Cnx8amF2Zm9yLm1lCi5qYXZoZC5jb20KLmphdmhpcC5jb20KLmphdm1vYmlsZS5u +ZXQKfGh0dHA6Ly9qYXZtb2JpbGUubmV0Ci5qYXZtb28uY29tCi5qYXZzZWVuLmNv +bQp8aHR0cDovL2phdnNlZW4uY29tCmpidGFsa3MuY2MKamJ0YWxrcy5jb20KamJ0 +YWxrcy5teQouamR3c3kuY29tCmplYW55aW0uY29tCnx8amZxdTM2LmNsdWIKfHxq +ZnF1MzcueHl6Cnx8amdvb2RpZXMuY29tCi5qaWFuZ3dlaXBpbmcuY29tCnx8amlh +bmd3ZWlwaW5nLmNvbQp8fGppYW95b3U4LmNvbQouamllaHVhLmN6Cnx8aGsuamll +cGFuZy5jb20KfHx0dy5qaWVwYW5nLmNvbQpqaWVzaGliYW9iYW8uY29tCi5qaWdn +bGVnaWZzLmNvbQo1NmN1bjA0LmppZ3N5LmNvbQpqaWdvbmcxMDI0LmNvbQpkYW9k +dTE0LmppZ3N5LmNvbQpzcGVjeGluemwuamlnc3kuY29tCndsY25ldy5qaWdzeS5j +b20KLmppaGFkb2xvZ3kubmV0CnxodHRwOi8vamloYWRvbG9neS5uZXQKamluYnVz +aGUub3JnCnx8amluYnVzaGUub3JnCi5qaW5nc2ltLm9yZwp6aGFvLmppbmhhaS5k +ZQpqaW5ncGluLm9yZwp8fGppbmdwaW4ub3JnCmppbnBpYW53YW5nLmNvbQouamlu +cm91a29uZy5jb20KYWMuamlydWFuLm5ldAp8fGppdG91Y2guY29tCi5qaXp6dGhp cy5jb20KampnaXJscy5jb20KLmprYi5jYwp8aHR0cDovL2prYi5jYwpqa2ZvcnVt Lm5ldAp8fGptYS5nby5qcApyZXNlYXJjaC5qbXNjLmhrdS5oay9zb2NpYWwKd2Vp -Ym9zY29wZS5qbXNjLmhrdS5oawp8fGpvYWNoaW1zLm9yZwp8fGpvYnNvLnR2Cnx8 -am9lZWRlbG1hbi5jb20KLmpvdXJuYWxjaHJldGllbi5uZXQKfHxqb3VybmFsb2Zk -ZW1vY3JhY3kub3JnCmpwb3Bmb3J1bS5uZXQKIS0tRG9hbWluIHBhcmtpbmcKLmp1 -aHVhcmVuLmNvbQp8fGp1bGllcmV5Yy5jb20KfHxqdW5hdXphLmNvbQouanVuZTRj -b21tZW1vcmF0aW9uLm9yZwouanVuZWZvdXJ0aC0yMC5uZXQKfHxqdW5lZm91cnRo -LTIwLm5ldApqdXN0ZnJlZXZwbi5jb20KLmp1c3RpY2Vmb3J0ZW56aW4ub3JnCmp1 -c3RwYXN0ZS5pdApqdXN0dHJpc3Rhbi5jb20KanV5dWFuZ2Uub3JnCmp1eml5dWUu -Y29tCnx8anV6aXl1ZS5jb20KfHxqd211c2ljLm9yZwpAQHx8bXVzaWMuandtdXNp -Yy5vcmcKLmp5eGYubmV0CgohLS0tLS0tLS0tLS0tLS0tLS0tLS1LSy0tLS0tLS0t -LS0tLS0tLS0tLS0tLS0tLS0KfHxrYS13YWkuY29tCi5rYWd5dW9mZmljZS5vcmcK -fHxrYWd5dW9mZmljZS5vcmcKfHxrYWd5dW9mZmljZS5vcmcudHcKLmthaXl1YW4u -ZGUKLmtha2FvLmNvbQp8fGtha2FvLmNvbQoua2Fua2FuLnRvZGF5Ci5rYW5uZXd5 -b3JrLmNvbQoua2Fuc2hpZmFuZy5jb20KfHxrYW5zaGlmYW5nLmNvbQprYW56aG9u -Z2d1by5jb20Ka2FuemhvbmdndW8uZXUKLmthb3RpYy5jb20KfHxrYXJheW91LmNv -bQprYXJraHVuZy5jb20KLmthcm1hcGEub3JnCi5rYXJtYXBhLXRlYWNoaW5ncy5v -cmcKLmtiYS10eC5vcmcKLmtjb29sb25saW5lLmNvbQp8fGtjc29mdHdhcmVzLmNv -bQoua2VicnVtLmNvbQp8fGtlYnJ1bS5jb20KLmtlY2hhcmEuY29tCi5rZWVwYW5k -c2hhcmUuY29tL3Zpc2l0L3Zpc2l0X3BhZ2UucGhwP2k9Njg4MTU0CiEtLXx8a2Vl -cHZpZC5jb20KLmtlbmRpbmNvcy5uZXQKLmtlbmVuZ2JhLmNvbQp8fGtlbmVuZ2Jh -LmNvbQp8fGtlb250ZWNoLm5ldAoua2VwYXJkLmNvbQp8fGtlcGFyZC5jb20Kd2lr -aS5rZXNvLmNuL0hvbWUKfHxrZXljZG4uY29tCi5raGFiZGhhLm9yZwoua2htdXNp -Yy5jb20udHcKfHxraWNoaWt1LWRvdWppbmtvLmNvbQpiYnMua2lteS5jb20udHcK -LmtpbmRsZXJlbi5jb20KfGh0dHA6Ly9raW5kbGVyZW4uY29tCnxodHRwOi8vd3d3 -LmtpbmRsZXJlbi5jb20KLmtpbmdkb21zYWx2YXRpb24ub3JnCmtpbmdob3N0LmNv -bQohLS0ua2luZ3N0b25lLmNvbS50dy9ib29rLwp8fGtpbmdzdG9uZS5jb20udHcK -LmtpbmsuY29tCmtpbGx3YWxsLmNvbQp8fGtpbGx3YWxsLmNvbQoua2lyLmpwCi5r -aXNzYmJhby5jbgp8aHR0cDovL2tpd2kua3oKfHxray13aHlzLmNvLmpwCiEtLXx8 -a210Lm9yZy50dwoua25vd2xlZGdlcnVzaC5jb20va3IvZW5jeWNsb3BlZGlhCnx8 -a29kaW5nZW4uY29tCkBAfHx3d3cua29kaW5nZW4uY29tCnx8a29tcG96ZXIubmV0 -Ci5rb25hY2hhbi5jb20KfGh0dHA6Ly9rb25hY2hhbi5jb20KfHxrb29sc29sdXRp -b25zLmNvbQoua29vcm5rLmNvbQp8fGtvb3Juay5jb20KfHxrb3Jhbm1hbmRhcmlu -LmNvbQp8aHR0cDovL2dvamV0LmtydGNvLmNvbS50dwoua3NuZXdzLmNvbS50dwp8 -fGt0emhrLmNvbQoua3VpLm5hbWUvZXZlbnQKa3VuLmltCi5rdXJhc2hzdWx0YW4u -Y29tCnx8a3VydG11bmdlci5jb20Ka3Vzb2NpdHkuY29tCnx8a3Vzb3MuY29tCnx8 -a3djZy5jYQprd29uZ3dhaC5jb20ubXkKa3lvaGsubmV0Ci5remVuZy5pbmZvCnx8 -a3plbmcuaW5mbwoKIS0tLS0tLS0tLS0tLS0tLS0tLS0tTEwtLS0tLS0tLS0tLS0t -LS0tLS0tLS0tLS0tCmxhLWZvcnVtLm9yZwpsYWRicm9rZXMuY29tCnx8bGFiaWVu -bmFsZS5vcmcKbGFncmFuZXBvY2EuY29tCi5sYWx1bGFsdS5jb20KLmxhbWF5ZXNo -ZS5jb20KfGh0dHA6Ly9sYW1heWVzaGUuY29tCnxodHRwOi8vd3d3LmxhbWVuaHUu -Y29tCi5sYW1uaWEuY28udWsKfHxsYW1uaWEuY28udWsKbGFtcmltLmNvbQoubGFu -dGVybmNuLmNuCnxodHRwOi8vbGFudGVybmNuLmNuCi5sYW50b3Nmb3VuZGF0aW9u -Lm9yZwoubGFvZC5jbgp8aHR0cDovL2xhb2QuY24KbGFvZ2FpLm9yZwp8fGxhb2dh -aS5vcmcKbGFvbWl1LmNvbQoubGFveWFuZy5pbmZvCnxodHRwOi8vbGFveWFuZy5p -bmZvCnx8bGFwdG9wbG9ja2Rvd24uY29tCi5sYXFpbmdkYW4ubmV0Cnx8bGFxaW5n -ZGFuLm5ldAp8fGxhcnNnZW9yZ2UuY29tCi5sYXN0Y29tYmF0LmNvbQp8aHR0cDov -L2xhc3Rjb21iYXQuY29tCnx8bGFzdGZtLmVzCmxhdGVsaW5lbmV3cy5jb20KLmxh -dGliZXQub3JnCnx8bGUtdnBuLmNvbQoubGVhZnl2cG4ubmV0Cnx8bGVhZnl2cG4u -bmV0CiEtLXx8bGVlY2hldWt5YW4ub3JnCmxlZm9yYS5jb20KfHxsZWZ0MjEuaGsK -LmxlZ2FscG9ybm8uY29tCnxodHRwOi8vbGVpcmVudHYuY2EKbGVpc3VyZWNhZmUu -Y2EKfHxsZW1hdGluLmNoCi5sZW1vbmRlLmZyCnx8bGVud2hpdGUuY29tCmxlcm9z -dWEub3JnCnx8bGVyb3N1YS5vcmcKYmxvZy5sZXN0ZXI4NTAuaW5mbwp8fGxlc29p -ci5iZQpsZXRzY29ycC5uZXQKfHxsZXRzY29ycC5uZXQKLmxoYWthci5vcmcKfGh0 -dHA6Ly9saGFrYXIub3JnCi5saGFzb2NpYWx3b3JrLm9yZwoubGlhbmd5b3UubmV0 -Cnx8bGlhbmd5b3UubmV0Ci5saWFueXVlLm5ldAp8fGxpYW93YW5neGl6YW5nLm5l -dAoubGlhb3dhbmd4aXphbmcubmV0Cnx8bGliZXJhbC5vcmcuaGsKLmxpYmVydHl0 -aW1lcy5jb20udHcKYmxvZ3MubGlicmFyeWluZm9ybWF0aW9udGVjaG5vbG9neS5j -b20vanh5egoubGlkZWNoZW5nLmNvbS9ibG9nL2Z1Y2tpbmctZ2Z3Ci5saWdodGVu -Lm9yZy50dwpsaW1pYW8ubmV0Cmxpbmt1c3dlbGwuY29tCmFiaXRuby5saW5waWUu -Y29tL3VzZS1pcHY2LXRvLWZ1Y2stZ2Z3Cnx8bGluZS5tZQoubGluZ2xpbmdmYS5j -b20KfHxsaW5ndm9kaWNzLmNvbQoubGlua2lkZW8uY29tCnx8YXBpLmxpbmtzYWxw -aGEuY29tCnx8YXBpZG9jcy5saW5rc2FscGhhLmNvbQp8fHd3dy5saW5rc2FscGhh -LmNvbQp8fGhlbHAubGlua3NhbHBoYS5jb20KfHxsaW51eC5vcmcuaGsKbGludXh0 -b3kub3JnL2FyY2hpdmVzL2luc3RhbGxpbmctd2VzdC1jaGFtYmVyLW9uLXVidW50 -dQoubGlvbnNyb2FyLmNvbQoubGlwdW1hbi5jb20KfHxncmVhdGZpcmUudXM3Lmxp -c3QtbWFuYWdlLmNvbQp8fGxpc3RlbnRveW91dHViZS5jb20KbGlzdG9yaW91cy5j -b20KfHxsaXVkZWp1bi5jb20KLmxpdWhhbnl1LmNvbQoubGl1amlhbnNodS5jb20K -fHxsaXVqaWFuc2h1LmNvbQpsaXV4aWFvdG9uZy5jb20KfHxsaXV4aWFvdG9uZy5j -b20KLmxpdmVkb29yLmpwCi5saXZlbGVhay5jb20KfHxsaXZlbGVhay5jb20KLmxp -dmVzdGF0aW9uLmNvbQpsaXZlc3RyZWFtLmNvbQp8fGxpdmVzdHJlYW0uY29tCnx8 -bGl2aW5nb25saW5lLnVzCnx8bGl2aW5nc3RyZWFtLmNvbQp8fGxpdmV2aWRlby5j -b20KLmxpdmV2aWRlby5jb20KLmxpd2FuZ3lhbmcuY29tCmxpemhpemh1YW5nYmku -Y29tCmxrY24ubmV0Ci5sb2FkLnRvCi5sb2JzYW5nd2FuZ3lhbC5jb20KLmxvY2Fs -ZG9tYWluLndzCnx8bG9jYWxkb21haW4ud3MKbG9jYWxwcmVzc2hrLmNvbQp8fGxv -Y2tkb3duLmNvbQp8fGxvY2tlc3Rlay5jb20KbG9nYm90Lm5ldAp8fGxvZ2lxeC5j -b20Kc2VjdXJlLmxvZ21laW4uY29tCnx8c2VjdXJlLmxvZ21laW4uY29tCnx8bG9n -bWlrZS5jb20KLmxvbmRvbmNoaW5lc2UuY2EKLmxvbmdoYWlyLmhrCmxvbmdtdXNp -Yy5jb20KfHxsb25ndGVybWx5Lm5ldAp8fGxvb2tpbmdnbGFzc3RoZWF0cmUub3Jn -Cnx8bG9va3BpYy5jb20KLmxvb2t0b3JvbnRvLmNvbQp8aHR0cDovL2xvb2t0b3Jv -bnRvLmNvbQoubG90c2F3YWhvdXNlLm9yZy90aWJldGFuLW1hc3RlcnMvZm91cnRl -ZW50aC1kYWxhaS1sYW1hCi5sb3R1c2xpZ2h0Lm9yZy5oawoubG90dXNsaWdodC5v -cmcudHcKaGtyZXBvcnRlci5sb3ZlZC5oawohLS00MDM/Cnx8bHBzZy5jb20KfHxs -cmZ6LmNvbQoubHJpcC5vcmcKfHxscmlwLm9yZwoubHNkLm9yZy5oawp8fGxzZC5v -cmcuaGsKbHNmb3J1bS5uZXQKLmxzbS5vcmcKfHxsc20ub3JnCi5sc21jaGluZXNl -Lm9yZwp8fGxzbWNoaW5lc2Uub3JnCi5sc21rb3JlYW4ub3JnCnx8bHNta29yZWFu -Lm9yZwoubHNtcmFkaW8uY29tL3JhZF9hcmNoaXZlcwoubHNtd2ViY2FzdC5jb20K -Lmx0bi5jb20udHcKfGh0dHA6Ly9sdG4uY29tLnR3Ci5sdWtlNTQuY29tCi5sdWtl -NTQub3JnCi5sdXBtLm9yZwp8fGx1cG0ub3JnCnx8bHVzaHN0b3JpZXMuY29tCmx1 -eGViYy5jb20KbHZoYWkub3JnCnx8bHZoYWkub3JnCnx8bHZ2Mi5jb20KLmx5Zmhr -Lm5ldAp8aHR0cDovL2x5ZmhrLm5ldAoKIS0tLS0tLS0tLS0tLS0tLS0tLS0tTU0t -LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi5tLXRlYW0uY2MKIS0tbS10ZWFtLmNj -L2ZvcnVtCi5tYWNyb3Zwbi5jb20KbWFjdHMuY29tLnR3Cnx8bWFkLWFyLmNoCnx8 -bWFkdGh1bWJzLmNvbQp8fG1hZ2ljLW5ldC5pbmZvCm1haGFib2RoaS5vcmcKbXku -bWFpbC5ydQoubWFpcGx1cy5jb20KfGh0dHA6Ly9tYWlwbHVzLmNvbQptYW5pY3Vy -NGlrLnJ1Ci5tYXBsZXcuY29tCnxodHRwOi8vbWFwbGV3LmNvbQp8fG1hcmMuaW5m -bwptYXJndWVyaXRlLnN1Cnx8bWFydGluY2FydG9vbnMuY29tCm1hc2tlZGlwLmNv -bQoubWFpaW8ubmV0Cm1haWwtYXJjaGl2ZS5jb20KLm1hbGF5c2lha2luaS5jb20K -fHxtYWtlbXltb29kLmNvbQoubWFuaWFzaC5jb20KfGh0dHA6Ly9tYW5pYXNoLmNv -bQoubWFuc2lvbi5jb20KLm1hbnNpb25wb2tlci5jb20KIS0tfHxtYXJpbmVzLm1p -bAohLS1tYXJrbWFpbC5vcmcqbWVzc2FnZQp8fG1hcnRhdS5jb20KfGh0dHA6Ly9i -bG9nLm1hcnRpbm9laS5jb20KLm1hcnRzYW5na2FneXVvZmZpY2lhbC5vcmcKfGh0 -dHA6Ly9tYXJ0c2FuZ2thZ3l1b2ZmaWNpYWwub3JnCm1hcnV0YS5iZS9mb3JnZXQK -Lm1hcnhpc3QuY29tCnx8bWFyeGlzdC5uZXQKLm1hcnhpc3RzLm9yZy9jaGluZXNl -CiEtLXx8bWFzaGFibGUuY29tCnx8bWF0YWluamEuY29tCnx8bWF0aGFibGUuaW8K -fHxtYXRoaWV3LWJhZGltb24uY29tCnx8bWF0c3VzaGltYWthZWRlLmNvbQp8aHR0 -cDovL21hdHVyZWpwLmNvbQptYXlpbWF5aS5jb20KLm1heGluZy5qcAoubWNhZi5l -ZQp8aHR0cDovL21jYWYuZWUKfHxtY2FkZm9ydW1zLmNvbQptY2ZvZy5jb20KbWNy -ZWFzaXRlLmNvbQoubWQtdC5vcmcKfHxtZC10Lm9yZwoubWVkaWFjaGluZXNlLmNv -bQp8fG1lZGlhY2hpbmVzZS5jb20KLm1lZGlhZmlyZS5jb20vPwoubWVkaWFmaXJl -LmNvbS9kb3dubG9hZAoubWVkaWFmcmVha2NpdHkuY29tCnx8bWVkaWFmcmVha2Np -dHkuY29tCi5tZWRpdW0uY29tCnx8bWVkaXVtLmNvbQp8fG1lZXR1cC5jb20KbWVm -ZWVkaWEuY29tCi5tZWdhcG9ybi5jb20KfHxtZWdhcHJveHkuY29tCnx8bWVnYXJv -dGljLmNvbQptZWdhdmlkZW8uY29tCnx8bWVndXJpbmVsdWthLmNvbQptZWlyaXhp -YW9jaGFvLmNvbQp8fG1lbG9uLXBlYWNoLmNvbQoubWVsdG9kYXkuY29tCi5tZW1l -aGsuY29tCnx8bWVtZWhrLmNvbQptZW1vcnliYnMuY29tCi5tZW1yaS5vcmcKLm1l -bXJpanR0bS5vcmcKLm1lcmN5cHJvcGhldC5vcmcKfGh0dHA6Ly9tZXJjeXByb3Bo -ZXQub3JnCi5tZXJpZGlhbi10cnVzdC5vcmcKfGh0dHA6Ly9tZXJpZGlhbi10cnVz -dC5vcmcKLm1lcmlwZXQuYml6CnxodHRwOi8vbWVyaXBldC5iaXoKLm1lcmlwZXQu -Y29tCnxodHRwOi8vbWVyaXBldC5jb20KbWVyaXQtdGltZXMuY29tLnR3Cm1lc2hy -ZXAuY29tCi5tZXNvdHcuY29tL2JicwptZXRhY2FmZS5jb20vd2F0Y2gKfHxtZXRl -b3JzaG93ZXJzb25saW5lLmNvbQp8aHR0cDovL3d3dy5tZXRyby50YWlwZWkvCi5t -ZXRyb2hrLmNvbS5oay8/Y21kPWRldGFpbCZjYXRlZ29yeUlEPTIKfHxtZXRyb2xp -ZmUuY2EKLm1ldHJvcmFkaW8uY29tLmhrCnxodHRwOi8vbWV0cm9yYWRpby5jb20u -aGsKbWV5b3UuanAKLm1leXVsLmNvbQp8fG1nb29uLmNvbQp8fG1nc3RhZ2UuY29t -Cnx8bWg0dS5vcmcKbWhyYWRpby5vcmcKfGh0dHA6Ly9taWNoYWVsYW50aS5jb20K -fHxtaWNoYWVsbWFya2V0bC5jb20KbWlkZGxlLXdheS5uZXQKLm1paGsuaGsvZm9y -dW0KLm1paHIuY29tCm1paHVhLm9yZwohLS1JUAp8fG1pa2Vzb2x0eXMuY29tCi5t -aWxwaC5uZXQKfGh0dHA6Ly9taWxwaC5uZXQKLm1pbHN1cnBzLmNvbQptaW1pYWku -bmV0Ci5taW1pdmlwLmNvbQoubWltaXZ2LmNvbQoubWluZHJvbGxpbmcub3JnCnxo -dHRwOi8vbWluZHJvbGxpbmcub3JnCi5taW5naHVpLm9yLmtyCnxodHRwOi8vbWlu -Z2h1aS5vci5rcgptaW5naHVpLm9yZwp8fG1pbmdodWkub3JnCm1pbmdodWktYS5v -cmcKbWluZ2h1aS1iLm9yZwptaW5naHVpLXNjaG9vbC5vcmcKLm1pbmdqaW5nbGlz -aGkuY29tCnx8bWluZ2ppbmdsaXNoaS5jb20KbWluZ2ppbmduZXdzLmNvbQp8fG1p -bmdqaW5ndGltZXMuY29tCi5taW5ncGFvLmNvbQoubWluZ3Bhb2NhbmFkYS5jb20K -Lm1pbmdwYW9tb250aGx5LmNvbQp8aHR0cDovL21pbmdwYW9tb250aGx5LmNvbQpt -aW5ncGFvbmV3cy5jb20KLm1pbmdwYW9ueS5jb20KLm1pbmdwYW9zZi5jb20KLm1p -bmdwYW90b3IuY29tCi5taW5ncGFvdmFuLmNvbQoubWluZ3NoZW5nYmFvLmNvbQou -bWluaGh1ZS5uZXQKLm1pbmlmb3J1bS5vcmcKLm1pbmlzdHJ5Ym9va3Mub3JnCi5t -aW56aHVodWEubmV0Cnx8bWluemh1aHVhLm5ldAptaW56aHV6aGFueGlhbi5jb20K -bWluemh1emhvbmdndW8ub3JnCnx8bWlyb2d1aWRlLmNvbQptaXJyb3Jib29rcy5j -b20KdGhlY2VudGVyLm1pdC5lZHUKbWl0YmJzLmNvbQoubWl4ZXJvLmNvbQp8fG1p -eGVyby5jb20KbWl4cG9kLmNvbQoubWl4eC5jb20KfHxtaXh4LmNvbQp8fG1penpt -b25hLmNvbQoubWs1MDAwLmNvbQoubWxjb29sLmNvbQp8fG1tYWF4eC5jb20KcGx1 -cmt0b3AubW1kYXlzLmNvbQoubW1tY2EuY29tCnx8bW9iYXRlay5uZXQKLm1vYmls -ZTAxLmNvbQp8fG1vYmlsZXdheXMuZGUKLm1vYnlwaWN0dXJlLmNvbQp8aHR0cDov -L21vYnkudG8KfHxtb2Vlcm9saWJyYXJ5LmNvbQp3aWtpLm1vZWdpcmwub3JnCi5t -b2Zvcy5jb20KfHxtb2cuY29tCm1vbGlodWEub3JnCnx8bW9uZGV4Lm9yZwp8aHR0 -cDovL3d3dy5tb25sYW1pdC5vcmcKLm1vb25iYnMuY29tCnx8bW9vbmJicy5jb20K -YzE1MjIubW9vby5jb20KfHxtb25pdG9yY2hpbmEub3JnCmJicy5tb3JiZWxsLmNv -bQp8fG1vcm5pbmdzdW4ub3JnCnx8bW9yb25ldGEuY29tCi5tb3RoZXJsZXNzLmNv -bQp8aHR0cDovL21vdGhlcmxlc3MuY29tCm1vdG9yNGlrLnJ1Ci5tb3VzZWJyZWFr -ZXIuY29tCiEtLXx8bW92YWJsZXR5cGUuY29tCi5tb3ZlbWVudHMub3JnCnx8bW92 -ZW1lbnRzLm9yZwp8fG1vdmllZmFwLmNvbQp8fHd3dy5tb3p0dy5vcmcKLm1wM2J1 -c2NhZG9yLmNvbQptcDN5ZS5ldQp8fG1wZXR0aXMuY29tCm1wZmluYW5jZS5jb20K -bXBpbmV3cy5jb20KbXBvbmxpbmUuaGsKbXJ0d2VldC5jb20KfHxtcnR3ZWV0LmNv -bQpuZXdzLmhrLm1zbi5jb20KbmV3cy5tc24uY29tLnR3Cm1zZ3VhbmNoYS5jb20K -Lm1zd2UxLm9yZwp8aHR0cDovL21zd2UxLm9yZwp8fG10aHJ1Zi5jb20KbXVjaG9z -dWNrby5jb20KfHxtdWx0aXBseS5jb20KbXVsdGlwcm94eS5vcmcKbXVsdGl1cGxv -YWQuY29tCi5tdWxsdmFkLm5ldAp8fG11bGx2YWQubmV0Ci5tdW1teXNnb2xkLmNv -bQoubXVybXVyLnR3CnxodHRwOi8vbXVybXVyLnR3Ci5tdXNpY2FkZS5uZXQKLm11 -c2xpbXZpZGVvLmNvbQp8fG11emkuY29tCnx8bXV6aS5uZXQKfHxteDk4MS5jb20K -Lm15LWZvcm1vc2EuY29tCi5teS1wcm94eS5jb20KZm9ydW0ubXk5MDMuY29tCm15 -YWN0aW1lcy5jb20KLm15YXVkaW9jYXN0LmNvbQp8fG15YXVkaW9jYXN0LmNvbQou -bXlhdi5jb20udHcvYmJzCi5teWJicy51cwoubXljYTE2OC5jb20KfHxiYnMubXlj -aGF0LnRvCnx8bXljaGluYW15aG9tZS5jb20KLm15Y2hpbmFteWhvbWUuY29tCi5t -eWNoaW5hbmV0LmNvbQoubXljaGluYW5ld3MuY29tCnx8bXljaGluYW5ld3MuY29t -Cnx8bXljbm5ld3MuY29tCnx8bXlrb21pY2Eub3JnCm15Y291bGQuY29tL2Rpc2N1 -egoubXllYXN5dHYuY29tCnx8bXllY2xpcHNlaWRlLmNvbQoubXlmb3J1bS5jb20u -aGsKfHxteWZvcnVtLmNvbS5oawp8fG15Zm9ydW0uY29tLnVrCi5teWZyZWVwYXlz -aXRlLmNvbQoubXlmcmVzaG5ldC5jb20KZm9ydW0ubXltYWppLmNvbQpteW1lZGlh -cm9tLmNvbS9maWxlcy9ib3gKfHxteW11c2ljLm5ldC50dwp8fG15cGFyYWdsaWRp -bmcuY29tCnx8bXlwb3Blc2N1LmNvbQoubXktcHJpdmF0ZS1uZXR3b3JrLmNvLnVr -Cnx8bXktcHJpdmF0ZS1uZXR3b3JrLmNvLnVrCm15cmFkaW8uaGsvcG9kY2FzdApt -eXNpbmFibG9nLmNvbQoubXlzcGFjZS5jb20KIS0tLmJsb2dzLm15c3BhY2UuY29t -CiEtLXx8YmxvZ3MubXlzcGFjZS5jb20KIS0tdmlkcy5teXNwYWNlLmNvbS9pbmRl -eC5jZm0/ZnVzZWFjdGlvbj12aWRzLgohLS12aWV3bW9yZXBpY3MubXlzcGFjZS5j -b20KLm15dGFsa2JveC5jb20KCiEtLS0tLS0tLS0tLS0tLS0tLS0tLU5OLS0tLS0t -LS0tLS0tLS0tLS0tLS0tLS0tLQp8fG5hYWNvYWxpdGlvbi5vcmcKb2xkLm5hYmJs -ZS5jb20KfHxuYWl0aWsubmV0Ci5uYWt1ei5jb20vYmJzCnx8bmFsYW5kYWJvZGhp -Lm9yZwp8fG5hbGFuZGF3ZXN0Lm9yZwoubmFtZ3lhbC5vcmcKbmFtZ3lhbG1vbmFz -dGVyeS5vcmcKfHxuYW1zaXNpLmNvbQoubmFueWFuZy5jb20KfHxuYW55YW5nLmNv -bQoubmFueWFuZ3Bvc3QuY29tCnx8bmFueWFuZ3Bvc3QuY29tCi5uYW56YW8uY29t -CiEtLS5uYW56YW8uY29tL3NjL2NoaW5hLzIwMjIzCiEtLS5uYW56YW8uY29tL3Nj -L2hrLW1hY2F1LXR3Cnx8anBsLm5hc2EuZ292Cnx8cGRzLm5hc2EuZ292Cnx8c29s -YXJzeXN0ZW0ubmFzYS5nb3YKL15odHRwcz86XC9cL1teXC9dK2xpbmVcLm5hdmVy -XC5qcC8KLm5ha2lkby5jb20KfHxuYWtpZG8uY29tCi5uYW9sLmNhCnVpZ2h1ci5u -YXJvZC5ydQpjeWJlcmdob3N0Lm5hdGFkby5jb20KfHxuYXRpb25hbC1sb3R0ZXJ5 -LmNvLnVrCm5ld3MubmF0aW9uYWxnZW9ncmFwaGljLmNvbS9uZXdzLzIwMTQvMDYv -MTQwNjAzLXRpYW5hbm1lbi1zcXVhcmUKLm5hdGlvbnNvbmxpbmUub3JnL29uZXdv -cmxkL3RpYmV0Cnx8bmF2eWZhbWlseS5uYXZ5Lm1pbAp8fG5hdnlyZXNlcnZlLm5h -dnkubWlsCnx8bmtvLm5hdnkubWlsCnx8dXNuby5uYXZ5Lm1pbAoubmJ0dnBuLmNv -bQp8aHR0cDovL25idHZwbi5jb20KbmNjd2F0Y2gub3JnLnR3Ci5uY2guY29tLnR3 -Ci5uY24ub3JnCnx8bmNuLm9yZwp8fGV0b29scy5uY29sLmNvbQoubmRlLmRlCi5u -ZHIuZGUKLm5lZC5vcmcKfHxuZWtvc2xvdmFraWEubmV0CiEtLWJic25ldy5uZXRi -aWcuY29tCmJicy5uZXRiaWcuY29tCi5uZXRiaXJkcy5jb20KbmV0Y29sb255LmNv -bQpib2xpbi5uZXRmaXJtcy5jb20KfHxuZXRtZS5jYwpuZXRzbmVhay5jb20KLm5l -dHdvcms1NC5jb20KbmV0d29ya2VkYmxvZ3MuY29tCm5ldmVyZm9yZ2V0ODk2NC5v -cmcKbmV3LTNsdW5jaC5uZXQKLm5ldy1ha2liYS5jb20KLm5ldzk2LmNhCi5uZXdj -ZW50dXJ5bWMuY29tCnxodHRwOi8vbmV3Y2VudHVyeW1jLmNvbQpuZXdjZW50dXJ5 -bmV3cy5jb20KfHxuZXdjaGVuLmNvbQoubmV3Y2hlbi5jb20KLm5ld2dyb3VuZHMu -Y29tCm5ld2lwbm93LmNvbQoubmV3bGFuZG1hZ2F6aW5lLmNvbS5hdQoubmV3bmV3 -cy5jYQpuZXdzMTAwLmNvbS50dwoubmV3c2NuLm9yZwp8fG5ld3Njbi5vcmcKfHxu -ZXdzbWluZXIuY29tCm5ld3NwZWFrLmNjL3N0b3J5Ci5uZXdzYW5jYWkuY29tCnx8 -bmV3c2FuY2FpLmNvbQoubmV3c2RoLmNvbQp8fG5ld3N0YW1hZ28uY29tCnx8bmV3 -c3RhcGEub3JnCm5ld3N0YXJuZXQuY29tCi5uZXd0YWl3YW4uY29tLnR3Cm5ld3Rh -bGsudHcKfHxuZXd0YWxrLnR3Cm5ld3lvcmt0aW1lcy5jb20KfHxuZXhvbi5jb20K -Lm5leHQxMS5jby5qcAoubmV4dG1hZy5jb20udHcKCiEtLWhrKi5uZXh0bWVkaWEu -Y29tCiEtLXR3Ki5uZXh0bWVkaWEuY29tCiEtLXN0YXRpYyoubmV4dG1lZGlhLmNv -bQoubmV4dG1lZGlhLmNvbQoKfHxuZXh0b24tbmV0LmpwCm5leHR0di5jb20udHcK -fHxjby5uZy5taWwKfHxuZ2EubWlsCm5nZW5zaXMuY29tCi5uaGVudGFpLm5ldAp8 -aHR0cDovL25oZW50YWkubmV0Ci5uaWNvdmlkZW8uanAvd2F0Y2gKIS0tfHxuaWNv -dmlkZW8uanAKfHxuaWdob3N0Lm9yZwphdi5uaWdodGxpZmUxNDEuY29tCm5pbmVj -b21tZW50YXJpZXMuY29tCi5uaW5qYWNsb2FrLmNvbQp8fG5pbmphcHJveHkubmlu -amEKbmludGVuZGl1bS5jb20KdGFpd2FueWVzLm5pbmcuY29tCnVzbWd0Y2cubmlu -Zy5jb20vZm9ydW0KfHxuaXVzbmV3cy5jb20KfHxuamFjdGIub3JnCm5qdWljZS5j -b20KfHxuanVpY2UuY29tCm5sZnJlZXZwbi5jb20KIS0tbm8taXAuY29tCi5uby1p -cC5vcmcKfHxub2JlbC5zZQohLS0ubm9iZWxwcml6ZS5vcmcKIS0tfGh0dHA6Ly9u -b2JlbHByaXplLm9yZwpub2JlbHByaXplLm9yZy9ub2JlbF9wcml6ZXMvcGVhY2Uv -bGF1cmVhdGVzLzE5ODkKbm9iZWxwcml6ZS5vcmcvbm9iZWxfcHJpemVzL3BlYWNl -L2xhdXJlYXRlcy8yMDEwCm5vYm9keWNhbnN0b3AudXMKfHxub2JvZHljYW5zdG9w -LnVzCnx8bm9rb2dpcmkub3JnCnx8bm9rb2xhLmNvbQpub29kbGV2cG4uY29tCi5u -b3JidWxpbmdrYS5vcmcKbm9yZHZwbi5jb20KfHxub3JkdnBuLmNvbQp8fG5vdmVs -YXNpYS5jb20KLm5ld3Mubm93LmNvbQp8aHR0cDovL25ld3Mubm93LmNvbS9ob21l -KgpuZXdzLm5vdy5jb20lMkZob21lCnx8bm93bmV3cy5jb20KLm5vd3RvcnJlbnRz -LmNvbQoubm95cGYuY29tCnx8bm95cGYuY29tCnx8bnBhLmdvLmpwCi5ucG50Lm1l -CnxodHRwOi8vbnBudC5tZQoubnBzLmdvdgoubnJrLm5vCnx8bnJrLm5vCi5udGQu -dHYKfHxudGQudHYKbnRkdHYuY29tCi5udGR0di5jby5rcgpudGR0di5jYQpudGR0 -di5vcmcKbnRkdHYucnUKbnRkdHZsYS5jb20KLm50cmZ1bi5jb20KfHxjYnMubnR1 -LmVkdS50dwoubnViaWxlcy5uZXQKfHxudWV4cG8uY29tCi5udWtpc3RyZWFtLmNv -bQp8fG51cmdvLXNvZnR3YXJlLmNvbQoubnV2aWQuY29tCm51emNvbS5jb20KLm52 -cXVhbi5vcmcKLm53dGNhLm9yZwp8fG55YWEuZXUKfHxueWFhLnNlCi5ueWR1cy5j -YQpueWxvbi1hbmdlbC5jb20Kbnlsb25zdG9ja2luZ3NvbmxpbmUuY29tCiEtLXx8 -bnl0LmNvbQp8fG55dGNvLmNvbQp8aHR0cDovL255dGkubXMvCi5ueXRpbWVzLmNv -bQp8fG55dGltZXMuY29tCnx8bnl0aW1nLmNvbQp1c2VyYXBpLm55dGxvZy5jb20K -bnlzaW5ndGFvLmNvbQoubnpjaGluZXNlLmNvbQp8fG56Y2hpbmVzZS5uZXQubnoK -CiEtLS0tLS0tLS0tLS0tLS0tLS0tLU9PLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t -LQpvYnNlcnZlY2hpbmEubmV0Ci5vYnV0dS5jb20Kb2Nhc3Byby5jb20Kb2NjdXB5 -dGlhbmFubWVuLmNvbQpvY2xwLmhrCi5vY3JlYW1waWVzLmNvbQp8fG9jdG9iZXIt -cmV2aWV3Lm9yZwpvZmZiZWF0Y2hpbmEuY29tCm9mZmljZW9mdGliZXQuY29tCnx8 -b2dhb2dhLm9yZwp0d3RyMnNyYy5vZ2FvZ2Eub3JnCnd3dzIub2hjaHIub3JnL2Vu -Z2xpc2gvYm9kaWVzL2NhdC9kb2NzL25nb3MvSUlfQ2hpbmFfNDEucGRmCi5vaWtv -cy5jb20udHcvdjQKLm9pa3R2LmNvbQpvaXpvYmxvZy5jb20KLm9rYXlmcmVlZG9t -LmNvbQp8fG9rYXlmcmVlZG9tLmNvbQpva2sudHcKfGh0dHA6Ly9maWxteS5vbGFi -bG9nYS5wbC9wbGF5ZXIKb2xkLWNhdC5uZXQKfHxvbHVtcG8uY29tCi5vbHltcGlj -d2F0Y2gub3JnCm9tZ2lsaS5jb20KfHxvbW5pdGFsay5jb20KfHxvbW5pdGFsay5v -cmcKY2xpbmcub215LnNnCmZvcnVtLm9teS5zZwpuZXdzLm9teS5zZwpzaG93Yml6 -Lm9teS5zZwp8fG9uLmNjCnx8b25lZHJpdmUubGl2ZS5jb20KfGh0dHA6Ly93d3cu -b25pb24uY2l0eQoub25saW5lY2hhLmNvbQp8fG9ubGluZXlvdXR1YmUuY29tCm9u -bW9vbi5uZXQKb25tb29uLmNvbQoub250aGVodW50LmNvbQp8aHR0cDovL29udGhl -aHVudC5jb20KLm9vcHNmb3J1bS5jb20Kb3Blbi5jb20uaGsKb3BlbmFsbHdlYi5j -b20Kb3BlbmRlbW9jcmFjeS5uZXQKfHxvcGVuZGVtb2NyYWN5Lm5ldAoub3BlbmVy -dnBuLmluCm9wZW5pZC5uZXQKfHxvcGVuaWQubmV0Ci5vcGVubGVha3Mub3JnCnx8 -b3BlbmxlYWtzLm9yZwpvcGVudnBuLm5ldAp8fG9wZW52cG4ubmV0Cnx8b3Blbndl -YnN0ZXIuY29tCnxodHRwOi8vaGVscC5vcGVyYS5jb20KbXkub3BlcmEuY29tL2Rh -aGVtYQp8fGRlbW8ub3BlcmEtbWluaS5uZXQKd3d3Lm9yY2hpZGJicy5jb20KLm9y -Z2FuY2FyZS5vcmcudHcKb3JnYW5oYXJ2ZXN0aW52ZXN0aWdhdGlvbi5uZXQKLm9y -Z2ZyZWUuY29tCnx8b3JpZW50LWRvbGwuY29tCm9yaWVudGFsZGFpbHkuY29tLm15 -Cnx8b3JpZW50YWxkYWlseS5jb20ubXkKIS0tb3JpZW50YWxkYWlseS5vbi5jYwp8 -fG9ybi5qcAp0Lm9yemRyZWFtLmNvbQp8fHQub3J6ZHJlYW0uY29tCnR1aS5vcnpk -cmVhbS5jb20KfHxvcnppc3RpYy5vcmcKfHxvc2Zvb3JhLmNvbQoub3RuZC5vcmcK -fHxvdG5kLm9yZwp8fG90dG8uZGUKfHxvdXJkZWFyYW15LmNvbQpvdXJzb2dvLmNv -bQpvdXJzdGVwcy5jb20uYXUKLm91cnN3ZWIubmV0Cnx8b3VydHYuaGsKeGlucWlt -ZW5nLm92ZXItYmxvZy5jb20KfHxvdmVycGxheS5uZXQKc2hhcmUub3ZpLmNvbS9t -ZWRpYQp8aHR0cDovL293bC5saQp8aHR0cDovL2h0Lmx5CnxodHRwOi8vaHRsLmxp -CnxodHRwOi8vbWFzaC50bwp3d3cub3dpbmQuY29tCnxodHRwOi8vd3d3Lm94aWQu -aXQKb3lheC5jb20Kb3lnaGFuLmNvbS93cHMKLm96Y2hpbmVzZS5jb20vYmJzCnx8 -b3cubHkKYmJzLm96Y2hpbmVzZS5jb20KLm96eHcuY29tCi5venlveW8uY29tCgoh -LS0tLS0tLS0tLS0tLS0tLS0tLS1QUC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K -fHxwYWNob3N0aW5nLmNvbQoucGFjaWZpY3Bva2VyLmNvbQoucGFja2V0aXgubmV0 -Cnx8cGFjb3BhY29tYW1hLmNvbQoucGFkbWFuZXQuY29tCnBhZ2UycnNzLmNvbQp8 -fHBhZ29kYWJveC5jb20KLnBhbGFjZW1vb24uY29tCmZvcnVtLnBhbG1pc2xpZmUu -Y29tCnx8ZXJpdmVyc29mdC5jb20KLnBhbGRlbmd5YWwuY29tCnBhbGpvcnB1Ymxp -Y2F0aW9ucy5jb20KLnBhbHRhbGsuY29tCnx8cGFuYWNvbS5jby5qcAoucGFuZGFw -b3cubmV0Ci5wYW5kYXZwbi1qcC5jb20KLnBhbmx1YW4ubmV0Cnx8cGFubHVhbi5u -ZXQKfHxwYW8tcGFvLm5ldApwYXBlci5saQpwYXBlcmIudXMKLnBhcmFkaXNlcG9r -ZXIuY29tCi5wYXJ0eWNhc2luby5jb20KLnBhcnR5cG9rZXIuY29tCi5wYXNzaW9u -LmNvbQp8fHBhc3Npb24uY29tCi5wYXNzaW9udGltZXMuaGsKcGFzdGViaW4uY29t -Ci5wYXN0aWUub3JnCnx8cGFzdGllLm9yZwp8fGJsb2cucGF0aHRvc2hhcmVwb2lu -dC5jb20KcGJzLm9yZy93Z2JoL3BhZ2VzL2Zyb250bGluZS9nYXRlCnBicy5vcmcv -d2diaC9wYWdlcy9mcm9udGxpbmUvdGFua21hbgpwYnMub3JnL3dnYmgvcGFnZXMv -ZnJvbnRsaW5lL3RpYmV0CgohLS1QYndpa2kKcGJ3aWtpLmNvbQp8fHBid29ya3Mu -Y29tCnx8ZGV2ZWxvcGVycy5ib3gubmV0Cnx8d2lraS5vYXV0aC5uZXQKfHx3aWtp -LnBob25lZ2FwLmNvbQp8fHdpa2kuanF1ZXJ5dWkuY29tCgp8fHBieGVzLmNvbQp8 -fHBieGVzLm9yZwpwY2R2ZC5jb20udHcKLnBjaG9tZS5jb20udHcKfGh0dHA6Ly9w -Y2lqLm9yZwoucGNzdG9yZS5jb20udHcvbnRkdHZhcHNob3AKfHxwY3Qub3JnLnR3 -CnBkZXRhaWxzLmNvbQp8fHBkcHJveHkuY29tCnx8cGVhY2UuY2EKcGVhY2VmaXJl -Lm9yZwpwZWFjZWhhbGwuY29tCnxodHRwOi8vcGVhcmxoZXIub3JnCi5wZWVhc2lh -bi5jb20KLnBla2luZ2R1Y2sub3JnCnx8cGVraW5nZHVjay5vcmcKLnBlbXVsaWhh -bi5vci5pZAp8aHR0cDovL3BlbXVsaWhhbi5vci5pZAp8fHBlbi5pbwpwZW5jaGlu -ZXNlLmNvbQp8fHBlbmNoaW5lc2UubmV0Ci5wZW5jaGluZXNlLm5ldApwZW5neXVs -b25nLmNvbQpwZW5pc2JvdC5jb20KfHxibG9nLnBlbnRhbG9naWMubmV0Ci5wZW50 -aG91c2UuY29tCi5wZW50b3kuaGsvJUU0JUI4JUFEJUU1JTlDJThCCi5wZW50b3ku -aGsvJUU2JTk5JTgyJUU0JUJBJThCCi5wZW9wbGVib29rY2FmZS5jb20KLnBlb3Bs -ZW5ld3MudHcKfHxwZW9wbGVuZXdzLnR3Ci5wZW9wby5vcmcKfHxwZW9wby5vcmcK -LnBlcmN5LmluCi5wZXJmZWN0Z2lybHMubmV0CnBlcmZlY3R2cG4ubmV0Ci5wZXJz -ZWN1dGlvbmJsb2cuY29tCnBmZC5vcmcuaGsKcGhhcGx1YW4ub3JnCnBoYXl1bC5j -b20KcGhpbGJvcmdlcy5jb20KcGhpbGx5LmNvbQp8fHBobmNkbi5jb20KfHxwaG90 -b2RoYXJtYS5uZXQKfHxwaG90b2ZvY3VzLmNvbQp8fHBodXF1b2NzZXJ2aWNlcy5j -b20KLnBpY2lkYWUubmV0Cnx8aW1nKi5waWN0dXJlZGlwLmNvbQpwaWN0dXJlc29j -aWFsLmNvbQoucGluNi5jb20KfHxwaW42LmNvbQoucGluZy5mbQp8fHBpbmcuZm0K -fHxwaW5veS1uLmNvbQoucGlwb3NheS5jb20KcGlyYWF0dGlsYWh0aS5vcmcKLnBp -cmluZy5jb20KfHxwaXhlbHFpLmNvbQp8fGNzcy5waXhuZXQuaW4KfHxwaXhuZXQu -bmV0Ci5waXhuZXQubmV0Ci5way5jb20KfHxwbGFjZW1peC5jb20KIS0tLnBsYW5l -dHN1enkub3JnCnxodHRwOi8vcGljdHVyZXMucGxheWJveS5jb20KfHxwbGF5Ym95 -LmNvbQoucGxheWJveXBsdXMuY29tCnx8cGxheWJveXBsdXMuY29tCi5wbGF5bm8x -LmNvbQp8fHBsYXlubzEuY29tCnx8cGxheXBjZXNvci5jb20KcGxheXMuY29tLnR3 -Cnx8bS5wbGl4aS5jb20KcGxtLm9yZy5oawpwbHVuZGVyLmNvbQoucGx1czI4LmNv -bQoucGx1c2JiLmNvbQoucG1hdGVzLmNvbQp8fHBvMmIuY29tCiEtLXx8cG9jb28u -b3JnCnx8cG9kaWN0aW9uYXJ5LmNvbQoucG9rZXJzdGFycy5uZXQKemgucG9rZXJz -dHJhdGVneS5jb20KcG9saXRpY2FsY2hpbmEub3JnCnBvbGl0aWNhbGNvbnN1bHRh -dGlvbi5vcmcKLnBvbHltZXJoay5jb20KfGh0dHA6Ly9wb2x5bWVyaGsuY29tCi5w -b3BvLnR3CiEtLXx8cG9wdWxhcnBhZ2VzLm5ldAp8fHBvcHZvdGUuaGsKcG9weWFy -ZC5jb20KfHxwb3B5YXJkLm9yZwoucG9ybi5jb20KLnBvcm4yLmNvbQoucG9ybjUu -Y29tCi5wb3JuYmFzZS5vcmcKLnBvcm5lcmJyb3MuY29tCnx8cG9ybmhkLmNvbQou -cG9ybmhvc3QuY29tCi5wb3JuaHViLmNvbQp8fHBvcm5tbS5uZXQKLnBvcm5veG8u -Y29tCi5wb3JucmFwaWRzaGFyZS5jb20KfHxwb3JucmFwaWRzaGFyZS5jb20KLnBv -cm5zaGFyaW5nLmNvbQp8aHR0cDovL3Bvcm5zaGFyaW5nLmNvbQoucG9ybnN0YXJj -bHViLmNvbQp8fHBvcm5zdGFyY2x1Yi5jb20KLnBvcm50dWJlLmNvbQoucG9ybnR1 -YmVuZXdzLmNvbQoucG9ybnR2YmxvZy5jb20KfHxwb3JudHZibG9nLmNvbQoucG9y -bnZpc2l0LmNvbQoucG9ydGFibGV2cG4ubmwKfHxwb3Nrb3RhbmV3cy5jb20KLnBv -c3Q4NTIuY29tCnBvc3RhZHVsdC5jb20KLnBvc3RpbWcub3JnCnx8cG93ZXJjeC5j -b20KLnBvd2VycGhvdG8ub3JnCnx8d3d3LnBvd2VycG9pbnRuaW5qYS5jb20KfHxj -ZG4ucHJpbnRmcmllbmRseS5jb20KLnByaXR1bmwuY29tCnByb3ZwbmFjY291bnRz -LmNvbQoucHJveGZyZWUuY29tCnx8cHJveGZyZWUuY29tCnByb3h5YW5vbmltby5l -cwoucHJveHluZXR3b3JrLm9yZy51awp8fHByb3h5bmV0d29yay5vcmcudWsKfHxw -dHMub3JnLnR3Ci5wdHR2YW4ub3JnCnB1YnUuY29tLnR3CnB1ZmZpbmJyb3dzZXIu -Y29tCnB1cmVpbnNpZ2h0Lm9yZwp8fHB1dHR5Lm9yZwoKIS0tLS0tLS0tLS0tLS1Q -b3N0ZXJvdXMtLS0tLQp8fGNhbGViZWxzdG9uLmNvbQp8fGJsb2cuZml6emlrLmNv -bQp8fG5mLmlkLmF1Cnx8c29ncmFkeS5tZQp8fHZhdG4ub3JnCnx8dmVudHVyZXN3 -ZWxsLmNvbQp8fHdoZXJlaXN3ZXJuZXIuY29tCgoucG93ZXIuY29tCnx8cG93ZXIu -Y29tCnBvd2VyYXBwbGUuY29tCnx8YWJjLnBwLnJ1CmhlaXgucHAucnUKfHxwcmF5 -Zm9yY2hpbmEubmV0Cnx8cHJlbWVmb3J3aW5kb3dzNy5jb20KfHxwcmVzZW50YXRp -b256ZW4uY29tCnx8cHJlc3RpZ2UtYXYuY29tCnByaXNvbmVyLXN0YXRlLXNlY3Jl -dC1qb3VybmFsLXByZW1pZXIKLnByaXNvbmVyYWxlcnQuY29tCnx8cHJpdHVubC5j -b20KfHxwcml2YWN5Ym94LmRlCi5wcml2YXRlLmNvbS9ob21lCnx8cHJpdmF0ZWlu -dGVybmV0YWNjZXNzLmNvbQpwcml2YXRlcGFzdGUuY29tCnx8cHJpdmF0ZXBhc3Rl -LmNvbQpwcml2YXRldHVubmVsLmNvbQp8fHByaXZhdGV0dW5uZWwuY29tCnx8cHJp -dmF0ZXZwbi5jb20KfHxwcm9jb3B5dGlwcy5jb20KcHJvdmlkZW9jb2FsaXRpb24u -Y29tCnx8cHJvc2liZW4uZGUKcHJveGlmaWVyLmNvbQphcGkucHJveGxldC5jb20K -fHxwcm94b21pdHJvbi5pbmZvCi5wcm94cG4uY29tCnx8cHJveHBuLmNvbQpwcm94 -eS5vcmcKLnByb3h5bGlzdC5vcmcudWsKfHxwcm94eWxpc3Qub3JnLnVrCi5wcm94 -eXB5Lm5ldAp8fHByb3h5cHkubmV0CnByb3h5cm9hZC5jb20KLnByb3h5dHVubmVs -Lm5ldAohLS00MDMgbWF5YmUKfHxwcm95ZWN0b2NsdWJlcy5jb20KcHJvenoubmV0 -CnBzYmxvZy5uYW1lCnx8cHNibG9nLm5hbWUKfHxwc2lwaG9uLmNhCi5wc2lwaG9u -My5jb20KfHxwc2lwaG9uMy5jb20KLnB0dC5jYwp8fHB0dC5jYwoucHVmZnN0b3Jl -LmNvbQoucHV1a28uY29tCnx8cHVsbGZvbGlvLmNvbQoucHVueXUuY29tL3B1bnkK -fHxwdXJlY29uY2VwdHMubmV0Cnx8cHVyZWluc2lnaHQub3JnCnx8cHVyZXBkZi5j -b20KfHxwdXJldnBuLmNvbQoucHVycGxlbG90dXMub3JnCi5wdXNzeXNwYWNlLmNv -bQoucHV0aWhvbWUub3JnCi5wdXRsb2NrZXIuY29tL2ZpbGUKcHduZWQuY29tCnB5 -dGhvbi5jb20KLnB5dGhvbi5jb20udHcKfGh0dHA6Ly9weXRob24uY29tLnR3Cgoh -LS0tLS0tLS0tLS0tLS0tLS0tLS1RUS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K -LnFhbm90ZS5jb20KfHxxYW5vdGUuY29tCi5xZ2lybC5jb20udHcKcWktZ29uZy5t -ZQoucWlkaWFuLmNhCi5xaWVua3Vlbi5vcmcKfHxxaWVua3Vlbi5vcmcKfHxxaXdl -bi5sdQpxaXhpYW5nbHUuY24KYmJzLnFtemRkLmNvbQoucWtzaGFyZS5jb20KcW9v -cy5jb20KfHxxb29zLmNvbQpibG9nLnFvb3phLmhrKmRhZmVuZ3FpeGkKfHxlZmtz -b2Z0LmNvbQp8fHFzdGF0dXMuY29tCnx8cXR3ZWV0ZXIuY29tCnx8cXRyYWMuZXUK -fHxxdWl0Y2NwLm5ldAoucXVpdGNjcC5uZXQKfHxxdWl0Y2NwLm9yZwoucXVpdGNj -cC5vcmcKLnF1cmFuLmNvbQp8aHR0cDovL3F1cmFuLmNvbQoucXVyYW5leHBsb3Jl -ci5jb20KcXVzaTgubmV0Ci5xdm9kenkub3JnCm5lbWVzaXMyLnF4Lm5ldCpwYWdl -cypNeUVuVHVubmVsCnF4YmJzLm9yZwoKIS0tLS0tLS0tLS0tLS0tLS0tLS0tUlIt -LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi5yYS5nZwp8aHR0cDovL3JhLmdnLwou -cmFkaWNhbHBhcnR5Lm9yZwp8fHJhZWwub3JnCnJhZGljYWxwYXJ0eS5vcmcKcmFk -aW9hdXN0cmFsaWEubmV0LmF1Ci5yYWRpb2hpbGlnaHQubmV0Cnx8cmFkaW9oaWxp -Z2h0Lm5ldApvcG1sLnJhZGlvdGltZS5jb20KfHxyYWRpb3ZhdGljYW5hLm9yZwp8 -fHJhZGlvdm5jci5jb20KfHxyYWdnZWRiYW5uZXIuY29tCnx8cmFpZGNhbGwuY29t -LnR3Ci5yYWlkdGFsay5jb20udHcKLnJhaW5ib3dwbGFuLm9yZy9iYnMKLnJhaXpv -amkub3IuanAKfGh0dHA6Ly9yYWl6b2ppLm9yLmpwCnJhbmd3YW5nLmJpegpyYW5n -emVuLmNvbQpyYW5nemVuLm5ldApyYW5nemVuLm9yZwp8aHR0cDovL2Jsb2cucmFu -eGlhbmcuY29tLwpyYW55dW5mZWkuY29tCnx8cmFueXVuZmVpLmNvbQoucmFwYnVs -bC5uZXQKfGh0dHA6Ly9yYXBpZGdhdG9yLm5ldC8KfHxyYXBpZG1vdmllei5jb20K -cmFwaWR2cG4uY29tCnx8cmFwaWR2cG4uY29tCi5yYXJlbW92aWUuY2MKfGh0dHA6 -Ly9yYXJlbW92aWUuY2MKLnJhcmVtb3ZpZS5uZXQKfGh0dHA6Ly9yYXJlbW92aWUu -bmV0CiEtLS5yYXlmbWUuY29tL2Jicwp8fHJhenlib2FyZC5jb20KcmNpbmV0LmNh -Ci5yZWFkMTAwLmNvbQoucmVhZGluZ3RpbWVzLmNvbS50dwp8fHJlYWRpbmd0aW1l -cy5jb20udHcKfHxyZWFkbW9vLmNvbQoucmVhZHlkb3duLmNvbQp8aHR0cDovL3Jl -YWR5ZG93bi5jb20KLnJlYWxjb3VyYWdlLm9yZwoucmVhbHJhcHRhbGsuY29tCi5y -ZWNvcmRoaXN0b3J5Lm9yZwoucmVjb3Zlcnkub3JnLnR3CnxodHRwOi8vb25saW5l -LnJlY292ZXJ5dmVyc2lvbi5vcmcKfHxyZWNvdmVyeXZlcnNpb24uY29tLnR3Ci5y -ZWRjaGluYWNuLm5ldAp8aHR0cDovL3JlZGNoaW5hY24ubmV0CnJlZGNoaW5hY24u -b3JnCnJlZHR1YmUuY29tCnJlZmVyZXIudXMKfHxyZWZlcmVyLnVzCnx8cmVmbGVj -dGl2ZWNvZGUuY29tCnJlbGF4YmJzLmNvbQoucmVsYXkuY29tLnR3Ci5yZWxlYXNl -aW50ZXJuYXRpb25hbC5vcmcKcmVsaWdpb3VzdG9sZXJhbmNlLm9yZwpyZW5taW5i -YW8uY29tCi5yZW55dXJlbnF1YW4ub3JnCnx8cmVueXVyZW5xdWFuLm9yZwp8aHR0 -cDovL2NlcnRpZmljYXRlLnJldm9jYXRpb25jaGVjay5jb20Kc3ViYWNtZS5yZXJv -dXRlZC5vcmcKLnJldXRlcnMuY29tCi5yZXZsZWZ0LmNvbQpyZXR3ZWV0aXN0LmNv -bQp8fHJldHdlZXRyYW5rLmNvbQohLS1jb25uZWN0ZWRjaGluYS5yZXV0ZXJzLmNv -bQohLS18aHR0cDovL3d3dy5yZXV0ZXJzLmNvbS9uZXdzL3ZpZGVvCnJldnZlci5j -b20KLnJmYS5vcmcKfGh0dHA6Ly9yZmEub3JnCi5yZmFjaGluYS5jb20KLnJmYW1v -YmlsZS5vcmcKcmZhd2ViLm9yZwp8fHJmZXJsLm9yZwoucmZpLmZyCnx8cmZpLmZy -CnxodHRwOi8vcmZpLm15LwoucmhjbG91ZC5jb20KIS0tRWRnZWNhc3QKfGh0dHA6 -Ly92ZHMucmlnaHRzdGVyLmNvbS8KLnJpZ3BhLm9yZwoucmlsZXlndWlkZS5jb20K -cmlrdS5tZS8KLnJpdG91a2kuanAKLnJsd2x3LmNvbQp8fHJsd2x3LmNvbQoucm1q -ZHcuY29tCi5ybWpkdzEzMi5pbmZvCi5yb2Fkc2hvdy5oawpyb2J0ZXguY29tCnx8 -cm9idXN0bmVzc2lza2V5LmNvbQp8fHJvYy10YWl3YW4ub3JnCnx8cm9ja2V0LWlu -Yy5uZXQKfGh0dHA6Ly93d3cyLnJvY2tldGJicy5jb20vMTEvYmJzLmNnaT9pZD01 -bXVzCnxodHRwOi8vd3d3Mi5yb2NrZXRiYnMuY29tLzExL2Jicy5jZ2k/aWQ9ZnJl -ZW1nbAp8fHJvY21wLm9yZwp8fHJvam8uY29tCnx8cm9uam9uZXN3cml0ZXIuY29t -Cnx8cm9saWEubmV0Ci5yb29kby5jb20KLnJvc2VjaGluYS5uZXQKLnJvdHRlbi5j -b20KLnJzZi5vcmcKfHxyc2Yub3JnCi5yc2YtY2hpbmVzZS5vcmcKfHxyc2YtY2hp -bmVzZS5vcmcKLnJzZ2FtZW4ub3JnCnx8cGhvc3BoYXRpb24xMy5yc3NpbmcuY29t -Ci5yc3NtZW1lLmNvbQp8fHJzc21lbWUuY29tCnx8cnRhbGFiZWwub3JnCi5ydGhr -LmhrCnxodHRwOi8vcnRoay5oawoucnRoay5vcmcuaGsKfGh0dHA6Ly9ydGhrLm9y -Zy5oawpydGkub3JnLnR3Ci5ydHljbWlubmVzb3RhLm9yZwoucnVhbnlpZmVuZy5j -b20vYmxvZypzb21lX3dheXNfdG9fYnJlYWtfdGhlX2dyZWF0X2ZpcmV3YWxsCnJ1 -a29yLm9yZwoucnVzaGJlZS5jb20KcnV0dWJlLnJ1Ci5ydXlpc2Vlay5jb20KLnJ4 -aGoubmV0CnxodHRwOi8vcnhoai5uZXQKCiEtLS0tLS0tLS0tLS0tLS0tLS0tLVNT -LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQouczFzMXMxLmNvbQp8fHMtY3V0ZS5j -b20KLnMtZHJhZ29uLm9yZwp8fHMxaGVuZy5jb20KfGh0dHA6Ly93d3cuczRtaW5p -YXJjaGl2ZS5jb20KfHxzOGZvcnVtLmNvbQpjZG4xLmxwLnNhYm9vbS5jb20Kc2Fj -b20uaGsKfHxzYWNvbS5oawp8fHNhZHBhbmRhLnVzCi5zYWZlcnZwbi5jb20KfHxz -YWZlcnZwbi5jb20KLnNhaXEubWUKfHxzYWlxLm1lCnx8c2FrdXJhbGl2ZS5jb20K -LnNha3lhLm9yZwouc2FsdmF0aW9uLm9yZy5oawp8fHNhbHZhdGlvbi5vcmcuaGsK -LnNhbWFpci5ydS9wcm94eS90eXBlLTAxCi5zYW1iaG90YS5vcmcKLmNuLnNhbmRz -Y290YWljZW50cmFsLmNvbQp8aHR0cDovL2NuLnNhbmRzY290YWljZW50cmFsLmNv -bQouc2FubWluLmNvbS50dwpzYXBpa2FjaHUubmV0CnNhdmVtZWRpYS5jb20Kc2F2 -ZXRpYmV0LmRlCnNhdmV0aWJldC5mcgpzYXZldGliZXQubmwKLnNhdmV0aWJldC5v -cmcKfHxzYXZldGliZXQub3JnCnNhdmV0aWJldC5ydQpzYXZldmlkLmNvbQp8fHNh -eTIuaW5mbwouc2JtZS5tZQp8aHR0cDovL3NibWUubWUKLnNjYXNpbm8uY29tCnxo -dHRwOi8vd3d3LnNjaWVuY2VtYWcub3JnL2NvbnRlbnQvMzQ0LzYxODcvOTUzCi5z -Y2llbmNlbmV0cy5jb20KfHxzY2lodWIub3JnCi5zY21wLmNvbQouc2NtcGNoaW5l -c2UuY29tCnx8c2NyYW1ibGUuaW8KLnNjcmliZC5jb20KfHxzY3JpcHRzcG90LmNv -bQpzZWFwdWZmLmNvbQpkb21haW5oZWxwLnNlYXJjaC5jb20KLnNlYXJjaHRydXRo -LmNvbQpzZWNyZXRjaGluYS5jb20KfHxzZWNyZXRnYXJkZW4ubm8KfHxkZWZhdWx0 -LnNlY3VyZXNlcnZlci5uZXQKLnNlY3JldHNsaW5lLmJpegp8fHNlY3JldHNsaW5l -LmJpegp8fHNlY3VyZXR1bm5lbC5jb20Kc2VjdXJpdHlraXNzLmNvbQpzZWVzbWlj -LmNvbQp8fHNlZXZwbi5jb20KfHxzZWV6b25lLm5ldApzZWppZS5jb20KLnNlbmRz -cGFjZS5jb20KfGh0dHA6Ly90d2VldHMuc2VyYXBoLm1lLwpzZXNhd2UubmV0Cnx8 -c2VzYXdlLm5ldAouc2VzYXdlLm9yZwp8fHNldGh3a2xlaW4ubmV0CmZvcnVtLnNl -dHR5LmNvbS50dwouc2V2ZW5sb2FkLmNvbQp8fHNldmVubG9hZC5jb20KLnNleC5j -b20KLnNleC0xMS5jb20KfHxzZXgzLmNvbQp8fHNleDguY2MKLnNleGFuZHN1Ym1p -c3Npb24uY29tCi5zZXhib3QuY29tCi5zZXhodS5jb20KLnNleGh1YW5nLmNvbQpz -ZXhpbnNleC5uZXQKfHxzZXhpbnNleC5uZXQKLnNleHR2eC5jb20KCiEtLUlQIG9m -IFNleEluU2V4CjY3LjIyMC45MS4xNQo2Ny4yMjAuOTEuMTgKNjcuMjIwLjkxLjIz -Cgp8aHR0cDovLyouc2YubmV0Ci5zZmlsZXlkeS5jb20KfHxzZnNoaWJhby5jb20K -LnNmdGluZGlhLm9yZwouc2Z0dWsub3JnCnx8c2Z0dWsub3JnCnNoYWRvdy5tYQou -c2hhZG93c2t5Lnh5egouc2hhZG93c29ja3Mub3JnCnx8c2hhZG93c29ja3Mub3Jn -CnxodHRwOi8vY24uc2hhZmFxbmEuY29tCnNoYWhhbWF0LWVuZ2xpc2guY29tCi5z -aGFtYmhhbGFzdW4uY29tCi5zaGFuZ2Zhbmcub3JnCnx8c2hhbmdmYW5nLm9yZwpz -aGFwZXNlcnZpY2VzLmNvbQouc2hhcmViZWUuY29tCnx8c2hhcmVjb29sLm9yZwoh -LS18fHNoYXJrZG9scGhpbi5jb20Kc2hhcnBkYWlseS5jb20uaGsKfHxzaGFycGRh -aWx5LmNvbS5oawouc2hhcnBkYWlseS5oawouc2hhcnBkYWlseS50dwouc2hhdC10 -aWJldC5jb20Kc2hlaWt5ZXJtYW1pLmNvbQouc2hlbGxmaXJlLmRlCnx8c2hlbGxm -aXJlLmRlCi5zaGVuc2hvdS5vcmcKc2hlbnl1bi5jb20Kc2hlbnl1bnBlcmZvcm1p -bmdhcnRzLm9yZwp8fHNoZW55dW5wZXJmb3JtaW5nYXJ0cy5vcmcKc2hlbnpob3Vm -aWxtLmNvbQp8fHNoZW56aG91ZmlsbS5jb20KfHxzaGVyYWJneWFsdHNlbi5jb20K -LnNoaWF0di5uZXQKLnNoaWNoZW5nLm9yZwpzaGlueWNoYW4uY29tCnNoaXBjYW1v -dWZsYWdlLmNvbQouc2hpdGFvdHYub3JnCnx8c2hpeGlhby5vcmcKfHxzaGl6aGFv -Lm9yZwpzaGl6aGFvLm9yZwpzaGtzcHIubW9iaS9kYWJyCnx8c2hvZGFuaHEuY29t -Ci5zaG9wMjAwMC5jb20udHcKLnNob3BwaW5nLmNvbQouc2hvd2hhb3R1LmNvbQou -c2hvd3RpbWUuanAKY2guc2h2b29uZy5jb20KLnNod2NodXJjaC5vcmcKLnNod2No -dXJjaDMuY29tCnxodHRwOi8vc2h3Y2h1cmNoMy5jb20KfHxzaWRlbGluZXNuZXdz -LmNvbQouc2lkZWxpbmVzc3BvcnRzZWF0ZXJ5LmNvbQouc2lqaWh1aXN1by5jb20K -c2ltcGxlY2Qub3JnCnx8c2ltcGxlY2Qub3JnCkBAfHxzaW1wbGVjZC5tZQpzaW1w -bGVwcm9kdWN0aXZpdHlibG9nLmNvbQpiYnMuc2luYS5jb20vCmJicy5zaW5hLmNv -bSUyRgpibG9nLnNpbmEuY29tLnR3CmRhaWx5bmV3cy5zaW5hLmNvbS8KZGFpbHlu -ZXdzLnNpbmEuY29tJTJGCmZvcnVtLnNpbmEuY29tLmhrCmhvbWUuc2luYS5jb20K -fHxtYWdhemluZXMuc2luYS5jb20udHcKbmV3cy5zaW5hLmNvbS5oawpuZXdzLnNp -bmEuY29tLnR3Cm5ld3Muc2luY2hldy5jb20ubXkKLnNpbmNoZXcuY29tLm15L25v -ZGUvCi5zaW5jaGV3LmNvbS5teS90YXhvbm9teS90ZXJtCi5zaW5nYXBvcmVwb29s -cy5jb20uc2cKfHxzaW5nYXBvcmVwb29scy5jb20uc2cKLnNpbmdmb3J0aWJldC5j -b20Kc2luZ3Rhby5jb20KfHxzaW5ndGFvLmNvbQpuZXdzLnNpbmd0YW8uY2EKIS0t +Ym9zY29wZS5qbXNjLmhrdS5oawouam1zY3VsdC5jb20KfGh0dHA6Ly9qbXNjdWx0 +LmNvbQp8fGpvYWNoaW1zLm9yZwp8fGpvYnNvLnR2Ci5zdW53aW5pc20uam9pbmJi +cy5uZXQKLmpvdXJuYWxjaHJldGllbi5uZXQKfHxqb3VybmFsb2ZkZW1vY3JhY3ku +b3JnCi5qb3ltaWlodWIuY29tCi5qb3lvdXJzZWxmLmNvbQpqcG9wZm9ydW0ubmV0 +Ci5qdWJ1c2hvdXNoZW4uY29tCnx8anVidXNob3VzaGVuLmNvbQohLS1Eb2FtaW4g +cGFya2luZwouanVodWFyZW4uY29tCnx8anVsaWVyZXljLmNvbQp8fGp1bmF1emEu +Y29tCi5qdW5lNGNvbW1lbW9yYXRpb24ub3JnCi5qdW5lZm91cnRoLTIwLm5ldAp8 +fGp1bmVmb3VydGgtMjAubmV0Cnx8YmJzLmp1bmdsb2JhbC5uZXQKLmp1b2FhLmNv +bQp8aHR0cDovL2p1b2FhLmNvbQpqdXN0ZnJlZXZwbi5jb20KLmp1c3RpY2Vmb3J0 +ZW56aW4ub3JnCmp1c3RwYXN0ZS5pdApqdXN0dHJpc3Rhbi5jb20KanV5dWFuZ2Uu +b3JnCmp1eml5dWUuY29tCnx8anV6aXl1ZS5jb20KfHxqd211c2ljLm9yZwpAQHx8 +bXVzaWMuandtdXNpYy5vcmcKLmp5eGYubmV0CgohLS0tLS0tLS0tLS0tLS0tLS0t +LS1LSy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KfHxrLWRvdWppbi5uZXQKfHxr +YS13YWkuY29tCi5rYWd5dS5vcmcKfHxrYWd5dS5vcmcuemEKLmthZ3l1bW9ubGFt +Lm9yZwoua2FneXVuZXdzLmNvbS5oawoua2FneXVvZmZpY2Uub3JnCnx8a2FneXVv +ZmZpY2Uub3JnCnx8a2FneXVvZmZpY2Uub3JnLnR3Ci5rYWl5dWFuLmRlCi5rYWth +by5jb20KfHxrYWthby5jb20KLmthbGFjaGFrcmFsdWdhbm8ub3JnCi5rYW5rYW4u +dG9kYXkKLmthbm5ld3lvcmsuY29tCnx8a2FubmV3eW9yay5jb20KLmthbnNoaWZh +bmcuY29tCnx8a2Fuc2hpZmFuZy5jb20KfHxrYW50aWUub3JnCmthbnpob25nZ3Vv +LmNvbQprYW56aG9uZ2d1by5ldQoua2FvdGljLmNvbQp8fGthcmF5b3UuY29tCmth +cmtodW5nLmNvbQoua2FybWFwYS5vcmcKLmthcm1hcGEtdGVhY2hpbmdzLm9yZwp8 +fGthd2FzZS5jb20KLmtiYS10eC5vcmcKLmtjb29sb25saW5lLmNvbQoua2VicnVt +LmNvbQp8fGtlYnJ1bS5jb20KLmtlY2hhcmEuY29tCi5rZWVwYW5kc2hhcmUuY29t +L3Zpc2l0L3Zpc2l0X3BhZ2UucGhwP2k9Njg4MTU0CiEtLXx8a2VlcHZpZC5jb20K +LmtlZXptb3ZpZXMuY29tCi5rZW5kaW5jb3MubmV0Ci5rZW5lbmdiYS5jb20KfHxr +ZW5lbmdiYS5jb20KfHxrZW9udGVjaC5uZXQKLmtlcGFyZC5jb20KfHxrZXBhcmQu +Y29tCndpa2kua2Vzby5jbi9Ib21lCnx8a2V5Y2RuLmNvbQoua2hhYmRoYS5vcmcK +LmtobXVzaWMuY29tLnR3Cnx8a2ljaGlrdS1kb3VqaW5rby5jb20KLmtpay5jb20K +fHxraWsuY29tCmJicy5raW15LmNvbS50dwoua2luZGxlcmVuLmNvbQp8aHR0cDov +L2tpbmRsZXJlbi5jb20KfGh0dHA6Ly93d3cua2luZGxlcmVuLmNvbQoua2luZ2Rv +bXNhbHZhdGlvbi5vcmcKfHxraW5nZG9tc2FsdmF0aW9uLm9yZwpraW5naG9zdC5j +b20KIS0tLmtpbmdzdG9uZS5jb20udHcvYm9vay8KfHxraW5nc3RvbmUuY29tLnR3 +Ci5raW5rLmNvbQpraWxsd2FsbC5jb20KfHxraWxsd2FsbC5jb20KfHxraW5tZW4u +dHJhdmVsCi5raXIuanAKLmtpc3NiYmFvLmNuCnxodHRwOi8va2l3aS5regp8fGtr +LXdoeXMuY28uanAKIS0tfHxrbXQub3JnLnR3Ci5rbXVoLm9yZy50dwoua25vd2xl +ZGdlcnVzaC5jb20va3IvZW5jeWNsb3BlZGlhCi5rb2JvLmNvbQp8fGtvYm8uY29t +Ci5rb2JvYm9va3MuY29tCnx8a29ib2Jvb2tzLmNvbQp8fGtvZGluZ2VuLmNvbQpA +QHx8d3d3LmtvZGluZ2VuLmNvbQp8fGtvbXBvemVyLm5ldAoua29uYWNoYW4uY29t +CnxodHRwOi8va29uYWNoYW4uY29tCi5rb25lLmNvbQp8fGtvb2xzb2x1dGlvbnMu +Y29tCi5rb29ybmsuY29tCnx8a29vcm5rLmNvbQp8fGtvcmFubWFuZGFyaW4uY29t +Ci5rb3JlbmFuMi5jb20KfGh0dHA6Ly9nb2pldC5rcnRjby5jb20udHcKLmtzZGwu +b3JnCi5rc25ld3MuY29tLnR3Cnx8a3R6aGsuY29tCi5rdWkubmFtZS9ldmVudApr +dW4uaW0KLmt1cmFzaHN1bHRhbi5jb20KfHxrdXJ0bXVuZ2VyLmNvbQprdXNvY2l0 +eS5jb20KfHxrd2NnLmNhCmt3b25nd2FoLmNvbS5teQoua3hzdy5saWZlCnx8a3hz +dy5saWZlCi5reW9mdW4uY29tCmt5b2hrLm5ldAp8fGt5b3l1ZS5jb20KLmt5enlo +ZWxsby5jb20KfHxreXp5aGVsbG8uY29tCi5remVuZy5pbmZvCnx8a3plbmcuaW5m +bwoKIS0tLS0tLS0tLS0tLS0tLS0tLS0tTEwtLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tCmxhLWZvcnVtLm9yZwpsYWRicm9rZXMuY29tCnx8bGFiaWVubmFsZS5vcmcK +LmxhZ3JhbmVwb2NhLmNvbQp8fGxhZ3JhbmVwb2NhLmNvbQoubGFsdWxhbHUuY29t +Ci5sYW1hLmNvbS50dwp8fGxhbWEuY29tLnR3Ci5sYW1heWVzaGUuY29tCnxodHRw +Oi8vbGFtYXllc2hlLmNvbQp8aHR0cDovL3d3dy5sYW1lbmh1LmNvbQoubGFtbmlh +LmNvLnVrCnx8bGFtbmlhLmNvLnVrCmxhbXJpbS5jb20KLmxhbnRlcm5jbi5jbgp8 +aHR0cDovL2xhbnRlcm5jbi5jbgoubGFudG9zZm91bmRhdGlvbi5vcmcKLmxhb2Qu +Y24KfGh0dHA6Ly9sYW9kLmNuCmxhb2dhaS5vcmcKfHxsYW9nYWkub3JnCmxhb21p +dS5jb20KLmxhb3lhbmcuaW5mbwp8aHR0cDovL2xhb3lhbmcuaW5mbwp8fGxhcHRv +cGxvY2tkb3duLmNvbQoubGFxaW5nZGFuLm5ldAp8fGxhcWluZ2Rhbi5uZXQKfHxs +YXJzZ2VvcmdlLmNvbQoubGFzdGNvbWJhdC5jb20KfGh0dHA6Ly9sYXN0Y29tYmF0 +LmNvbQp8fGxhc3RmbS5lcwpsYXRlbGluZW5ld3MuY29tCi5sYXRpYmV0Lm9yZwp8 +fGxlLXZwbi5jb20KLmxlYWZ5dnBuLm5ldAp8fGxlYWZ5dnBuLm5ldApsZWVhby5j +b20uY24vYmJzL2ZvcnVtLnBocAohLS18fGxlZWNoZXVreWFuLm9yZwpsZWZvcmEu +Y29tCnx8bGVmdDIxLmhrCi5sZWdhbHBvcm5vLmNvbQoubGVnc2phcGFuLmNvbQp8 +aHR0cDovL2xlaXJlbnR2LmNhCmxlaXN1cmVjYWZlLmNhCnx8bGVtYXRpbi5jaAou +bGVtb25kZS5mcgp8fGxlbndoaXRlLmNvbQpsZXJvc3VhLm9yZwp8fGxlcm9zdWEu +b3JnCmJsb2cubGVzdGVyODUwLmluZm8KfHxsZXNvaXIuYmUKLmxldG91LmNvbQps +ZXRzY29ycC5uZXQKfHxsZXRzY29ycC5uZXQKfHxzcy5sZXZ5aHN1LmNvbQohNjku +MTYuMTc1LjQyCnx8Y2RuLmFzc2V0cy5sZnBjb250ZW50LmNvbQoubGhha2FyLm9y +Zwp8aHR0cDovL2xoYWthci5vcmcKLmxoYXNvY2lhbHdvcmsub3JnCi5saWFuZ3lv +dS5uZXQKfHxsaWFuZ3lvdS5uZXQKLmxpYW55dWUubmV0Cnx8bGlhb3dhbmd4aXph +bmcubmV0Ci5saWFvd2FuZ3hpemFuZy5uZXQKfHxsaWJlcmFsLm9yZy5oawoubGli +ZXJ0eXRpbWVzLmNvbS50dwpibG9ncy5saWJyYXJ5aW5mb3JtYXRpb250ZWNobm9s +b2d5LmNvbS9qeHl6Ci5saWRlY2hlbmcuY29tL2Jsb2cvZnVja2luZy1nZncKLmxp +Z2h0ZW4ub3JnLnR3Ci5saWdodG5vdmVsLmNuCkBAfGh0dHBzOi8vd3d3LmxpZ2h0 +bm92ZWwuY24KbGltaWFvLm5ldApsaW5rdXN3ZWxsLmNvbQphYml0bm8ubGlucGll +LmNvbS91c2UtaXB2Ni10by1mdWNrLWdmdwp8fGxpbmUubWUKfHxsaW5lLWFwcHMu +Y29tCi5saW5nbGluZ2ZhLmNvbQp8fGxpbmd2b2RpY3MuY29tCi5saW5rLW8tcmFt +YS5jb20KfGh0dHA6Ly9saW5rLW8tcmFtYS5jb20KLmxpbmtpZGVvLmNvbQp8fGFw +aS5saW5rc2FscGhhLmNvbQp8fGFwaWRvY3MubGlua3NhbHBoYS5jb20KfHx3d3cu +bGlua3NhbHBoYS5jb20KfHxoZWxwLmxpbmtzYWxwaGEuY29tCnx8bGludXgub3Jn +LmhrCmxpbnV4dG95Lm9yZy9hcmNoaXZlcy9pbnN0YWxsaW5nLXdlc3QtY2hhbWJl +ci1vbi11YnVudHUKLmxpb25zcm9hci5jb20KLmxpcHVtYW4uY29tCnx8bGlxdWlk +dnBuLmNvbQp8fGdyZWF0ZmlyZS51czcubGlzdC1tYW5hZ2UuY29tCnx8bGlzdGVu +dG95b3V0dWJlLmNvbQpsaXN0b3Jpb3VzLmNvbQoubGl1LXhpYW9iby5vcmcKfHxs +aXVkZWp1bi5jb20KLmxpdWhhbnl1LmNvbQoubGl1amlhbnNodS5jb20KfHxsaXVq +aWFuc2h1LmNvbQoubGl1eGlhb2JvLm5ldAp8aHR0cDovL2xpdXhpYW9iby5uZXQK +bGl1eGlhb3RvbmcuY29tCnx8bGl1eGlhb3RvbmcuY29tCi5saXZlZG9vci5qcAou +bGl2ZWxlYWsuY29tCnx8bGl2ZWxlYWsuY29tCi5saXZlc3RhdGlvbi5jb20KbGl2 +ZXN0cmVhbS5jb20KfHxsaXZlc3RyZWFtLmNvbQp8fGxpdmluZ29ubGluZS51cwp8 +fGxpdmluZ3N0cmVhbS5jb20KfHxsaXZldmlkZW8uY29tCi5saXZldmlkZW8uY29t +Ci5saXdhbmd5YW5nLmNvbQpsaXpoaXpodWFuZ2JpLmNvbQpsa2NuLm5ldAoubGxz +cy5tZS8KLmxvYWQudG8KLmxvYnNhbmd3YW5neWFsLmNvbQoubG9jYWxkb21haW4u +d3MKfHxsb2NhbGRvbWFpbi53cwpsb2NhbHByZXNzaGsuY29tCnx8bG9ja2VzdGVr +LmNvbQpsb2dib3QubmV0Cnx8bG9naXF4LmNvbQpzZWN1cmUubG9nbWVpbi5jb20K +fHxzZWN1cmUubG9nbWVpbi5jb20KLmxvbmRvbmNoaW5lc2UuY2EKLmxvbmdoYWly +LmhrCmxvbmdtdXNpYy5jb20KfHxsb25ndGVybWx5Lm5ldAp8fGxvb2twaWMuY29t +Ci5sb29rdG9yb250by5jb20KfGh0dHA6Ly9sb29rdG9yb250by5jb20KLmxvdHNh +d2Fob3VzZS5vcmcvdGliZXRhbi1tYXN0ZXJzL2ZvdXJ0ZWVudGgtZGFsYWktbGFt +YQoubG90dXNsaWdodC5vcmcuaGsKLmxvdHVzbGlnaHQub3JnLnR3CmhrcmVwb3J0 +ZXIubG92ZWQuaGsKIS0tNDAzPwp8fGxwc2cuY29tCnx8bHJmei5jb20KLmxyaXAu +b3JnCnx8bHJpcC5vcmcKLmxzZC5vcmcuaGsKfHxsc2Qub3JnLmhrCmxzZm9ydW0u +bmV0Ci5sc20ub3JnCnx8bHNtLm9yZwoubHNtY2hpbmVzZS5vcmcKfHxsc21jaGlu +ZXNlLm9yZwoubHNta29yZWFuLm9yZwp8fGxzbWtvcmVhbi5vcmcKLmxzbXJhZGlv +LmNvbS9yYWRfYXJjaGl2ZXMKLmxzbXdlYmNhc3QuY29tCi5sdG4uY29tLnR3Cnxo +dHRwOi8vbHRuLmNvbS50dwoubHVrZTU0LmNvbQoubHVrZTU0Lm9yZwoubHVwbS5v +cmcKfHxsdXBtLm9yZwp8fGx1c2hzdG9yaWVzLmNvbQpsdXhlYmMuY29tCmx2aGFp +Lm9yZwp8fGx2aGFpLm9yZwp8fGx2djIuY29tCi5seWZoay5uZXQKfGh0dHA6Ly9s +eWZoay5uZXQKLmx6bXRuZXdzLm9yZwp8fGx6bXRuZXdzLm9yZwoKIS0tLS0tLS0t +LS0tLS0tLS0tLS0tTU0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmh0dHA6Ly8q +Lm0tdGVhbS5jYwohLS1tLXRlYW0uY2MvZm9ydW0KLm1hY3JvdnBuLmNvbQptYWN0 +cy5jb20udHcKfHxtYWQtYXIuY2gKfHxtYWRyYXUuY29tCnx8bWFkdGh1bWJzLmNv +bQp8fG1hZ2ljLW5ldC5pbmZvCm1haGFib2RoaS5vcmcKbXkubWFpbC5ydQoubWFp +cGx1cy5jb20KfGh0dHA6Ly9tYWlwbHVzLmNvbQoubWFpemhvbmcub3JnCm1ha2th +aG5ld3NwYXBlci5jb20KLm1hbWluZ3poZS5jb20KbWFuaWN1cjRpay5ydQoubWFw +bGV3LmNvbQp8aHR0cDovL21hcGxldy5jb20KfHxtYXJjLmluZm8KbWFyZ3Vlcml0 +ZS5zdQp8fG1hcnRpbmNhcnRvb25zLmNvbQptYXNrZWRpcC5jb20KLm1haWlvLm5l +dAptYWlsLWFyY2hpdmUuY29tCi5tYWxheXNpYWtpbmkuY29tCnx8bWFrZW15bW9v +ZC5jb20KLm1hbmNodWt1by5uZXQKLm1hbmlhc2guY29tCnxodHRwOi8vbWFuaWFz +aC5jb20KLm1hbnNpb24uY29tCi5tYW5zaW9ucG9rZXIuY29tCiEtLXx8bWFyaW5l +cy5taWwKIS0tbWFya21haWwub3JnKm1lc3NhZ2UKfHxtYXJ0YXUuY29tCnxodHRw +Oi8vYmxvZy5tYXJ0aW5vZWkuY29tCi5tYXJ0c2FuZ2thZ3l1b2ZmaWNpYWwub3Jn +CnxodHRwOi8vbWFydHNhbmdrYWd5dW9mZmljaWFsLm9yZwptYXJ1dGEuYmUvZm9y +Z2V0Ci5tYXJ4aXN0LmNvbQp8fG1hcnhpc3QubmV0Ci5tYXJ4aXN0cy5vcmcvY2hp +bmVzZQohLS18fG1hc2hhYmxlLmNvbQp8fG1hdGFpbmphLmNvbQp8fG1hdGhhYmxl +LmlvCnx8bWF0aGlldy1iYWRpbW9uLmNvbQp8fG1hdHN1c2hpbWFrYWVkZS5jb20K +fGh0dHA6Ly9tYXR1cmVqcC5jb20KbWF5aW1heWkuY29tCi5tYXhpbmcuanAKLm1j +YWYuZWUKfGh0dHA6Ly9tY2FmLmVlCnx8bWNhZGZvcnVtcy5jb20KbWNmb2cuY29t +Cm1jcmVhc2l0ZS5jb20KLm1kLXQub3JnCnx8bWQtdC5vcmcKfHxtZWFuc3lzLmNv +bQoubWVkaWEub3JnLmhrCi5tZWRpYWNoaW5lc2UuY29tCnx8bWVkaWFjaGluZXNl +LmNvbQoubWVkaWFmaXJlLmNvbS8/Ci5tZWRpYWZpcmUuY29tL2Rvd25sb2FkCi5t +ZWRpYWZyZWFrY2l0eS5jb20KfHxtZWRpYWZyZWFrY2l0eS5jb20KLm1lZGl1bS5j +b20KfHxtZWRpdW0uY29tCi5tZWV0YXYuY29tCnx8bWVldHVwLmNvbQptZWZlZWRp +YS5jb20KamloYWRpbnRlbC5tZWZvcnVtLm9yZwp8fG1lZ2EubnoKfHxtZWdhcHJv +eHkuY29tCnx8bWVnYXJvdGljLmNvbQptZWdhdmlkZW8uY29tCnx8bWVndXJpbmVs +dWthLmNvbQptZWlyaXhpYW9jaGFvLmNvbQoubWVsdG9kYXkuY29tCi5tZW1laGsu +Y29tCnx8bWVtZWhrLmNvbQptZW1vcnliYnMuY29tCi5tZW1yaS5vcmcKLm1lbXJp +anR0bS5vcmcKLm1lcmN5cHJvcGhldC5vcmcKfGh0dHA6Ly9tZXJjeXByb3BoZXQu +b3JnCi5tZXJpZGlhbi10cnVzdC5vcmcKfGh0dHA6Ly9tZXJpZGlhbi10cnVzdC5v +cmcKLm1lcmlwZXQuYml6CnxodHRwOi8vbWVyaXBldC5iaXoKLm1lcmlwZXQuY29t +CnxodHRwOi8vbWVyaXBldC5jb20KbWVyaXQtdGltZXMuY29tLnR3Cm1lc2hyZXAu +Y29tCi5tZXNvdHcuY29tL2JicwptZXRhY2FmZS5jb20vd2F0Y2gKfHxtZXRlb3Jz +aG93ZXJzb25saW5lLmNvbQp8aHR0cDovL3d3dy5tZXRyby50YWlwZWkvCi5tZXRy +b2hrLmNvbS5oay8/Y21kPWRldGFpbCZjYXRlZ29yeUlEPTIKfHxtZXRyb2xpZmUu +Y2EKLm1ldHJvcmFkaW8uY29tLmhrCnxodHRwOi8vbWV0cm9yYWRpby5jb20uaGsK +bWV5b3UuanAKLm1leXVsLmNvbQp8fG1nb29uLmNvbQp8fG1nc3RhZ2UuY29tCnx8 +bWg0dS5vcmcKbWhyYWRpby5vcmcKfGh0dHA6Ly9taWNoYWVsYW50aS5jb20KfHxt +aWNoYWVsbWFya2V0bC5jb20KLm1pY3JvdnBuLmNvbQp8aHR0cDovL21pY3JvdnBu +LmNvbQptaWRkbGUtd2F5Lm5ldAoubWloay5oay9mb3J1bQoubWloci5jb20KbWlo +dWEub3JnCiEtLUlQCnx8bWlrZXNvbHR5cy5jb20KLm1pbHBoLm5ldAp8aHR0cDov +L21pbHBoLm5ldAoubWlsc3VycHMuY29tCm1pbWlhaS5uZXQKLm1pbWl2aXAuY29t +Ci5taW1pdnYuY29tCi5taW5kcm9sbGluZy5vcmcKfGh0dHA6Ly9taW5kcm9sbGlu +Zy5vcmcKLm1pbmdodWkub3Iua3IKfGh0dHA6Ly9taW5naHVpLm9yLmtyCm1pbmdo +dWkub3JnCnx8bWluZ2h1aS5vcmcKbWluZ2h1aS1hLm9yZwptaW5naHVpLWIub3Jn +Cm1pbmdodWktc2Nob29sLm9yZwoubWluZ2ppbmdsaXNoaS5jb20KfHxtaW5namlu +Z2xpc2hpLmNvbQptaW5namluZ25ld3MuY29tCnx8bWluZ2ppbmd0aW1lcy5jb20K +Lm1pbmdwYW8uY29tCnx8bWluZ3Bhby5jb20KLm1pbmdwYW9jYW5hZGEuY29tCi5t +aW5ncGFvbW9udGhseS5jb20KfGh0dHA6Ly9taW5ncGFvbW9udGhseS5jb20KbWlu +Z3Bhb25ld3MuY29tCi5taW5ncGFvbnkuY29tCi5taW5ncGFvc2YuY29tCi5taW5n +cGFvdG9yLmNvbQoubWluZ3Bhb3Zhbi5jb20KLm1pbmdzaGVuZ2Jhby5jb20KLm1p +bmhodWUubmV0Ci5taW5pZm9ydW0ub3JnCi5taW5pc3RyeWJvb2tzLm9yZwoubWlu +emh1aHVhLm5ldAp8fG1pbnpodWh1YS5uZXQKbWluemh1emhhbnhpYW4uY29tCm1p +bnpodXpob25nZ3VvLm9yZwp8fG1pcm9ndWlkZS5jb20KbWlycm9yYm9va3MuY29t +Ci5taXN0LnZpcAp0aGVjZW50ZXIubWl0LmVkdQoubWl0YW8uY29tLnR3Ci5taXRi +YnMuY29tCnx8bWl0YmJzLmNvbQptaXRiYnNhdS5jb20KLm1peGVyby5jb20KfHxt +aXhlcm8uY29tCm1peHBvZC5jb20KLm1peHguY29tCnx8bWl4eC5jb20KfHxtaXp6 +bW9uYS5jb20KLm1rNTAwMC5jb20KLm1sY29vbC5jb20KfHxtbHpzLndvcmsKLm1t +LWNnLmNvbQp8fG1tYWF4eC5jb20KLm1tbWNhLmNvbQptbmV3c3R2LmNvbQp8fG1v +YmF0ZWsubmV0Ci5tb2JpbGUwMS5jb20KfHxtb2JpbGUwMS5jb20KfHxtb2JpbGV3 +YXlzLmRlCi5tb2J5cGljdHVyZS5jb20KfGh0dHA6Ly9tb2J5LnRvCnx8bW9lZXJv +bGlicmFyeS5jb20Kd2lraS5tb2VnaXJsLm9yZwoubW9mYXhpZWh1aS5jb20KLm1v +Zm9zLmNvbQp8fG1vZy5jb20KbW9saWh1YS5vcmcKfHxtb25kZXgub3JnCi5tb25l +eS1saW5rLmNvbS50dwp8aHR0cDovL21vbmV5LWxpbmsuY29tLnR3CnxodHRwOi8v +d3d3Lm1vbmxhbWl0Lm9yZwoubW9vbmJicy5jb20KfHxtb29uYmJzLmNvbQpjMTUy +Mi5tb29vLmNvbQp8fG1vbml0b3JjaGluYS5vcmcKYmJzLm1vcmJlbGwuY29tCnx8 +bW9ybmluZ3N1bi5vcmcKfHxtb3JvbmV0YS5jb20KLm1vdGhlcmxlc3MuY29tCnxo +dHRwOi8vbW90aGVybGVzcy5jb20KbW90b3I0aWsucnUKLm1vdXNlYnJlYWtlci5j +b20KIS0tfHxtb3ZhYmxldHlwZS5jb20KLm1vdmVtZW50cy5vcmcKfHxtb3ZlbWVu +dHMub3JnCnx8bW92aWVmYXAuY29tCnx8d3d3Lm1venR3Lm9yZwoubXAzYnVzY2Fk +b3IuY29tCm1wM3llLmV1Cnx8bXBldHRpcy5jb20KbXBmaW5hbmNlLmNvbQptcGlu +ZXdzLmNvbQptcG9ubGluZS5oawoubXF4ZC5vcmcKfGh0dHA6Ly9tcXhkLm9yZwpt +cnR3ZWV0LmNvbQp8fG1ydHdlZXQuY29tCm5ld3MuaGsubXNuLmNvbQpuZXdzLm1z +bi5jb20udHcKbXNndWFuY2hhLmNvbQoubXN3ZTEub3JnCnxodHRwOi8vbXN3ZTEu +b3JnCnx8bXRocnVmLmNvbQptdWNob3N1Y2tvLmNvbQp8fG11bHRpcGx5LmNvbQpt +dWx0aXByb3h5Lm9yZwptdWx0aXVwbG9hZC5jb20KLm11bGx2YWQubmV0Cnx8bXVs +bHZhZC5uZXQKLm11bW15c2dvbGQuY29tCi5tdXJtdXIudHcKfGh0dHA6Ly9tdXJt +dXIudHcKLm11c2ljYWRlLm5ldAoubXVzbGltdmlkZW8uY29tCnx8bXV6aS5jb20K +fHxtdXppLm5ldAp8fG14OTgxLmNvbQoubXktZm9ybW9zYS5jb20KLm15LXByb3h5 +LmNvbQoubXktcHJpdmF0ZS1uZXR3b3JrLmNvLnVrCnx8bXktcHJpdmF0ZS1uZXR3 +b3JrLmNvLnVrCmZvcnVtLm15OTAzLmNvbQoubXlhY3RpbWVzLmNvbS9hY3RpbWVz +Cnx8bXlhbm5pdS5jb20KLm15YXVkaW9jYXN0LmNvbQp8fG15YXVkaW9jYXN0LmNv +bQoubXlhdi5jb20udHcvYmJzCi5teWJicy51cwoubXljYTE2OC5jb20KLm15Y2Fu +YWRhbm93LmNvbQp8fGJicy5teWNoYXQudG8KfHxteWNoaW5hbXlob21lLmNvbQou +bXljaGluYW15aG9tZS5jb20KLm15Y2hpbmFuZXQuY29tCi5teWNoaW5hbmV3cy5j +b20KfHxteWNoaW5hbmV3cy5jb20KLm15Y2hpbmVzZS5uZXdzCnx8bXljbm5ld3Mu +Y29tCnx8bXlrb21pY2Eub3JnCm15Y291bGQuY29tL2Rpc2N1egoubXllYXN5dHYu +Y29tCnx8bXllY2xpcHNlaWRlLmNvbQoubXlmb3J1bS5jb20uaGsKfHxteWZvcnVt +LmNvbS5oawp8fG15Zm9ydW0uY29tLnVrCi5teWZyZWVjYW1zLmNvbQoubXlmcmVl +cGF5c2l0ZS5jb20KLm15ZnJlc2huZXQuY29tCi5teWlwaGlkZS5jb20KfHxteWlw +aGlkZS5jb20KZm9ydW0ubXltYWppLmNvbQpteW1lZGlhcm9tLmNvbS9maWxlcy9i +b3gKfHxteW1vZS5tb2UKfHxteW11c2ljLm5ldC50dwp8fG15cGFyYWdsaWRpbmcu +Y29tCnx8bXlwb3Blc2N1LmNvbQpteXJhZGlvLmhrL3BvZGNhc3QKLm15cmVhZGlu +Z21hbmdhLmluZm8KbXlzaW5hYmxvZy5jb20KLm15c3BhY2UuY29tCiEtLS5ibG9n +cy5teXNwYWNlLmNvbQohLS18fGJsb2dzLm15c3BhY2UuY29tCiEtLXZpZHMubXlz +cGFjZS5jb20vaW5kZXguY2ZtP2Z1c2VhY3Rpb249dmlkcy4KIS0tdmlld21vcmVw +aWNzLm15c3BhY2UuY29tCnx8bXlzcGFjZWNkbi5jb20KLm15dGFsa2JveC5jb20K +Lm15dGl6aS5jb20KCiEtLS0tLS0tLS0tLS0tLS0tLS0tLU5OLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLQp8fG5hYWNvYWxpdGlvbi5vcmcKb2xkLm5hYmJsZS5jb20K +fHxuYWl0aWsubmV0Ci5uYWt1ei5jb20vYmJzCnx8bmFsYW5kYWJvZGhpLm9yZwp8 +fG5hbGFuZGF3ZXN0Lm9yZwoubmFtZ3lhbC5vcmcKbmFtZ3lhbG1vbmFzdGVyeS5v +cmcKfHxuYW1zaXNpLmNvbQoubmFueWFuZy5jb20KfHxuYW55YW5nLmNvbQoubmFu +eWFuZ3Bvc3QuY29tCnx8bmFueWFuZ3Bvc3QuY29tCi5uYW56YW8uY29tCiEtLS5u +YW56YW8uY29tL3NjL2NoaW5hLzIwMjIzCiEtLS5uYW56YW8uY29tL3NjL2hrLW1h +Y2F1LXR3Cnx8anBsLm5hc2EuZ292Cnx8cGRzLm5hc2EuZ292Cnx8c29sYXJzeXN0 +ZW0ubmFzYS5nb3YKLm5ha2lkby5jb20KfHxuYWtpZG8uY29tCi5uYW9sLmNhCi5u +YW9sLmNjCnVpZ2h1ci5uYXJvZC5ydQoubmF0Lm1vZQp8fG5hdC5tb2UKY3liZXJn +aG9zdC5uYXRhZG8uY29tCnx8bmF0aW9uYWwtbG90dGVyeS5jby51awpuZXdzLm5h +dGlvbmFsZ2VvZ3JhcGhpYy5jb20vbmV3cy8yMDE0LzA2LzE0MDYwMy10aWFuYW5t +ZW4tc3F1YXJlCi5uYXRpb25zb25saW5lLm9yZy9vbmV3b3JsZC90aWJldAp8fGxp +bmUubmF2ZXIuanAKfHxuYXZ5ZmFtaWx5Lm5hdnkubWlsCnx8bmF2eXJlc2VydmUu +bmF2eS5taWwKfHxua28ubmF2eS5taWwKfHx1c25vLm5hdnkubWlsCm5hd2Vla2x5 +dGltZXMuY29tCi5uYnR2cG4uY29tCnxodHRwOi8vbmJ0dnBuLmNvbQpuY2N3YXRj +aC5vcmcudHcKLm5jaC5jb20udHcKLm5jbi5vcmcKfHxuY24ub3JnCnx8ZXRvb2xz +Lm5jb2wuY29tCi5uZGUuZGUKLm5kci5kZQoubmVkLm9yZwp8fG5la29zbG92YWtp +YS5uZXQKfHxuZXB1c29rdS5jb20KfHxuZXQtZml0cy5wcm8KIS0tYmJzbmV3Lm5l +dGJpZy5jb20KYmJzLm5ldGJpZy5jb20KLm5ldGJpcmRzLmNvbQpuZXRjb2xvbnku +Y29tCmJvbGluLm5ldGZpcm1zLmNvbQp8fG5ldG1lLmNjCm5ldHNuZWFrLmNvbQou +bmV0d29yazU0LmNvbQpuZXR3b3JrZWRibG9ncy5jb20KLm5ldHdvcmt0dW5uZWwu +bmV0Cm5ldmVyZm9yZ2V0ODk2NC5vcmcKbmV3LTNsdW5jaC5uZXQKLm5ldy1ha2li +YS5jb20KLm5ldzk2LmNhCi5uZXdjZW50dXJ5bWMuY29tCnxodHRwOi8vbmV3Y2Vu +dHVyeW1jLmNvbQpuZXdjZW50dXJ5bmV3cy5jb20KfHxuZXdjaGVuLmNvbQoubmV3 +Y2hlbi5jb20KLm5ld2dyb3VuZHMuY29tCm5ld2lwbm93LmNvbQoubmV3bGFuZG1h +Z2F6aW5lLmNvbS5hdQoubmV3bmV3cy5jYQpuZXdzMTAwLmNvbS50dwpuZXdzY2hp +bmFjb21tZW50Lm9yZwoubmV3c2NuLm9yZwp8fG5ld3Njbi5vcmcKbmV3c3BlYWsu +Y2Mvc3RvcnkKLm5ld3NhbmNhaS5jb20KfHxuZXdzYW5jYWkuY29tCi5uZXdzZGV0 +b3guY2EKLm5ld3NkaC5jb20KfHxuZXdzdGFtYWdvLmNvbQp8fG5ld3N0YXBhLm9y +ZwpuZXdzdGFybmV0LmNvbQoubmV3dGFpd2FuLmNvbS50dwpuZXd0YWxrLnR3Cnx8 +bmV3dGFsay50dwpuZXd5b3JrdGltZXMuY29tCnx8bmV4b24uY29tCi5uZXh0MTEu +Y28uanAKLm5leHRtYWcuY29tLnR3CgohLS1oayoubmV4dG1lZGlhLmNvbQohLS10 +dyoubmV4dG1lZGlhLmNvbQohLS1zdGF0aWMqLm5leHRtZWRpYS5jb20KLm5leHRt +ZWRpYS5jb20KCnx8bmV4dG9uLW5ldC5qcApuZXh0dHYuY29tLnR3Ci5uZmp0eWQu +Y29tCnx8Y28ubmcubWlsCnx8bmdhLm1pbApuZ2Vuc2lzLmNvbQoubmhlbnRhaS5u +ZXQKfGh0dHA6Ly9uaGVudGFpLm5ldAoubmhrLW9uZGVtYW5kLmpwCi5uaWNvdmlk +ZW8uanAvd2F0Y2gKIS0tfHxuaWNvdmlkZW8uanAKfHxuaWdob3N0Lm9yZwphdi5u +aWdodGxpZmUxNDEuY29tCm5pbmVjb21tZW50YXJpZXMuY29tCi5uaW5qYWNsb2Fr +LmNvbQp8fG5pbmphcHJveHkubmluamEKbmludGVuZGl1bS5jb20KdGFpd2FueWVz +Lm5pbmcuY29tCnVzbWd0Y2cubmluZy5jb20vZm9ydW0KfHxuaXVzbmV3cy5jb20K +fHxuamFjdGIub3JnCm5qdWljZS5jb20KfHxuanVpY2UuY29tCm5sZnJlZXZwbi5j +b20KCiEtLW5vLWlwLmNvbSNOT0lQCi5kZG5zLm5ldC8KLmdvb2RkbnMuaW5mbwp8 +fGdvdGRucy5jaAoubWFpbGRucy54eXoKLm5vLWlwLm9yZwoub3BlbmRuLnh5egou +c2VydmVodHRwLmNvbQpzeXRlcy5uZXQKLndob2Rucy54eXoKLnphcHRvLm9yZwp8 +aHR0cDovL2R5bnVwZGF0ZS5uby1pcC5jb20vCgp8fG5vYmVsLnNlCiEtLS5ub2Jl +bHByaXplLm9yZwohLS18aHR0cDovL25vYmVscHJpemUub3JnCm5vYmVscHJpemUu +b3JnL25vYmVsX3ByaXplcy9wZWFjZS9sYXVyZWF0ZXMvMTk4OQpub2JlbHByaXpl +Lm9yZy9ub2JlbF9wcml6ZXMvcGVhY2UvbGF1cmVhdGVzLzIwMTAKbm9ib2R5Y2Fu +c3RvcC51cwp8fG5vYm9keWNhbnN0b3AudXMKfHxub2tvZ2lyaS5vcmcKfHxub2tv +bGEuY29tCm5vb2RsZXZwbi5jb20KLm5vcmJ1bGluZ2thLm9yZwpub3JkdnBuLmNv +bQp8fG5vcmR2cG4uY29tCnx8bm92ZWxhc2lhLmNvbQoubmV3cy5ub3cuY29tCnxo +dHRwOi8vbmV3cy5ub3cuY29tCiEtLXxodHRwOi8vbmV3cy5ub3cuY29tL2hvbWUq +Cm5ld3Mubm93LmNvbSUyRmhvbWUKfHxub3duZXdzLmNvbQoubm93dG9ycmVudHMu +Y29tCi5ub3lwZi5jb20KfHxub3lwZi5jb20KfHxucGEuZ28uanAKLm5wbnQubWUK +fGh0dHA6Ly9ucG50Lm1lCi5ucHMuZ292Ci5ucmFkaW8ubWUKfGh0dHA6Ly9ucmFk +aW8ubWUKLm5yay5ubwp8fG5yay5ubwoubnRkLnR2Cnx8bnRkLnR2CiEhLS1Pcmln +Om50ZHR2LmNvbQoubnRkdHYuY29tCnx8bnRkdHYuY29tCi5udGR0di5jby5rcgpu +dGR0di5jYQpudGR0di5vcmcKbnRkdHYucnUKbnRkdHZsYS5jb20KLm50cmZ1bi5j +b20KfHxjYnMubnR1LmVkdS50dwp8fG1lZGlhLm51Lm5sCi5udWJpbGVzLm5ldAp8 +fG51ZXhwby5jb20KLm51a2lzdHJlYW0uY29tCnx8bnVyZ28tc29mdHdhcmUuY29t +Cnx8bnV0YWt1Lm5ldAoubnV2aWQuY29tCnx8bnZkc3QuY29tCm51emNvbS5jb20K +Lm52cXVhbi5vcmcKLm52dG9uZ3poaXNoZW5nLm9yZwp8aHR0cDovL252dG9uZ3po +aXNoZW5nLm9yZwoubnd0Y2Eub3JnCnxodHRwOi8vbnlhYS5ldQohLS18fG55YWEu +c2kKLm55ZHVzLmNhCm55bG9uLWFuZ2VsLmNvbQpueWxvbnN0b2NraW5nc29ubGlu +ZS5jb20KIS0tbnlzaW5ndGFvLmNvbQoubnpjaGluZXNlLmNvbQp8fG56Y2hpbmVz +ZS5uZXQubnoKCiEtLS0tLS0tLS0tLS0tLS0tLS0tLU9PLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLQpvYnNlcnZlY2hpbmEubmV0Ci5vYnV0dS5jb20Kb2Nhc3Byby5j +b20Kb2NjdXB5dGlhbmFubWVuLmNvbQpvY2xwLmhrCi5vY3JlYW1waWVzLmNvbQp8 +fG9jdG9iZXItcmV2aWV3Lm9yZwpvZmZiZWF0Y2hpbmEuY29tCm9mZmljZW9mdGli +ZXQuY29tCnxodHRwOi8vb2ZpbGUub3JnCnx8b2dhb2dhLm9yZwp0d3RyMnNyYy5v +Z2FvZ2Eub3JnCi5vZ2F0ZS5vcmcKfHxvZ2F0ZS5vcmcKd3d3Mi5vaGNoci5vcmcv +ZW5nbGlzaC9ib2RpZXMvY2F0L2RvY3Mvbmdvcy9JSV9DaGluYV80MS5wZGYKLm9p +a29zLmNvbS50dy92NAoub2lrdHYuY29tCm9pem9ibG9nLmNvbQoub2sucnUKfHxv +ay5ydQoub2theWZyZWVkb20uY29tCnx8b2theWZyZWVkb20uY29tCm9ray50dwp8 +aHR0cDovL2ZpbG15Lm9sYWJsb2dhLnBsL3BsYXllcgpvbGQtY2F0Lm5ldAp8fG9s +dW1wby5jb20KLm9seW1waWN3YXRjaC5vcmcKb21naWxpLmNvbQp8fG9tbml0YWxr +LmNvbQp8fG9tbml0YWxrLm9yZwpjbGluZy5vbXkuc2cKZm9ydW0ub215LnNnCm5l +d3Mub215LnNnCnNob3diaXoub215LnNnCnx8b24uY2MKfHxvbmVkcml2ZS5saXZl +LmNvbQp8fG9uaW9uLmNpdHkKLm9ubGluZWNoYS5jb20KfHxvbmxpbmV5b3V0dWJl +LmNvbQoub25seXR3ZWV0cy5jb20KfGh0dHA6Ly9vbmx5dHdlZXRzLmNvbQpvbm1v +b24ubmV0Cm9ubW9vbi5jb20KLm9udGhlaHVudC5jb20KfGh0dHA6Ly9vbnRoZWh1 +bnQuY29tCi5vb3BzZm9ydW0uY29tCm9wZW4uY29tLmhrCm9wZW5hbGx3ZWIuY29t +Cm9wZW5kZW1vY3JhY3kubmV0Cnx8b3BlbmRlbW9jcmFjeS5uZXQKLm9wZW5lcnZw +bi5pbgpvcGVuaWQubmV0Cnx8b3BlbmlkLm5ldAoub3BlbmxlYWtzLm9yZwp8fG9w +ZW5sZWFrcy5vcmcKb3BlbnZwbi5uZXQKfHxvcGVudnBuLm5ldAp8fG9wZW53ZWJz +dGVyLmNvbQoub3BlbndydC5vcmcuY24KQEB8fG9wZW53cnQub3JnLmNuCm15Lm9w +ZXJhLmNvbS9kYWhlbWEKfHxkZW1vLm9wZXJhLW1pbmkubmV0Ci5vcHVzLWdhbWlu +Zy5jb20KfGh0dHA6Ly9vcHVzLWdhbWluZy5jb20Kd3d3Lm9yY2hpZGJicy5jb20K +Lm9yZ2FuY2FyZS5vcmcudHcKb3JnYW5oYXJ2ZXN0aW52ZXN0aWdhdGlvbi5uZXQK +Lm9yZ2FzbS5jb20KLm9yZ2ZyZWUuY29tCnx8b3JpZW50LWRvbGwuY29tCm9yaWVu +dGFsZGFpbHkuY29tLm15Cnx8b3JpZW50YWxkYWlseS5jb20ubXkKIS0tb3JpZW50 +YWxkYWlseS5vbi5jYwp8fG9ybi5qcAp0Lm9yemRyZWFtLmNvbQp8fHQub3J6ZHJl +YW0uY29tCnR1aS5vcnpkcmVhbS5jb20KfHxvcnppc3RpYy5vcmcKfHxvc2Zvb3Jh +LmNvbQoub3RuZC5vcmcKfHxvdG5kLm9yZwp8fG90dG8uZGUKfHxvdXJkZWFyYW15 +LmNvbQpvdXJzb2dvLmNvbQoub3Vyc3RlcHMuY29tLmF1Cnx8b3Vyc3RlcHMuY29t +LmF1Ci5vdXJzd2ViLm5ldAp8fG91cnR2LmhrCnhpbnFpbWVuZy5vdmVyLWJsb2cu +Y29tCnx8b3ZlcnBsYXkubmV0CnNoYXJlLm92aS5jb20vbWVkaWEKfGh0dHA6Ly9v +d2wubGkKfGh0dHA6Ly9odC5seQp8aHR0cDovL2h0bC5saQp8aHR0cDovL21hc2gu +dG8Kd3d3Lm93aW5kLmNvbQp8aHR0cDovL3d3dy5veGlkLml0Cm95YXguY29tCm95 +Z2hhbi5jb20vd3BzCi5vemNoaW5lc2UuY29tL2Jicwp8fG93Lmx5CmJicy5vemNo +aW5lc2UuY29tCi5venZvaWNlLm9yZwp8fG96dm9pY2Uub3JnCi5venh3LmNvbQou +b3p5b3lvLmNvbQoKIS0tLS0tLS0tLS0tLS0tLS0tLS0tUFAtLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tCnx8cGFjaG9zdGluZy5jb20KLnBhY2lmaWNwb2tlci5jb20K +LnBhY2tldGl4Lm5ldAp8fHBhY29wYWNvbWFtYS5jb20KLnBhZG1hbmV0LmNvbQpw +YWdlMnJzcy5jb20KfHxwYWdvZGFib3guY29tCi5wYWxhY2Vtb29uLmNvbQpmb3J1 +bS5wYWxtaXNsaWZlLmNvbQp8fGVyaXZlcnNvZnQuY29tCi5wYWxkZW5neWFsLmNv +bQpwYWxqb3JwdWJsaWNhdGlvbnMuY29tCi5wYWx0YWxrLmNvbQohLS18fHBhbmdj +aS5uZXQKfHxwYW5kYXBvdy5jbwoucGFuZGFwb3cubmV0Ci5wYW5kYXZwbi1qcC5j +b20KLnBhbmx1YW4ubmV0Cnx8cGFubHVhbi5uZXQKfHxwYW8tcGFvLm5ldApwYXBl +ci5saQpwYXBlcmIudXMKLnBhcmFkaXNlaGlsbC5jYwoucGFyYWRpc2Vwb2tlci5j +b20KLnBhcnR5Y2FzaW5vLmNvbQoucGFydHlwb2tlci5jb20KLnBhc3Npb24uY29t +Cnx8cGFzc2lvbi5jb20KLnBhc3Npb250aW1lcy5oawpwYXN0ZWJpbi5jb20KLnBh +c3RpZS5vcmcKfHxwYXN0aWUub3JnCnx8YmxvZy5wYXRodG9zaGFyZXBvaW50LmNv +bQpwYnMub3JnL3dnYmgvcGFnZXMvZnJvbnRsaW5lL2dhdGUKcGJzLm9yZy93Z2Jo +L3BhZ2VzL2Zyb250bGluZS90YW5rbWFuCnBicy5vcmcvd2diaC9wYWdlcy9mcm9u +dGxpbmUvdGliZXQKdmlkZW8ucGJzLm9yZwoKIS0tUGJ3aWtpCnBid2lraS5jb20K +fHxwYndvcmtzLmNvbQp8fGRldmVsb3BlcnMuYm94Lm5ldAp8fHdpa2kub2F1dGgu +bmV0Cnx8d2lraS5waG9uZWdhcC5jb20KfHx3aWtpLmpxdWVyeXVpLmNvbQoKfHxw +Ynhlcy5jb20KfHxwYnhlcy5vcmcKcGNkdmQuY29tLnR3Ci5wY2hvbWUuY29tLnR3 +CnxodHRwOi8vcGNpai5vcmcKLnBjc3RvcmUuY29tLnR3Cnx8cGN0Lm9yZy50dwpw +ZGV0YWlscy5jb20KfHxwZHByb3h5LmNvbQp8fHBlYWNlLmNhCnBlYWNlZmlyZS5v +cmcKcGVhY2VoYWxsLmNvbQp8fHBlYWNlaGFsbC5jb20KfGh0dHA6Ly9wZWFybGhl +ci5vcmcKLnBlZWFzaWFuLmNvbQoucGVraW5nZHVjay5vcmcKfHxwZWtpbmdkdWNr +Lm9yZwoucGVtdWxpaGFuLm9yLmlkCnxodHRwOi8vcGVtdWxpaGFuLm9yLmlkCnx8 +cGVuLmlvCnBlbmNoaW5lc2UuY29tCnx8cGVuY2hpbmVzZS5uZXQKLnBlbmNoaW5l +c2UubmV0CnBlbmd5dWxvbmcuY29tCnBlbmlzYm90LmNvbQp8fGJsb2cucGVudGFs +b2dpYy5uZXQKLnBlbnRob3VzZS5jb20KLnBlbnRveS5oay8lRTQlQjglQUQlRTUl +OUMlOEIKLnBlbnRveS5oay8lRTYlOTklODIlRTQlQkElOEIKLnBlb3BsZWJvb2tj +YWZlLmNvbQoucGVvcGxlbmV3cy50dwp8fHBlb3BsZW5ld3MudHcKLnBlb3BvLm9y +Zwp8fHBlb3BvLm9yZwoucGVyY3kuaW4KLnBlcmZlY3RnaXJscy5uZXQKcGVyZmVj +dHZwbi5uZXQKLnBlcnNlY3V0aW9uYmxvZy5jb20KLnBlcnNpYW5raXR0eS5jb20K +cGZkLm9yZy5oawpwaGFwbHVhbi5vcmcKcGhheXVsLmNvbQpwaGlsYm9yZ2VzLmNv +bQpwaGlsbHkuY29tCnx8cGhuY2RuLmNvbQp8fHBob3RvZGhhcm1hLm5ldAp8fHBo +b3RvZm9jdXMuY29tCnx8cGh1cXVvY3NlcnZpY2VzLmNvbQp8fHBpY2Fjb21pY2Nu +LmNvbQoucGljaWRhZS5uZXQKfHxpbWcqLnBpY3R1cmVkaXAuY29tCnBpY3R1cmVz +b2NpYWwuY29tCnx8cGluLWNvbmcuY29tCi5waW42LmNvbQp8fHBpbjYuY29tCi5w +aW5nLmZtCnx8cGluZy5mbQp8fHBpbmltZy5jb20KLnBpbmtyb2QuY29tCnx8cGlu +b3ktbi5jb20KfHxwaW50ZXJlc3QuYXQKfHxwaW50ZXJlc3QuY28ua3IKfHxwaW50 +ZXJlc3QuY28udWsKLnBpbnRlcmVzdC5jb20KfHxwaW50ZXJlc3QuY29tCnx8cGlu +dGVyZXN0LmRlCnx8cGludGVyZXN0LmRrCnx8cGludGVyZXN0LmZyCnx8cGludGVy +ZXN0LmpwCnx8cGludGVyZXN0Lm5sCnx8cGludGVyZXN0LnNlCi5waXBpaS50dgou +cGlwb3NheS5jb20KcGlyYWF0dGlsYWh0aS5vcmcKLnBpcmluZy5jb20KfHxwaXhl +bHFpLmNvbQp8fGNzcy5waXhuZXQuaW4KfHxwaXhuZXQubmV0Ci5waXhuZXQubmV0 +Ci5way5jb20KfHxwbGFjZW1peC5jb20KIS0tLnBsYW5ldHN1enkub3JnCnxodHRw +Oi8vcGljdHVyZXMucGxheWJveS5jb20KfHxwbGF5Ym95LmNvbQoucGxheWJveXBs +dXMuY29tCnx8cGxheWJveXBsdXMuY29tCnx8cGxheWVyLmZtCi5wbGF5bm8xLmNv +bQp8fHBsYXlubzEuY29tCnx8cGxheXBjZXNvci5jb20KcGxheXMuY29tLnR3Cnx8 +bS5wbGl4aS5jb20KcGxtLm9yZy5oawpwbHVuZGVyLmNvbQoucGx1cmsuY29tCnx8 +cGx1cmsuY29tCi5wbHVzMjguY29tCi5wbHVzYmIuY29tCi5wbWF0ZWh1bnRlci5j +b20KfGh0dHA6Ly9wbWF0ZWh1bnRlci5jb20KLnBtYXRlcy5jb20KfHxwbzJiLmNv +bQpwb2JpZXJhbXkudG9wCiEtLXx8cG9jb28ub3JnCnx8cG9kaWN0aW9uYXJ5LmNv +bQoucG9rZXJzdGFycy5jb20KfHxwb2tlcnN0YXJzLmNvbQoucG9rZXJzdGFycy5u +ZXQKemgucG9rZXJzdHJhdGVneS5jb20KcG9saXRpY2FsY2hpbmEub3JnCnBvbGl0 +aWNhbGNvbnN1bHRhdGlvbi5vcmcKLnBvbGl0aXNjYWxlcy5uZXQKfHxwb2xvbmll +eC5jb20KLnBvbHltZXJoay5jb20KfGh0dHA6Ly9wb2x5bWVyaGsuY29tCi5wb3Bv +LnR3CiEtLXx8cG9wdWxhcnBhZ2VzLm5ldAp8fHBvcHZvdGUuaGsKcG9weWFyZC5j +b20KfHxwb3B5YXJkLm9yZwoucG9ybi5jb20KLnBvcm4yLmNvbQoucG9ybjUuY29t +Ci5wb3JuYmFzZS5vcmcKLnBvcm5lcmJyb3MuY29tCnx8cG9ybmhkLmNvbQoucG9y +bmhvc3QuY29tCi5wb3JuaHViLmNvbQp8fHBvcm5odWIuY29tCi5wb3JuaHViZGV1 +dHNjaC5uZXQKfGh0dHA6Ly9wb3JuaHViZGV1dHNjaC5uZXQKfHxwb3JubW0ubmV0 +Ci5wb3Jub3hvLmNvbQoucG9ybnJhcGlkc2hhcmUuY29tCnx8cG9ybnJhcGlkc2hh +cmUuY29tCi5wb3Juc2hhcmluZy5jb20KfGh0dHA6Ly9wb3Juc2hhcmluZy5jb20K +LnBvcm5zb2NrZXQuY29tCi5wb3Juc3RhcmNsdWIuY29tCnx8cG9ybnN0YXJjbHVi +LmNvbQoucG9ybnR1YmUuY29tCi5wb3JudHViZW5ld3MuY29tCi5wb3JudHZibG9n +LmNvbQp8fHBvcm50dmJsb2cuY29tCi5wb3JudmlzaXQuY29tCi5wb3J0YWJsZXZw +bi5ubAp8fHBvc2tvdGFuZXdzLmNvbQoucG9zdDAxLmNvbQoucG9zdDc2LmNvbQp8 +fHBvc3Q3Ni5jb20KLnBvc3Q4NTIuY29tCnBvc3RhZHVsdC5jb20KLnBvc3RpbWcu +b3JnCnx8cG90dnBuLmNvbQp8fHBvd2VyY3guY29tCi5wb3dlcnBob3RvLm9yZwp8 +fHd3dy5wb3dlcnBvaW50bmluamEuY29tCnx8cHJlc2lkZW50bGVlLnR3Cnx8Y2Ru +LnByaW50ZnJpZW5kbHkuY29tCi5wcml0dW5sLmNvbQpwcm92cG5hY2NvdW50cy5j +b20KfHxwcm92cG5hY2NvdW50cy5jb20KLnByb3hmcmVlLmNvbQp8fHByb3hmcmVl +LmNvbQpwcm94eWFub25pbW8uZXMKLnByb3h5bmV0d29yay5vcmcudWsKfHxwcm94 +eW5ldHdvcmsub3JnLnVrCnx8cHRzLm9yZy50dwoucHR0dmFuLm9yZwpwdWJ1LmNv +bS50dwpwdWZmaW5icm93c2VyLmNvbQpwdXJlaW5zaWdodC5vcmcKLnB1c2hjaGlu +YXdhbGwuY29tCi5wdXR0eS5vcmcKfHxwdXR0eS5vcmcKCiEtLS0tLS0tLS0tLS0t +UG9zdGVyb3VzLS0tLS0KfHxjYWxlYmVsc3Rvbi5jb20KfHxibG9nLmZpenppay5j +b20KfHxuZi5pZC5hdQp8fHNvZ3JhZHkubWUKfHx2YXRuLm9yZwp8fHZlbnR1cmVz +d2VsbC5jb20KfHx3aGVyZWlzd2VybmVyLmNvbQoKLnBvd2VyLmNvbQp8fHBvd2Vy +LmNvbQpwb3dlcmFwcGxlLmNvbQp8fHBvd2VyYXBwbGUuY29tCnx8YWJjLnBwLnJ1 +CmhlaXgucHAucnUKfHxwcmF5Zm9yY2hpbmEubmV0Cnx8cHJlbWVmb3J3aW5kb3dz +Ny5jb20KfHxwcmVzZW50YXRpb256ZW4uY29tCnx8cHJlc3RpZ2UtYXYuY29tCnBy +aXNvbmVyLXN0YXRlLXNlY3JldC1qb3VybmFsLXByZW1pZXIKLnByaXNvbmVyYWxl +cnQuY29tCnx8cHJpdHVubC5jb20KfHxwcml2YWN5Ym94LmRlCi5wcml2YXRlLmNv +bS9ob21lCnx8cHJpdmF0ZWludGVybmV0YWNjZXNzLmNvbQpwcml2YXRlcGFzdGUu +Y29tCnx8cHJpdmF0ZXBhc3RlLmNvbQpwcml2YXRldHVubmVsLmNvbQp8fHByaXZh +dGV0dW5uZWwuY29tCnx8cHJpdmF0ZXZwbi5jb20KfHxwcm9jb3B5dGlwcy5jb20K +cHJvdmlkZW9jb2FsaXRpb24uY29tCnx8cHJvc2liZW4uZGUKcHJveGlmaWVyLmNv +bQphcGkucHJveGxldC5jb20KfHxwcm94b21pdHJvbi5pbmZvCi5wcm94cG4uY29t +Cnx8cHJveHBuLmNvbQoucHJveHlsaXN0Lm9yZy51awp8fHByb3h5bGlzdC5vcmcu +dWsKLnByb3h5cHkubmV0Cnx8cHJveHlweS5uZXQKcHJveHlyb2FkLmNvbQoucHJv +eHl0dW5uZWwubmV0CiEtLTQwMyBtYXliZQp8fHByb3llY3RvY2x1YmVzLmNvbQpw +cm96ei5uZXQKcHNibG9nLm5hbWUKfHxwc2Jsb2cubmFtZQp8fHBzaXBob24uY2EK +LnBzaXBob24zLmNvbQp8fHBzaXBob24zLmNvbQoucHNpcGhvbnRvZGF5LmNvbQou +cHR0LmNjCnx8cHR0LmNjCi5wdWZmc3RvcmUuY29tCi5wdXVrby5jb20KfHxwdWxs +Zm9saW8uY29tCi5wdW55dS5jb20vcHVueQp8fHB1cmVjb25jZXB0cy5uZXQKfHxw +dXJlaW5zaWdodC5vcmcKfHxwdXJlcGRmLmNvbQp8fHB1cmV2cG4uY29tCi5wdXJw +bGVsb3R1cy5vcmcKLnB1cnN1ZXN0YXIuY29tCnx8cHVyc3Vlc3Rhci5jb20KLnB1 +c3N5c3BhY2UuY29tCi5wdXRpaG9tZS5vcmcKLnB1dGxvY2tlci5jb20vZmlsZQpw +d25lZC5jb20KcHl0aG9uLmNvbQoucHl0aG9uLmNvbS50dwp8aHR0cDovL3B5dGhv +bi5jb20udHcKcHl0aG9uaGFja2Vycy5jb20vcApzcy5weXRob25pYy5saWZlLwoK +IS0tLS0tLS0tLS0tLS0tLS0tLS0tUVEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +Ci5xYW5vdGUuY29tCnx8cWFub3RlLmNvbQoucWdpcmwuY29tLnR3Cnx8cWlhbmRh +by50b2RheQoucWktZ29uZy5tZQp8fHFpLWdvbmcubWUKIS0tIzkyMQp8fHFpYW5n +eW91Lm9yZwoucWlkaWFuLmNhCi5xaWVua3Vlbi5vcmcKfHxxaWVua3Vlbi5vcmcK +fHxxaXdlbi5sdQpxaXhpYW5nbHUuY24KYmJzLnFtemRkLmNvbQoucWtzaGFyZS5j +b20KcW9vcy5jb20KfHxxb29zLmNvbQpibG9nLnFvb3phLmhrL2RhZmVuZ3FpeGkK +fHxlZmtzb2Z0LmNvbQp8fHFzdGF0dXMuY29tCnx8cXR3ZWV0ZXIuY29tCnx8cXRy +YWMuZXUKLnF1YW5uZW5nc2hlbi5vcmcKfGh0dHA6Ly9xdWFubmVuZ3NoZW4ub3Jn +CnF1YW50dW1ib290ZXIubmV0Cnx8cXVpdGNjcC5uZXQKLnF1aXRjY3AubmV0Cnx8 +cXVpdGNjcC5vcmcKLnF1aXRjY3Aub3JnCi5xdW9yYS5jb20vQ2hpbmFzLUZ1dHVy +ZQoucXVyYW4uY29tCnxodHRwOi8vcXVyYW4uY29tCi5xdXJhbmV4cGxvcmVyLmNv +bQpxdXNpOC5uZXQKLnF2b2R6eS5vcmcKbmVtZXNpczIucXgubmV0L3BhZ2VzL015 +RW5UdW5uZWwKcXhiYnMub3JnCgohLS0tLS0tLS0tLS0tLS0tLS0tLS1SUi0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0KLnJhLmdnCnxodHRwOi8vcmEuZ2cvCi5yYWRp +Y2FscGFydHkub3JnCnx8cmFlbC5vcmcKcmFkaWNhbHBhcnR5Lm9yZwpyYWRpb2F1 +c3RyYWxpYS5uZXQuYXUKLnJhZGlvaGlsaWdodC5uZXQKfHxyYWRpb2hpbGlnaHQu +bmV0Cm9wbWwucmFkaW90aW1lLmNvbQp8fHJhZGlvdmF0aWNhbmEub3JnCnx8cmFk +aW92bmNyLmNvbQp8fHJhZ2dlZGJhbm5lci5jb20KfHxyYWlkY2FsbC5jb20udHcK +LnJhaWR0YWxrLmNvbS50dwoucmFpbmJvd3BsYW4ub3JnL2Jicwp8aHR0cHM6Ly9y +YWluZHJvcC5pby8KLnJhaXpvamkub3IuanAKfGh0dHA6Ly9yYWl6b2ppLm9yLmpw +CnJhbmd3YW5nLmJpegpyYW5nemVuLmNvbQpyYW5nemVuLm5ldApyYW5nemVuLm9y +Zwp8aHR0cDovL2Jsb2cucmFueGlhbmcuY29tLwpyYW55dW5mZWkuY29tCnx8cmFu +eXVuZmVpLmNvbQoucmFwYnVsbC5uZXQKfGh0dHA6Ly9yYXBpZGdhdG9yLm5ldC8K +fHxyYXBpZG1vdmllei5jb20KcmFwaWR2cG4uY29tCnx8cmFwaWR2cG4uY29tCi5y +YXJlbW92aWUuY2MKfGh0dHA6Ly9yYXJlbW92aWUuY2MKLnJhcmVtb3ZpZS5uZXQK +fGh0dHA6Ly9yYXJlbW92aWUubmV0Cnx8cmF3Z2l0LmNvbQp8fHJhd2dpdGh1Yi5j +b20KIS0tLnJheWZtZS5jb20vYmJzCnx8cmF6eWJvYXJkLmNvbQpyY2luZXQuY2EK +LnJlYWQxMDAuY29tCi5yZWFkaW5ndGltZXMuY29tLnR3Cnx8cmVhZGluZ3RpbWVz +LmNvbS50dwp8fHJlYWRtb28uY29tCi5yZWFkeWRvd24uY29tCnxodHRwOi8vcmVh +ZHlkb3duLmNvbQoucmVhbGNvdXJhZ2Uub3JnCi5yZWFsaXR5a2luZ3MuY29tCnx8 +cmVhbGl0eWtpbmdzLmNvbQoucmVhbHJhcHRhbGsuY29tCi5yZWFsc2V4cGFzcy5j +b20KLnJlY29yZGhpc3Rvcnkub3JnCi5yZWNvdmVyeS5vcmcudHcKfGh0dHA6Ly9v +bmxpbmUucmVjb3Zlcnl2ZXJzaW9uLm9yZwp8fHJlY292ZXJ5dmVyc2lvbi5jb20u +dHcKfHxyZWQtbGFuZy5vcmcKcmVkYmFsbG9vbnNvbGlkYXJpdHkub3JnCi5yZWRj +aGluYWNuLm5ldAp8aHR0cDovL3JlZGNoaW5hY24ubmV0CnJlZGNoaW5hY24ub3Jn +CnJlZHR1YmUuY29tCnJlZmVyZXIudXMKfHxyZWZlcmVyLnVzCnx8cmVmbGVjdGl2 +ZWNvZGUuY29tCnJlbGF4YmJzLmNvbQoucmVsYXkuY29tLnR3Ci5yZWxlYXNlaW50 +ZXJuYXRpb25hbC5vcmcKcmVsaWdpb3VzdG9sZXJhbmNlLm9yZwpyZW5taW5iYW8u +Y29tCnx8cmVubWluYmFvLmNvbQoucmVueXVyZW5xdWFuLm9yZwp8fHJlbnl1cmVu +cXVhbi5vcmcKfGh0dHA6Ly9jZXJ0aWZpY2F0ZS5yZXZvY2F0aW9uY2hlY2suY29t +CnN1YmFjbWUucmVyb3V0ZWQub3JnCnx8cmVzaWxpby5jb20KLnJldXRlcnMuY29t +Cnx8cmV1dGVycy5jb20KfHxyZXV0ZXJzbWVkaWEubmV0Ci5yZXZsZWZ0LmNvbQpy +ZXR3ZWV0aXN0LmNvbQp8fHJldHdlZXRyYW5rLmNvbQohLS1jb25uZWN0ZWRjaGlu +YS5yZXV0ZXJzLmNvbQohLS18aHR0cDovL3d3dy5yZXV0ZXJzLmNvbS9uZXdzL3Zp +ZGVvCnJldnZlci5jb20KLnJmYS5vcmcKfHxyZmEub3JnCi5yZmFjaGluYS5jb20K +LnJmYW1vYmlsZS5vcmcKcmZhd2ViLm9yZwp8fHJmZXJsLm9yZwoucmZpLmZyCnx8 +cmZpLmZyCnxodHRwOi8vcmZpLm15LwohLS0ucmhjbG91ZC5jb20KIS0tRWRnZWNh +c3QKfGh0dHA6Ly92ZHMucmlnaHRzdGVyLmNvbS8KLnJpZ3BhLm9yZwoucmlsZXln +dWlkZS5jb20KcmlrdS5tZS8KLnJpdG91a2kuanAKfHxyaXR0ZXIudmcKLnJsd2x3 +LmNvbQp8fHJsd2x3LmNvbQoucm1qZHcuY29tCi5ybWpkdzEzMi5pbmZvCi5yb2Fk +c2hvdy5oawoucm9ib2ZvcmV4LmNvbQp8fHJvYnVzdG5lc3Npc2tleS5jb20KIS0t +fHxyb2MtdGFpd2FuLm9yZwp8fHJvY2tldC1pbmMubmV0CnxodHRwOi8vd3d3Mi5y +b2NrZXRiYnMuY29tLzExL2Jicy5jZ2k/aWQ9NW11cwp8aHR0cDovL3d3dzIucm9j +a2V0YmJzLmNvbS8xMS9iYnMuY2dpP2lkPWZyZWVtZ2wKIS0tfHxyb2NtcC5vcmcK +fHxyb2pvLmNvbQp8fHJvbmpvbmVzd3JpdGVyLmNvbQp8fHJvbGlhLm5ldAoucm9v +ZG8uY29tCi5yb3NlY2hpbmEubmV0Ci5yb3R0ZW4uY29tCi5yc2Yub3JnCnx8cnNm +Lm9yZwoucnNmLWNoaW5lc2Uub3JnCnx8cnNmLWNoaW5lc2Uub3JnCi5yc2dhbWVu +Lm9yZwp8fHBob3NwaGF0aW9uMTMucnNzaW5nLmNvbQoucnNzbWVtZS5jb20KfHxy +c3NtZW1lLmNvbQp8fHJ0YWxhYmVsLm9yZwoucnRoay5oawp8aHR0cDovL3J0aGsu +aGsKLnJ0aGsub3JnLmhrCnxodHRwOi8vcnRoay5vcmcuaGsKLnJ0aS5vcmcudHcK +fHxydGkub3JnLnR3Ci5ydHljbWlubmVzb3RhLm9yZwoucnVhbnlpZmVuZy5jb20v +YmxvZypzb21lX3dheXNfdG9fYnJlYWtfdGhlX2dyZWF0X2ZpcmV3YWxsCnJ1a29y +Lm9yZwoucnVzaGJlZS5jb20KLnJ1dGVuLmNvbS50dwpydXR1YmUucnUKLnJ1eWlz +ZWVrLmNvbQoucnhoai5uZXQKfGh0dHA6Ly9yeGhqLm5ldAoKIS0tLS0tLS0tLS0t +LS0tLS0tLS0tU1MtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi5zMXMxczEuY29t +Cnx8cy1jdXRlLmNvbQoucy1kcmFnb24ub3JnCnx8czFoZW5nLmNvbQp8aHR0cDov +L3d3dy5zNG1pbmlhcmNoaXZlLmNvbQp8fHM4Zm9ydW0uY29tCmNkbjEubHAuc2Fi +b29tLmNvbQp8fHNhY2tzLmNvbQpzYWNvbS5oawp8fHNhY29tLmhrCnx8c2FkcGFu +ZGEudXMKLnNhZmVydnBuLmNvbQp8fHNhZmVydnBuLmNvbQouc2FpbnR5Y3VsdHVy +ZS5jb20KfGh0dHA6Ly9zYWludHljdWx0dXJlLmNvbQouc2FpcS5tZQp8fHNhaXEu +bWUKfHxzYWt1cmFsaXZlLmNvbQouc2FreWEub3JnCi5zYWx2YXRpb24ub3JnLmhr +Cnx8c2FsdmF0aW9uLm9yZy5oawouc2FtYWlyLnJ1L3Byb3h5L3R5cGUtMDEKLnNh +bWJob3RhLm9yZwouY24uc2FuZHNjb3RhaWNlbnRyYWwuY29tCnxodHRwOi8vY24u +c2FuZHNjb3RhaWNlbnRyYWwuY29tCi5zYW5taW4uY29tLnR3CnNhcGlrYWNodS5u +ZXQKc2F2ZW1lZGlhLmNvbQpzYXZldGliZXQuZGUKc2F2ZXRpYmV0LmZyCnNhdmV0 +aWJldC5ubAouc2F2ZXRpYmV0Lm9yZwp8fHNhdmV0aWJldC5vcmcKc2F2ZXRpYmV0 +LnJ1Ci5zYXZldGliZXRzdG9yZS5vcmcKfHxzYXZldGliZXRzdG9yZS5vcmcKc2F2 +ZXZpZC5jb20KfHxzYXkyLmluZm8KLnNibWUubWUKfGh0dHA6Ly9zYm1lLm1lCi5z +YnMuY29tLmF1L3lvdXJsYW5ndWFnZQouc2Nhc2luby5jb20KfGh0dHA6Ly93d3cu +c2NpZW5jZW1hZy5vcmcvY29udGVudC8zNDQvNjE4Ny85NTMKLnNjaWVuY2VuZXRz +LmNvbQouc2NtcC5jb20KLnNjbXBjaGluZXNlLmNvbQp8fHNjcmFtYmxlLmlvCi5z +Y3JpYmQuY29tCnx8c2NyaWJkLmNvbQp8fHNjcmlwdHNwb3QuY29tCnNlYXB1ZmYu +Y29tCmRvbWFpbmhlbHAuc2VhcmNoLmNvbQouc2VhcmNodHJ1dGguY29tCnNlY3Jl +dGNoaW5hLmNvbQp8fHNlY3JldGNoaW5hLmNvbQp8fHNlY3JldGdhcmRlbi5ubwou +c2VjcmV0c2xpbmUuYml6Cnx8c2VjcmV0c2xpbmUuYml6Cnx8c2VjdXJldHVubmVs +LmNvbQpzZWN1cml0eWluYWJveC5vcmcKfGh0dHBzOi8vc2VjdXJpdHlpbmFib3gu +b3JnCi5zZWN1cml0eWtpc3MuY29tCnx8c2VjdXJpdHlraXNzLmNvbQp8fHNlZWQ0 +Lm1lCm5ld3Muc2VlaHVhLmNvbQpzZWVzbWljLmNvbQp8fHNlZXZwbi5jb20KfHxz +ZWV6b25lLm5ldApzZWppZS5jb20KLnNlbmRzcGFjZS5jb20KfGh0dHA6Ly90d2Vl +dHMuc2VyYXBoLm1lLwpzZXNhd2UubmV0Cnx8c2VzYXdlLm5ldAouc2VzYXdlLm9y +Zwp8fHNldGh3a2xlaW4ubmV0Ci5zZXRuLmNvbQouc2V0dHYuY29tLnR3CmZvcnVt +LnNldHR5LmNvbS50dwouc2V2ZW5sb2FkLmNvbQp8fHNldmVubG9hZC5jb20KLnNl +eC5jb20KLnNleC0xMS5jb20KfHxzZXgzLmNvbQp8fHNleDguY2MKLnNleGFuZHN1 +Ym1pc3Npb24uY29tCi5zZXhib3QuY29tCi5zZXhodS5jb20KLnNleGh1YW5nLmNv +bQpzZXhpbnNleC5uZXQKfHxzZXhpbnNleC5uZXQKLnNleHR2eC5jb20KCiEtLUlQ +IG9mIFNleEluU2V4CjY3LjIyMC45MS4xNQo2Ny4yMjAuOTEuMTgKNjcuMjIwLjkx +LjIzCgp8aHR0cDovLyouc2YubmV0Ci5zZmlsZXlkeS5jb20KfHxzZnNoaWJhby5j +b20KLnNmdGluZGlhLm9yZwouc2Z0dWsub3JnCnx8c2Z0dWsub3JnCnx8c2hhZGV5 +b3V2cG4uY29tCnNoYWRvdy5tYQouc2hhZG93c2t5Lnh5egouc2hhZG93c29ja3Mu +YXNpYQp8fHd3dy5zaGFkb3dzb2Nrcy5jb20KLnNoYWRvd3NvY2tzLmNvbQp8fHNo +YWRvd3NvY2tzLmNvbS5oawouc2hhZG93c29ja3Mub3JnCnx8c2hhZG93c29ja3Mu +b3JnCnx8c2hhZG93c29ja3Mtci5jb20KfGh0dHA6Ly9jbi5zaGFmYXFuYS5jb20K +LnNoYW1iYWxhcG9zdC5jb20KLnNoYW1iaGFsYXN1bi5jb20KLnNoYW5nZmFuZy5v +cmcKfHxzaGFuZ2Zhbmcub3JnCnNoYXBlc2VydmljZXMuY29tCi5zaGFyZWJlZS5j +b20KfHxzaGFyZWNvb2wub3JnCiEtLXx8c2hhcmtkb2xwaGluLmNvbQpzaGFycGRh +aWx5LmNvbS5oawp8fHNoYXJwZGFpbHkuY29tLmhrCi5zaGFycGRhaWx5LmhrCi5z +aGFycGRhaWx5LnR3Ci5zaGF0LXRpYmV0LmNvbQpzaGVpa3llcm1hbWkuY29tCi5z +aGVsbGZpcmUuZGUKfHxzaGVsbGZpcmUuZGUKLnNoZW5zaG91Lm9yZwpzaGVueXVu +LmNvbQpzaGVueXVucGVyZm9ybWluZ2FydHMub3JnCnx8c2hlbnl1bnBlcmZvcm1p +bmdhcnRzLm9yZwpzaGVuemhvdWZpbG0uY29tCnx8c2hlbnpob3VmaWxtLmNvbQp8 +fHNoZXJhYmd5YWx0c2VuLmNvbQouc2hpYXR2Lm5ldAouc2hpY2hlbmcub3JnCnNo +aW55Y2hhbi5jb20Kc2hpcGNhbW91ZmxhZ2UuY29tCi5zaGlyZXlpc2h1bmppYW4u +Y29tCi5zaGl0YW90di5vcmcKfHxzaGl4aWFvLm9yZwp8fHNoaXpoYW8ub3JnCnNo +aXpoYW8ub3JnCnNoa3Nwci5tb2JpL2RhYnIKfHxzaG9kYW5ocS5jb20KfHxzaG9v +c2h0aW1lLmNvbQouc2hvcDIwMDAuY29tLnR3Ci5zaG9wcGluZy5jb20KLnNob3do +YW90dS5jb20KLnNob3d0aW1lLmpwCi5zaHV0dGVyc3RvY2suY29tCnx8c2h1dHRl +cnN0b2NrLmNvbQpjaC5zaHZvb25nLmNvbQouc2h3Y2h1cmNoLm9yZwp8fHd3dy5z +aHdjaHVyY2gub3JnCi5zaHdjaHVyY2gzLmNvbQp8aHR0cDovL3Nod2NodXJjaDMu +Y29tCi5zaWRkaGFydGhhc2ludGVudC5vcmcKfHxzaWRlbGluZXNuZXdzLmNvbQou +c2lkZWxpbmVzc3BvcnRzZWF0ZXJ5LmNvbQouc2lqaWh1aXN1by5jbHViCi5zaWpp +aHVpc3VvLmNvbQouc2lsa2Jvb2suY29tCnx8c2ltYm9sb3N0d2l0dGVyLmNvbQpz +aW1wbGVjZC5vcmcKfHxzaW1wbGVjZC5vcmcKQEB8fHNpbXBsZWNkLm1lCnNpbXBs +ZXByb2R1Y3Rpdml0eWJsb2cuY29tCmJicy5zaW5hLmNvbS8KYmJzLnNpbmEuY29t +JTJGCmJsb2cuc2luYS5jb20udHcKZGFpbHluZXdzLnNpbmEuY29tLwpkYWlseW5l +d3Muc2luYS5jb20lMkYKZm9ydW0uc2luYS5jb20uaGsKaG9tZS5zaW5hLmNvbQp8 +fG1hZ2F6aW5lcy5zaW5hLmNvbS50dwpuZXdzLnNpbmEuY29tLmhrCm5ld3Muc2lu +YS5jb20udHcKbmV3cy5zaW5jaGV3LmNvbS5teQouc2luY2hldy5jb20ubXkvbm9k +ZS8KLnNpbmNoZXcuY29tLm15L3RheG9ub215L3Rlcm0KLnNpbmdhcG9yZXBvb2xz +LmNvbS5zZwp8fHNpbmdhcG9yZXBvb2xzLmNvbS5zZwouc2luZ2ZvcnRpYmV0LmNv +bQouc2luZ3Bhby5jb20uaGsKc2luZ3Rhby5jb20KfHxzaW5ndGFvLmNvbQpuZXdz +LnNpbmd0YW8uY2EKLnNpbmd0YW91c2EuY29tCnx8c2luZ3Rhb3VzYS5jb20KIS0t fHxjZHAuc2luaWNhLmVkdS50dwpzaW5vLW1vbnRobHkuY29tCnx8c2lub2Nhc3Qu Y29tCnNpbm9jaXNtLmNvbQpzaW5vbW9udHJlYWwuY2EKLnNpbm9uZXQuY2EKLnNp bm9waXR0LmluZm8KLnNpbm9hbnRzLmNvbQp8fHNpbm9hbnRzLmNvbQouc2lub3F1 -ZWJlYy5jb20KfHxzaXRlOTAubmV0Ci5zaXRlYnJvLnR3Cnx8c2l0ZWtyZWF0b3Iu -Y29tCnx8c2l0ZWtzLnVrLnRvCnx8c2l0ZW1hcHMub3JnCnNpdGV0YWcudXMKc2lz -Lnh4eAp8fHNpczAwMS5jb20Kc2lzMDAxLnVzCi5zanJ0Lm9yZwp8aHR0cDovL3Nq -cnQub3JnCnx8c2p1bS5jbgp8fHNrZXRjaGFwcHNvdXJjZXMuY29tCnx8c2tpbXR1 -YmUuY29tCnx8c2t5YmV0LmNvbQp8aHR0cDovL3VzZXJzLnNreW5ldC5iZS9yZXZl -cy90aWJldGhvbWUuaHRtbAp8aHR0cDovL3NreWhpZ2hwcmVtaXVtLmNvbS8KYmJz -LnNreWtpd2kuY29tCnxodHRwOi8vd3d3LnNreXBlLmNvbS9pbnRsLwp8aHR0cDov -L3d3dy5za3lwZS5jb20vemgtSGFudAp8fHNreXZlZ2FzLmNvbQoueHNreXdhbGtl -ci5jb20KfHx4c2t5d2Fsa2VyLmNvbQptLnNsYW5kci5uZXQKfHxzbGF2YXNvZnQu -Y29tCi5zbGF5dGl6bGUuY29tCnx8c2xoZW5nLmNvbQouc2xpZGVzaGFyZS5uZXQK -Zm9ydW0uc2xpbWUuY29tLnR3Ci5zbGlua3NldC5jb20KfHxzbGlja3Zwbi5jb20K -LnNsdXRsb2FkLmNvbQpzbWNoYm9va3MuY29tCi5zbWguY29tLmF1L3dvcmxkL2Rl -YXRoLW9mLWNoaW5lc2UtcGxheWJveS1sZWF2ZXMtZnJlc2gtc2NyYXRjaGVzLWlu -LXBhcnR5LXBhaW50d29yay0yMDEyMDkwMy0yNWE4dgpzbWhyaWMub3JnCi5zbWl0 -aC5lZHUvZGFsYWlsYW1hCi5zbXl4eS5vcmcKIS0tVE9ETy1uby1ob21lcGFnZQp8 -fHNuYXBjaGF0LmNvbQouc25hcHR1LmNvbQp8fHNuYXB0dS5jb20KfHxzbmRjZG4u -Y29tCnNuZWFrbWUubmV0Cnx8c25vb3Blci5jby51awpzbm93bGlvbnB1Yi5jb20K -fHxzby1nYS5uZXQKLnNvLWdhLm5ldAp8fHNvLW5ld3MuY29tCi5zby1uZXdzLmNv -bQpob21lLnNvLW5ldC5uZXQudHcveWlzYV90c2FpCnx8c29jLm1pbAp8fHNvY2tz -bGlzdC5uZXQKLnNvY3JlYy5vcmcKfGh0dHA6Ly9zb2NyZWMub3JnCi5zb2QuY28u -anAKLnNvZnRldGhlci5vcmcKfHxzb2Z0ZXRoZXIub3JnCi5zb2Z0ZXRoZXItZG93 -bmxvYWQuY29tCnx8c29mdGV0aGVyLWRvd25sb2FkLmNvbQp8fGNkbi5zb2Z0bGF5 -ZXIubmV0Cnx8c29nY2x1Yi5jb20Kc29oY3JhZGlvLmNvbQp8fHNvaGNyYWRpby5j -b20KfHxzb3J0aW5nLWFsZ29yaXRobXMuY29tCi5zb3N0aWJldC5vcmcKLnNvdW1v -LmluZm8KfHxzb3VwLmlvCkBAfHxzdGF0aWMuc291cC5pbwouc29iZWVzLmNvbQp8 -fHNvYmVlcy5jb20Kc29jaWFsd2hhbGUuY29tCi5zb2Z0ZXRoZXIuY28uanAKfHxz -b2Z0d2FyZWJ5Y2h1Y2suY29tCmJsb2cuc29nb28ub3JnCnNvaC50dwp8fHNvaC50 -dwpzb2hmcmFuY2Uub3JnCnx8c29oZnJhbmNlLm9yZwpjaGluZXNlLnNvaWZpbmQu -Y29tCnNva2Ftb25saW5lLmNvbQp8fHNvbWVlLmNvbQouc29uZ2ppYW5qdW4uY29t +ZWJlYy5jb20KLnNpZXJyYWZyaWVuZHNvZnRpYmV0Lm9yZwpzaXMueHh4Cnx8c2lz +MDAxLmNvbQpzaXMwMDEudXMKLnNpdGUydW5ibG9jay5jb20KfHxzaXRlOTAubmV0 +Ci5zaXRlYnJvLnR3Cnx8c2l0ZWtyZWF0b3IuY29tCnx8c2l0ZWtzLnVrLnRvCnx8 +c2l0ZW1hcHMub3JnCi5zanJ0Lm9yZwp8aHR0cDovL3NqcnQub3JnCnx8c2p1bS5j +bgp8fHNrZXRjaGFwcHNvdXJjZXMuY29tCnx8c2tpbXR1YmUuY29tCnx8c2t5YmV0 +LmNvbQp8aHR0cDovL3VzZXJzLnNreW5ldC5iZS9yZXZlcy90aWJldGhvbWUuaHRt +bAouc2t5a2luZy5jb20udHcKYmJzLnNreWtpd2kuY29tCnxodHRwOi8vd3d3LnNr +eXBlLmNvbS9pbnRsLwp8aHR0cDovL3d3dy5za3lwZS5jb20vemgtSGFudAp8fHNr +eXZlZ2FzLmNvbQoueHNreXdhbGtlci5jb20KfHx4c2t5d2Fsa2VyLmNvbQp8fHNr +eXh2cG4uY29tCm0uc2xhbmRyLm5ldAouc2xheXRpemxlLmNvbQouc2xlYXp5ZHJl +YW0uY29tCnx8c2xoZW5nLmNvbQp8fHNsaWRlc2hhcmUubmV0CmZvcnVtLnNsaW1l +LmNvbS50dwouc2xpbmtzZXQuY29tCnx8c2xpY2t2cG4uY29tCi5zbHV0bG9hZC5j +b20KfHxzbWFydGRuc3Byb3h5LmNvbQouc21hcnRoaWRlLmNvbQp8fGFwcC5zbWFy +dG1haWxjbG91ZC5jb20Kc21jaGJvb2tzLmNvbQouc21oLmNvbS5hdS93b3JsZC9k +ZWF0aC1vZi1jaGluZXNlLXBsYXlib3ktbGVhdmVzLWZyZXNoLXNjcmF0Y2hlcy1p +bi1wYXJ0eS1wYWludHdvcmstMjAxMjA5MDMtMjVhOHYKc21ocmljLm9yZwouc21p +dGguZWR1L2RhbGFpbGFtYQouc215eHkub3JnCiEtLVRPRE8tbm8taG9tZXBhZ2UK +fHxzbmFwY2hhdC5jb20KLnNuYXB0dS5jb20KfHxzbmFwdHUuY29tCnx8c25kY2Ru +LmNvbQpzbmVha21lLm5ldApzbm93bGlvbnB1Yi5jb20KaG9tZS5zby1uZXQubmV0 +LnR3L3lpc2FfdHNhaQp8fHNvYy5taWwKLnNvY2tzY2FwNjQuY29tCnx8c29ja3Ns +aXN0Lm5ldAouc29jcmVjLm9yZwp8aHR0cDovL3NvY3JlYy5vcmcKLnNvZC5jby5q +cAouc29mdGV0aGVyLm9yZwp8fHNvZnRldGhlci5vcmcKLnNvZnRldGhlci1kb3du +bG9hZC5jb20KfHxzb2Z0ZXRoZXItZG93bmxvYWQuY29tCnx8Y2RuLnNvZnRsYXll +ci5uZXQKfHxzb2djbHViLmNvbQpzb2hjcmFkaW8uY29tCnx8c29oY3JhZGlvLmNv +bQouc29rbWlsLmNvbQp8fHNvcnRpbmctYWxnb3JpdGhtcy5jb20KLnNvc3RpYmV0 +Lm9yZwouc291bW8uaW5mbwp8fHNvdXAuaW8KQEB8fHN0YXRpYy5zb3VwLmlvCi5z +b2JlZXMuY29tCnx8c29iZWVzLmNvbQpzb2NpYWx3aGFsZS5jb20KLnNvZnRldGhl +ci5jby5qcAp8fHNvZnR3YXJlYnljaHVjay5jb20KYmxvZy5zb2dvby5vcmcKc29o +LnR3Cnx8c29oLnR3CnNvaGZyYW5jZS5vcmcKfHxzb2hmcmFuY2Uub3JnCmNoaW5l +c2Uuc29pZmluZC5jb20Kc29rYW1vbmxpbmUuY29tCi5zb2xpZGFyaXRldGliZXQu +b3JnCi5zb2xpZGZpbGVzLmNvbQp8fHNvbWVlLmNvbQouc29uZ2ppYW5qdW4uY29t Cnx8c29uZ2ppYW5qdW4uY29tCi5zb25pY2Jicy5jYwouc29uaWRvZGVsYWVzcGVy YW56YS5vcmcKLnNvcGNhc3QuY29tCi5zb3BjYXN0Lm9yZwouc29yYXpvbmUubmV0 Cnx8c29zLm9yZwpiYnMuc291LXRvbmcub3JnCi5zb3Vib3J5LmNvbQp8aHR0cDov @@ -1592,550 +2248,569 @@ b3VuZG9maG9wZS5vcmcKfHxzb3VuZG9maG9wZS5vcmcKfHxzb3Vwb2ZtZWRpYS5j b20KIS0tLnNvdXJjZWZvcmdlLm5ldAohLXxodHRwOi8vc291cmNlZm9yZ2UubmV0 CnxodHRwOi8vc291cmNlZm9yZ2UubmV0L3AqL3NoYWRvd3NvY2tzZ3VpLwouc291 cmNld2FkaW8uY29tCnNvdXRobmV3cy5jb20udHcKc293ZXJzLm9yZy5oawp8fHds -eC5zb3dpa2kubmV0Cnx8c3BhY2Utc2NhcGUuY29tCnx8c3BhbmtiYW5nLmNvbQou -c3Bhbmt3aXJlLmNvbQp8fHNwYi5jb20KfHxzcGVha2VyZGVjay5jb20Kc3BlbS5h -dAp8fHNwZW5jZXJ0aXBwaW5nLmNvbQp8fHNwaWNldnBuLmNvbQouc3Bpa2UuY29t -CnNwaW5lanMuY29tCi5zcG90Zmx1eC5jb20KfHxzcG90Zmx1eC5jb20KLnNwcmlu -ZzR1LmluZm8KfGh0dHA6Ly9zcHJpbmc0dS5pbmZvCnx8c3Byb3V0Y29yZS5jb20K -fHxzcHJveHkuaW5mbwpzcXVhcmVzcGFjZS5jb20KfHxzc2g5MS5jb20KLnNzcHJv -Lm1sCnxodHRwOi8vc3Nwcm8ubWwKIS0tfGh0dHA6Ly9jZG4uc3N0YXRpYy5uZXQv -CnNzdG1sdC5uZXQKfHxzc3RtbHQubmV0CnxodHRwOi8vc3RhY2tvdmVyZmxvdy5j -b20vdXNlcnMvODk1MjQ1Ci5zdGFnZTY0LmhrCnx8c3RhZ2U2NC5oawp8fHN0YW5k -dXBmb3J0aWJldC5vcmcKc3RhbmZvcmQuZWR1L2dyb3VwL2ZhbHVuCnVzaW5mby5z -dGF0ZS5nb3YKfHxzdGF0dWVvZmRlbW9jcmFjeS5vcmcKLnN0YXJmaXNoZnguY29t -Ci5zdGFycDJwLmNvbQp8fHN0YXJwMnAuY29tCi5zdGFydHBhZ2UuY29tCnx8c3Rh -cnRwYWdlLmNvbQouc3RhdGUxNjguY29tCnx8c3RhdGljLWVjb25vbWlzdC5jb20K -fHxzdGMuY29tLnNhCnN0ZWFtY29tbXVuaXR5LmNvbS9ncm91cHMvTGliZXRUaWJl -dApzdGVhbWNvbW11bml0eS5jb20vaWQvQ0pUX0phY2t0b24KfHxzdGVlbC1zdG9y -bS5jb20KLnN0ZXBjaGluYS5jb20KIS0tfHxzdGVwbWFuaWEuY29tCm55LnN0Z2xv -YmFsbGluay5jb20KaGQuc3RoZWFkbGluZS5jb20vbmV3cy9yZWFsdGltZQpzdGhv -by5jb20KfHxzdGhvby5jb20KLnN0aWNrYW0uY29tCnN0aWNrZXJhY3Rpb24uY29t -L3Nlc2F3ZQouc3RpbGVwcm9qZWN0LmNvbQouc3RvLmNjCnx8c3RvbmVpcC5pbmZv -Cnx8c3RvcmFnZW5ld3NsZXR0ZXIuY29tCi5zdG9ybS5tZwp8fHN0b3JtLm1nCi5z -dG9wdGliZXRjcmlzaXMubmV0Cnx8c3RvcHRpYmV0Y3Jpc2lzLm5ldAp8fHN0b3Jp -ZnkuY29tCi5zdG9ybW1lZGlhZ3JvdXAuY29tCnx8c3Rvd2Vib3lkLmNvbQpzdHJh -bmFiZy5jb20KfHxzdHJlYW1pbmd0aGUubmV0CnN0cmVlbWEuY29tL3R2L05URFRW -X0NoaW5lc2UKY24uc3RyZWV0dm9pY2UuY29tL2FydGljbGUKY24uc3RyZWV0dm9p -Y2UuY29tL2RpYXJ5CmNuMi5zdHJlZXR2b2ljZS5jb20KdHcuc3RyZWV0dm9pY2Uu -Y29tCnx8c3Ryb25ndnBuLmNvbQouc3Ryb25nd2luZHByZXNzLmNvbQouc3R1ZGVu -dC50dy9kYgp8fHN0dWRlbnRzZm9yYWZyZWV0aWJldC5vcmcKfHxzdHVtYmxldXBv -bi5jb20Kc3R1cGlkdmlkZW9zLmNvbQpwYW5hbWFwYXBlcnMuc3VlZGRldXRzY2hl -LmRlCi5zdWdhcnN5bmMuY29tCnx8c3VnYXJzeW5jLmNvbQouc3Vnb2Jicy5jb20K -fHxzdWlzc2wuY29tCnN1bW1pZnkuY29tCi5zdW1yYW5kby5jb20KfHxzdW1yYW5k -by5jb20Kc3VuMTkxMS5jb20KLnN1bnBvcm5vLmNvbQp8fHN1bm1lZGlhLmNhCnx8 -c3VucG9ybm8uY29tCi5zdW5za3lmb3J1bS5jb20KLnN1bnZwbi5uZXQKLnN1b2x1 -by5vcmcKLnN1cGVydnBuLm5ldAp8fHN1cGVydnBuLm5ldAouc3VwcmVtZW1hc3Rl -cnR2LmNvbQp8aHR0cDovL3N1cHJlbWVtYXN0ZXJ0di5jb20KLnN1cmZlYXN5LmNv -bQp8fHN1cmZlYXN5LmNvbQouc3VyZmVhc3kuY29tLmF1CnxodHRwOi8vc3VyZmVh -c3kuY29tLmF1Cnx8c3VycmVuZGVyYXQyMC5uZXQKLnN1eWFuZ2cuY29tCnxodHRw -Oi8vc3V5YW5nZy5jb20KfHxzdndpbmQuY29tCnx8c3dldXguY29tCi5zd2lzc3Zw -bi5uZXQKfHxzd2lzc3Zwbi5uZXQKc3dpdGNodnBuLm5ldAp8fHN3aXRjaHZwbi5u -ZXQKfHxzd2lmdC10b29scy5uZXQKLnN5ZG5leXRvZGF5LmNvbQouc3lsZm91bmRh -dGlvbi5vcmcKfHxzeW5jYmFjay5jb20KfHxzeXNhZG1pbjExMzgubmV0CnN5c3Jl -c2NjZC5vcmcKLnN5dGVzLm5ldApibG9nLnN5eDg2LmNvbS8yMDA5LzA5L3B1ZmYK -YmxvZy5zeXg4Ni5jbi8yMDA5LzA5L3B1ZmYKLnN6YmJzLm5ldAp8fHN6ZXRvd2Fo -Lm9yZy5oawoKIS0tLS0tLS0tLS0tLS0tLS0tLS0tVFQtLS0tLS0tLS0tLS0tLS0t -LS0tLS0tLS0tCi50MzUuY29tCi50NjZ5LmNvbQp8fHQ2NnkuY29tCnx8dDg4LmNh -Ci50YWEtdXNhLm9yZwp8aHR0cDovL3RhYS11c2Eub3JnCi50YWF6ZS50dwp8fHRh -YXplLnR3CnxodHRwOi8vd3d3LnRhYmxlc2dlbmVyYXRvci5jb20vCnRhYnR0ZXIu -anAKLnRhY2VtLm9yZwoudGFjb25ldC5jb20udHcKfHx0YWVkcC5vcmcudHcKfHx0 -YWZhd2FyZC5jb20KLnRhZm0ub3JnCi50YWd3YS5vcmcuYXUKdGFnd2Fsay5jb20K -fHx0YWd3YWxrLmNvbQp0YWhyLm9yZy50dwoudGFpcGVpc29jaWV0eS5vcmcKfHx0 -YWlwZWlzb2NpZXR5Lm9yZwoudGFpd2FuYmlibGUuY29tCi50YWl3YW5jb24uY29t -Ci50YWl3YW5kYWlseS5uZXQKfHx0YWl3YW5kYWlseS5uZXQKLnRhaXdhbmRjLm9y -Zwp8fHRhaXdhbmVtYmFzc3kub3JnCi50YWl3YW5qdXN0aWNlLmNvbQp0YWl3YW5r +eC5zb3dpa2kubmV0Cnx8c3BhbmtiYW5nLmNvbQouc3Bhbmtpbmd0dWJlLmNvbQou +c3Bhbmt3aXJlLmNvbQp8fHNwYi5jb20KfHxzcGVha2VyZGVjay5jb20KfHxzcGVl +ZGlmeS5jb20Kc3BlbS5hdAp8fHNwZW5jZXJ0aXBwaW5nLmNvbQp8fHNwaWNldnBu +LmNvbQouc3BpZGVyb2FrLmNvbQp8fHNwaWRlcm9hay5jb20KLnNwaWtlLmNvbQou +c3BvdGZsdXguY29tCnx8c3BvdGZsdXguY29tCi5zcHJpbmc0dS5pbmZvCnxodHRw +Oi8vc3ByaW5nNHUuaW5mbwp8fHNwcm91dGNvcmUuY29tCnx8c3Byb3h5LmluZm8K +fHxzcm9ja2V0LnVzCi5zcy1saW5rLmNvbQp8fHNzLWxpbmsuY29tCi5zc2dsb2Jh +bC5jby93cAp8aHR0cDovL3NzZ2xvYmFsLmNvCi5zc2dsb2JhbC5tZQp8fHNzaDkx +LmNvbQouc3Nwcm8ubWwKfGh0dHA6Ly9zc3Byby5tbAouc3Nyc2hhcmUuY29tCnx8 +c3Nyc2hhcmUuY29tCnx8c3NzLmNhbXAKIS0tfGh0dHA6Ly9jZG4uc3N0YXRpYy5u +ZXQvCnx8c3N0bWx0Lm1vZQpzc3RtbHQubmV0Cnx8c3N0bWx0Lm5ldAp8aHR0cDov +L3N0YWNrb3ZlcmZsb3cuY29tL3VzZXJzLzg5NTI0NQouc3RhZ2U2NC5oawp8fHN0 +YWdlNjQuaGsKfHxzdGFuZHVwZm9ydGliZXQub3JnCnN0YW5mb3JkLmVkdS9ncm91 +cC9mYWx1bgp1c2luZm8uc3RhdGUuZ292Cnx8c3RhdHVlb2ZkZW1vY3JhY3kub3Jn +Ci5zdGFyZmlzaGZ4LmNvbQouc3RhcnAycC5jb20KfHxzdGFycDJwLmNvbQouc3Rh +cnRwYWdlLmNvbQp8fHN0YXJ0cGFnZS5jb20KLnN0YXJ0dXBsaXZpbmdjaGluYS5j +b20KfGh0dHA6Ly9zdGFydHVwbGl2aW5nY2hpbmEuY29tCnx8c3RhdGljLWVjb25v +bWlzdC5jb20KfHxzdGMuY29tLnNhCnx8c3RlZWwtc3Rvcm0uY29tCi5zdGVnYW5v +cy5jb20KfHxzdGVnYW5vcy5jb20KLnN0ZWdhbm9zLm5ldAouc3RlcGNoaW5hLmNv +bQohLS18fHN0ZXBtYW5pYS5jb20Kbnkuc3RnbG9iYWxsaW5rLmNvbQpoZC5zdGhl +YWRsaW5lLmNvbS9uZXdzL3JlYWx0aW1lCnN0aG9vLmNvbQp8fHN0aG9vLmNvbQou +c3RpY2thbS5jb20Kc3RpY2tlcmFjdGlvbi5jb20vc2VzYXdlCi5zdGlsZXByb2pl +Y3QuY29tCi5zdG8uY2MKLnN0b3BvcmdhbmhhcnZlc3Rpbmcub3JnCnx8c3RvcmFn +ZW5ld3NsZXR0ZXIuY29tCi5zdG9ybS5tZwp8fHN0b3JtLm1nCi5zdG9wdGliZXRj +cmlzaXMubmV0Cnx8c3RvcHRpYmV0Y3Jpc2lzLm5ldAp8fHN0b3JpZnkuY29tCi5z +dG9ybW1lZGlhZ3JvdXAuY29tCnx8c3Rvd2Vib3lkLmNvbQpzdHJhbmFiZy5jb20K +fHxzdHJhcGxlc3NkaWxkby5jb20KfHxzdHJlYW1pbmd0aGUubmV0CnN0cmVlbWEu +Y29tL3R2L05URFRWX0NoaW5lc2UKY24uc3RyZWV0dm9pY2UuY29tL2FydGljbGUK +Y24uc3RyZWV0dm9pY2UuY29tL2RpYXJ5CmNuMi5zdHJlZXR2b2ljZS5jb20KdHcu +c3RyZWV0dm9pY2UuY29tCi5zdHJpa2luZ2x5LmNvbQp8fHN0cm9uZ3Zwbi5jb20K +LnN0cm9uZ3dpbmRwcmVzcy5jb20KLnN0dWRlbnQudHcvZGIKfHxzdHVkZW50c2Zv +cmFmcmVldGliZXQub3JnCnx8c3R1bWJsZXVwb24uY29tCnN0dXBpZHZpZGVvcy5j +b20KLnN1Y2Nlc3Nmbi5jb20KcGFuYW1hcGFwZXJzLnN1ZWRkZXV0c2NoZS5kZQou +c3VnYXJzeW5jLmNvbQp8fHN1Z2Fyc3luYy5jb20KLnN1Z29iYnMuY29tCnx8c3Vn +dW1pcnUxOC5jb20KfHxzdWlzc2wuY29tCnN1bW1pZnkuY29tCi5zdW1yYW5kby5j +b20KfHxzdW1yYW5kby5jb20Kc3VuMTkxMS5jb20KLnN1bnBvcm5vLmNvbQp8fHN1 +bm1lZGlhLmNhCnx8c3VucG9ybm8uY29tCi5zdW5za3lmb3J1bS5jb20KLnN1bnRh +LmNvbS50dwouc3VudnBuLm5ldAouc3VvbHVvLm9yZwouc3VwZXJmcmVldnBuLmNv +bQouc3VwZXJ2cG4ubmV0Cnx8c3VwZXJ2cG4ubmV0Ci5zdXBlcnpvb2kuY29tCnxo +dHRwOi8vc3VwZXJ6b29pLmNvbQouc3VwcGlnLm5ldAouc3VwcmVtZW1hc3RlcnR2 +LmNvbQp8aHR0cDovL3N1cHJlbWVtYXN0ZXJ0di5jb20KLnN1cmZlYXN5LmNvbQp8 +fHN1cmZlYXN5LmNvbQouc3VyZmVhc3kuY29tLmF1CnxodHRwOi8vc3VyZmVhc3ku +Y29tLmF1Cnx8c3VycmVuZGVyYXQyMC5uZXQKLnN1eWFuZ2cuY29tCnxodHRwOi8v +c3V5YW5nZy5jb20KLnN2c2Z4LmNvbQouc3dpc3N2cG4ubmV0Cnx8c3dpc3N2cG4u +bmV0CnN3aXRjaHZwbi5uZXQKfHxzd2l0Y2h2cG4ubmV0Ci5zeWRuZXl0b2RheS5j +b20KfHxzeWRuZXl0b2RheS5jb20KLnN5bGZvdW5kYXRpb24ub3JnCnx8c3luY2Jh +Y2suY29tCnN5c3Jlc2NjZC5vcmcKLnN5dGVzLm5ldApibG9nLnN5eDg2LmNvbS8y +MDA5LzA5L3B1ZmYKYmxvZy5zeXg4Ni5jbi8yMDA5LzA5L3B1ZmYKLnN6YmJzLm5l +dAouc3pldG93YWgub3JnLmhrCgohLS0tLS0tLS0tLS0tLS0tLS0tLS1UVC0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0KfHx0LWcuY29tCi50MzUuY29tCi50NjZ5LmNv +bQp8fHQ2NnkuY29tCi50YWEtdXNhLm9yZwp8aHR0cDovL3RhYS11c2Eub3JnCi50 +YWF6ZS50dwp8fHRhYXplLnR3CnxodHRwOi8vd3d3LnRhYmxlc2dlbmVyYXRvci5j +b20vCnRhYnR0ZXIuanAKLnRhY2VtLm9yZwoudGFjb25ldC5jb20udHcKfHx0YWVk +cC5vcmcudHcKLnRhZm0ub3JnCi50YWd3YS5vcmcuYXUKdGFnd2Fsay5jb20KfHx0 +YWd3YWxrLmNvbQp0YWhyLm9yZy50dwoudGFpcGVpc29jaWV0eS5vcmcKfHx0YWlw +ZWlzb2NpZXR5Lm9yZwoudGFpd2FuYmlibGUuY29tCi50YWl3YW5jb24uY29tCi50 +YWl3YW5kYWlseS5uZXQKfHx0YWl3YW5kYWlseS5uZXQKLnRhaXdhbmRjLm9yZwoh +LS18fHRhaXdhbmVtYmFzc3kub3JnCi50YWl3YW5qdXN0aWNlLmNvbQp0YWl3YW5r aXNzLmNvbQp0YWl3YW5uYXRpb24uY29tCnRhaXdhbm5hdGlvbi5jb20udHcKfHx0 YWl3YW5uY2Yub3JnLnR3Cnx8dGFpd2FubmV3cy5jb20udHcKfGh0dHA6Ly93d3cu -dGFpd2Fub25saW5lLmNjLwp8fHRhaXdhbnRvZGF5LnR3CnRhaXdhbnRwLm5ldAp8 -fHRhaXdhbnR0Lm9yZy50dwp0YWl3YW51cy5uZXQKdGFpd2FueWVzLmNvbQp0YWl3 -YW4tc2V4LmNvbQoudGFsazg1My5jb20KLnRhbGtib3hhcHAuY29tCnx8dGFsa2Jv -eGFwcC5jb20KLnRhbGtvbmx5Lm5ldAp8fHRhbGtvbmx5Lm5ldAp8fHRhbWlhb2Rl -LnRrCnx8dGFuYy5vcmcKdGFuZ2Jlbi5jb20KLnRhbmdyZW4udXMKLnRhb2lzbS5u -ZXQKfGh0dHA6Ly90YW9pc20ubmV0Ci50YW9sdW4uaW5mbwp8fHRhb2x1bi5pbmZv -CmJsb2cudGFyYWdhbmEuY29tCi50YXNjbi5jb20uYXUKfHx0YXVwLm5ldAp8aHR0 -cDovL3d3dy50YXVwLm9yZy50dwoudGF3ZWV0LmNvbQp8fHRhd2VldC5jb20KLnRi -Y29sbGVnZS5vcmcKfHx0YmNvbGxlZ2Uub3JnCi50Ymkub3JnLmhrCi50Ymljbi5v -cmcKLnRianl0Lm9yZwp8fHRicGljLmluZm8KdGJzLXJhaW5ib3cub3JnCnx8dGJz -ZWMub3JnCnRic2traW5hYmFsdS5wYWdlLnRsCi50YnNtYWxheXNpYS5vcmcKLnRi -c24ub3JnCnx8dGJzbi5vcmcKLnRic3NlYXR0bGUub3JnCi50YnNzcWgub3JnCnxo -dHRwOi8vdGJzc3FoLm9yZwp0YnN3ZC5vcmcKLnRidGVtcGxlLm9yZy51awoudGJ0 -aG91c3Rvbi5vcmcKLnRjY3dvbmxpbmUub3JnCi50Y2V3Zi5vcmcKdGNocmQub3Jn -CnRjbnluai5vcmcKdGVhbWFtZXJpY2FueS5jb20KfHx0ZWNobGlmZXdlYi5jb20K -IS0tdGVjaG5vcmF0aS5jb20KfHx0ZWNrLmluCi50ZWVuaWVmdWNrLm5ldAp0ZWVu -c2luYXNpYS5jb20KLnRlbGVjb21zcGFjZS5jb20KfHx0ZWxlZ3JhbS5vcmcKLnRl -bGVncmFtZG93bmxvYWQuY29tCnx8dGVsZWdyYXBoLmNvLnVrCi50ZW5hY3kuY29t -Ci50ZXcub3JnCi50aGFpY24uY29tCnx8dGhlYXRydW0tYmVsbGkuY29tCnx8dGhl -Ym9keXNob3AtdXNhLmNvbQp0aGVibGVtaXNoLmNvbQp8fHRoZWJjb21wbGV4LmNv -bQoudGhlYm9icy5jb20KfHx0aGVib2JzLmNvbQoudGhlY2hpbmFiZWF0Lm9yZwp8 -aHR0cDovL3d3dy50aGVjaGluYXN0b3J5Lm9yZy95ZWFyYm9va3MveWVhcmJvb2st -MjAxMi8KLnRoZWRhbGFpbGFtYW1vdmllLmNvbQp8aHR0cDovL3RoZWRhbGFpbGFt -YW1vdmllLmNvbQp8fHRoZWR3LnVzCnRoZWZyb250aWVyLmhrL3RmCiEtLXx8dGhl -Z2F0ZXNub3Rlcy5jb20KfGh0dHA6Ly90aGVnaW9pdGluaG9jLnZuLwoudGhlZ2x5 -LmNvbQoudGhlaG90cy5pbmZvCnRoZWhvdXNlbmV3cy5jb20KfHx0aGVodW4ubmV0 -Ci50aGVpbml0aXVtLmNvbQp8fHRoZWluaXRpdW0uY29tCnx8dGhlbGlmZXlvdWNh -bnNhdmUuY29tCi50aGVuZXdzbGVucy5jb20KdGhlcGlyYXRlYmF5Lm9yZwohLS18 -fHRoZXBpcmF0ZWJheS5zZQp0aGVyZWFsbG92ZS5rcgp0aGVyb2NrLm5ldC5uegp0 -aGVzcGVlZGVyLmNvbQp8fHRoZXN0YW5kbmV3cy5jb20KdGhldGliZXRjZW50ZXIu -b3JnCnRoZXRpYmV0Y29ubmVjdGlvbi5vcmcKLnRoZXRpYmV0bXVzZXVtLm9yZwou -dGhldGliZXRwb3N0LmNvbQp8fHRoZXRpYmV0cG9zdC5jb20KdGhldHJvdHNreW1v -dmllLmNvbQp0aGV2aXZla3Nwb3QuY29tCnx8dGhld2dvLm9yZwoudGhpbmtpbmd0 -YWl3YW4uY29tCi50aGlzYXYuY29tCnxodHRwOi8vdGhpc2F2LmNvbQoudGhsaWIu -b3JnCnx8dGhvbWFzYmVybmhhcmQub3JnCnRocmVhdGNoYW9zLmNvbQp8fHRocm91 -Z2huaWdodHNmaXJlLmNvbQoudGh1bWJ6aWxsYS5jb20KfHx0aHl3b3Jkcy5jb20K -LnRoeXdvcmRzLmNvbS50dwp0aWFuYW5tZW5tb3RoZXIub3JnCi50aWFuYW5tZW5k -dWl6aGkuY29tCnx8dGlhbmFubWVuZHVpemhpLmNvbQp8fHRpYW5hbm1lbnVuaXYu -Y29tCnx8dGlhbmFubWVudW5pdi5uZXQKfHx0aWFuZGl4aW5nLm9yZwoudGlhbmh1 -YXl1YW4uY29tCi50aWFubGF3b2ZmaWNlLmNvbQp8fHRpYW50aS5pbwp0aWFudGli -b29rcy5vcmcKLnRpYW56aHUub3JnCi50aWJldC5hdAp0aWJldC5jYQoudGliZXQu -Y29tCnx8dGliZXQuY29tCnRpYmV0LmZyCi50aWJldC5uZXQKfHx0aWJldC5uZXQK -dGliZXQubnUKLnRpYmV0Lm9yZwp8fHRpYmV0Lm9yZwp0aWJldC5vcmcudHcKLnRp -YmV0LnRvCi50aWJldC1lbnZveS5ldQp8fHRpYmV0LWVudm95LmV1Ci50aWJldC1m -b3VuZGF0aW9uLm9yZwoudGliZXQtaG91c2UtdHJ1c3QuY28udWsKdGliZXQtaW5m -by5uZXQKdGliZXQtaW5pdGlhdGl2ZS5kZQohLS18fHRpYmV0LWluaXRpYXRpdmUu -ZGUKLnRpYmV0LW11bmljaC5kZQoudGliZXQzcmRwb2xlLm9yZwp8aHR0cDovL3Rp -YmV0M3JkcG9sZS5vcmcKdGliZXRhY3Rpb24ubmV0Cnx8dGliZXRhY3Rpb24ubmV0 -Ci50aWJldGFpZC5vcmcKdGliZXRhbGsuY29tCi50aWJldGFuLmZyCnRpYmV0YW4t -YWxsaWFuY2Uub3JnCi50aWJldGFuYXJ0cy5vcmcKLnRpYmV0YW5idWRkaGlzdGlu -c3RpdHV0ZS5vcmcKfGh0dHA6Ly90aWJldGFuYnVkZGhpc3RpbnN0aXR1dGUub3Jn -Ci50aWJldGFubGFuZ3VhZ2Uub3JnCi50aWJldGFubGliZXJhdGlvbi5vcmcKfHx0 -aWJldGFubGliZXJhdGlvbi5vcmcKLnRpYmV0Y29sbGVjdGlvbi5jb20KLnRpYmV0 -YW5haWRwcm9qZWN0Lm9yZwoudGliZXRhbmNvbW11bml0eXVrLm5ldAp8aHR0cDov -L3RpYmV0YW5jb21tdW5pdHl1ay5uZXQKdGliZXRhbmN1bHR1cmUub3JnCnRpYmV0 -YW5mZW1pbmlzdGNvbGxlY3RpdmUub3JnCi50aWJldGFucGFpbnRpbmdzLmNvbQou -dGliZXRhbnBob3RvcHJvamVjdC5jb20KLnRpYmV0YW5wb2xpdGljYWxyZXZpZXcu -b3JnCi50aWJldGFucmV2aWV3Lm5ldAoudGliZXRhbndvbWVuLm9yZwp8aHR0cDov -L3RpYmV0YW53b21lbi5vcmcKLnRpYmV0YW55b3V0aC5vcmcKLnRpYmV0YW55b3V0 -aGNvbmdyZXNzLm9yZwp8fHRpYmV0YW55b3V0aGNvbmdyZXNzLm9yZwoudGliZXRj -aGFyaXR5LmRrCnRpYmV0Y2hhcml0eS5pbgoudGliZXRjaGlsZC5vcmcKLnRpYmV0 -Y2l0eS5jb20KLnRpYmV0Y29ycHMub3JnCi50aWJldGV4cHJlc3MubmV0CnxodHRw -Oi8vdGliZXRleHByZXNzLm5ldAp0aWJldGZvY3VzLmNvbQp0aWJldGZ1bmQub3Jn -Ci50aWJldGdlcm1hbnkuY29tCnx8dGliZXRnZXJtYW55LmRlCi50aWJldGhhdXMu -Y29tCi50aWJldGhlcml0YWdlZnVuZC5vcmcKdGliZXRob3VzZS5qcAp0aWJldGhv -dXNlLm9yZwp8fHRpYmV0aG91c2UudXMKLnRpYmV0aW5mb25ldC5uZXQKLnRpYmV0 -anVzdGljZS5vcmcKLnRpYmV0a29taXRlLmRrCnxodHRwOi8vdGliZXRtdXNldW0u -b3JnCnRpYmV0bmV0d29yay5vcmcKfHx0aWJldG5ldHdvcmsub3JnCi50aWJldG9m -ZmljZS5jaAp8aHR0cDovL3RpYmV0b2ZmaWNlLmNoCnRpYmV0b2ZmaWNlLmV1CnRp -YmV0b2ZmaWNlLm9yZwp0aWJldG9ubGluZS5jb20KfHx0aWJldG9ubGluZS5jb20K -LnRpYmV0b2ZmaWNlLmNvbS5hdQp8aHR0cDovL3RpYmV0b2ZmaWNlLmNvbS5hdQp8 -fHRpYmV0b25saW5lLnR2Ci50aWJldG9ubGluZS50dgoudGliZXRvcmFsaGlzdG9y -eS5vcmcKfGh0dHA6Ly90aWJldG9yYWxoaXN0b3J5Lm9yZwoudGliZXRwb2xpY3ku -ZXUKLnRpYmV0cmVsaWVmZnVuZC5jby51awp0aWJldHNpdGVzLmNvbQoudGliZXRz -b2NpZXR5LmNvbQp8fHRpYmV0c29jaWV0eS5jb20KLnRpYmV0c3VuLmNvbQoudGli -ZXRzdXBwb3J0Z3JvdXAub3JnCnxodHRwOi8vdGliZXRzdXBwb3J0Z3JvdXAub3Jn -Ci50aWJldHN3aXNzLmNoCi50aWJldHRlbGVncmFwaC5jb20KdGliZXR0aW1lcy5u -ZXQKfHx0aWJldHdyaXRlcy5vcmcKLnRpY2tldC5jb20udHcKLnRpbWRpci5jb20K -fGh0dHA6Ly90aW1kaXIuY29tCi50aW1lLmNvbQp8aHR0cDovL3RpbWUuY29tCiEt -LS50aW1lLmNvbS90aW1lL3RpbWUxMDAvbGVhZGVycy9wcm9maWxlL3JlYmVsCiEt -LS50aW1lLmNvbS90aW1lL3NwZWNpYWxzL3BhY2thZ2VzL2FydGljbGUvMCwyODgw -NAohLS0udGltZS5jb20vdGltZS9tYWdhemluZQoudGltc2FoLmNvbQp8fGJsb2cu -dGluZXkuY29tCnRpbnR1YzEwMS5jb20KLnRpbnkuY2MKfGh0dHA6Ly90aW55LmNj -CnRpbnljaGF0LmNvbQp8fHRpbnlwYXN0ZS5jb20KLnRpc3RvcnkuY29tCnx8dGtj -cy1jb2xsaW5zLmNvbQoudG1hZ2F6aW5lLmNvbQp8fHRtYWdhemluZS5jb20KLnRt -ZGZpc2guY29tCnxodHRwOi8vdG1pLm1lCi50bXBwLm9yZwp8aHR0cDovL3RtcHAu -b3JnCi50bmFmbGl4LmNvbQp8fHRuYWZsaXguY29tCi50bmdybm93LmNvbQoudG5n -cm5vdy5uZXQKLnRucC5vcmcKfGh0dHA6Ly90bnAub3JnCi50by1wb3Juby5jb20K -fHx0by1wb3Juby5jb20KdG9nZXR0ZXIuY29tCi50b2t5by0yNDcuY29tCi50b2t5 -by1ob3QuY29tCnx8dG9reW8tcG9ybi10dWJlLmNvbQp8fHRva3lvY24uY29tCnR3 -LnRvbW9uZXdzLm5ldAoudG9uZ2lsLm9yLmtyCi50b25vLW9rYS5qcAp0b255eWFu -Lm5ldAoudG9vZG9jLmNvbQp0b29uZWwubmV0CnRvcDgxLndzCi50b3BuZXdzLmlu -Cnx8dG9wc2hhcmUudXMKLnRvcmd1YXJkLm5ldAp8fHRvcmd1YXJkLm5ldAoudG9w -c2hhcmV3YXJlLmNvbQoudG9wc3kuY29tCnx8dG9wc3kuY29tCnx8dG9wdGlwLmNh -CnRvcmEudG8KLnRvcmNuLmNvbQoudG9ycHJvamVjdC5vcmcKfHx0b3Jwcm9qZWN0 -Lm9yZwp0b3JyZW50Y3JhenkuY29tCnx8dG9ycmVudGNyYXp5LmNvbQp0b3JyZW50 -cHJpdmFjeS5jb20KfHx0b3JyZW50cHJpdmFjeS5jb20KfHx0b3JyZW50cHJvamVj -dC5zZQp8fHRvcnJlbnR5Lm9yZwp8fHRvcnJlbnR6LmV1Cnx8dG9ydnBuLmNvbQp8 -fHRvdGFsdnBuLmNvbQp8fHRvdXRmci5jb20KdG93bmdhaW4uY29tCnRveXBhcmsu -aW4KdG95dHJhY3RvcnNob3cuY29tCi50cGFyZW50cy5vcmcKLnRwaS5vcmcudHcK -fHx0cGkub3JnLnR3CnRyYWZmaWNoYXVzLmNvbQp8fHRyYW5zZ3Jlc3Npb25pc20u -b3JnCnx8dHJhbnNwYXJlbmN5Lm9yZwp8fHRyYXZlbGlubG9jYWwuY29tCnx8dHJl -ZW1hbGwuY29tLnR3CnRyZW5kc21hcC5jb20KfHx0cmVuZHNtYXAuY29tCi50cmlh -bG9mY2NwLm9yZwp8fHRyaWFsb2ZjY3Aub3JnCi50cmltb25kaS5kZS9TRExFCnx8 -dHJpcG9kLmNvbQpAQHx8d3d3LnRyaXBvZC5jb20KLnRyb3V3Lm5sCnxodHRwOi8v -dHJvdXcubmwKLnRydC5uZXQudHIKdHJ0Yy5jb20udHcKLnRydWVidWRkaGEtbWQu -b3JnCnxodHRwOi8vdHJ1ZWJ1ZGRoYS1tZC5vcmcKdHJ1bHllcmdvbm9taWMuY29t -Cnx8dHJ1c3RlZGJpLmNvbQoudHJ1dGgxMDEuY28udHYKfGh0dHA6Ly90cnV0aDEw -MS5jby50dgp8fHRydXRoY24uY29tCi50cnV0aG9udG91ci5vcmcKfGh0dHA6Ly90 -cnV0aG9udG91ci5vcmcKLnRydXZlby5jb20KLnRzY3R2Lm5ldAoudHNlbXR1bGt1 -LmNvbQp0c3F1YXJlLnR2Ci50c3Uub3JnLnR3CnRzdW5hZ2FydW1vbi5jb20KIS0t -fGh0dHA6Ly93d3cudHN1cnUtYmlyZC5uZXQvCi50c2N0di5uZXQKfHx0dC1yc3Mu -b3JnCnx8dHQxMDY5LmNvbQoudHR0YW4uY29tCnx8dHR0YW4uY29tCmJiLnR0di5j -b20udHcvYmIKdHU4OTY0LmNvbQoudHVhbnp0LmNvbQoudHViYWhvbGljLmNvbQou -dHViZS5jb20KdHViZTguY29tCnx8dHViZTguY29tCi50dWJlOTExLmNvbQp8fHR1 -YmU5MTEuY29tCnR1YmVjYW8uY29tCi50dWJlY3VwLmNvbQoudHViZWdhbHMuY29t -Ci50dWJlaXNsYW0uY29tCnxodHRwOi8vdHViZWlzbGFtLmNvbQp8fHR1YmV3b2xm -LmNvbQp0dWlkYW5nLm5ldAp0dWlkYW5nLm9yZwoudHVpZGFuZy5zZQpiYnMudHVp -dHVpLmluZm8KLnR1bXV0YW56aS5jb20KfGh0dHA6Ly90dW11dGFuemkuY29tCi50 -dW5laW4uY29tCnxodHRwOi8vdHVuZWluLmNvbQp8fHR1bm5lbGJlYXIuY29tCi50 -dW84LmNjCi50dW84LmNsdWIKLnR1bzguaGsKLnR1bzguaW4KLnR1bzgubmluamEK -LnR1bzgub3JnCnx8dHVvOC5vcmcKLnR1bzgucHcKfGh0dHA6Ly90dW84LnB3CnR1 -aXR3aXQuY29tCi50dXJhbnNhbS5vcmcKLnR1cmJvYml0Lm5ldAp8aHR0cDovL3R1 -cmJvYml0Lm5ldAoudHVyYm9oaWRlLmNvbQp8fHR1cmJvaGlkZS5jb20KfHx0dXJu -aW5ndG9yc28uY29tCi50dXNoeWNhc2guY29tCnxodHRwOi8vdHVzaHljYXNoLmNv -bQoudHV2cG4uY29tCnx8dHV2cG4uY29tCnx8dHV4dHJhaW5pbmcuY29tCnxodHRw -Oi8vdHV6YWlqaWRpLmNvbQp8aHR0cDovLyoudHV6YWlqaWRpLmNvbQoudHcwMS5v -cmcKfGh0dHA6Ly90dzAxLm9yZwoKIS0tLVR1bWJsci0tLQoudHVtYmxyLmNvbQp8 -fHR1bWJsci5jb20KIS0tQEB8fGFzc2V0cy50dW1ibHIuY29tCiEtLUBAfHxkYXRh -LnR1bWJsci5jb20KIS0tQEB8fG1lZGlhLnR1bWJsci5jb20KIS0tQEB8fHN0YXRp -Yy50dW1ibHIuY29tCiEtLUBAfHx3d3cudHVtYmxyLmNvbQohLS1ibG9ja2Vkb253 -ZWliby50dW1ibHIuY29tCiEtLXx8ZnFyb3V0ZXIudHVtYmxyLmNvbQohLS1mYW5x -aWFuZ2thbi50dW1ibHIuY29tCiEtLWZ1YmFpY2hpbmEudHVtYmxyLmNvbQoKLnR2 -LmNvbQp8aHR0cDovL3R2LmNvbQp8fHR2LWludHJvcy5jb20KdHZhbnRzLmNvbQpm -b3J1bS50dmIuY29tCm5ld3MudHZiLmNvbS9saXN0L3dvcmxkCm5ld3MudHZiLmNv -bS9sb2NhbApuZXdzLnR2YnMuY29tLnR3Ci50dmJveG5vdy5jb20KfGh0dHA6Ly90 -dmJveG5vdy5jb20vCnR2aWRlci5jb20KLnR2bW9zdC5jb20uaGsKLnR2cGxheXZp -ZGVvcy5jb20KfHx0dnVuZXR3b3Jrcy5jb20KLnR3LW5wby5vcmcKLnR3YWl0dGVy +dGFpd2Fub25saW5lLmNjLwohLS18fHRhaXdhbnRvZGF5LnR3CnRhaXdhbnRwLm5l +dAp8fHRhaXdhbnR0Lm9yZy50dwp0YWl3YW51cy5uZXQKdGFpd2FueWVzLmNvbQp0 +YWl3YW4tc2V4LmNvbQoudGFsazg1My5jb20KLnRhbGtib3hhcHAuY29tCnx8dGFs +a2JveGFwcC5jb20KLnRhbGtvbmx5Lm5ldAp8fHRhbGtvbmx5Lm5ldAp8fHRhbWlh +b2RlLnRrCnx8dGFuYy5vcmcKdGFuZ2Jlbi5jb20KLnRhbmdyZW4udXMKLnRhb2lz +bS5uZXQKfGh0dHA6Ly90YW9pc20ubmV0Ci50YW9sdW4uaW5mbwp8fHRhb2x1bi5p +bmZvCi50YXBhdGFsay5jb20KfHx0YXBhdGFsay5jb20KYmxvZy50YXJhZ2FuYS5j +b20KLnRhc2NuLmNvbS5hdQp8fHRhdXAubmV0CnxodHRwOi8vd3d3LnRhdXAub3Jn +LnR3Ci50YXdlZXQuY29tCnx8dGF3ZWV0LmNvbQoudGJjb2xsZWdlLm9yZwp8fHRi +Y29sbGVnZS5vcmcKLnRiaS5vcmcuaGsKLnRiaWNuLm9yZwoudGJqeXQub3JnCnx8 +dGJwaWMuaW5mbwoudGJyYy5vcmcKdGJzLXJhaW5ib3cub3JnCi50YnNlYy5vcmcK +fHx0YnNlYy5vcmcKdGJza2tpbmFiYWx1LnBhZ2UudGwKLnRic21hbGF5c2lhLm9y +ZwoudGJzbi5vcmcKfHx0YnNuLm9yZwoudGJzc2VhdHRsZS5vcmcKLnRic3NxaC5v +cmcKfGh0dHA6Ly90YnNzcWgub3JnCnRic3dkLm9yZwoudGJ0ZW1wbGUub3JnLnVr +Ci50YnRob3VzdG9uLm9yZwoudGNjd29ubGluZS5vcmcKLnRjZXdmLm9yZwp0Y2hy +ZC5vcmcKdGNueW5qLm9yZwp8fHRjcHNwZWVkLmNvCi50Y3BzcGVlZC5jb20KfHx0 +Y3BzcGVlZC5jb20KLnRjc29mYmMub3JnCi50Y3Nvdmkub3JnCi50ZG0uY29tLm1v +CnRlYW1hbWVyaWNhbnkuY29tCiEtLU9WSAp8fHRlY2h2aXoubmV0Cnx8dGVjay5p +bgoudGVlbmllZnVjay5uZXQKdGVlbnNpbmFzaWEuY29tCi50ZWxlY29tc3BhY2Uu +Y29tCnx8dGVsZWdyYXBoLmNvLnVrCi50ZW5hY3kuY29tCnx8dGVuemlucGFsbW8u +Y29tCi50ZXcub3JnCi50aGFpY24uY29tCnx8dGhlYXRydW0tYmVsbGkuY29tCnRo +ZWJsZW1pc2guY29tCnx8dGhlYmNvbXBsZXguY29tCi50aGVib2JzLmNvbQp8fHRo +ZWJvYnMuY29tCi50aGVjaGluYWJlYXQub3JnCnxodHRwOi8vd3d3LnRoZWNoaW5h +c3Rvcnkub3JnL3llYXJib29rcy95ZWFyYm9vay0yMDEyLwoudGhlZGFsYWlsYW1h +bW92aWUuY29tCnxodHRwOi8vdGhlZGFsYWlsYW1hbW92aWUuY29tCnx8dGhlZHcu +dXMKdGhlZnJvbnRpZXIuaGsvdGYKY24udGhlZ2F5LmNvbQp8aHR0cDovL3RoZWdp +b2l0aW5ob2Mudm4vCi50aGVnbHkuY29tCi50aGVob3RzLmluZm8KdGhlaG91c2Vu +ZXdzLmNvbQp8fHRoZWh1bi5uZXQKLnRoZWluaXRpdW0uY29tCnx8dGhlaW5pdGl1 +bS5jb20KLnRoZW5ld3NsZW5zLmNvbQp8fHRoZW5ld3NsZW5zLmNvbQoudGhlcGly +YXRlYmF5Lm9yZwp8fHRoZXBpcmF0ZWJheS5vcmcKIS0tfHx0aGVwaXJhdGViYXku +c2UKfHx0aGVwb3J0YWx3aWtpLmNvbQp0aGVyZWFsbG92ZS5rcgp0aGVyb2NrLm5l +dC5uegp0aGVzcGVlZGVyLmNvbQp8fHRoZXN0YW5kbmV3cy5jb20KdGhldGliZXRj +ZW50ZXIub3JnCnRoZXRpYmV0Y29ubmVjdGlvbi5vcmcKLnRoZXRpYmV0bXVzZXVt +Lm9yZwoudGhldGliZXRwb3N0LmNvbQp8fHRoZXRpYmV0cG9zdC5jb20KIS0tVG9y +Cnx8dGhldGluaGF0LmNvbQp0aGV0cm90c2t5bW92aWUuY29tCnRoZXZpdmVrc3Bv +dC5jb20KfHx0aGV3Z28ub3JnCi50aGV5bmMuY29tCnxodHRwOi8vdGhleW5jLmNv +bQoudGhpbmtpbmd0YWl3YW4uY29tCi50aGlzYXYuY29tCnxodHRwOi8vdGhpc2F2 +LmNvbQoudGhsaWIub3JnCnx8dGhvbWFzYmVybmhhcmQub3JnCi50aG9uZ2RyZWFt +cy5jb20KdGhyZWF0Y2hhb3MuY29tCnx8dGhyb3VnaG5pZ2h0c2ZpcmUuY29tCi50 +aHVtYnppbGxhLmNvbQp8fHRoeXdvcmRzLmNvbQoudGh5d29yZHMuY29tLnR3CnRp +YW5hbm1lbm1vdGhlci5vcmcKLnRpYW5hbm1lbmR1aXpoaS5jb20KfHx0aWFuYW5t +ZW5kdWl6aGkuY29tCnx8dGlhbmFubWVudW5pdi5jb20KfHx0aWFuYW5tZW51bml2 +Lm5ldAp8fHRpYW5kaXhpbmcub3JnCi50aWFuaHVheXVhbi5jb20KLnRpYW5sYXdv +ZmZpY2UuY29tCnx8dGlhbnRpLmlvCnRpYW50aWJvb2tzLm9yZwp8fHRpYW50aWJv +b2tzLm9yZwp0aWFueWFudG9uZy5vcmcuY24KLnRpYW56aHUub3JnCi50aWJldC5h +dAp0aWJldC5jYQoudGliZXQuY29tCnx8dGliZXQuY29tCnRpYmV0LmZyCi50aWJl +dC5uZXQKfHx0aWJldC5uZXQKdGliZXQubnUKLnRpYmV0Lm9yZwp8fHRpYmV0Lm9y +ZwoudGliZXQuc2sKdGliZXQub3JnLnR3Ci50aWJldC50bwoudGliZXQtZW52b3ku +ZXUKfHx0aWJldC1lbnZveS5ldQoudGliZXQtZm91bmRhdGlvbi5vcmcKLnRpYmV0 +LWhvdXNlLXRydXN0LmNvLnVrCnRpYmV0LWluZm8ubmV0CnRpYmV0LWluaXRpYXRp +dmUuZGUKfHx0aWJldC1pbml0aWF0aXZlLmRlCi50aWJldC1tdW5pY2guZGUKLnRp +YmV0M3JkcG9sZS5vcmcKfGh0dHA6Ly90aWJldDNyZHBvbGUub3JnCnRpYmV0YWN0 +aW9uLm5ldAp8fHRpYmV0YWN0aW9uLm5ldAoudGliZXRhaWQub3JnCnRpYmV0YWxr +LmNvbQoudGliZXRhbi5mcgp0aWJldGFuLWFsbGlhbmNlLm9yZwoudGliZXRhbmFy +dHMub3JnCi50aWJldGFuYnVkZGhpc3RpbnN0aXR1dGUub3JnCnxodHRwOi8vdGli +ZXRhbmJ1ZGRoaXN0aW5zdGl0dXRlLm9yZwp0aWJldGFuY29tbXVuaXR5Lm9yZwou +dGliZXRhbmpvdXJuYWwuY29tCi50aWJldGFubGFuZ3VhZ2Uub3JnCi50aWJldGFu +bGliZXJhdGlvbi5vcmcKfHx0aWJldGFubGliZXJhdGlvbi5vcmcKLnRpYmV0Y29s +bGVjdGlvbi5jb20KLnRpYmV0YW5haWRwcm9qZWN0Lm9yZwoudGliZXRhbmNvbW11 +bml0eXVrLm5ldAp8aHR0cDovL3RpYmV0YW5jb21tdW5pdHl1ay5uZXQKdGliZXRh +bmN1bHR1cmUub3JnCnRpYmV0YW5mZW1pbmlzdGNvbGxlY3RpdmUub3JnCi50aWJl +dGFucGFpbnRpbmdzLmNvbQoudGliZXRhbnBob3RvcHJvamVjdC5jb20KLnRpYmV0 +YW5wb2xpdGljYWxyZXZpZXcub3JnCi50aWJldGFucmV2aWV3Lm5ldAp8aHR0cDov +L3RpYmV0YW5zcG9ydHMub3JnCi50aWJldGFud29tZW4ub3JnCnxodHRwOi8vdGli +ZXRhbndvbWVuLm9yZwoudGliZXRhbnlvdXRoLm9yZwoudGliZXRhbnlvdXRoY29u +Z3Jlc3Mub3JnCnx8dGliZXRhbnlvdXRoY29uZ3Jlc3Mub3JnCi50aWJldGNoYXJp +dHkuZGsKdGliZXRjaGFyaXR5LmluCi50aWJldGNoaWxkLm9yZwoudGliZXRjaXR5 +LmNvbQoudGliZXRjb3Jwcy5vcmcKLnRpYmV0ZXhwcmVzcy5uZXQKfGh0dHA6Ly90 +aWJldGV4cHJlc3MubmV0CnRpYmV0Zm9jdXMuY29tCnRpYmV0ZnVuZC5vcmcKLnRp +YmV0Z2VybWFueS5jb20KfHx0aWJldGdlcm1hbnkuZGUKLnRpYmV0aGF1cy5jb20K +LnRpYmV0aGVyaXRhZ2VmdW5kLm9yZwp0aWJldGhvdXNlLmpwCnRpYmV0aG91c2Uu +b3JnCnx8dGliZXRob3VzZS51cwoudGliZXRpbmZvbmV0Lm5ldAoudGliZXRqdXN0 +aWNlLm9yZwoudGliZXRrb21pdGUuZGsKfGh0dHA6Ly90aWJldG11c2V1bS5vcmcK +dGliZXRuZXR3b3JrLm9yZwp8fHRpYmV0bmV0d29yay5vcmcKLnRpYmV0b2ZmaWNl +LmNoCnxodHRwOi8vdGliZXRvZmZpY2UuY2gKdGliZXRvZmZpY2UuZXUKdGliZXRv +ZmZpY2Uub3JnCnRpYmV0b25saW5lLmNvbQp8fHRpYmV0b25saW5lLmNvbQoudGli +ZXRvZmZpY2UuY29tLmF1CnxodHRwOi8vdGliZXRvZmZpY2UuY29tLmF1Cnx8dGli +ZXRvbmxpbmUudHYKLnRpYmV0b25saW5lLnR2Ci50aWJldG9yYWxoaXN0b3J5Lm9y +Zwp8aHR0cDovL3RpYmV0b3JhbGhpc3Rvcnkub3JnCi50aWJldHBvbGljeS5ldQou +dGliZXRyZWxpZWZmdW5kLmNvLnVrCnRpYmV0c2l0ZXMuY29tCi50aWJldHNvY2ll +dHkuY29tCnx8dGliZXRzb2NpZXR5LmNvbQoudGliZXRzdW4uY29tCi50aWJldHN1 +cHBvcnRncm91cC5vcmcKfGh0dHA6Ly90aWJldHN1cHBvcnRncm91cC5vcmcKLnRp +YmV0c3dpc3MuY2gKLnRpYmV0dGVsZWdyYXBoLmNvbQp0aWJldHRpbWVzLm5ldAp8 +fHRpYmV0d3JpdGVzLm9yZwoudGlja2V0LmNvbS50dwoudGlnZXJ2cG4uY29tCnx8 +dGlnZXJ2cG4uY29tCi50aW1kaXIuY29tCnxodHRwOi8vdGltZGlyLmNvbQoudGlt +ZS5jb20KfGh0dHA6Ly90aW1lLmNvbQohLS0udGltZS5jb20vdGltZS90aW1lMTAw +L2xlYWRlcnMvcHJvZmlsZS9yZWJlbAohLS0udGltZS5jb20vdGltZS9zcGVjaWFs +cy9wYWNrYWdlcy9hcnRpY2xlLzAsMjg4MDQKIS0tLnRpbWUuY29tL3RpbWUvbWFn +YXppbmUKLnRpbXNhaC5jb20KfHxibG9nLnRpbmV5LmNvbQp0aW50dWMxMDEuY29t +Ci50aW55LmNjCnxodHRwOi8vdGlueS5jYwp0aW55Y2hhdC5jb20KfHx0aW55cGFz +dGUuY29tCi50aXN0b3J5LmNvbQp8fHRrY3MtY29sbGlucy5jb20KLnRtYWdhemlu +ZS5jb20KfHx0bWFnYXppbmUuY29tCi50bWRmaXNoLmNvbQp8aHR0cDovL3RtaS5t +ZQoudG1wcC5vcmcKfGh0dHA6Ly90bXBwLm9yZwoudG5hZmxpeC5jb20KfHx0bmFm +bGl4LmNvbQoudG5ncm5vdy5jb20KLnRuZ3Jub3cubmV0Ci50bnAub3JnCnxodHRw +Oi8vdG5wLm9yZwoudG8tcG9ybm8uY29tCnx8dG8tcG9ybm8uY29tCnRvZ2V0dGVy +LmNvbQoudG9reW8tMjQ3LmNvbQoudG9reW8taG90LmNvbQp8fHRva3lvLXBvcm4t +dHViZS5jb20KfHx0b2t5b2NuLmNvbQp0dy50b21vbmV3cy5uZXQKLnRvbmdpbC5v +ci5rcgoudG9uby1va2EuanAKdG9ueXlhbi5uZXQKLnRvb2RvYy5jb20KdG9vbmVs +Lm5ldAp0b3A4MS53cwoudG9wbmV3cy5pbgoudG9wcG9ybnNpdGVzLmNvbQp8aHR0 +cDovL3RvcHBvcm5zaXRlcy5jb20KLnRvcmd1YXJkLm5ldAp8fHRvcmd1YXJkLm5l +dAp8fHRvcC50dgoudG9wc2hhcmV3YXJlLmNvbQoudG9wc3kuY29tCnx8dG9wc3ku +Y29tCnx8dG9wdGlwLmNhCnRvcmEudG8KLnRvcmNuLmNvbQoudG9ycHJvamVjdC5v +cmcKfHx0b3Jwcm9qZWN0Lm9yZwp0b3JyZW50cHJpdmFjeS5jb20KfHx0b3JyZW50 +cHJpdmFjeS5jb20KfGh0dHA6Ly90b3JyZW50cHJvamVjdC5zZQp8fHRvcnJlbnR5 +Lm9yZwp8fHRvcnJlbnR6LmV1Cnx8dG9ydnBuLmNvbQp8fHRvdGFsdnBuLmNvbQou +dG91dGlhb2FiYy5jb20KdG93bmdhaW4uY29tCnRveXBhcmsuaW4KdG95dHJhY3Rv +cnNob3cuY29tCi50cGFyZW50cy5vcmcKLnRwaS5vcmcudHcKfHx0cGkub3JnLnR3 +CnRyYWZmaWNoYXVzLmNvbQp8fHRyYW5zcGFyZW5jeS5vcmcKfHx0cmVlbWFsbC5j +b20udHcKdHJlbmRzbWFwLmNvbQp8fHRyZW5kc21hcC5jb20KLnRyaWFsb2ZjY3Au +b3JnCnx8dHJpYWxvZmNjcC5vcmcKLnRyaW1vbmRpLmRlL1NETEUKLnRyb3V3Lm5s +CnxodHRwOi8vdHJvdXcubmwKLnRydC5uZXQudHIKdHJ0Yy5jb20udHcKLnRydWVi +dWRkaGEtbWQub3JnCnxodHRwOi8vdHJ1ZWJ1ZGRoYS1tZC5vcmcKdHJ1bHllcmdv +bm9taWMuY29tCi50cnV0aDEwMS5jby50dgp8aHR0cDovL3RydXRoMTAxLmNvLnR2 +Ci50cnV0aG9udG91ci5vcmcKfGh0dHA6Ly90cnV0aG9udG91ci5vcmcKLnRydXZl +by5jb20KLnRzY3R2Lm5ldAoudHNlbXR1bGt1LmNvbQp0c3F1YXJlLnR2Ci50c3Uu +b3JnLnR3CnRzdW5hZ2FydW1vbi5jb20KIS0tfGh0dHA6Ly93d3cudHN1cnUtYmly +ZC5uZXQvCi50c2N0di5uZXQKfHx0dC1yc3Mub3JnCnx8dHQxMDY5LmNvbQoudHR0 +YW4uY29tCnx8dHR0YW4uY29tCmJiLnR0di5jb20udHcvYmIKdHU4OTY0LmNvbQou +dHViYWhvbGljLmNvbQoudHViZS5jb20KdHViZTguY29tCnx8dHViZTguY29tCi50 +dWJlOTExLmNvbQp8fHR1YmU5MTEuY29tCi50dWJlY3VwLmNvbQoudHViZWdhbHMu +Y29tCi50dWJlaXNsYW0uY29tCnxodHRwOi8vdHViZWlzbGFtLmNvbQoudHViZXN0 +YWNrLmNvbQp8fHR1YmV3b2xmLmNvbQoudHVpYmVpdHUubmV0CnR1aWRhbmcubmV0 +Ci50dWlkYW5nLm9yZwp8fHR1aWRhbmcub3JnCi50dWlkYW5nLnNlCmJicy50dWl0 +dWkuaW5mbwoudHVtdXRhbnppLmNvbQp8aHR0cDovL3R1bXV0YW56aS5jb20KfHx0 +dW12aWV3LmNvbQoudHVuZWluLmNvbQp8aHR0cDovL3R1bmVpbi5jb20KfHx0dW5u +ZWxiZWFyLmNvbQoudHVubmVsci5jb20KfHx0dW5uZWxyLmNvbQoudHVvOC5ibHVl +Cnx8dHVvOC5ibHVlCi50dW84LmNjCi50dW84LmNsdWIKfHx0dW84LmNsdWIKLnR1 +bzguZml0Ci50dW84LmhrCi50dW84LmluCi50dW84Lm5pbmphCi50dW84Lm9yZwp8 +fHR1bzguZml0Cnx8dHVvOC5vcmcKLnR1bzgucHcKfGh0dHA6Ly90dW84LnB3Cnx8 +dHVvOC5yZWQKLnR1bzguc3BhY2UKdHVpdHdpdC5jb20KLnR1cmFuc2FtLm9yZwou +dHVyYm9iaXQubmV0CnxodHRwOi8vdHVyYm9iaXQubmV0Ci50dXJib2hpZGUuY29t +Cnx8dHVyYm9oaWRlLmNvbQoudHVzaHljYXNoLmNvbQp8aHR0cDovL3R1c2h5Y2Fz +aC5jb20KfHxhcHAudHV0YW5vdGEuY29tCi50dXZwbi5jb20KfHx0dXZwbi5jb20K +fGh0dHA6Ly90dXphaWppZGkuY29tCnxodHRwOi8vKi50dXphaWppZGkuY29tCi50 +dzAxLm9yZwp8aHR0cDovL3R3MDEub3JnCgohLS0tVHVtYmxyLS0tCi50dW1ibHIu +Y29tCnx8dHVtYmxyLmNvbQohLS1AQHx8YXNzZXRzLnR1bWJsci5jb20KIS0tQEB8 +fGRhdGEudHVtYmxyLmNvbQohLS1AQHx8bWVkaWEudHVtYmxyLmNvbQohLS1AQHx8 +c3RhdGljLnR1bWJsci5jb20KIS0tQEB8fHd3dy50dW1ibHIuY29tCnx8bGVjbG91 +ZC5uZXQKfGh0dHA6Ly9jb3NtaWMubW9uYXIuY2gKfHxzbHV0bW9vbmJlYW0uY29t +CnxodHRwOi8vYmxvZy5zb3lsZW50LmNvbQoKLnR2LmNvbQp8aHR0cDovL3R2LmNv +bQp0dmFudHMuY29tCmZvcnVtLnR2Yi5jb20KbmV3cy50dmIuY29tL2xpc3Qvd29y +bGQKbmV3cy50dmIuY29tL2xvY2FsCm5ld3MudHZicy5jb20udHcKLnR2Ym94bm93 +LmNvbQp8aHR0cDovL3R2Ym94bm93LmNvbS8KdHZpZGVyLmNvbQoudHZtb3N0LmNv +bS5oawoudHZwbGF5dmlkZW9zLmNvbQp8fHR2dW5ldHdvcmtzLmNvbQoudHctYmxv +Zy5jb20KfGh0dHBzOi8vdHctYmxvZy5jb20KLnR3LW5wby5vcmcKLnR3YWl0dGVy LmNvbQp0d2FwcGVya2VlcGVyLmNvbQp8fHR3YXBwZXJrZWVwZXIuY29tCnx8dHdh -dWQuaW8KLnR3YXVkLmlvCi50d2Jicy5uZXQudHcKdHdiYnMub3JnCnR3YmJzLnR3 -Cnx8dHdibG9nZ2VyLmNvbQp0d2VlcG1hZy5jb20KLnR3ZWVwbWwub3JnCnx8dHdl -ZXBtbC5vcmcKLnR3ZWV0YmFja3VwLmNvbQp8fHR3ZWV0YmFja3VwLmNvbQp0d2Vl -dGJvYXJkLmNvbQp8fHR3ZWV0Ym9hcmQuY29tCi50d2VldGJvbmVyLmJpegp8fHR3 -ZWV0Ym9uZXIuYml6Ci50d2VldGRlY2suY29tCnx8dHdlZXRkZWNrLmNvbQp8aHR0 -cDovL2RlY2subHkKIS0tIE9wZXJhdGlvbiBkaXNjb250aW51ZWQKIS0tfHx0d2Vl -dGUubmV0CiEtLW0udHdlZXRlLm5ldAp8fG10dy50bAp8fHR3ZWV0ZWR0aW1lcy5j -b20KIS0tIE9wZXJhdGlvbiBkaXNjb250aW51ZWQKIS0tdHdlZXRtZW1lLmNvbQp8 -fHR3ZWV0bXlsYXN0LmZtCnR3ZWV0cGhvdG8uY29tCnx8dHdlZXRwaG90by5jb20K -fHx0d2VldHJhbnMuY29tCnR3ZWV0cmVlLmNvbQp8fHR3ZWV0cmVlLmNvbQoudHdl -ZXR0dW5uZWwuY29tCnx8dHdlZXR0dW5uZWwuY29tCnx8dHdlZXR3YWxseS5jb20K -dHdlZXR5bWFpbC5jb20KfHx0d2Z0cC5vcmcKdHdpYmFzZS5jb20KLnR3aWJibGUu -ZGUKfHx0d2liYmxlLmRlCnR3aWJib24uY29tCnx8dHdpYnMuY29tCnR3aWNzeS5j -b20KLnR3aWVuZHMuY29tCnxodHRwOi8vdHdpZW5kcy5jb20KLnR3aWZhbi5jb20K -fGh0dHA6Ly90d2lmYW4uY29tCnR3aWZmby5jb20KfHx0d2lmZm8uY29tCi50d2ls -aWdodHNleC5jb20KdHdpbG9nLm9yZwp0d2ltYm93LmNvbQp8fHR3aW5kZXh4LmNv -bQp0d2lwcGxlLmpwCnx8dHdpcHBsZS5qcAp8fHR3aXAubWUKdHdpc2hvcnQuY29t -Cnx8dHdpc2hvcnQuY29tCnR3aXN0YXIuY2MKfHx0d2lzdGVyLm5ldC5jbwp8fHR3 -aXN0ZXJpby5jb20KdHdpc3Rlcm5vdy5jb20KdHdpc3RvcnkubmV0CnR3aXRicm93 -c2VyLm5ldAp8fHR3aXRjYXVzZS5jb20KfHx0d2l0Z2V0aGVyLmNvbQp8fHR3aWdn -aXQub3JnCnR3aXRnb28uY29tCnR3aXRpcS5jb20KfHx0d2l0aXEuY29tCi50d2l0 -bG9uZ2VyLmNvbQp8fHR3aXRsb25nZXIuY29tCnxodHRwOi8vdGwuZ2QvCnR3aXRt -YW5pYS5jb20KdHdpdG9hc3Rlci5jb20KfHx0d2l0b2FzdGVyLmNvbQp8fHR3aXRv -bm1zbi5jb20KLnR3aXRwaWMuY29tCnx8dHdpdHBpYy5jb20KIS0tU2FtZSBJUAou -dHdpdDJkLmNvbQp8fHR3aXQyZC5jb20KLnR3aXRzdGF0LmNvbQp8fHR3aXRzdGF0 -LmNvbQp8fGZpcnN0Zml2ZWZvbGxvd2Vycy5jb20KfHxyZXR3ZWV0ZWZmZWN0LmNv -bQp8fHR3ZWVwbGlrZS5tZQp8fHR3ZWVwZ3VpZGUuY29tCnx8dHVyYm90d2l0dGVy -LmNvbQoudHdpdHZpZC5jb20KfHx0d2l0dmlkLmNvbQoxOTkuNTkuMTQ4LjIwCi50 -LmNvCnx8dC5jbwp8aHR0cDovL3R3dC50bAp0d2l0dGJvdC5uZXQKLnR3aXR0ZXIu -Y29tCnx8dHdpdHRlci5jb20KfHx0d2l0dGVyLmpwCnx8dHd0dHIuY29tCnx8dHdp -dHRlcjRqLm9yZwoudHdpdHRlcmNvdW50ZXIuY29tCnx8dHdpdHRlcmNvdW50ZXIu -Y29tCnR3aXR0ZXJmZWVkLmNvbQoudHdpdHRlcmdhZGdldC5jb20KfHx0d2l0dGVy -Z2FkZ2V0LmNvbQoudHdpdHRlcmtyLmNvbQp8fHR3aXR0ZXJrci5jb20KfHx0d2l0 -dGVybWFpbC5jb20KfHx0d2l0dGVycmlmaWMuY29tCnR3aXR0ZXJ0aW0uZXMKfHx0 -d2l0dGVydGltLmVzCnR3aXR0aGF0LmNvbQp8fHR3aXR0dXJrLmNvbQoudHdpdHR1 -cmx5LmNvbQp8fHR3aXR0dXJseS5jb20KLnR3aXR6YXAuY29tCnR3aXlpYS5jb20K -fHx0d3N0YXIubmV0Ci50d3Rrci5jb20KfGh0dHA6Ly90d3Rrci5jb20KfHx0d2lt -Zy5jb20KLnR3bm9ydGgub3JnLnR3CnR3dHJsYW5kLmNvbQp0d3VybC5ubAoudHd5 -YWMub3JnCnx8dHd5YWMub3JnCi50eHh4LmNvbQoudHljb29sLmNvbQp8fHR5Y29v -bC5jb20KfHx0emFuZ21zLmNvbQoKIS0tdHlwZXBhZAp8fHR5cGVwYWQuY29tCkBA -fHx3d3cudHlwZXBhZC5jb20KQEB8fHN0YXRpYy50eXBlcGFkLmNvbQp8fGJsb2cu -ZXhwb2Z1dHVyZXMuY29tCnx8bGVnYWx0ZWNoLmxhdy5jb20KfHxibG9ncy50YW1w -YWJheS5jb20KfHxjb250ZXN0cy50d2lsaW8uY29tCiEtbGF3cHJvZmVzc29ycy50 -eXBlcGFkLmNvbS9jaGluYV9sYXdfcHJvZgoKIS0tLS0tLS0tLS0tLS1Ud2l0ZXNl -LS0tLS0KLmVtYnIuaW4KfHxlbWJyLmluCgohLS0tLS0tLS0tLS0tLS0tLS0tLS1V -VS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLnViZGRucy5vcmcKfGh0dHA6Ly91 -YmRkbnMub3JnCnx8dWJlcnByb3h5Lm5ldAoudWMtamFwYW4ub3JnCnx8dWMtamFw -YW4ub3JnCi5zcmNmLnVjYW0ub3JnL3NhbG9uLwp8aHR0cDovL2NoaW5hLnVjYW5l -d3MuY29tLwp8fHVjZGMxOTk4Lm9yZwp8aHR0cDovL2h1bSoudWNoaWNhZ28uZWR1 -L2ZhY3VsdHkveXdhbmcvaGlzdG9yeQp8fHVkZXJ6by5pdAoudWRuLmNvbQp8fHVk -bi5jb20KdWRuYmtrLmNvbS9iYnMKfHx1Zm9yYWRpby5jb20udHcKdWZyZWV2cG4u -Y29tCi51Z28uY29tCiEtLWdocwp8fHVoZHdhbGxwYXBlcnMub3JnCnx8dWhycC5v -cmcKLnVpZ2h1ci5ubAp8fHVpZ2h1ci5ubAp1aWdodXJiaXoubmV0Ci51bGlrZS5u -ZXQKdWtjZHAuY28udWsKdWtsaWZlcmFkaW8uY28udWsKfHx1a2xpZmVyYWRpby5j -by51awp1bHRyYXZwbi5mcgp8fHVsdHJhdnBuLmZyCnVsdHJheHMuY29tCnVtaWNo -LmVkdS9+ZmFsdW4KfHx1bmJsb2NrLmNuLmNvbQp1bmJsb2NrLXVzLmNvbQp8fHVu -YmxvY2stdXMuY29tCi51bmJsb2NrZG1tLmNvbQp8aHR0cDovL3VuYmxvY2tkbW0u -Y29tCnx8dW5ibG9ja3NpdC5lcwp1bmN5Y2xvbWVkaWEub3JnCi51bmN5Y2xvcGVk -aWEuaGsvd2lraQp8aHR0cDovL3VuY3ljbG9wZWRpYS5oawohLS11bmN5Y2xvcGVk -aWEuaW5mbwp8aHR0cDovL3VuY3ljbG9wZWRpYS50dwp1bmRlcndvb2RhbW1vLmNv -bQp8fHVuZGVyd29vZGFtbW8uY29tCnx8dW5ob2x5a25pZ2h0LmNvbQoudW5pLmNj -Cnx8Y2xkci51bmljb2RlLm9yZwoudW5pZmljYXRpb24ubmV0Ci51bmlmaWNhdGlv -bi5vcmcudHcKLnVuaXRlZHNvY2lhbHByZXNzLmNvbQoudW5peDEwMC5jb20KfHx1 -bmtub3duc3BhY2Uub3JnCi51bm9kZWRvcy5jb20KdW5wby5vcmcKLnVudHJhY2Vh -YmxlLnVzCnxodHRwOi8vdW50cmFjZWFibGUudXMKfHx1b2NuLm9yZwp0b3IudXBk -YXRlc3Rhci5jb20KLnVwaG9sZGp1c3RpY2Uub3JnCi51cGxvYWQ0dS5pbmZvCnVw -bG9hZGVkLm5ldC9maWxlCnxodHRwOi8vdXBsb2FkZWQubmV0L2ZpbGUKfGh0dHA6 -Ly91cGxvYWRlZC50by9maWxlCi51cGxvYWRzdGF0aW9uLmNvbS9maWxlCi51cG9y -bmlhLmNvbQp8aHR0cDovL3Vwb3JuaWEuY29tCnx8dXByb3h5Lm9yZwp8aHR0cDov -L3Rvci5jbi51cHRvZG93bi5jb20vCi51cHdpbGwub3JnCnVyN3MuY29tCnx8dXJi -YW5zdXJ2aXZhbC5jb20KbXlzaGFyZS51cmwuY29tLnR3Lwp8fHVybGJvcmcuY29t -Cnx8dXJscGFyc2VyLmNvbQp1cy50bwp8fHVzYWNuLmNvbQoudXNhaXAuZXUKfHx1 -c2FpcC5ldQpkYWxhaWxhbWEudXNjLmVkdQpiZXRhLnVzZWp1bXAuY29tCnx8dXNm -ay5taWwKfHx1c21hLmVkdQp8fHVzbWMubWlsCnxodHRwOi8vdGFyci51c3B0by5n -b3YvCnx8dHNkci51c3B0by5nb3YKLnVzdHJlYW0udHYKfHx1c3RyZWFtLnR2CiEt -LXx8dXN0d3JhcC5pbmZvCnVzdXMuY2MKLnV0b3BpYW5wYWwuY29tCnx8dXRvcGlh -bnBhbC5jb20KLnV1LWdnLmNvbQoudXZ3eHl6Lnh5egp8fHV2d3h5ei54eXoKLnV3 -YW50cy5jb20KLnV3YW50cy5uZXQKdXlnaHVyLmNvLnVrCnxodHRwOi8vdXlnaHVy -LWoub3JnCnx8dXlnaHVyYW1lcmljYW4ub3JnCi51eWdodXJjYW5hZGlhbnNvY2ll -dHkub3JnCi51eWdodXJlbnNlbWJsZS5jby51awp8fHV5Z2h1cmNvbmdyZXNzLm9y -ZwoudXlnaHVycGVuLm9yZwoudXlnaHVycHJlc3MuY29tCi51eWdodXJzdHVkaWVz -Lm9yZwp8aHR0cDovL3V5Z2h1cnN0dWRpZXMub3JnCnV5Z3VyLm9yZwp8aHR0cDov -L3V5bWFhcmlwLmNvbS8KCiEtLS0tLS0tLS0tLS0tLS0tLS0tLVZWLS0tLS0tLS0t -LS0tLS0tLS0tLS0tLS0tLQoudjJyYXkuY29tCnxodHRwOi8vdjJyYXkuY29tCi52 -YW4wMDEuY29tCi52YW42OTguY29tCi52YW5lbXUuY24KLnZhbmlsbGEtanAuY29t -Ci52YW5wZW9wbGUuY29tCnZhbnNreS5jb20KfHx2Y2Ytb25saW5lLm9yZwp8fHZj -ZmJ1aWxkZXIub3JnCi52ZWdhc3JlZC5jb20KLnZlbGthZXBvY2hhLnNrCi52ZW5i -YnMuY29tCi52ZW5jaGluYS5jb20KdmVvaC5jb20KbXlzaXRlLnZlcml6b24ubmV0 -CnZlcm1vbnR0aWJldC5vcmcKLnZlcnNhdnBuLmNvbQp8fHZlcnNhdnBuLmNvbQp8 -fHZlcnlicy5jb20KLnZmdC5jb20udHcKLnZpYmVyLmNvbQp8fHZpYmVyLmNvbQou -dmljYS5pbmZvCi52aWN0aW1zb2Zjb21tdW5pc20ub3JnCnxodHRwOi8vdmljdGlt -c29mY29tbXVuaXNtLm9yZwp8fHZpZC5tZQp8fHZpZGJsZS5jb20KdmlkZW9iYW0u -Y29tCnx8dmlkZW9iYW0uY29tCi52aWRlb2RldGVjdGl2ZS5jb20KLnZpZGVvbWVn -YS50dgp8fHZpZGVvbWVnYS50dgoudmlkZW9tby5jb20KdmlkZW9wZWRpYXdvcmxk -LmNvbQoudmlkaW5mby5vcmcvdmlkZW8KdmlldGRhaWt5bmd1eWVuLmNvbQoudmlq -YXlhdGVtcGxlLm9yZwp8fHZpa2kuY29tCnZpbWVvLmNvbQp8fHZpbWVvLmNvbQp8 -fHZpbXBlcmF0b3Iub3JnCnx8dmluY25kLmNvbQp8fHZpbm5pZXYuY29tCnxodHRw -Oi8vd3d3LmxpYi52aXJnaW5pYS5lZHUvYXJlYS1zdHVkaWVzL1RpYmV0L3RpYmV0 -Lmh0bWwKdmlzaWJsZXR3ZWV0cy5jb20KfGh0dHA6Ly9ueS52aXNpb250aW1lcy5j -b20KLnZpdGFsMjQ3Lm9yZwp8fHZpdS5jb20KLnZpdmFoZW50YWk0dS5uZXQKLnZp -dmF0dWJlLmNvbQoudml2dGhvbWFzLmNvbQp8fHZpdnRob21hcy5jb20KLnZqbWVk -aWEuY29tLmhrCi52bGxjcy5vcmcKfGh0dHA6Ly92bGxjcy5vcmcKfHx2bWl4Y29y -ZS5jb20KY24udm9hLm1vYmkKdHcudm9hLm1vYmkKLnZvYWNoaW5lc2VibG9nLmNv -bQp8fHZvYWNoaW5lc2VibG9nLmNvbQp2b2FnZC5jb20KLnZvYWNhbnRvbmVzZS5j -b20KfHx2b2FjYW50b25lc2UuY29tCnZvYWNoaW5lc2UuY29tCnx8dm9hY2hpbmVz -ZS5jb20KLnZvYW5ld3MuY29tCnZvYXRpYmV0YW4uY29tCnx8dm9hdGliZXRhbi5j -b20KLnZvYXRpYmV0YW5lbmdsaXNoLmNvbQp8fHZvYXRpYmV0YW5lbmdsaXNoLmNv -bQoudm9jYXRpdi5jb20Kdm9jbi50dgoudm90Lm9yZwp8fHZvdC5vcmcKLnZvdm8y -MDAwLmNvbQp8aHR0cDovL3Zvdm8yMDAwLmNvbQoudm94ZXIuY29tCnx8dm94ZXIu -Y29tCi52b3kuY29tCi52cG40YWxsLmNvbQoudnBuYWNjb3VudC5vcmcKfGh0dHA6 -Ly92cG5hY2NvdW50Lm9yZwp8fHd3dy52cG5jdXAuY29tCnZwbmJvb2suY29tCi52 -cG5jb3Vwb25zLmNvbQp8aHR0cDovL3ZwbmNvdXBvbnMuY29tCi52cG5mYW4uY29t -CnZwbmZpcmUuY29tCi52cG5mb3JnYW1lLm5ldAp8fHZwbmZvcmdhbWUubmV0Cnx8 -dnBuZ2F0ZS5qcAoudnBuZ2F0ZS5uZXQKfHx2cG5nYXRlLm5ldAoudnBuZ3JhdGlz -Lm5ldAp2cG5ocS5jb20KLnZwbm1hc3Rlci5jb20KfHx2cG5tYXN0ZXIuY29tCi52 -cG5pbmphLm5ldAp8fHZwbmluamEubmV0Ci52cG5waWNrLmNvbQp8fHZwbnBpY2su -Y29tCnx8dnBucG9wLmNvbQp8fHZwbnByb25ldC5jb20KLnZwbnJlYWN0b3IuY29t -Cnx8dnBucmVhY3Rvci5jb20KfHx2cG5yZXZpZXd6LmNvbQoudnBuc2VjdXJlLm1l -Cnx8dnBuc2VjdXJlLm1lCi52cG5zcC5jb20KLnZwbnR1bm5lbC5jb20KfHx2cG50 -dW5uZWwuY29tCi52cG51ay5pbmZvCnx8dnBudWsuaW5mbwoudnBudmlwLmNvbQp8 -fHZwbnZpcC5jb20KLnZwb3JuLmNvbQp8fHZwb3JuLmNvbQp2cmFpZXNhZ2Vzc2Uu -bmV0Cnx8dnR1bm5lbC5jb20KfHx2dWt1LmNjCgohLS0tLS0tLS0tLS0tLS0tLS0t -LS1XVy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KfHx3Lm9yZwpsaXN0cy53My5v -cmcvYXJjaGl2ZXMvcHVibGljCiEtLXx8dzNzY2hvb2xzLmNvbQp8fHdhZmZsZTE5 -OTkuY29tCi53YWhhcy5jb20KLndhaWdhb2J1LmNvbQp3YWlrZXVuZy5vcmcvcGhw -X3dpbmQKLndhaXdhaWVyLmNvbQp8aHR0cDovL3dhaXdhaWVyLmNvbQp3YWxsb3Ju -b3Qub3JnCnx8d2FsbHBhcGVyY2FzYS5jb20KLndhbGxwcm94eS5jb20KQEB8fHdh -bGxwcm94eS5jb20uY24KfHx3YWx0ZXJtYXJ0aW4uY29tCnx8d2FsdGVybWFydGlu -Lm9yZwp8fHd3dy53YW4tcHJlc3Mub3JnCnx8d2FuZGVyaW5naG9yc2UubmV0Cnx8 -d2FuZ2FmdS5uZXQKfHx3YW5namluYm8ub3JnCi53YW5namluYm8ub3JnCndhbmds -aXhpb25nLmNvbQoud2FuZ28ub3JnCnx8d2FuZ28ub3JnCndhbmdydW9zaHVpLm5l -dAp3d3cud2FuZ3J1b3dhbmcub3JnCndhbnQtZGFpbHkuY29tCndhcGVkaWEubW9i -aS96aHNpbXAKfHx3YXNlbHByby5jb20KLndhdGNoaW5lc2UuY29tCi53YXR0cGFk -LmNvbQp8fHdhdHRwYWQuY29tCi5tYWt6aG91LndhcmVob3VzZTMzMy5jb20Kd2Fz -aGVuZy5uZXQKfHx3YXRjaG15Z2YubmV0Cnx8d2F2LnR2Ci53ZGY1LmNvbQoud2Vh -cmVoYWlyeS5jb20KLndlYXJuLmNvbQp8fHdlYXJuLmNvbQp8aHR0cDovL2hrY29j -LndlYXRoZXIuY29tLmhrCnx8aHVkYXRvcmlxLndlYi5pZAp8fHdlYjJwcm9qZWN0 -Lm5ldAp3ZWJiYW5nLm5ldAoud2ViZXZhZGVyLm9yZwoud2ViZnJlZXIuY29tCndl -YmxhZ3UuY29tCi53ZWJqYi5vcmcKLndlYnJ1c2gubmV0CndlYnMtdHYubmV0Ci53 -ZWJzaXRlcHVsc2UuY29tL2hlbHAvdGVzdHRvb2xzLmNoaW5hLXRlc3QKfGh0dHA6 -Ly93d3cud2Vic25hcHIuY29tCi53ZWJ3YXJwZXIubmV0CnxodHRwOi8vd2Vid2Fy -cGVyLm5ldAp3ZWJ3b3JrZXJkYWlseS5jb20KLndlZWttYWcuaW5mbwp8fHdlZmln -aHRjZW5zb3JzaGlwLm9yZwoud2Vmb25nLmNvbQp3ZWlib2xlYWsuY29tCndlaWpp -bmdzaGVuZy5vcmcKLndlaW1pbmcuaW5mbwp8fHdlaW1pbmcuaW5mbwp3ZWlxdWFu -d2FuZy5vcmcKfGh0dHA6Ly93ZWlzdW8ud3MKLndlbG92ZWNvY2suY29tCi53ZW1p -Z3JhdGUub3JnCnxodHRwOi8vd2VtaWdyYXRlLm9yZwp3ZW5nZXdhbmcuY29tCnx8 -d2VuZ2V3YW5nLm9yZwoud2VuaHVpLmNoCnxodHRwOi8vdHJhbnMud2Vud2VpcG8u -Y29tL2diLwp3ZW54dWVjaXR5LmNvbQoud2VueXVuY2hhby5jb20KfHx3ZW55dW5j -aGFvLmNvbQoud2VzdGNhLmNvbQp8fHdlc3RjYS5jb20KfHx3ZXN0ZXJud29sdmVz -LmNvbQoud2VzdGtpdC5uZXQKfHx3ZXN0cG9pbnQuZWR1Ci53ZXN0ZXJuc2h1Z2Rl -bnNvY2lldHkub3JnCndldHB1c3N5Z2FtZXMuY29tCi53ZXRwbGFjZS5jb20Kd2V4 -aWFvYm8ub3JnCnx8d2V4aWFvYm8ub3JnCndlemhpeW9uZy5vcmcKfHx3ZXpvbmUu -bmV0Ci53Zm9ydW0uY29tCnx8d2ZvcnVtLmNvbS8KLndoYXRibG9ja2VkLmNvbQp8 -fHdoYXRibG9ja2VkLmNvbQp8fHdoZWVsb2Nrc2xhdGluLmNvbQoud2hpcHBlZGFz -cy5jb20KIS0tfGh0dHA6Ly93aG8uaXMvCndob3RhbGtpbmcuY29tCndoeWxvdmVy -LmNvbQp8fHdoeXgub3JnCnxodHRwOi8vZXZjaGsud2lraWEuY29tCmNuLnVuY3lj -bG9wZWRpYS53aWtpYS5jb20KemgudW5jeWNsb3BlZGlhLndpa2lhLmNvbQp8fHdp -a2lsZWFrcy5jaAp8fHdpa2lsZWFrcy5kZQp8fHdpa2lsZWFrcy5ldQp8fHdpa2ls -ZWFrcy5sdQoud2lraWxlYWtzLm9yZwp8fHdpa2lsZWFrcy5vcmcKfHx3aWtpbGVh -a3MucGwKLndpa2lsZWFrcy1mb3J1bS5jb20Kd2lsZGFtbW8uY29tCnx8Y29sbGF0 -ZXJhbG11cmRlci5jb20KfHxjb2xsYXRlcmFsbXVyZGVyLm9yZwp3aWtpbGl2cmVz -LmluZm8vd2lraS8lRTklOUIlQjYlRTUlODUlQUIlRTUlQUUlQUElRTclQUIlQTAK -fHx3aWtpbWFwaWEub3JnCgohLS0tLS0tLS0tLS0tLVdpa2lwZWRpYSBSZWxhdGVk -LS0tLS0tLS0tLS0tLQohIUVtZXJnZW5jeSBuZWVkIG9ubHkoSVAvUG9ydCBibG9j -ayB1c2FnZSkhIQohLS0tLS0tMC0tLS0tLQohLS18fG1lZGlhd2lraS5vcmcKIS0t -QEB8fG0ubWVkaWF3aWtpLm9yZwohLS0tLS0tMS0tLS0tLQohLS18fHdpa2lkYXRh -Lm9yZwohLS1AQHx8bS53aWtpZGF0YS5vcmcKIS0tLS0tLTItLS0tLS0KIS0tfHx3 -aWtpbWVkaWEub3JnCiEtLUBAfHxsaXN0cy53aWtpbWVkaWEub3JnCiEtLUBAfHxt -Lndpa2ltZWRpYS5vcmcKIS0tQEB8fHBoYWJyaWNhdG9yLndpa2ltZWRpYS5vcmcK -IS0tQEB8fHVwbG9hZC53aWtpbWVkaWEub3JnCiEtLUBAfHx3aWtpdGVjaC53aWtp -bWVkaWEub3JnCiEtLS0tLS0zLS0tLS0tCiEtLXx8d2lraWJvb2tzLm9yZwohLS1A -QHx8bS53aWtpYm9va3Mub3JnCiEtLS0tLS00LS0tLS0tCiEtLXx8d2lraXZlcnNp -dHkub3JnCiEtLUBAfHxtLndpa2l2ZXJzaXR5Lm9yZwohLS0tLS0tNS0tLS0tLQoh -LS18fHdpa2lzb3VyY2Uub3JnCiEtLUBAfHxtLndpa2lzb3VyY2Uub3JnCnxodHRw -Oi8vemgud2lraXNvdXJjZS5vcmcKIS0tLS0tLTYtLS0tLS0KIS0tfHx3aWtpcXVv -dGUub3JnCiEtLUBAfHxtLndpa2lxdW90ZS5vcmcKIS0tLS0tLTctLS0tLS0KIS0t -fHx3aWtpbmV3cy5vcmcKIS0tQEB8fG0ud2lraW5ld3Mub3JnCnxodHRwOi8vemgu -d2lraW5ld3Mub3JnCiEtLS0tLS04LS0tLS0tCiEtLXx8d2lraXZveWFnZS5vcmcK -IS0tQEB8fG0ud2lraXZveWFnZS5vcmcKfGh0dHA6Ly96aC53aWtpdm95YWdlLm9y -ZwohLS0tLS0tOS0tLS0tLQohLS18fHdpa3Rpb25hcnkub3JnCiEtLUBAfHxtLndp -a3Rpb25hcnkub3JnCnxodHRwOi8vemgud2lrdGlvbmFyeS5vcmcKIS0tLS0tMTAt -LS0tLS0KIS0tfHx3aWtpbWVkaWFmb3VuZGF0aW9uLm9yZwohLS1AQHx8bS53aWtp -bWVkaWFmb3VuZGF0aW9uLm9yZwohLS0tLU1haW4tLS0tLQohLS18fHdpa2lwZWRp -YS5vcmcKemgud2lraXBlZGlhLm9yZwohLS18fHpoLndpa2lwZWRpYS5vcmcKemgu -bS53aWtpcGVkaWEub3JnCnxodHRwczovL3poLm0ud2lraXBlZGlhLm9yZwohLS1A -QHx8bS53aWtpcGVkaWEub3JnCnxodHRwczovL3poLndpa2lwZWRpYS5vcmcKCnx8 -d2lraXdpa2kuanAKfHxjYXNpbm8ud2lsbGlhbWhpbGwuY29tCnx8c3BvcnRzLndp -bGxpYW1oaWxsLmNvbQp8fHZlZ2FzLndpbGxpYW1oaWxsLmNvbQp8fHdpbGx3Lm5l -dAp8fHdpbmRvd3NwaG9uZW1lLmNvbQp3aW5uaW5nMTEuY29tCndpbndoaXNwZXJz -LmluZm8KfHx3aXJlZGJ5dGVzLmNvbQp8fHdpcmVkcGVuLmNvbQp8fHdpcmVzaGFy -ay5vcmcKLndpc2RvbXB1YnMub3JnCi53aXNldmlkLmNvbQp8fHdpc2V2aWQuY29t -Ci53aXRuZXNzbGVldGVhY2hpbmcuY29tCi53aXRvcGlhLm5ldAoud2piay5vcmcK -fHx3amJrLm9yZwp8aHR0cDovL3duLmNvbQoud25hY2cuY29tCi53by50Ywp8fHdv -ZXNlci5jb20KfGh0dHA6Ly93b2VzZXJtaWRkbGUtd2F5Lm5ldC8KLndva2FyLm9y -Zwp8aHR0cDovL3dva2FyLm9yZwp3b2xmYXguY29tCnx8d29sZmF4LmNvbQp3b29w -aWUuanAKfHx3b29waWUuanAKd29vcGllLnR2Cnx8d29vcGllLnR2Cnx8d29ya2F0 -cnVuYS5jb20KLndvcmtlcmRlbW8ub3JnLmhrCnx8d29ya2Vyc3RoZWJpZy5uZXQK -LndvcmxkY2F0Lm9yZwp3b3JsZGpvdXJuYWwuY29tCi53b3JsZHZwbi5uZXQKfHx3 -b3JsZHZwbi5uZXQKCi53b3JkcHJlc3MuY29tCnxodHRwOi8vKi53b3JkcHJlc3Mu -Y29tCnx8Y2hlbnNoYW4yMDA0MjAwNS53b3JkcHJlc3MuY29tCnx8d3AuY29tCgoh -LXx8d29ybXNjdWxwdG9yLmNvbQoud293LmNvbQoud293LWxpZmUubmV0Cnx8d293 -bGVnYWN5Lm1sCndveGluZ2h1aWd1by5jb20KLndveWFvbGlhbi5vcmcKfGh0dHA6 -Ly93b3lhb2xpYW4ub3JnCi53cG9mb3J1bS5jb20KfHx3cG9mb3J1bS5jb20KLndx -eWQub3JnCnx8d3F5ZC5vcmcKd3JjaGluYS5vcmcKd3JldGNoLmNjCiEtY24ud3Nq -LmNvbS9nYi8yMDEzMDIxNS90ZWMxMTM4NTMuYXNwCi53c2ouY29tCnx8d3NqLmNv -bQoud3NqLm5ldAoud3NqaGsuY29tCi53dGJuLm9yZwoud3RmcGVvcGxlLmNvbQp3 -dWVya2FpeGkuY29tCnx8d3VmYWZhbmd3ZW4uY29tCnd1Zmkub3JnLnR3Cnx8d3Vn -dW9ndWFuZy5jb20Kd3VqaWUubmV0Cnd1amllbGl1bGFuLmNvbQp8fHd1amllbGl1 -bGFuLmNvbQp3dWthbmdydWkubmV0Ci53d2l0di5jb20KfHx3d2l0di5jb20Kd3p5 -Ym95LmltL3Bvc3QvMTYwCgohLS0tLS0tLS0tLS0tLS0tLS0tLS1YWC0tLS0tLS0t -LS0tLS0tLS0tLS0tLS0tLS0KLngtYmVycnkuY29tCnx8eC1iZXJyeS5jb20KfHx4 -LWFydC5jb20KfHx4LXdhbGwub3JnCngxOTQ5eC5jb20KeDM2NXguY29tCnhhbmdh -LmNvbQp8fHhiYWJlLmNvbQoueGJvb2tjbi5jb20KfHx4Ym9va2NuLmNvbQp8fHhj -YWZlLmluCnx8eGNpdHkuanAKLnhjcml0aWMuY29tCnxodHRwOi8vY2RuKi54ZGEt -ZGV2ZWxvcGVycy5jb20KZGVzdGlueS54ZmlsZXMudG8vdWJidGhyZWFkcwoueGZt -LnBwLnJ1CnhnbXlkLmNvbQp4aDRuLmNuL2Jsb2cKeGhhbXN0ZXIuY29tCi54aWFu -Y2hhd2FuZy5uZXQKLnhpYW5qaWFuLnR3CnxodHRwOi8veGlhbmppYW4udHcKLnhp -YW5xaWFvLm5ldAoueGlhb2NodW5jbmpwLmNvbQpzLnhpYW9kLmluCi54aWFvaGV4 -aWUuY29tCnx8eGlhb2xhbi5tZQp8fHhpYW9tYS5vcmcKfHx4aWFvaGV4aWUuY29t -CnhpZXpodWEuY29tCi54aWh1YS5lcwpmb3J1bS54aW5iYW8uZGUvZm9ydW0KLnhp -bmcuY29tCnxodHRwOi8veGluZy5jb20KLnhpbm1pYW8uY29tLmhrCnx8eGlubWlh -by5jb20uaGsKeGluc2hlbmcubmV0CnhpbnNoaWp1ZS5jb20KeGluaHVhbmV0Lm9y -Zwp8aHR0cDovL3hpbnl1YmJzLm5ldAoueGlvbmdwaWFuLmNvbQoueGl1cmVuLm9y -Zwp4aXphbmctemhpeWUub3JnCnhqcC5jYwp8fHhqcC5jYwp8fHhqdHJhdmVsZ3Vp -ZGUuY29tCnhsZm10YWxrLmNvbQp8fHhsZm13ei5pbmZvCnx8eG1sLXRyYWluaW5n -LWd1aWRlLmNvbQp4bW92aWVzLmNvbQp8fHhueHguY29tCnhwZG8ubmV0Cnx8eHB1 -ZC5vcmcKLnhyZW50ZHZkLmNvbQp8fHh0dWJlLmNvbQpibG9nLnh1aXRlLm5ldAp2 -bG9nLnh1aXRlLm5ldAp4dXpoaXlvbmcubmV0Cnx8eHVjaGFvLm9yZwp4dWNoYW8u -bmV0Cnx8eHVjaGFvLm5ldAoueHZpZGVvcy5jb20KfHx4dmlkZW9zLmVzCi54eGJi -eC5jb20KLnh4bG1vdmllcy5jb20KfHx4eHguY29tCnx8eHh4eC5jb20uYXUKLnh4 -eHltb3ZpZXMuY29tCnxodHRwOi8veHh4eW1vdmllcy5jb20KeHlzLm9yZwp4eXNi -bG9ncy5vcmcKeHl5NjkuY29tCnh5eTY5LmluZm8KCiEtLS0tLS0tLS0tLS0tLS0t -LS0tLVlZLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpwYWdlLmJpZC55YWhvby5j -b20KYmxvZ3MueWFob28uY28uanAKYnV5LnlhaG9vLmNvbS50dy9nZHNhbGUKaGsu -eWFob28uY29tCmhrLmtub3dsZWRnZS55YWhvby5jb20KaGsubXlibG9nLnlhaG9v -LmNvbQp8fGhrLm5ld3MueWFob28uY29tCmhrLnJkLnlhaG9vLmNvbQpoay5zZWFy -Y2gueWFob28uY29tL3NlYXJjaApoay52aWRlby5uZXdzLnlhaG9vLmNvbS92aWRl -bwptZW1lLnlhaG9vLmNvbQohLS10dy55YWhvby5jb20KfHx0dy5rbm93bGVkZ2Uu -eWFob28uY29tCnR3LnlhaG9vLmNvbQp8fHR3Lm1vYmkueWFob28uY29tCnR3Lm15 -YmxvZy55YWhvby5jb20KfHx0dy5uZXdzLnlhaG9vLmNvbQpwdWxzZS55YWhvby5j -b20KdXBjb21pbmcueWFob28uY29tCnZpZGVvLnlhaG9vLmNvbQp8fHlhaG9vLmNv -bS5oawp8fHlha2J1dHRlcmJsdWVzLmNvbQp5YW0uY29tCnx8eWFtLmNvbQp8fHlh -bS5vcmcudHcKLnlhbmdoZW5nanVuLmNvbQp5YW5namlhbmxpLmNvbQoueWFzbmku -Y28udWsKfHx5YXNuaS5jby51awp8fHlhc3VrdW5pLm9yLmpwCi55ZHkuY29tCi55 -ZWFodGVlbnR1YmUuY29tCnx8eWVhaHRlZW50dWJlLmNvbQp8fHllZWxvdS5jb20K -eWVleWkuY29tCnllZ2xlLm5ldAp8fHllZ2xlLm5ldAp8fHllczEyMy5jb20udHcK -fHx5ZXNhc2lhLmNvbQp8fHllc2FzaWEuY29tLmhrCi55ZXMtbmV3cy5jb20KfGh0 -dHA6Ly95ZXMtbmV3cy5jb20KfHx5ZWNsLm5ldAohLS15ZnJvZy5jb20KfHx5aGN3 -Lm5ldAoueWliYWRhLmNvbQoueWliYW9jaGluYS5jb20KLnlpZGlvLmNvbQp8fHlp -ZGlvLmNvbQp5aWx1YmJzLmNvbQp4YS55aW1nLmNvbQoueWluZ3N1b3NzLmNvbQou -eWlwdWIuY29tCnx8eWlwdWIuY29tCnlpbmxlaS5vcmcvbXQKLnlvYnQuY29tCi55 -b2dpY2hlbi5vcmcKfHx5b2dpY2hlbi5vcmcKeW9uZy5odQoueW9ya2Jicy5jYQp8 -fHlvdXh1LmluZm8KLnlvdWppenouY29tCnx8eW91aml6ei5jb20KeW91bWFrZXIu -Y29tCi55b3VwYWkub3JnCnx8eW91cGFpLm9yZwoueW91ci1mcmVlZG9tLm5ldAp8 -fHlvdXJlcGVhdC5jb20KLnlvdXJwcml2YXRldnBuLmNvbQp8fHlvdXJwcml2YXRl -dnBuLmNvbQoueW91c2VuZGl0LmNvbQp8fHlvdXNlbmRpdC5jb20KLnlvdXRobmV0 -cmFkaW8ub3JnL3RtaXQvZm9ydW0KYmxvZy55b3V0aHdhbnQuY29tLnR3CnNoYXJl -LnlvdXRod2FudC5jb20udHcKdG9waWMueW91dGh3YW50LmNvbS50dwoueW91cG9y -bi5jb20KfHx5b3Vwb3JuLmNvbQoueW91cG9ybmdheS5jb20KfHx5b3Vwb3JuZ2F5 -LmNvbQoueW91cmxpc3Rlbi5jb20KfGh0dHA6Ly95b3VybGlzdGVuLmNvbQoueW91 -cmx1c3QuY29tCnxodHRwOi8veW91cmx1c3QuY29tCnlvdXNodW4xMi5jb20KLnlv -dXR1YmVjbi5jb20KeW91dmVyc2lvbi5jb20KfHx5b3V2ZXJzaW9uLmNvbQpibG9n -LnlvdXh1LmluZm8vMjAxMC8wMy8xNC93ZXN0LWNoYW1iZXIKeXRodC5uZXQKeXVh -bm1pbmcubmV0Ci55dWFuemhlbmd0YW5nLm9yZwoueXVsZ2h1bi5jb20KfHx5dW5j -aGFvLm5ldAoueXV2dXR1LmNvbQp8fHl2ZXNnZWxleW4uY29tCi55d3B3LmNvbS9m -b3J1bXMvaGlzdG9yeS9wb3N0L0EwL3AwL2h0bWwvMjI3Cnl4NTEubmV0Ci55eWlp -Lm9yZwp8fHl5aWkub3JnCi55enprLmNvbQp8aHR0cDovL3l6emsuY29tCgohLS0t -LS0tLS0tLS0tLS0tLS0tLS1aWi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KemFj -ZWJvb2suY29tCi56YWxtb3MuY29tCnx8emFubmVsLmNvbQouemFvYmFvLmNvbQou -emFvYmFvLmNvbS5zZwp8fHphb2Jhby5jb20uc2cKLnphb3pvbi5jb20KfHx6YXJp -YXMuY29tCiEtLS56ZG5ldC5jb20udHcvbmV3cy9zb2Z0d2FyZS8wLDIwMDAwODU2 -NzgsMjAxMTExODcsMDAKfHx6ZG5ldC5jb20udHcKLnplbGxvLmNvbQp8fHplbGxv -LmNvbQouemVuZ2ppbnlhbi5vcmcKfHx6ZXV0Y2guY29tCiEtLXd3dy56ZnJlZXQu -Y29tL3Bvc3QvdXNlanVtcC1icm93bnMuaHRtbAouemZyZWV0LmNvbQouemdzZGRo -LmNvbQp6Z3pjamoubmV0Ci56aGFuYmluLm5ldAp8fHpoYW5iaW4ubmV0Ci56aGFu -Z2JvbGkubmV0Cnx8emhhbmd0aWFubGlhbmcuY29tCnpoZW5naHVpLm9yZwp6aGVu -Z3d1bmV0Lm9yZwp6aGVubGlidS5pbmZvCnx8emhlbmxpYnUuaW5mbwouemhlbmxp -YnUxOTg0LmNvbQp8aHR0cDovL3poZW5saWJ1MTk4NC5jb20KfGh0dHA6Ly96aGVu -eGlhbmcuYml6Ci56aGluZW5nbHV5b3UuY29tCnpob25nZ3VvLmNhCnxodHRwOi8v -emhvbmdndW9yZW5xdWFuLm9yZwp6aG9uZ2d1b3Rlc2UubmV0Cnx8emhvbmdndW90 -ZXNlLm5ldAp8fHpob25nbWVuZy5vcmcKfHx6aHJlYWRlci5jb20Kemh1YW5nYmku -bWUvYWNjb3VudC9sb2dpbi91cmwtTHc9PQouemh1YW54aW5nLmNuCnx8emh1YXRp -ZWJhLmNvbQp6aHVpY2hhZ3Vvamkub3JnCnx8emh1aWNoYWd1b2ppLm9yZwp8aHR0 -cDovL2Jvb2suemk1Lm1lCi56aWRkdS5jb20vZG93bmxvYWQKfHx6aWxsaW9uay5j -b20KemluaW8uY29tCnx8emluaW8uY29tCnx8emlwbGliLmNvbQouemlwb3JuLmNv -bQouemthaXAuY29tCnx8emthaXAuY29tCnJlYWxmb3J1bS56a2l6LmNvbQohLS18 -fHpsaWIubmV0Cnx8em13LmNuCnpvbW9iby5uZXQKLnpvbmFldXJvcGEuY29tCnx8 -em9uYWV1cm9wYS5jb20KfHx6b25naGV4aW53ZW4uY29tCi56b25naGV4aW53ZW4u -bmV0Cnx8em9vdG9vbC5jb20KLnpvb3psZS5uZXQKd3JpdGVyLnpvaG8uY29tCi56 -c2hhcmUubmV0L2Rvd25sb2FkCi56c3JoYW8uY29tCi56dW8ubGEKfHx6dW8ubGEK -fHx6dW9iaWFvLm1lCi56dW9sYS5jb20KfHx6dW9sYS5jb20KfHx6dmVyZWZmLmNv -bQp6eXpjOS5jb20KLnp6Y2FydG9vbi5jb20KISMjIyMjIyMjIyMjIyMjR2VuZXJh -bCBMaXN0IEVuZCMjIyMjIyMjIyMjIyMjIyMjCgohIyMjIyMjIyMjIyNTdXBwbGVt -ZW50YWwgTGlzdCBTdGFydCMjIyMjIyMjIyMjIyMKIS0tLS0tLS0tLS0tLS0tLS0t -VVJMIEtleXdvcmRzLS0tLS0tLS0tLS0tLS0tLS0tCjY0bWVtbwphSFIwY0hNNkx5 -OTVaV05zTG01bGRBCmZyZWVuZXQKLmdvb2dsZS4qL2ZhbHVuCnBob2Jvcy5hcHBs -ZS5jb20qL3ZpZGVvCnE9ZnJlZWRvbQpxJTNEZnJlZWRvbQpyZW1lbWJlcmluZ190 -aWFuYW5tZW5fMjBfeWVhcnMKc2VhcmNoKnNhZmV3ZWIKcT10cmlhbmdsZQpxJTNE -VHJpYW5nbGUKdWx0cmFyZWFjaAp1bHRyYXN1cmYKemhlbmdqaWFuCgohLS0tLS0t -LS0tLS0tLS0tT3RoZXIgV2lraXMtLS0tLS0tLS0tLS0tLS0KIS0tVHUgUG8gV2Fu -ZyBMdW8gU2hlbiBDaGEtLVdpa2lib29rcwp6aC53aWtpYm9va3Mub3JnKiVFNyVB -QSU4MSVFNyVBMCVCNCVFNyVCRCU5MSVFNyVCQiU5QyVFNSVBRSVBMSVFNiU5RiVB -NQoKIS0tLS0tLS0tLS0tLS0tLS0tLS1UVyBHb3ZzLS0tLS0tLS0tLS0tLS0tLS0t -LS0tCi5nb3YudHcKfHx0YWNjLmN3Yi5nb3YudHcKaW1taWdyYXRpb24uZ292LnR3 -Cnx8bnNjLmdvdi50dwp8fG50Ym5hLmdvdi50dwp8fG50c25hLmdvdi50dwp0YWlw -ZWkuZ292LnR3CkBAfHx0YXgubmF0Lmdvdi50dwpAQHx8bW9lLmdvdi50dwohLS1A -QHx8Y3diLmdvdi50dwpAQHx8bnBtLmdvdi50dwpAQHx8eWF0c2VuLmdvdi50dwpA -QHx8bXZkaXMuZ292LnR3CkBAfHxzdGR0aW1lLmdvdi50dwpAQHx8bm1tYmEuZ292 -LnR3CkBAfHxudGRtaC5nb3YudHcKQEB8fGdyYi5nb3YudHcKQEB8fHRwZGUuYWlk -ZS5nb3YudHcKQEB8fG1hdHN1LW5ld3MuZ292LnR3CkBAfHxkYXB1LWhvdXNlLmdv -di50dwpAQHx8dmdodGMuZ292LnR3CkBAfHxhaWRlLmdvdi50dwpAQHx8aGNoY2Mu -Z292LnR3CkBAfHxudHVoLmdvdi50dwpAQHx8bmhyaS5nb3YudHcKQEB8fG5zdG0u -Z292LnR3CkBAfHxudHNlYy5nb3YudHcKQEB8fG5lci5nb3YudHcKQEB8fG5tdGwu -Z292LnR3CkBAfHxudGwuZ292LnR3CkBAfHxwZXQuZ292LnR3CkBAfHxraGNjLmdv -di50dwpAQHx8bm1tYmEuZ292LnR3CkBAfHxraG1zLmdvdi50dwpAQHx8d2FuZmFu -Zy5nb3YudHcKQEB8fG5pY3QuZ292LnR3CkBAfHxhcnRlLmdvdi50dwpAQHx8bm1o -Lmdvdi50dwpAQHx8bm1wLmdvdi50dwpAQHx8dHBoY2MuZ292LnR3CkBAfHxpbmVy -Lmdvdi50dwpAQHx8dG5jc2VjLmdvdi50dwpAQHx8bnNwby5nb3YudHcKQEB8fGFp -ZGUuZ292LnR3CkBAfHxuY3JlZS5nb3YudHcKQEB8fHZnaGtzLmdvdi50dwpAQHx8 -dGNoYi5nb3YudHcKQEB8fHBhYnAuZ292LnR3CkBAfHxpdHJjLmdvdi50dwpAQHx8 -ZGYuZ292LnR3CkBAfHx3b21lbmJ1c2luZXNzLm55Yy5nb3YudHcKQEB8fGdzbi1j -ZXJ0Lm5hdC5nb3YudHcKQEB8fGtrLmdvdi50dwpAQHx8dGhic3RjLmdvdi50dwpA -QHx8Y29tbmV3cy5naW8uZ292LnR3CkBAfHxjb21uZXdzLmdpby5nb3YudHcKQEB8 -fGtsY2NhYi5nb3YudHcKQEB8fHl2dGMuZ292LnR3CkBAfHxhZnR5Z2guZ292LnR3 -CkBAfHxrbHJhLmdvdi50dwpAQHx8bHVuZ3RhbmhyLmdvdi50dwpAQHx8dGFveXVh -bi5nb3YudHcKQEB8fGhjYy5nb3YudHcKQEB8fG52cmkuZ292LnR3CkBAfHxubXZ0 -dGMuZ292LnR3CkBAfHxrbWguZ292LnR3CkBAfHxwYXRlaHIuZ292LnR3CkBAfHxu -ZXJjaC5nb3YudHcKQEB8fGttc2VoLmdvdi50dwpAQHx8bmVydHQuZ292LnR3CkBA -fHxjeWNhYi5nb3YudHcKQEB8fGNodWt1YW5nLmdvdi50dwpAQHx8Z3lzZC5ueWMu -Z292LnR3CkBAfHxjcC1ob3VzZS5nb3YudHcKQEB8fHZnaHRwZS5nb3YudHcKQEB8 -fGV0cmFpbmluZy5nb3YudHcKQEB8fHN0YWcuZ292LnR3CkBAfHxiZGhyLmdvdi50 -dwpAQHx8dGNzYWMuZ292LnR3CkBAfHxpbWFnZXNibG9nLmdpby5nb3YudHcKQEB8 -fGFydGUuZ292LnR3CkBAfHxkbXRpcC5nb3YudHcKQEB8fGNoY2NjLmdvdi50dwpA -QHx8aGVuZ2NodWVuLmdvdi50dwpAQHx8aHNpbmNodS1jYy5nb3YudHcKQEB8fDky -MS5nb3YudHcKQEB8fG5jZHIubmF0Lmdvdi50dwpAQHx8NHBwcGMuZ292LnR3CkBA -fHxrbHNpby5nb3YudHcKQEB8fG5pY2kubmF0Lmdvdi50dwpAQHx8Y3JvbW90Yy5u -YXQuZ292LnR3CkBAfHx0YWl0dW5nLWhvdXNlLmdvdi50dwohIyMjIyMjIyMjIyMj -I1N1cHBsZW1lbnRhbCBMaXN0IEVuZCMjIyMjIyMjIyMjIyMKCiEjIyMjIyMjIyMj -IyMjIyMjV2hpdGVsaXN0IFN0YXJ0IyMjIyMjIyMjIyMjIyMjIwpAQHx8YWxpeXVu -LmNvbQpAQHx8YmFpZHUuY29tCiEtLUBAfHxiaW5nLmNvbQpAQHx8YnQuYnlyLmNu -CkBAfHxjaGluYXNvLmNvbQpAQHxodHRwOi8vbnJjaC5jdWx0dXJlLnR3LwohLS1J -U1AgY2FjaGUgd29ya3Mgc29tZXRpbWVzLCB2ZXJpZmllZCBhdCBkcnBlbmcgKyBn -ZWh1YS4KIS0tQEB8fGRsLmdvb2dsZS5jb20KQEB8fGZvbnRzLmdvb2dsZWFwaXMu -Y29tCkBAfHxjbi5ncmF2YXRhci5jb20KQEB8fGNzaS5nc3RhdGljLmNvbQpAQHx8 -Zm9udHMuZ3N0YXRpYy5jb20KQEB8fGhhb3NvdS5jb20KQEB8fGpkLmNvbQpAQHx8 -amlrZS5jb20KQEB8aHR0cDovL3RyYW5zbGF0ZS5nb29nbGUuY24KQEB8aHR0cDov -L3d3dy5nb29nbGUuY24vbWFwcwpAQHx8aHR0cDIuZ29sYW5nLm9yZwpAQHx8Z292 -LmNuCkBAfHxidC5uZXU2LmVkdS5jbgpAQHx8cXEuY29tCkBAfHxzaW5hLmNuCkBA -fHxzaW5hLmNvbS5jbgpAQHx8c29nb3UuY29tCkBAfHxzby5jb20KQEB8fHNvc28u -Y29tCkBAfHx0YW9iYW8uY29tCkBAfHx3ZWliby5jb20KQEB8fHlhaG9vLmNuCkBA -fHx5b3VkYW8uY29tCkBAfHx6aG9uZ3NvdS5jb20KQEB8aHR0cDovL2ltZS5iYWlk -dS5qcAohIyMjIyMjIyMjIyMjIyMjI1doaXRlbGlzdCBFbmQjIyMjIyMjIyMjIyMj -IyMjIyMKIS0tLS0tLS0tLS0tLS0tLS0tLS0tLUVPRi0tLS0tLS0tLS0tLS0tLS0t -LS0tLS0tCg== +dWQuaW8KLnR3YXVkLmlvCi50d2F2aS5jb20KLnR3YmJzLm5ldC50dwp0d2Jicy5v +cmcKdHdiYnMudHcKfHx0d2Jsb2dnZXIuY29tCnR3ZWVwbWFnLmNvbQoudHdlZXBt +bC5vcmcKfHx0d2VlcG1sLm9yZwoudHdlZXRiYWNrdXAuY29tCnx8dHdlZXRiYWNr +dXAuY29tCnR3ZWV0Ym9hcmQuY29tCnx8dHdlZXRib2FyZC5jb20KLnR3ZWV0Ym9u +ZXIuYml6Cnx8dHdlZXRib25lci5iaXoKLnR3ZWV0Y3MuY29tCnxodHRwOi8vdHdl +ZXRjcy5jb20KfGh0dHA6Ly9kZWNrLmx5CiEtLSBPcGVyYXRpb24gZGlzY29udGlu +dWVkCiEtLXx8dHdlZXRlLm5ldAohLS1tLnR3ZWV0ZS5uZXQKfHxtdHcudGwKfHx0 +d2VldGVkdGltZXMuY29tCiEtLSBPcGVyYXRpb24gZGlzY29udGludWVkCiEtLXR3 +ZWV0bWVtZS5jb20KfHx0d2VldG15bGFzdC5mbQp0d2VldHBob3RvLmNvbQp8fHR3 +ZWV0cGhvdG8uY29tCnx8dHdlZXRyYW5zLmNvbQp0d2VldHJlZS5jb20KfHx0d2Vl +dHJlZS5jb20KLnR3ZWV0dHVubmVsLmNvbQp8fHR3ZWV0dHVubmVsLmNvbQp8fHR3 +ZWV0d2FsbHkuY29tCnR3ZWV0eW1haWwuY29tCnx8dHdlbHZlLnRvZGF5Ci50d2Vl +ei5uZXQKfGh0dHA6Ly90d2Vlei5uZXQKfHx0d2Z0cC5vcmcKfHx0d2dyZWF0ZGFp +bHkuY29tCnR3aWJhc2UuY29tCi50d2liYmxlLmRlCnx8dHdpYmJsZS5kZQp0d2li +Ym9uLmNvbQp8fHR3aWJzLmNvbQoudHdpY291bnRyeS5vcmcKfGh0dHA6Ly90d2lj +b3VudHJ5Lm9yZwp0d2ljc3kuY29tCi50d2llbmRzLmNvbQp8aHR0cDovL3R3aWVu +ZHMuY29tCi50d2lmYW4uY29tCnxodHRwOi8vdHdpZmFuLmNvbQp0d2lmZm8uY29t +Cnx8dHdpZmZvLmNvbQoudHdpbGlnaHRzZXguY29tCnR3aWxvZy5vcmcKdHdpbWJv +dy5jb20KfHx0d2luZGV4eC5jb20KdHdpcHBsZS5qcAp8fHR3aXBwbGUuanAKfHx0 +d2lwLm1lCnR3aXNob3J0LmNvbQp8fHR3aXNob3J0LmNvbQp0d2lzdGFyLmNjCnx8 +dHdpc3Rlci5uZXQuY28KfHx0d2lzdGVyaW8uY29tCnR3aXN0ZXJub3cuY29tCnR3 +aXN0b3J5Lm5ldAp0d2l0YnJvd3Nlci5uZXQKfHx0d2l0Y2F1c2UuY29tCnx8dHdp +dGdldGhlci5jb20KfHx0d2lnZ2l0Lm9yZwp0d2l0Z29vLmNvbQp0d2l0aXEuY29t +Cnx8dHdpdGlxLmNvbQoudHdpdGxvbmdlci5jb20KfHx0d2l0bG9uZ2VyLmNvbQp8 +aHR0cDovL3RsLmdkLwp0d2l0bWFuaWEuY29tCnR3aXRvYXN0ZXIuY29tCnx8dHdp +dG9hc3Rlci5jb20KfHx0d2l0b25tc24uY29tCiEtLVNhbWUgSVAKLnR3aXQyZC5j +b20KfHx0d2l0MmQuY29tCi50d2l0c3RhdC5jb20KfHx0d2l0c3RhdC5jb20KfHxm +aXJzdGZpdmVmb2xsb3dlcnMuY29tCnx8cmV0d2VldGVmZmVjdC5jb20KfHx0d2Vl +cGxpa2UubWUKfHx0d2VlcGd1aWRlLmNvbQp8fHR1cmJvdHdpdHRlci5jb20KLnR3 +aXR2aWQuY29tCnx8dHdpdHZpZC5jb20KfGh0dHA6Ly90d3QudGwKdHdpdHRib3Qu +bmV0Cnx8YWRzLXR3aXR0ZXIuY29tCnx8dHd0dHIuY29tCnx8dHdpdHRlcjRqLm9y +ZwoudHdpdHRlcmNvdW50ZXIuY29tCnx8dHdpdHRlcmNvdW50ZXIuY29tCnR3aXR0 +ZXJmZWVkLmNvbQoudHdpdHRlcmdhZGdldC5jb20KfHx0d2l0dGVyZ2FkZ2V0LmNv +bQoudHdpdHRlcmtyLmNvbQp8fHR3aXR0ZXJrci5jb20KfHx0d2l0dGVybWFpbC5j +b20KfHx0d2l0dGVycmlmaWMuY29tCnR3aXR0ZXJ0aW0uZXMKfHx0d2l0dGVydGlt +LmVzCnR3aXR0aGF0LmNvbQp8fHR3aXR0dXJrLmNvbQoudHdpdHR1cmx5LmNvbQp8 +fHR3aXR0dXJseS5jb20KLnR3aXR6YXAuY29tCnR3aXlpYS5jb20KfHx0d3N0YXIu +bmV0Ci50d3Rrci5jb20KfGh0dHA6Ly90d3Rrci5jb20KLnR3bm9ydGgub3JnLnR3 +CnR3c2t5cGUuY29tCnR3dHJsYW5kLmNvbQp0d3VybC5ubAoudHd5YWMub3JnCnx8 +dHd5YWMub3JnCi50eHh4LmNvbQoudHljb29sLmNvbQp8fHR5Y29vbC5jb20KCiEt +LXR5cGVwYWQKfHx0eXBlcGFkLmNvbQpAQHx8d3d3LnR5cGVwYWQuY29tCkBAfHxz +dGF0aWMudHlwZXBhZC5jb20KfHxibG9nLmV4cG9mdXR1cmVzLmNvbQp8fGxlZ2Fs +dGVjaC5sYXcuY29tCnx8YmxvZ3MudGFtcGFiYXkuY29tCnx8Y29udGVzdHMudHdp +bGlvLmNvbQohLWxhd3Byb2Zlc3NvcnMudHlwZXBhZC5jb20vY2hpbmFfbGF3X3By +b2YKCiEtLS0tLS0tLS0tLS0tVHdpdGVzZS0tLS0tCi5lbWJyLmluCnx8ZW1ici5p +bgoKIS0tLS0tLS0tLS0tLS0tLS0tLS0tVVUtLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tCi51OXVuLmNvbQp8fHU5dW4uY29tCi51YmRkbnMub3JnCnxodHRwOi8vdWJk +ZG5zLm9yZwp8fHViZXJwcm94eS5uZXQKLnVjLWphcGFuLm9yZwp8fHVjLWphcGFu +Lm9yZwouc3JjZi51Y2FtLm9yZy9zYWxvbi8KfGh0dHA6Ly9jaGluYS51Y2FuZXdz +LmNvbS8KfHx1Y2RjMTk5OC5vcmcKfGh0dHA6Ly9odW0qLnVjaGljYWdvLmVkdS9m +YWN1bHR5L3l3YW5nL2hpc3RvcnkKfHx1ZGVyem8uaXQKLnVkbi5jb20KfHx1ZG4u +Y29tCnx8dWRuLmNvbS50dwp1ZG5ia2suY29tL2Jicwp8fHVmb3JhZGlvLmNvbS50 +dwp1ZnJlZXZwbi5jb20KLnVnby5jb20KIS0tZ2hzCnx8dWhkd2FsbHBhcGVycy5v +cmcKfHx1aHJwLm9yZwoudWlnaHVyLm5sCnx8dWlnaHVyLm5sCnVpZ2h1cmJpei5u +ZXQKLnVsaWtlLm5ldAp1a2NkcC5jby51awp1a2xpZmVyYWRpby5jby51awp8fHVr +bGlmZXJhZGlvLmNvLnVrCnVsdHJhdnBuLmZyCnx8dWx0cmF2cG4uZnIKdWx0cmF4 +cy5jb20KdW1pY2guZWR1L35mYWx1bgp8fHVuYmxvY2suY24uY29tCi51bmJsb2Nr +ZXIueXQKdW5ibG9jay11cy5jb20KfHx1bmJsb2NrLXVzLmNvbQoudW5ibG9ja2Rt +bS5jb20KfGh0dHA6Ly91bmJsb2NrZG1tLmNvbQp8fHVuYmxvY2tzaXQuZXMKdW5j +eWNsb21lZGlhLm9yZwoudW5jeWNsb3BlZGlhLmhrL3dpa2kKfGh0dHA6Ly91bmN5 +Y2xvcGVkaWEuaGsKIS0tdW5jeWNsb3BlZGlhLmluZm8KfGh0dHA6Ly91bmN5Y2xv +cGVkaWEudHcKdW5kZXJ3b29kYW1tby5jb20KfHx1bmRlcndvb2RhbW1vLmNvbQp8 +fHVuaG9seWtuaWdodC5jb20KLnVuaS5jYwp8fGNsZHIudW5pY29kZS5vcmcKLnVu +aWZpY2F0aW9uLm5ldAoudW5pZmljYXRpb24ub3JnLnR3Cnx8dW5pcnVsZS5jbG91 +ZAoudW5pdGVkc29jaWFscHJlc3MuY29tCi51bml4MTAwLmNvbQp8fHVua25vd25z +cGFjZS5vcmcKLnVub2RlZG9zLmNvbQp1bnBvLm9yZwoudW50cmFjZWFibGUudXMK +fGh0dHA6Ly91bnRyYWNlYWJsZS51cwp8fHVvY24ub3JnCnRvci51cGRhdGVzdGFy +LmNvbQoudXBob2xkanVzdGljZS5vcmcKLnVwbG9hZDR1LmluZm8KdXBsb2FkZWQu +bmV0L2ZpbGUKfGh0dHA6Ly91cGxvYWRlZC5uZXQvZmlsZQp8aHR0cDovL3VwbG9h +ZGVkLnRvL2ZpbGUKLnVwbG9hZHN0YXRpb24uY29tL2ZpbGUKLnVwbWVkaWEubWcK +LnVwb3JuaWEuY29tCnxodHRwOi8vdXBvcm5pYS5jb20KfHx1cHJveHkub3JnCnxo +dHRwOi8vdG9yLmNuLnVwdG9kb3duLmNvbS8KLnVwd2lsbC5vcmcKdXI3cy5jb20K +fHx1cmJhbnN1cnZpdmFsLmNvbQpteXNoYXJlLnVybC5jb20udHcvCnx8dXJsYm9y +Zy5jb20KfHx1cmxwYXJzZXIuY29tCnVzLnRvCnx8dXNhY24uY29tCi51c2FpcC5l +dQp8fHVzYWlwLmV1CmRhbGFpbGFtYS51c2MuZWR1CmlpcGRpZ2l0YWwudXNlbWJh +c3N5Lmdvdgp8fHVzZmsubWlsCnx8dXNtYS5lZHUKfHx1c21jLm1pbAoudXNvY2N0 +bi5jb20KfGh0dHA6Ly90YXJyLnVzcHRvLmdvdi8KfHx0c2RyLnVzcHRvLmdvdgou +dXN0cmVhbS50dgp8fHVzdHJlYW0udHYKIS0tfHx1c3R3cmFwLmluZm8KLnVzdW5p +dGVkbmV3cy5jb20KfGh0dHA6Ly91c3VuaXRlZG5ld3MuY29tCnVzdXMuY2MKLnV0 +b3BpYW5wYWwuY29tCnx8dXRvcGlhbnBhbC5jb20KLnV1LWdnLmNvbQoudXZ3eHl6 +Lnh5egp8fHV2d3h5ei54eXoKLnV3YW50cy5jb20KLnV3YW50cy5uZXQKdXlnaHVy +LmNvLnVrCnxodHRwOi8vdXlnaHVyLWoub3JnCnx8dXlnaHVyYW1lcmljYW4ub3Jn +Ci51eWdodXJjYW5hZGlhbnNvY2lldHkub3JnCi51eWdodXJlbnNlbWJsZS5jby51 +awp8fHV5Z2h1cmNvbmdyZXNzLm9yZwoudXlnaHVycGVuLm9yZwoudXlnaHVycHJl +c3MuY29tCi51eWdodXJzdHVkaWVzLm9yZwp8aHR0cDovL3V5Z2h1cnN0dWRpZXMu +b3JnCnV5Z3VyLm9yZwp8aHR0cDovL3V5bWFhcmlwLmNvbS8KCiEtLS0tLS0tLS0t +LS0tLS0tLS0tLVZWLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoudjJyYXkuY29t +CnxodHRwOi8vdjJyYXkuY29tCi52YW4wMDEuY29tCi52YW42OTguY29tCi52YW5l +bXUuY24KLnZhbmlsbGEtanAuY29tCi52YW5wZW9wbGUuY29tCnZhbnNreS5jb20K +fHx2Y2Ytb25saW5lLm9yZwp8fHZjZmJ1aWxkZXIub3JnCi52ZWdhc3JlZC5jb20K +LnZlbGthZXBvY2hhLnNrCi52ZW5iYnMuY29tCi52ZW5jaGluYS5jb20KLnZlbmV0 +aWFubWFjYW8uY29tCnx8dmVuZXRpYW5tYWNhby5jb20KdmVvaC5jb20KbXlzaXRl +LnZlcml6b24ubmV0CnZlcm1vbnR0aWJldC5vcmcKLnZlcnNhdnBuLmNvbQp8fHZl +cnNhdnBuLmNvbQp8fHZlcnlicy5jb20KLnZmdC5jb20udHcKLnZpYmVyLmNvbQp8 +fHZpYmVyLmNvbQoudmljYS5pbmZvCi52aWN0aW1zb2Zjb21tdW5pc20ub3JnCnxo +dHRwOi8vdmljdGltc29mY29tbXVuaXNtLm9yZwp8fHZpZC5tZQp8fHZpZGJsZS5j +b20KdmlkZW9iYW0uY29tCnx8dmlkZW9iYW0uY29tCi52aWRlb2RldGVjdGl2ZS5j +b20KLnZpZGVvbWVnYS50dgp8fHZpZGVvbWVnYS50dgoudmlkZW9tby5jb20Kdmlk +ZW9wZWRpYXdvcmxkLmNvbQoudmlkZW9wcmVzcy5jb20KLnZpZGluZm8ub3JnL3Zp +ZGVvCnZpZXRkYWlreW5ndXllbi5jb20KLnZpamF5YXRlbXBsZS5vcmcKdmltZW8u +Y29tCnx8dmltZW8uY29tCnx8dmltcGVyYXRvci5vcmcKfHx2aW5jbmQuY29tCnx8 +dmlubmlldi5jb20KfGh0dHA6Ly93d3cubGliLnZpcmdpbmlhLmVkdS9hcmVhLXN0 +dWRpZXMvVGliZXQvdGliZXQuaHRtbAoudmlydHVhbHJlYWxwb3JuLmNvbQp8fHZp +cnR1YWxyZWFscG9ybi5jb20KdmlzaWJsZXR3ZWV0cy5jb20KfGh0dHA6Ly9ueS52 +aXNpb250aW1lcy5jb20KLnZpdGFsMjQ3Lm9yZwp8fHZpdS5jb20KLnZpdmFoZW50 +YWk0dS5uZXQKLnZpdmF0dWJlLmNvbQoudml2dGhvbWFzLmNvbQp8fHZpdnRob21h +cy5jb20KLnZqYXYuY29tCnx8dmphdi5jb20KLnZqbWVkaWEuY29tLmhrCi52bGxj +cy5vcmcKfGh0dHA6Ly92bGxjcy5vcmcKfHx2bWl4Y29yZS5jb20KfHx2bmV0Lmxp +bmsKY24udm9hLm1vYmkKdHcudm9hLm1vYmkKLnZvYWNoaW5lc2VibG9nLmNvbQp8 +fHZvYWNoaW5lc2VibG9nLmNvbQp2b2FnZC5jb20KLnZvYWNhbnRvbmVzZS5jb20K +fHx2b2FjYW50b25lc2UuY29tCnZvYWNoaW5lc2UuY29tCnx8dm9hY2hpbmVzZS5j +b20KLnZvYW5ld3MuY29tCnx8dm9hbmV3cy5jb20Kdm9hdGliZXRhbi5jb20KfHx2 +b2F0aWJldGFuLmNvbQoudm9hdGliZXRhbmVuZ2xpc2guY29tCnx8dm9hdGliZXRh +bmVuZ2xpc2guY29tCi52b2NhdGl2LmNvbQp2b2NuLnR2Ci52b3Qub3JnCnx8dm90 +Lm9yZwoudm92bzIwMDAuY29tCnxodHRwOi8vdm92bzIwMDAuY29tCi52b3hlci5j +b20KfHx2b3hlci5jb20KLnZveS5jb20KfHx2cG4uYWMKLnZwbjRhbGwuY29tCnx8 +dnBuNGFsbC5jb20KLnZwbmFjY291bnQub3JnCnxodHRwOi8vdnBuYWNjb3VudC5v +cmcKLnZwbmFjY291bnRzLmNvbQp8fHZwbmFjY291bnRzLmNvbQoudnBuY29tcGFy +aXNvbi5vcmcKLnZwbmN1cC5jb20KfHx2cG5jdXAuY29tCnZwbmJvb2suY29tCi52 +cG5jb3Vwb25zLmNvbQp8aHR0cDovL3ZwbmNvdXBvbnMuY29tCi52cG5kYWRhLmNv +bQp8fHZwbmRhZGEuY29tCi52cG5mYW4uY29tCnZwbmZpcmUuY29tCi52cG5maXJl +cy5iaXoKLnZwbmZvcmdhbWUubmV0Cnx8dnBuZm9yZ2FtZS5uZXQKfHx2cG5nYXRl +LmpwCi52cG5nYXRlLm5ldAp8fHZwbmdhdGUubmV0Ci52cG5ncmF0aXMubmV0CnZw +bmhxLmNvbQoudnBubWFzdGVyLmNvbQp8fHZwbm1hc3Rlci5jb20KLnZwbm1lbnRv +ci5jb20KfHx2cG5tZW50b3IuY29tCi52cG5pbmphLm5ldAp8fHZwbmluamEubmV0 +Ci52cG5pbnRvdWNoLmNvbQp8fHZwbmludG91Y2gubmV0CnZwbmphY2suY29tCnx8 +dnBuamFjay5jb20KLnZwbnBpY2suY29tCnx8dnBucGljay5jb20KfHx2cG5wb3Au +Y29tCnx8dnBucHJvbmV0LmNvbQoudnBucmVhY3Rvci5jb20KfHx2cG5yZWFjdG9y +LmNvbQp8fHZwbnJldmlld3ouY29tCi52cG5zZWN1cmUubWUKfHx2cG5zZWN1cmUu +bWUKLnZwbnNoYXphbS5jb20KfHx2cG5zaGF6YW0uY29tCi52cG5zaGllbGRhcHAu +Y29tCnx8dnBuc2hpZWxkYXBwLmNvbQoudnBuc3AuY29tCi52cG50cmFmZmljLmNv +bQoudnBudHVubmVsLmNvbQp8fHZwbnR1bm5lbC5jb20KLnZwbnVrLmluZm8KfHx2 +cG51ay5pbmZvCnx8dnBudW5saW1pdGVkYXBwLmNvbQoudnBudmlwLmNvbQp8fHZw +bnZpcC5jb20KLnZwbndvcmxkd2lkZS5jb20KLnZwb3JuLmNvbQp8fHZwb3JuLmNv +bQoudnBzZXIubmV0CkBAfHx2cHNlci5uZXQKdnJhaWVzYWdlc3NlLm5ldAoudnJt +dHIuY29tCnx8dnR1bm5lbC5jb20KfHx2dWt1LmNjCgohLS0tLS0tLS0tLS0tLS0t +LS0tLS1XVy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KbGlzdHMudzMub3JnL2Fy +Y2hpdmVzL3B1YmxpYwp8fHczc2Nob29scy5jb20KfHx3YWZmbGUxOTk5LmNvbQou +d2FoYXMuY29tCi53YWlnYW9idS5jb20Kd2Fpa2V1bmcub3JnL3BocF93aW5kCi53 +YWlsYWlrZS5uZXQKLndhaXdhaWVyLmNvbQp8aHR0cDovL3dhaXdhaWVyLmNvbQp8 +fHdhbGxtYW1hLmNvbQp3YWxsb3Jub3Qub3JnCnx8d2FsbHBhcGVyY2FzYS5jb20K +LndhbGxwcm94eS5jb20KQEB8fHdhbGxwcm94eS5jb20uY24KfHx3YWx0ZXJtYXJ0 +aW4uY29tCnx8d2FsdGVybWFydGluLm9yZwp8fHd3dy53YW4tcHJlc3Mub3JnCnx8 +d2FuZGVyaW5naG9yc2UubmV0Cnx8d2FuZ2FmdS5uZXQKfHx3YW5namluYm8ub3Jn +Ci53YW5namluYm8ub3JnCndhbmdsaXhpb25nLmNvbQoud2FuZ28ub3JnCnx8d2Fu +Z28ub3JnCndhbmdydW9zaHVpLm5ldAp3d3cud2FuZ3J1b3dhbmcub3JnCndhbnQt +ZGFpbHkuY29tCndhcGVkaWEubW9iaS96aHNpbXAKfHx3YXNlbHByby5jb20KLndh +dGNoaW5lc2UuY29tCi53YXR0cGFkLmNvbQp8fHdhdHRwYWQuY29tCi5tYWt6aG91 +LndhcmVob3VzZTMzMy5jb20Kd2FzaGVuZy5uZXQKLndhdGNoOHguY29tCnx8d2F0 +Y2hteWdmLm5ldAp8fHdhdi50dgoud2RmNS5jb20KLndlYXJlaGFpcnkuY29tCi53 +ZWFybi5jb20KfHx3ZWFybi5jb20KfGh0dHA6Ly9oa2NvYy53ZWF0aGVyLmNvbS5o +awp8fGh1ZGF0b3JpcS53ZWIuaWQKfHx3ZWIycHJvamVjdC5uZXQKd2ViYmFuZy5u +ZXQKLndlYmV2YWRlci5vcmcKLndlYmZyZWVyLmNvbQp3ZWJsYWd1LmNvbQoud2Vi +amIub3JnCi53ZWJydXNoLm5ldAp3ZWJzLXR2Lm5ldAoud2Vic2l0ZXB1bHNlLmNv +bS9oZWxwL3Rlc3R0b29scy5jaGluYS10ZXN0CnxodHRwOi8vd3d3LndlYnNuYXBy +LmNvbQoud2Vid2FycGVyLm5ldAp8aHR0cDovL3dlYndhcnBlci5uZXQKd2Vid29y +a2VyZGFpbHkuY29tCi53ZWVrbWFnLmluZm8KfHx3ZWZpZ2h0Y2Vuc29yc2hpcC5v +cmcKLndlZm9uZy5jb20Kd2VpYm9sZWFrLmNvbQoud2VpaHVvLm9yZwp3ZWlqaW5n +c2hlbmcub3JnCi53ZWltaW5nLmluZm8KfHx3ZWltaW5nLmluZm8Kd2VpcXVhbndh +bmcub3JnCnxodHRwOi8vd2Vpc3VvLndzCi53ZWxvdmVjb2NrLmNvbQoud2VtaWdy +YXRlLm9yZwp8aHR0cDovL3dlbWlncmF0ZS5vcmcKd2VuZ2V3YW5nLmNvbQp8fHdl +bmdld2FuZy5vcmcKLndlbmh1aS5jaAp8aHR0cDovL3RyYW5zLndlbndlaXBvLmNv +bS9nYi8KLndlbnh1ZWNpdHkuY29tCnx8d2VueHVlY2l0eS5jb20KLndlbnl1bmNo +YW8uY29tCnx8d2VueXVuY2hhby5jb20KLndlc3RjYS5jb20KfHx3ZXN0Y2EuY29t +Cnx8d2VzdGVybndvbHZlcy5jb20KLndlc3RraXQubmV0Cnx8d2VzdHBvaW50LmVk +dQoud2VzdGVybnNodWdkZW5zb2NpZXR5Lm9yZwp3ZXRwdXNzeWdhbWVzLmNvbQou +d2V0cGxhY2UuY29tCndleGlhb2JvLm9yZwp8fHdleGlhb2JvLm9yZwp3ZXpoaXlv +bmcub3JnCnx8d2V6b25lLm5ldAoud2ZvcnVtLmNvbQp8fHdmb3J1bS5jb20vCi53 +aGF0YmxvY2tlZC5jb20KfHx3aGF0YmxvY2tlZC5jb20KLndoZWF0c2VlZHMub3Jn +Cnx8d2hlZWxvY2tzbGF0aW4uY29tCi53aGlwcGVkYXNzLmNvbQohLS18aHR0cDov +L3doby5pcy8KLndob2VyLm5ldAp8fHdob2VyLm5ldAp3aG90YWxraW5nLmNvbQp3 +aHlsb3Zlci5jb20KfHx3aHl4Lm9yZwp8aHR0cDovL3poLmVjZG0ud2lraWEuY29t +CnxodHRwOi8vZXZjaGsud2lraWEuY29tCmZxLndpa2lhLmNvbQpjbi51bmN5Y2xv +cGVkaWEud2lraWEuY29tCnpoLnVuY3ljbG9wZWRpYS53aWtpYS5jb20KfHx3aWtp +bGVha3MuY2gKfHx3aWtpbGVha3MuY29tCnx8d2lraWxlYWtzLmRlCnx8d2lraWxl +YWtzLmV1Cnx8d2lraWxlYWtzLmx1Ci53aWtpbGVha3Mub3JnCnx8d2lraWxlYWtz +Lm9yZwp8fHdpa2lsZWFrcy5wbAoud2lraWxlYWtzLWZvcnVtLmNvbQp3aWxkYW1t +by5jb20KLndpbGxpYW1oaWxsLmNvbQp8fGNvbGxhdGVyYWxtdXJkZXIuY29tCnx8 +Y29sbGF0ZXJhbG11cmRlci5vcmcKd2lraWxpdnJlcy5pbmZvL3dpa2kvJUU5JTlC +JUI2JUU1JTg1JUFCJUU1JUFFJUFBJUU3JUFCJUEwCnx8d2lraW1hcGlhLm9yZwoK +IS0tLS0tLS0tLS0tLS1XaWtpcGVkaWEgUmVsYXRlZC0tLS0tLS0tLS0tLS0KISFF +bWVyZ2VuY3kgbmVlZCBvbmx5KElQL1BvcnQgYmxvY2sgdXNhZ2UpISEKIS0tLS0t +LTAtLS0tLS0KIS0tfHxtZWRpYXdpa2kub3JnCiEtLUBAfHxtLm1lZGlhd2lraS5v +cmcKIS0tLS0tLTEtLS0tLS0KIS0tfHx3aWtpZGF0YS5vcmcKIS0tQEB8fG0ud2lr +aWRhdGEub3JnCiEtLS0tLS0yLS0tLS0tCiEtLXx8d2lraW1lZGlhLm9yZwohLS1A +QHx8bGlzdHMud2lraW1lZGlhLm9yZwohLS1AQHx8bS53aWtpbWVkaWEub3JnCiEt +LUBAfHxwaGFicmljYXRvci53aWtpbWVkaWEub3JnCiEtLUBAfHx1cGxvYWQud2lr +aW1lZGlhLm9yZwohLS1AQHx8d2lraXRlY2gud2lraW1lZGlhLm9yZwohLS0tLS0t +My0tLS0tLQohLS18fHdpa2lib29rcy5vcmcKIS0tQEB8fG0ud2lraWJvb2tzLm9y +ZwohLS0tLS0tNC0tLS0tLQohLS18fHdpa2l2ZXJzaXR5Lm9yZwohLS1AQHx8bS53 +aWtpdmVyc2l0eS5vcmcKIS0tLS0tLTUtLS0tLS0KIS0tfHx3aWtpc291cmNlLm9y +ZwohLS1AQHx8bS53aWtpc291cmNlLm9yZwp8aHR0cDovL3poLndpa2lzb3VyY2Uu +b3JnCiEtLS0tLS02LS0tLS0tCiEtLXx8d2lraXF1b3RlLm9yZwohLS1AQHx8bS53 +aWtpcXVvdGUub3JnCiEtLS0tLS03LS0tLS0tCiEtLXx8d2lraW5ld3Mub3JnCiEt +LUBAfHxtLndpa2luZXdzLm9yZwp8fHpoLndpa2luZXdzLm9yZwohLS0tLS0tOC0t +LS0tLQohLS18fHdpa2l2b3lhZ2Uub3JnCiEtLUBAfHxtLndpa2l2b3lhZ2Uub3Jn +CiEtLXxodHRwOi8vemgud2lraXZveWFnZS5vcmcKIS0tLS0tLTktLS0tLS0KIS0t +fHx3aWt0aW9uYXJ5Lm9yZwohLS1AQHx8bS53aWt0aW9uYXJ5Lm9yZwohLS18aHR0 +cDovL3poLndpa3Rpb25hcnkub3JnCiEtLS0tLTEwLS0tLS0tCiEtLXx8d2lraW1l +ZGlhZm91bmRhdGlvbi5vcmcKIS0tQEB8fG0ud2lraW1lZGlhZm91bmRhdGlvbi5v +cmcKIS0tLS1NYWluLS0tLS0KIS0tfHx3aWtpcGVkaWEub3JnCnx8amEud2lraXBl +ZGlhLm9yZwp6aC53aWtpcGVkaWEub3JnCiEtLXx8emgud2lraXBlZGlhLm9yZwp6 +aC5tLndpa2lwZWRpYS5vcmcKfGh0dHBzOi8vemgubS53aWtpcGVkaWEub3JnCiEt +LUBAfHxtLndpa2lwZWRpYS5vcmcKfGh0dHBzOi8vemgud2lraXBlZGlhLm9yZwoh +LS1PdGhlciBMYW5ndWFnZXMgb2YgV2lraXBlZGlhCnd1dS53aWtpcGVkaWEub3Jn +CnxodHRwczovL3d1dS53aWtpcGVkaWEub3JnCnpoLXl1ZS53aWtpcGVkaWEub3Jn +CnxodHRwczovL3poLXl1ZS53aWtpcGVkaWEub3JnCgp8fHdpa2l3aWtpLmpwCnx8 +Y2FzaW5vLndpbGxpYW1oaWxsLmNvbQp8fHNwb3J0cy53aWxsaWFtaGlsbC5jb20K +fHx2ZWdhcy53aWxsaWFtaGlsbC5jb20KfHx3aWxsdy5uZXQKfHx3aW5kb3dzcGhv +bmVtZS5jb20KLndpbmRzY3JpYmUuY29tCnx8d2luZHNjcmliZS5jb20KfHxjb21t +dW5pdHkud2luZHkuY29tCnx8d2luZ3kuc2l0ZQp3aW5uaW5nMTEuY29tCndpbndo +aXNwZXJzLmluZm8KfHx3aXJlZGJ5dGVzLmNvbQp8fHdpcmVkcGVuLmNvbQohLS18 +fHdpcmVzaGFyay5vcmcKLndpc2RvbXB1YnMub3JnCi53aXNldmlkLmNvbQp8fHdp +c2V2aWQuY29tCi53aXRuZXNzbGVldGVhY2hpbmcuY29tCi53aXRvcGlhLm5ldAou +d2piay5vcmcKfHx3amJrLm9yZwp8aHR0cDovL3duLmNvbQoud25hY2cuY29tCi53 +bmFjZy5vcmcKLndvLnRjCnx8d29lc2VyLmNvbQp8aHR0cDovL3dvZXNlcm1pZGRs +ZS13YXkubmV0Lwoud29rYXIub3JnCnxodHRwOi8vd29rYXIub3JnCndvbGZheC5j +b20KfHx3b2xmYXguY29tCnx8d29vbHlzcy5jb20Kd29vcGllLmpwCnx8d29vcGll +LmpwCndvb3BpZS50dgp8fHdvb3BpZS50dgp8fHdvcmthdHJ1bmEuY29tCi53b3Jr +ZXJkZW1vLm9yZy5oawp8fHdvcmtlcnN0aGViaWcubmV0Ci53b3JsZGNhdC5vcmcK +d29ybGRqb3VybmFsLmNvbQoud29ybGR2cG4ubmV0Cnx8d29ybGR2cG4ubmV0Cgp8 +fHZpZGVvcHJlc3MuY29tCi53b3JkcHJlc3MuY29tCnxodHRwOi8vKi53b3JkcHJl +c3MuY29tCnx8Y2hlbnNoYW4yMDA0MjAwNS53b3JkcHJlc3MuY29tCnx8Y2hpbmF2 +aWV3LndvcmRwcmVzcy5jb20KfHxjbmJibmV3cy53b3JkcHJlc3MuY29tCnx8ZnJl +ZWRvbWluZm9uZXR3ZWIud29yZHByZXNzLmNvbQp8fGhrYTg5NjQud29yZHByZXNz +LmNvbQp8fGhrYW5ld3Mud29yZHByZXNzLmNvbQp8fGhxc2JuZXQud29yZHByZXNz +LmNvbQp8fGhxc2JvbmxpbmUud29yZHByZXNzLmNvbQp8fGludmVzdGlnYXRpbmcu +d29yZHByZXNzLmNvbQp8fGpvYm5ld2VyYS53b3JkcHJlc3MuY29tCnx8bWluZ2h1 +aXl3LndvcmRwcmVzcy5jb20KfHx3bzN0dHQud29yZHByZXNzLmNvbQp8fHN1amlh +dHVuLndvcmRwcmVzcy5jb20KfHx4aWppZS53b3JkcHJlc3MuY29tCnx8d3AuY29t +CgohLXx8d29ybXNjdWxwdG9yLmNvbQoud293LmNvbQoud293LWxpZmUubmV0Cnx8 +d293bGVnYWN5Lm1sCnx8d293cG9ybi5jb20KfHx3b3dnaXJscy5jb20KLndvd3Jr +LmNvbQp3b3hpbmdodWlndW8uY29tCi53b3lhb2xpYW4ub3JnCnxodHRwOi8vd295 +YW9saWFuLm9yZwoud3BvZm9ydW0uY29tCnx8d3BvZm9ydW0uY29tCi53cXlkLm9y +Zwp8fHdxeWQub3JnCndyY2hpbmEub3JnCndyZXRjaC5jYwohLWNuLndzai5jb20v +Z2IvMjAxMzAyMTUvdGVjMTEzODUzLmFzcAoud3NqLmNvbQp8fHdzai5jb20KLndz +ai5uZXQKfHx3c2oubmV0Ci53c2poay5jb20KLnd0Ym4ub3JnCi53dGZwZW9wbGUu +Y29tCnd1ZXJrYWl4aS5jb20KfHx3dWZhZmFuZ3dlbi5jb20Kd3VmaS5vcmcudHcK +fHx3dWd1b2d1YW5nLmNvbQp3dWppZS5uZXQKd3VqaWVsaXVsYW4uY29tCnx8d3Vq +aWVsaXVsYW4uY29tCnd1a2FuZ3J1aS5uZXQKfHx3dXcucmVkCnx8d3V5YW5ibG9n +LmNvbQoud3dpdHYuY29tCnx8d3dpdHYuY29tCnd6eWJveS5pbS9wb3N0LzE2MAoK +IS0tLS0tLS0tLS0tLS0tLS0tLS0tWFgtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +Ci54LWJlcnJ5LmNvbQp8fHgtYmVycnkuY29tCnx8eC1hcnQuY29tCnx8eC13YWxs +Lm9yZwp4MTk0OXguY29tCngzNjV4LmNvbQp4YW5nYS5jb20KfHx4YmFiZS5jb20K +Lnhib29rY24uY29tCnx8eGJvb2tjbi5jb20KfHx4Y2FmZS5pbgp8fHhjaXR5Lmpw +Ci54Y3JpdGljLmNvbQp8aHR0cDovL2NkbioueGRhLWRldmVsb3BlcnMuY29tCi54 +ZXJvdGljYS5jb20KZGVzdGlueS54ZmlsZXMudG8vdWJidGhyZWFkcwoueGZtLnBw +LnJ1Ci54Z215ZC5jb20KfHx4Z215ZC5jb20KeGhhbXN0ZXIuY29tCnx8eGhhbXN0 +ZXIuY29tCi54aWFuYmEubmV0Ci54aWFuY2hhd2FuZy5uZXQKLnhpYW5qaWFuLnR3 +CnxodHRwOi8veGlhbmppYW4udHcKLnhpYW5xaWFvLm5ldAoueGlhb2JhaXd1LmNv +bQoueGlhb2NodW5jbmpwLmNvbQoueGlhb2QuaW4KLnhpYW9oZXhpZS5jb20KfHx4 +aWFvbGFuLm1lCnx8eGlhb21hLm9yZwp8fHhpYW9oZXhpZS5jb20KeGllemh1YS5j +b20KLnhpaHVhLmVzCmZvcnVtLnhpbmJhby5kZS9mb3J1bQoueGluZy5jb20KfGh0 +dHA6Ly94aW5nLmNvbQoueGlubWlhby5jb20uaGsKfHx4aW5taWFvLmNvbS5oawp4 +aW5zaGVuZy5uZXQKeGluc2hpanVlLmNvbQp4aW5odWFuZXQub3JnCnxodHRwOi8v +eGlueXViYnMubmV0Ci54aW9uZ3BpYW4uY29tCi54aXVyZW4ub3JnCnhpemFuZy16 +aGl5ZS5vcmcKeGpwLmNjCnx8eGpwLmNjCnx8eGp0cmF2ZWxndWlkZS5jb20KeGxm +bXRhbGsuY29tCnx8eGxmbXd6LmluZm8KfHx4bWwtdHJhaW5pbmctZ3VpZGUuY29t +Cnhtb3ZpZXMuY29tCnx8eG54eC5jb20KeHBkby5uZXQKfHx4cHVkLm9yZwoueHJl +bnRkdmQuY29tCi54c2t5d2Fsa2VyLm5ldAp8fHh0dWJlLmNvbQpibG9nLnh1aXRl +Lm5ldAp2bG9nLnh1aXRlLm5ldAp4dXpoaXlvbmcubmV0Cnx8eHVjaGFvLm9yZwp4 +dWNoYW8ubmV0Cnx8eHVjaGFvLm5ldAp4dmlkZW8uY2MKLnh2aWRlb3MuY29tCnx8 +eHZpZGVvcy5jb20KfHx4dmlkZW9zLmVzCi54a2l3aS50ay8KLnh4YmJ4LmNvbQou +eHhsbW92aWVzLmNvbQp8fHh4eC5jb20KLnh4eC54eHgKfGh0dHA6Ly94eHgueHh4 +Ci54eHhmdWNrbW9tLmNvbQp8fHh4eHguY29tLmF1Ci54eHh5bW92aWVzLmNvbQp8 +aHR0cDovL3h4eHltb3ZpZXMuY29tCnh5cy5vcmcKeHlzYmxvZ3Mub3JnCnh5eTY5 +LmNvbQp4eXk2OS5pbmZvCgohLS0tLS0tLS0tLS0tLS0tLS0tLS1ZWS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0KfHx5YWtidXR0ZXJibHVlcy5jb20KeWFtLmNvbQp8 +fHlhbS5jb20KfHx5YW0ub3JnLnR3Ci55YW5naGVuZ2p1bi5jb20KeWFuZ2ppYW5s +aS5jb20KLnlhc25pLmNvLnVrCnx8eWFzbmkuY28udWsKIS0tfHx5YXN1a3VuaS5v +ci5qcAoueWF5YWJheS5jb20vZm9ydW0KLnlkeS5jb20KLnllYWh0ZWVudHViZS5j +b20KfHx5ZWFodGVlbnR1YmUuY29tCnx8eWVjbC5uZXQKfHx5ZWVsb3UuY29tCnll +ZXlpLmNvbQp5ZWdsZS5uZXQKfHx5ZWdsZS5uZXQKLnllcy54eHgKfHx5ZXMxMjMu +Y29tLnR3Cnx8eWVzYXNpYS5jb20KfHx5ZXNhc2lhLmNvbS5oawoueWVzLW5ld3Mu +Y29tCnxodHRwOi8veWVzLW5ld3MuY29tCi55ZXNwb3JucGxlYXNlLmNvbQp8fHll +c3Bvcm5wbGVhc2UuY29tCnxodHRwOi8veWV5ZWNsdWIuY29tCiEtLXlmcm9nLmNv +bQp8fHloY3cubmV0Ci55aWJhZGEuY29tCi55aWJhb2NoaW5hLmNvbQoueWlkaW8u +Y29tCnx8eWlkaW8uY29tCnlpbHViYnMuY29tCnhhLnlpbWcuY29tCi55aW5nc3Vv +c3MuY29tCi55aXB1Yi5jb20KfHx5aXB1Yi5jb20KeWlubGVpLm9yZy9tdAoueWl6 +aGlob25neGluZy5jb20KLnlvYnQuY29tCi55b2J0LnR2Cnx8eW9idC50dgoueW9n +aWNoZW4ub3JnCnx8eW9naWNoZW4ub3JnCi55b2xhc2l0ZS5jb20KLnlvbWl1cmku +Y28uanAKeW9uZy5odQoueW9ya2Jicy5jYQp8fHlvdXh1LmluZm8KLnlvdWppenou +Y29tCnx8eW91aml6ei5jb20KLnlvdW1ha2VyLmNvbQp8fHlvdW1ha2VyLmNvbQou +eW91bmdwb3JudmlkZW9zLmNvbQp5b3VuZ3NwaXJhdGlvbi5oawoueW91cGFpLm9y +Zwp8fHlvdXBhaS5vcmcKLnlvdXItZnJlZWRvbS5uZXQKfHx5b3VyZXBlYXQuY29t +Ci55b3VycHJpdmF0ZXZwbi5jb20KfHx5b3VycHJpdmF0ZXZwbi5jb20KLnlvdXNl +bmRpdC5jb20KfHx5b3VzZW5kaXQuY29tCi55b3V0aG5ldHJhZGlvLm9yZy90bWl0 +L2ZvcnVtCmJsb2cueW91dGh3YW50LmNvbS50dwptZS55b3V0aHdhbnQuY29tLnR3 +CnNoYXJlLnlvdXRod2FudC5jb20udHcKdG9waWMueW91dGh3YW50LmNvbS50dwou +eW91cG9ybi5jb20KfHx5b3Vwb3JuLmNvbQoueW91cG9ybmdheS5jb20KfHx5b3Vw +b3JuZ2F5LmNvbQoueW91cmxpc3Rlbi5jb20KfGh0dHA6Ly95b3VybGlzdGVuLmNv +bQoueW91cmx1c3QuY29tCnxodHRwOi8veW91cmx1c3QuY29tCnlvdXNodW4xMi5j +b20KLnlvdXR1YmVjbi5jb20KeW91dmVyc2lvbi5jb20KfHx5b3V2ZXJzaW9uLmNv +bQpibG9nLnlvdXh1LmluZm8vMjAxMC8wMy8xNC93ZXN0LWNoYW1iZXIKeXRodC5u +ZXQKeXVhbm1pbmcubmV0Ci55dWFuemhlbmd0YW5nLm9yZwoueXVsZ2h1bi5jb20K +fHx5dW5jaGFvLm5ldAp8fHl1bnRpcHViLmNvbQoueXV2dXR1LmNvbQp8fHl2ZXNn +ZWxleW4uY29tCi55d3B3LmNvbS9mb3J1bXMvaGlzdG9yeS9wb3N0L0EwL3AwL2h0 +bWwvMjI3Cnl4NTEubmV0Ci55eWlpLm9yZwp8fHl5aWkub3JnCi55enprLmNvbQp8 +aHR0cDovL3l6emsuY29tCgohLS0tLS0tLS0tLS0tLS0tLS0tLS1aWi0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0KemFjZWJvb2suY29tCi56YWxtb3MuY29tCnx8emFs +bW9zLmNvbQp8fHphbm5lbC5jb20KLnphb2Jhby5jb20KfHx6YW9iYW8uY29tCnxo +dHRwOi8vemFvYmFvLmNvbS5zZwp8fHphb2Jhby5jb20uc2cKLnphb3pvbi5jb20K +fHx6ZG5ldC5jb20udHcKLnplbGxvLmNvbQp8fHplbGxvLmNvbQouemVuZ2ppbnlh +bi5vcmcKLnplbm1hdGUuY29tCnx8emVubWF0ZS5jb20KfHx6ZW5tYXRlLmNvbS5y +dQp8fHplcm9uZXQuaW8KfHx6ZXV0Y2guY29tCiEtLXd3dy56ZnJlZXQuY29tL3Bv +c3QvdXNlanVtcC1icm93bnMuaHRtbAouemZyZWV0LmNvbQouemdzZGRoLmNvbQp6 +Z3pjamoubmV0Ci56aGFuYmluLm5ldAp8fHpoYW5iaW4ubmV0Ci56aGFuZ2JvbGku +bmV0Cnx8emhhbmd0aWFubGlhbmcuY29tCnx8emhhbmx2ZS5vcmcKemhlbmdodWku +b3JnCi56aGVuZ2ppYW4ub3JnCnx8emhlbmdqaWFuLm9yZwp6aGVuZ3d1bmV0Lm9y +Zwp6aGVubGlidS5pbmZvCnx8emhlbmxpYnUuaW5mbwouemhlbmxpYnUxOTg0LmNv +bQp8fHpoZW5saWJ1MTk4NC5jb20KfGh0dHA6Ly96aGVueGlhbmcuYml6Ci56aGlu +ZW5nbHV5b3UuY29tCnpob25nZ3VvLmNhCnxodHRwOi8vemhvbmdndW9yZW5xdWFu +Lm9yZwp6aG9uZ2d1b3Rlc2UubmV0Cnx8emhvbmdndW90ZXNlLm5ldAp8fHpob25n +bWVuZy5vcmcKLnpob3VzaHVndWFuZy5jb20KfHx6aHJlYWRlci5jb20KLnpodWFu +Z2JpLm1lCnx8emh1YW5nYmkubWUKLnpodWFueGluZy5jbgp8fHpodWF0aWViYS5j +b20Kemh1aWNoYWd1b2ppLm9yZwp8fHpodWljaGFndW9qaS5vcmcKfGh0dHA6Ly9i +b29rLnppNS5tZQouemlkZHUuY29tL2Rvd25sb2FkCnx8emlsbGlvbmsuY29tCi56 +aW5pby5jb20KfHx6aW5pby5jb20KLnppcG9ybi5jb20KLnppcHB5c2hhcmUuY29t +Ci56a2FpcC5jb20KfHx6a2FpcC5jb20KcmVhbGZvcnVtLnpraXouY29tCiEtLXx8 +emxpYi5uZXQKfHx6bXcuY24KLnpvZGdhbWUudXMKem9tb2JvLm5ldAouem9uYWV1 +cm9wYS5jb20KfHx6b25hZXVyb3BhLmNvbQp8fHpvbmdoZXhpbndlbi5jb20KLnpv +bmdoZXhpbndlbi5uZXQKfHx6b29ndnBuLmNvbQp8fHpvb3Rvb2wuY29tCi56b296 +bGUubmV0CndyaXRlci56b2hvLmNvbQp8fHpvcnJvdnBuLmNvbQp8fHpwbi5pbQp8 +fHpzcGVlZGVyLm1lCi56c3JoYW8uY29tCi56dW8ubGEKfHx6dW8ubGEKfHx6dW9i +aWFvLm1lCi56dW9sYS5jb20KfHx6dW9sYS5jb20KfHx6dmVyZWZmLmNvbQouenlu +YWltYS5jb20Kenl6YzkuY29tCi56emNhcnRvb24uY29tCiEjIyMjIyMjIyMjIyMj +I0dlbmVyYWwgTGlzdCBFbmQjIyMjIyMjIyMjIyMjIyMjIwoKISMjIyMjIyMjIyMj +U3VwcGxlbWVudGFsIExpc3QgU3RhcnQjIyMjIyMjIyMjIyMjCiEtLS0tLS0tLS0t +LS0tLS0tLVVSTCBLZXl3b3Jkcy0tLS0tLS0tLS0tLS0tLS0tLQo2NG1lbW8KYUhS +MGNITTZMeTk1WldOc0xtNWxkQQpmcmVlbmV0Ci5nb29nbGUuKi9mYWx1bgpwaG9i +b3MuYXBwbGUuY29tKi92aWRlbwpxPWZyZWVkb20KcSUzRGZyZWVkb20KcmVtZW1i +ZXJpbmdfdGlhbmFubWVuXzIwX3llYXJzCnNlYXJjaCpzYWZld2ViCnE9dHJpYW5n +bGUKcSUzRFRyaWFuZ2xlCnVsdHJhcmVhY2gKdWx0cmFzdXJmCiEjIyMjIyMjIyMj +IyMjU3VwcGxlbWVudGFsIExpc3QgRW5kIyMjIyMjIyMjIyMjIwoKISMjIyMjIyMj +IyMjIyMjIyNXaGl0ZWxpc3QgU3RhcnQjIyMjIyMjIyMjIyMjIyMjCkBAfHxhbGl5 +dW4uY29tCkBAfHxiYWlkdS5jb20KIS0tQEB8fGJpbmcuY29tCkBAfHxjaGluYXNv +LmNvbQpAQHx8Y2hpbmF6LmNvbQpAQHxodHRwOi8vbnJjaC5jdWx0dXJlLnR3Lwoh +LS1JU1AgY2FjaGUgd29ya3Mgc29tZXRpbWVzLCB2ZXJpZmllZCBhdCBkcnBlbmcg +KyBnZWh1YS4KQEB8fGRsLmdvb2dsZS5jb20KQEB8fGtoLmdvb2dsZS5jb20KQEB8 +fGtobS5nb29nbGUuY29tCkBAfHxraG0wLmdvb2dsZS5jb20KQEB8fGtobTEuZ29v +Z2xlLmNvbQpAQHx8a2htMi5nb29nbGUuY29tCkBAfHxraG0zLmdvb2dsZS5jb20K +QEB8fGtobWRiLmdvb2dsZS5jb20KQEB8fHRvb2xzLmdvb2dsZS5jb20KQEB8fGNs +aWVudHNlcnZpY2VzLmdvb2dsZWFwaXMuY29tCkBAfHxmb250cy5nb29nbGVhcGlz +LmNvbQpAQHx8a2htLmdvb2dsZWFwaXMuY29tCkBAfHxraG0wLmdvb2dsZWFwaXMu +Y29tCkBAfHxraG0xLmdvb2dsZWFwaXMuY29tCkBAfHxraG0yLmdvb2dsZWFwaXMu +Y29tCkBAfHxraG0zLmdvb2dsZWFwaXMuY29tCkBAfHxraG1kYi5nb29nbGVhcGlz +LmNvbQpAQHx8c3RvcmFnZS5nb29nbGVhcGlzLmNvbQpAQHx8dHJhbnNsYXRlLmdv +b2dsZWFwaXMuY29tCkBAfHx1cGRhdGUuZ29vZ2xlYXBpcy5jb20KQEB8fHNhZmVi +cm93c2luZy5nb29nbGVhcGlzLmNvbQpAQHx8Y24uZ3JhdmF0YXIuY29tCkBAfHxj +b25uZWN0aXZpdHljaGVjay5nc3RhdGljLmNvbQpAQHx8Y3NpLmdzdGF0aWMuY29t +CkBAfHxmb250cy5nc3RhdGljLmNvbQpAQHx8c3NsLmdzdGF0aWMuY29tCkBAfHxo +YW9zb3UuY29tCkBAfHxpcC5jbgpAQHx8amlrZS5jb20KQEB8aHR0cDovL3RyYW5z +bGF0ZS5nb29nbGUuY24KQEB8aHR0cDovL3d3dy5nb29nbGUuY24vbWFwcwpAQHx8 +aHR0cDIuZ29sYW5nLm9yZwpAQHx8Z292LmNuCkBAfHxxcS5jb20KQEB8fHNpbmEu +Y24KQEB8fHNpbmEuY29tLmNuCkBAfHxzb2dvdS5jb20KQEB8fHNvLmNvbQpAQHx8 +c29zby5jb20KQEB8fHVsdWFpLmNvbS5jbgpAQHx8d2VpYm8uY29tCkBAfHx5YWhv +by5jbgpAQHx8eW91ZGFvLmNvbQpAQHx8emhvbmdzb3UuY29tCkBAfGh0dHA6Ly9p +bWUuYmFpZHUuanAKISMjIyMjIyMjIyMjIyMjIyNXaGl0ZWxpc3QgRW5kIyMjIyMj +IyMjIyMjIyMjIyMjCiEtLS0tLS0tLS0tLS0tLS0tLS0tLS1FT0YtLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLQo= diff --git a/ShadowsocksX-NG/install_helper.sh b/ShadowsocksX-NG/install_helper.sh index fe34eba8..aa8db660 100755 --- a/ShadowsocksX-NG/install_helper.sh +++ b/ShadowsocksX-NG/install_helper.sh @@ -6,9 +6,9 @@ # Created by clowwindy on 14-3-15. cd `dirname "${BASH_SOURCE[0]}"` -sudo mkdir -p "/Library/Application Support/ShadowsocksX-NG/" -sudo cp proxy_conf_helper "/Library/Application Support/ShadowsocksX-NG/" -sudo chown root:admin "/Library/Application Support/ShadowsocksX-NG/proxy_conf_helper" -sudo chmod +s "/Library/Application Support/ShadowsocksX-NG/proxy_conf_helper" +sudo mkdir -p "/Library/Application Support/ShadowsocksX-NG-R/" +sudo cp proxy_conf_helper "/Library/Application Support/ShadowsocksX-NG-R/" +sudo chown root:admin "/Library/Application Support/ShadowsocksX-NG-R/proxy_conf_helper" +sudo chmod +s "/Library/Application Support/ShadowsocksX-NG-R/proxy_conf_helper" -echo done \ No newline at end of file +echo done diff --git a/ShadowsocksX-NG/install_privoxy.sh b/ShadowsocksX-NG/install_privoxy.sh index a89d9e87..9c7f50c7 100755 --- a/ShadowsocksX-NG/install_privoxy.sh +++ b/ShadowsocksX-NG/install_privoxy.sh @@ -9,9 +9,9 @@ cd `dirname "${BASH_SOURCE[0]}"` privoxyVersion=3.0.26.static -mkdir -p "$HOME/Library/Application Support/ShadowsocksX-NG/privoxy-$privoxyVersion" -cp -f privoxy "$HOME/Library/Application Support/ShadowsocksX-NG/privoxy-$privoxyVersion/" -rm -f "$HOME/Library/Application Support/ShadowsocksX-NG/privoxy" -ln -s "$HOME/Library/Application Support/ShadowsocksX-NG/privoxy-$privoxyVersion/privoxy" "$HOME/Library/Application Support/ShadowsocksX-NG/privoxy" +mkdir -p "$HOME/Library/Application Support/ShadowsocksX-NG-R/privoxy-$privoxyVersion" +cp -f privoxy "$HOME/Library/Application Support/ShadowsocksX-NG-R/privoxy-$privoxyVersion/" +rm -f "$HOME/Library/Application Support/ShadowsocksX-NG-R/privoxy" +ln -s "$HOME/Library/Application Support/ShadowsocksX-NG-R/privoxy-$privoxyVersion/privoxy" "$HOME/Library/Application Support/ShadowsocksX-NG-R/privoxy" echo done diff --git a/ShadowsocksX-NG/install_ss_local.sh b/ShadowsocksX-NG/install_ss_local.sh index 6141f8c8..b5aba7b7 100755 --- a/ShadowsocksX-NG/install_ss_local.sh +++ b/ShadowsocksX-NG/install_ss_local.sh @@ -8,12 +8,12 @@ cd `dirname "${BASH_SOURCE[0]}"` -ssLocalVersion=2.5.6.9.static -mkdir -p "$HOME/Library/Application Support/ShadowsocksX-NG/ss-local-$ssLocalVersion" -cp -f ss-local "$HOME/Library/Application Support/ShadowsocksX-NG/ss-local-$ssLocalVersion/" -rm -f "$HOME/Library/Application Support/ShadowsocksX-NG/ss-local" -ln -s "$HOME/Library/Application Support/ShadowsocksX-NG/ss-local-$ssLocalVersion/ss-local" "$HOME/Library/Application Support/ShadowsocksX-NG/ss-local" +ssLocalVersion=2.5.6.12.static +mkdir -p "$HOME/Library/Application Support/ShadowsocksX-NG-R/ss-local-$ssLocalVersion" +cp -f ss-local "$HOME/Library/Application Support/ShadowsocksX-NG-R/ss-local-$ssLocalVersion/" +rm -f "$HOME/Library/Application Support/ShadowsocksX-NG-R/ss-local" +ln -s "$HOME/Library/Application Support/ShadowsocksX-NG-R/ss-local-$ssLocalVersion/ss-local" "$HOME/Library/Application Support/ShadowsocksX-NG-R/ss-local" -cp -f libcrypto.1.0.0.dylib "$HOME/Library/Application Support/ShadowsocksX-NG/" +cp -f libcrypto.1.0.0.dylib "$HOME/Library/Application Support/ShadowsocksX-NG-R/" echo done diff --git a/ShadowsocksX-NG/reload_conf_privoxy.sh b/ShadowsocksX-NG/reload_conf_privoxy.sh index f8e435c2..319b14c0 100755 --- a/ShadowsocksX-NG/reload_conf_privoxy.sh +++ b/ShadowsocksX-NG/reload_conf_privoxy.sh @@ -6,7 +6,7 @@ # Created by 王晨 on 16/10/7. # Copyright © 2016年 zhfish. All rights reserved. -#launchctl kill SIGHUP "$HOME/Library/LaunchAgents/com.qiuyuzhou.shadowsocksX-NG.http.plist" +#launchctl kill SIGHUP "$HOME/Library/LaunchAgents/com.qiuyuzhou.shadowsocksX-NG-R.http.plist" -launchctl unload "$HOME/Library/LaunchAgents/com.qiuyuzhou.shadowsocksX-NG.http.plist" -launchctl load "$HOME/Library/LaunchAgents/com.qiuyuzhou.shadowsocksX-NG.http.plist" +launchctl unload "$HOME/Library/LaunchAgents/com.qiuyuzhou.shadowsocksX-NG-R.http.plist" +launchctl load "$HOME/Library/LaunchAgents/com.qiuyuzhou.shadowsocksX-NG-R.http.plist" diff --git a/ShadowsocksX-NG/reload_conf_ss_local.sh b/ShadowsocksX-NG/reload_conf_ss_local.sh index c96f7906..0b12cffb 100755 --- a/ShadowsocksX-NG/reload_conf_ss_local.sh +++ b/ShadowsocksX-NG/reload_conf_ss_local.sh @@ -6,7 +6,7 @@ # Created by 邱宇舟 on 16/6/6. # Copyright © 2016年 qiuyuzhou. All rights reserved. -#launchctl kill SIGHUP "$HOME/Library/LaunchAgents/com.qiuyuzhou.shadowsocksX-NG.local.plist" +#launchctl kill SIGHUP "$HOME/Library/LaunchAgents/com.qiuyuzhou.shadowsocksX-NG-R.local.plist" -launchctl unload "$HOME/Library/LaunchAgents/com.qiuyuzhou.shadowsocksX-NG.local.plist" -launchctl load "$HOME/Library/LaunchAgents/com.qiuyuzhou.shadowsocksX-NG.local.plist" +launchctl unload "$HOME/Library/LaunchAgents/com.qiuyuzhou.shadowsocksX-NG-R.local.plist" +launchctl load "$HOME/Library/LaunchAgents/com.qiuyuzhou.shadowsocksX-NG-R.local.plist" diff --git a/ShadowsocksX-NG/ss-local b/ShadowsocksX-NG/ss-local index 89681d34..fc428004 100755 Binary files a/ShadowsocksX-NG/ss-local and b/ShadowsocksX-NG/ss-local differ diff --git a/ShadowsocksX-NG/start_privoxy.sh b/ShadowsocksX-NG/start_privoxy.sh index bedef6a0..3e1566d5 100755 --- a/ShadowsocksX-NG/start_privoxy.sh +++ b/ShadowsocksX-NG/start_privoxy.sh @@ -6,4 +6,4 @@ # Created by 王晨 on 16/10/7. # Copyright © 2016年 zhfish. All rights reserved. -launchctl load "$HOME/Library/LaunchAgents/com.qiuyuzhou.shadowsocksX-NG.http.plist" +launchctl load "$HOME/Library/LaunchAgents/com.qiuyuzhou.shadowsocksX-NG-R.http.plist" diff --git a/ShadowsocksX-NG/start_ss_local.sh b/ShadowsocksX-NG/start_ss_local.sh index b4047d32..97be3baa 100755 --- a/ShadowsocksX-NG/start_ss_local.sh +++ b/ShadowsocksX-NG/start_ss_local.sh @@ -6,4 +6,4 @@ # Created by 邱宇舟 on 16/6/6. # Copyright © 2016年 qiuyuzhou. All rights reserved. -launchctl load "$HOME/Library/LaunchAgents/com.qiuyuzhou.shadowsocksX-NG.local.plist" \ No newline at end of file +launchctl load "$HOME/Library/LaunchAgents/com.qiuyuzhou.shadowsocksX-NG-R.local.plist" diff --git a/ShadowsocksX-NG/stop_privoxy.sh b/ShadowsocksX-NG/stop_privoxy.sh index 8cb6a2b3..e84df0f6 100755 --- a/ShadowsocksX-NG/stop_privoxy.sh +++ b/ShadowsocksX-NG/stop_privoxy.sh @@ -8,4 +8,4 @@ -launchctl unload "$HOME/Library/LaunchAgents/com.qiuyuzhou.shadowsocksX-NG.http.plist" +launchctl unload "$HOME/Library/LaunchAgents/com.qiuyuzhou.shadowsocksX-NG-R.http.plist" diff --git a/ShadowsocksX-NG/stop_ss_local.sh b/ShadowsocksX-NG/stop_ss_local.sh index 5a6cf577..55ca34ab 100755 --- a/ShadowsocksX-NG/stop_ss_local.sh +++ b/ShadowsocksX-NG/stop_ss_local.sh @@ -8,4 +8,4 @@ -launchctl unload "$HOME/Library/LaunchAgents/com.qiuyuzhou.shadowsocksX-NG.local.plist" \ No newline at end of file +launchctl unload "$HOME/Library/LaunchAgents/com.qiuyuzhou.shadowsocksX-NG-R.local.plist" diff --git a/ShadowsocksX-NG/zh-Hans.lproj/MainMenu.strings b/ShadowsocksX-NG/zh-Hans.lproj/MainMenu.strings index eea6bfc6..fdf3220e 100644 --- a/ShadowsocksX-NG/zh-Hans.lproj/MainMenu.strings +++ b/ShadowsocksX-NG/zh-Hans.lproj/MainMenu.strings @@ -113,3 +113,11 @@ "sDG-YV-yuQ.title" = "ACL自动"; +"NnE-Ad-1An.title" = "手动更新订阅"; + +"nQ4-Nv-tox.title" = "打开时自动更新订阅"; + +"QJ6-eg-mzv.title" = "编辑订阅"; + +"QJ6-eg-mzv.title" = "编辑订阅"; + diff --git a/ShadowsocksX-NG/zh-Hans.lproj/PreferencesWindowController.strings b/ShadowsocksX-NG/zh-Hans.lproj/PreferencesWindowController.strings index d0050287..fce10b65 100644 --- a/ShadowsocksX-NG/zh-Hans.lproj/PreferencesWindowController.strings +++ b/ShadowsocksX-NG/zh-Hans.lproj/PreferencesWindowController.strings @@ -26,7 +26,7 @@ /* Class = "NSTextFieldCell"; title = "Obfs Param"; ObjectID = "g7c-fW-7J4"; */ "g7c-fW-7J4.title" = "混淆参数:"; -/* Class = "NSButtonCell"; title = "Cacnel"; ObjectID = "j03-9E-uHW"; */ +/* Class = "NSButtonCell"; title = "Cancel"; ObjectID = "j03-9E-uHW"; */ "j03-9E-uHW.title" = "取消"; /* Class = "NSTextFieldCell"; title = "Password:"; ObjectID = "kil-xC-HPD"; */ diff --git a/ShadowsocksX-NG/zh-Hans.lproj/SubscribePreferenceWindowController.strings b/ShadowsocksX-NG/zh-Hans.lproj/SubscribePreferenceWindowController.strings new file mode 100644 index 00000000..5f5fb0dc --- /dev/null +++ b/ShadowsocksX-NG/zh-Hans.lproj/SubscribePreferenceWindowController.strings @@ -0,0 +1,24 @@ + +/* Class = "NSButtonCell"; title = "OK"; ObjectID = "CfK-8Y-YNP"; */ +"CfK-8Y-YNP.title" = "OK"; + +/* Class = "NSWindow"; title = "Window"; ObjectID = "F0z-JX-Cv5"; */ +"F0z-JX-Cv5.title" = "订阅设置"; + +/* Class = "NSTextFieldCell"; title = "Token"; ObjectID = "IrJ-D8-tlX"; */ +"IrJ-D8-tlX.title" = "口令"; + +/* Class = "NSTextFieldCell"; title = "Group"; ObjectID = "f2p-qb-uuE"; */ +"f2p-qb-uuE.title" = "组名"; + +/* Class = "NSTextFieldCell"; title = "Text"; ObjectID = "ik7-wS-gok"; */ +"ik7-wS-gok.title" = "Text"; + +/* Class = "NSTextFieldCell"; title = "Subscribe Feed URL"; ObjectID = "rMX-5B-Fvs"; */ +"rMX-5B-Fvs.title" = "订阅设置"; + +/* Class = "NSTextFieldCell"; title = "Count"; ObjectID = "wbG-HT-bdN"; */ +"wbG-HT-bdN.title" = "最大数量"; + +/* Class = "NSTextFieldCell"; title = "URL"; ObjectID = "yBp-oB-gbL"; */ +"yBp-oB-gbL.title" = "订阅地址";