diff --git a/Xcodes.xcodeproj/project.pbxproj b/Xcodes.xcodeproj/project.pbxproj index 9ed058b..b597144 100644 --- a/Xcodes.xcodeproj/project.pbxproj +++ b/Xcodes.xcodeproj/project.pbxproj @@ -45,6 +45,9 @@ CAA1CB4D255A5CFD003FD669 /* SignInPhoneListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAA1CB4C255A5CFD003FD669 /* SignInPhoneListView.swift */; }; CAA858CD25A3D8BC00ACF8C0 /* ErrorHandling in Frameworks */ = {isa = PBXBuildFile; productRef = CAA858CC25A3D8BC00ACF8C0 /* ErrorHandling */; }; CAA8587C25A2B37900ACF8C0 /* IsTesting.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAA8587B25A2B37900ACF8C0 /* IsTesting.swift */; }; + CAA8589325A2B77E00ACF8C0 /* aria2c in Copy aria2c */ = {isa = PBXBuildFile; fileRef = CAA8588025A2B63A00ACF8C0 /* aria2c */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; + CAA8589B25A2B83000ACF8C0 /* Aria2CError.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAA8589A25A2B83000ACF8C0 /* Aria2CError.swift */; }; + CAA858DB25A3E11F00ACF8C0 /* aria2-release-1.35.0.tar.gz in Resources */ = {isa = PBXBuildFile; fileRef = CAA858DA25A3E11F00ACF8C0 /* aria2-release-1.35.0.tar.gz */; }; CABFA9BB2592EEEA00380FEE /* DateFormatter+.swift in Sources */ = {isa = PBXBuildFile; fileRef = CABFA9BA2592EEEA00380FEE /* DateFormatter+.swift */; }; CABFA9BD2592EEEA00380FEE /* Environment.swift in Sources */ = {isa = PBXBuildFile; fileRef = CABFA9A92592EEE900380FEE /* Environment.swift */; }; CABFA9BF2592EEEA00380FEE /* URLSession+DownloadTaskPublisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = CABFA9B32592EEEA00380FEE /* URLSession+DownloadTaskPublisher.swift */; }; @@ -128,6 +131,17 @@ name = "Copy Helper"; runOnlyForDeploymentPostprocessing = 0; }; + CAA8589225A2B76F00ACF8C0 /* Copy aria2c */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 6; + files = ( + CAA8589325A2B77E00ACF8C0 /* aria2c in Copy aria2c */, + ); + name = "Copy aria2c"; + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ @@ -176,6 +190,10 @@ CAA1CB48255A5C97003FD669 /* SignInSMSView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignInSMSView.swift; sourceTree = ""; }; CAA1CB4C255A5CFD003FD669 /* SignInPhoneListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignInPhoneListView.swift; sourceTree = ""; }; CAA8587B25A2B37900ACF8C0 /* IsTesting.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IsTesting.swift; sourceTree = ""; }; + CAA8588025A2B63A00ACF8C0 /* aria2c */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.executable"; path = aria2c; sourceTree = ""; }; + CAA8588A25A2B69300ACF8C0 /* aria2c.LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = aria2c.LICENSE; sourceTree = ""; }; + CAA8589A25A2B83000ACF8C0 /* Aria2CError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Aria2CError.swift; sourceTree = ""; }; + CAA858DA25A3E11F00ACF8C0 /* aria2-release-1.35.0.tar.gz */ = {isa = PBXFileReference; lastKnownFileType = archive.gzip; path = "aria2-release-1.35.0.tar.gz"; sourceTree = ""; }; CABFA9A02592EAF500380FEE /* R&PLogo.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "R&PLogo.png"; sourceTree = ""; }; CABFA9A12592EAFB00380FEE /* LICENSE */ = {isa = PBXFileReference; lastKnownFileType = text; path = LICENSE; sourceTree = ""; }; CABFA9A32592ED5700380FEE /* Apple.paw */ = {isa = PBXFileReference; lastKnownFileType = file; name = Apple.paw; path = ../xcodes/Apple.paw; sourceTree = ""; }; @@ -369,6 +387,7 @@ CA378F982466567600A58CE0 /* AppState.swift */, CAE424B3259A764700B8B246 /* AppState+Install.swift */, CABFA9A72592EEE900380FEE /* AppState+Update.swift */, + CAA8589A25A2B83000ACF8C0 /* Aria2CError.swift */, CA9FF88025955C7000E47BAF /* AvailableXcode.swift */, CABFAA2B2592FBFC00380FEE /* Configure.swift */, CABFAA482593162500380FEE /* Bundle+InfoPlistValues.swift */, @@ -419,6 +438,9 @@ CABFAA1D2592F7F200380FEE /* Resources */ = { isa = PBXGroup; children = ( + CAA858DA25A3E11F00ACF8C0 /* aria2-release-1.35.0.tar.gz */, + CAA8588025A2B63A00ACF8C0 /* aria2c */, + CAA8588A25A2B69300ACF8C0 /* aria2c.LICENSE */, CAD2E7A52449575000113D76 /* Assets.xcassets */, CAD2E7AD2449575000113D76 /* Info.plist */, CA9FF83E2594FBC000E47BAF /* Licenses.rtf */, @@ -522,6 +544,7 @@ CA9FF8292594F33200E47BAF /* Generate Acknowledgements */, CAD2E79C2449574E00113D76 /* Resources */, CA9FF8BB259596B500E47BAF /* Copy Helper */, + CAA8589225A2B76F00ACF8C0 /* Copy aria2c */, ); buildRules = ( ); @@ -623,6 +646,7 @@ files = ( CAD2E7A92449575000113D76 /* Preview Assets.xcassets in Resources */, CA9FF83F2594FBC000E47BAF /* Licenses.rtf in Resources */, + CAA858DB25A3E11F00ACF8C0 /* aria2-release-1.35.0.tar.gz in Resources */, CAD2E7A62449575000113D76 /* Assets.xcassets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -683,6 +707,7 @@ CA735109257BF96D00EA9CF8 /* AttributedText.swift in Sources */, CAFBDC4E2599B33D003DCC5A /* MainToolbar.swift in Sources */, CA11E7BA2598476C00D2EE1C /* XcodeCommands.swift in Sources */, + CAA8589B25A2B83000ACF8C0 /* Aria2CError.swift in Sources */, CABFAA492593162500380FEE /* Bundle+InfoPlistValues.swift in Sources */, CA9FF8662595130600E47BAF /* View+IsHidden.swift in Sources */, CAE4248C259A68B800B8B246 /* Optional+IsNotNil.swift in Sources */, diff --git a/Xcodes/Backend/AppState+Install.swift b/Xcodes/Backend/AppState+Install.swift index d8b934f..c61c8de 100644 --- a/Xcodes/Backend/AppState+Install.swift +++ b/Xcodes/Backend/AppState+Install.swift @@ -76,12 +76,12 @@ extension AppState { // Check to see if the archive is in the expected path in case it was downloaded but failed to install let expectedArchivePath = Path.xcodesApplicationSupport/"Xcode-\(availableXcode.version).\(availableXcode.filename.suffix(fromLast: "."))" // aria2 downloads directly to the destination (instead of into /tmp first) so we need to make sure that the download isn't incomplete -// let aria2DownloadMetadataPath = expectedArchivePath.parent/(expectedArchivePath.basename() + ".aria2") -// var aria2DownloadIsIncomplete = false -// if case .aria2 = downloader, aria2DownloadMetadataPath.exists { -// aria2DownloadIsIncomplete = true -// } - if Current.files.fileExistsAtPath(expectedArchivePath.string) {//}, aria2DownloadIsIncomplete == false { + let aria2DownloadMetadataPath = expectedArchivePath.parent/(expectedArchivePath.basename() + ".aria2") + var aria2DownloadIsIncomplete = false + if case .aria2 = downloader, aria2DownloadMetadataPath.exists { + aria2DownloadIsIncomplete = true + } + if Current.files.fileExistsAtPath(expectedArchivePath.string), aria2DownloadIsIncomplete == false { Current.logging.log("(1/6) Found existing archive that will be used for installation at \(expectedArchivePath).") return Just(expectedArchivePath.url) .setFailureType(to: Error.self) @@ -90,13 +90,13 @@ extension AppState { else { let destination = Path.xcodesApplicationSupport/"Xcode-\(availableXcode.version).\(availableXcode.filename.suffix(fromLast: "."))" switch downloader { -// case .aria2(let aria2Path): -// return downloadXcodeWithAria2( -// availableXcode, -// to: destination, -// aria2Path: aria2Path, -// progressChanged: progressChanged -// ) + case .aria2(let aria2Path): + return downloadXcodeWithAria2( + availableXcode, + to: destination, + aria2Path: aria2Path, + progressChanged: progressChanged + ) case .urlSession: return downloadXcodeWithURLSession( availableXcode, @@ -107,20 +107,20 @@ extension AppState { } } -// public func downloadXcodeWithAria2(_ availableXcode: AvailableXcode, to destination: Path, aria2Path: Path, progressChanged: @escaping (Progress) -> Void) -> Promise { -// let cookies = AppleAPI.Current.network.session.configuration.httpCookieStorage?.cookies(for: availableXcode.url) ?? [] -// -// return attemptRetryableTask(maximumRetryCount: 3) { -// let (progress, promise) = Current.shell.downloadWithAria2( -// aria2Path, -// availableXcode.url, -// destination, -// cookies -// ) -// progressChanged(progress) -// return promise.map { _ in destination.url } -// } -// } + public func downloadXcodeWithAria2(_ availableXcode: AvailableXcode, to destination: Path, aria2Path: Path, progressChanged: @escaping (Progress) -> Void) -> AnyPublisher { + let cookies = AppleAPI.Current.network.session.configuration.httpCookieStorage?.cookies(for: availableXcode.url) ?? [] + + let (progress, publisher) = Current.shell.downloadWithAria2( + aria2Path, + availableXcode.url, + destination, + cookies + ) + progressChanged(progress) + return publisher + .map { _ in destination.url } + .eraseToAnyPublisher() + } public func downloadXcodeWithURLSession(_ availableXcode: AvailableXcode, to destination: Path, progressChanged: @escaping (Progress) -> Void) -> AnyPublisher { let resumeDataPath = Path.xcodesApplicationSupport/"Xcode-\(availableXcode.version).resumedata" @@ -432,7 +432,7 @@ public enum InstallationType { public enum Downloader { case urlSession - // case aria2(Path) + case aria2(Path) } let XcodeTeamIdentifier = "59GAB85EFG" diff --git a/Xcodes/Backend/AppState.swift b/Xcodes/Backend/AppState.swift index b5b42d6..03a6217 100644 --- a/Xcodes/Backend/AppState.swift +++ b/Xcodes/Backend/AppState.swift @@ -256,7 +256,7 @@ class AppState: ObservableObject { .mapError { $0 as Error } } .flatMap { [unowned self] in - self.install(.version(availableXcode), downloader: .urlSession) + self.install(.version(availableXcode), downloader: .aria2(Path(url: Bundle.main.url(forAuxiliaryExecutable: "aria2c")!)!)) } .sink( receiveCompletion: { [unowned self] completion in @@ -273,7 +273,18 @@ class AppState: ObservableObject { } func cancelInstall(id: Xcode.ID) { + guard let availableXcode = availableXcodes.first(where: { $0.version == id }) else { return } + + // Cancel the publisher installationPublishers[id] = nil + + // If the download is cancelled by the user, clean up the download files that aria2 creates. + // This isn't done as part of the publisher with handleEvents(receiveCancel:) because it shouldn't happen when e.g. the app quits. + let expectedArchivePath = Path.xcodesApplicationSupport/"Xcode-\(availableXcode.version).\(availableXcode.filename.suffix(fromLast: "."))" + let aria2DownloadMetadataPath = expectedArchivePath.parent/(expectedArchivePath.basename() + ".aria2") + try? Current.files.removeItem(at: expectedArchivePath.url) + try? Current.files.removeItem(at: aria2DownloadMetadataPath.url) + if let index = allXcodes.firstIndex(where: { $0.id == id }) { allXcodes[index].installState = .notInstalled } diff --git a/Xcodes/Backend/Aria2CError.swift b/Xcodes/Backend/Aria2CError.swift new file mode 100644 index 0000000..c652626 --- /dev/null +++ b/Xcodes/Backend/Aria2CError.swift @@ -0,0 +1,125 @@ +import Foundation + +/// A LocalizedError that represents a non-zero exit code from running aria2c. +struct Aria2CError: LocalizedError { + var code: Code + + init?(exitStatus: Int32) { + guard let code = Code(rawValue: exitStatus) else { return nil } + self.code = code + } + + var errorDescription: String? { + "aria2c error: \(code.description)" + } + + // https://github.com/aria2/aria2/blob/master/src/error_code.h + enum Code: Int32, CustomStringConvertible { + case undefined = -1 + // Ignoring, not an error + // case finished = 0 + case unknownError = 1 + case timeOut + case resourceNotFound + case maxFileNotFound + case tooSlowDownloadSpeed + case networkProblem + case inProgress + case cannotResume + case notEnoughDiskSpace + case pieceLengthChanged + case duplicateDownload + case duplicateInfoHash + case fileAlreadyExists + case fileRenamingFailed + case fileOpenError + case fileCreateError + case fileIoError + case dirCreateError + case nameResolveError + case metalinkParseError + case ftpProtocolError + case httpProtocolError + case httpTooManyRedirects + case httpAuthFailed + case bencodeParseError + case bittorrentParseError + case magnetParseError + case optionError + case httpServiceUnavailable + case jsonParseError + case removed + case checksumError + + var description: String { + switch self { + case .undefined: + return "Undefined" + case .unknownError: + return "Unknown error" + case .timeOut: + return "Timed out" + case .resourceNotFound: + return "Resource not found" + case .maxFileNotFound: + return "Maximum number of file not found errors reached" + case .tooSlowDownloadSpeed: + return "Download speed too slow" + case .networkProblem: + return "Network problem" + case .inProgress: + return "Unfinished downloads in progress" + case .cannotResume: + return "Remote server did not support resume when resume was required to complete download" + case .notEnoughDiskSpace: + return "Not enough disk space available" + case .pieceLengthChanged: + return "Piece length was different from one in .aria2 control file" + case .duplicateDownload: + return "Duplicate download" + case .duplicateInfoHash: + return "Duplicate info hash torrent" + case .fileAlreadyExists: + return "File already exists" + case .fileRenamingFailed: + return "Renaming file failed" + case .fileOpenError: + return "Could not open existing file" + case .fileCreateError: + return "Could not create new file or truncate existing file" + case .fileIoError: + return "File I/O error" + case .dirCreateError: + return "Could not create directory" + case .nameResolveError: + return "Name resolution failed" + case .metalinkParseError: + return "Could not parse Metalink document" + case .ftpProtocolError: + return "FTP command failed" + case .httpProtocolError: + return "HTTP response header was bad or unexpected" + case .httpTooManyRedirects: + return "Too many redirects occurred" + case .httpAuthFailed: + return "HTTP authorization failed" + case .bencodeParseError: + return "Could not parse bencoded file (usually \".torrent\" file)" + case .bittorrentParseError: + return "\".torrent\" file was corrupted or missing information" + case .magnetParseError: + return "Magnet URI was bad" + case .optionError: + return "Bad/unrecognized option was given or unexpected option argument was given" + case .httpServiceUnavailable: + return "HTTP service unavailable" + case .jsonParseError: + return "Could not parse JSON-RPC request" + case .removed: + return "Reserved. Not used." + case .checksumError: + return "Checksum validation failed" + } + } + } +} diff --git a/Xcodes/Backend/Environment.swift b/Xcodes/Backend/Environment.swift index 0938368..d444794 100644 --- a/Xcodes/Backend/Environment.swift +++ b/Xcodes/Backend/Environment.swift @@ -34,6 +34,87 @@ public struct Shell { public var touchInstallCheck: (String, String, String) -> AnyPublisher = { Process.run(Path.root.usr.bin/"touch", "\($0)com.apple.dt.Xcode.InstallCheckCache_\($1)_\($2)") } public var xcodeSelectPrintPath: () -> AnyPublisher = { Process.run(Path.root.usr.bin.join("xcode-select"), "-p") } + + public var downloadWithAria2: (Path, URL, Path, [HTTPCookie]) -> (Progress, AnyPublisher) = { aria2Path, url, destination, cookies in + let process = Process() + process.executableURL = aria2Path.url + process.arguments = [ + "--header=Cookie: \(cookies.map { "\($0.name)=\($0.value)" }.joined(separator: "; "))", + "--max-connection-per-server=16", + "--split=16", + "--summary-interval=1", + "--dir=\(destination.parent.string)", + "--out=\(destination.basename())", + url.absoluteString, + ] + let stdOutPipe = Pipe() + process.standardOutput = stdOutPipe + let stdErrPipe = Pipe() + process.standardError = stdErrPipe + + var progress = Progress(totalUnitCount: 100) + + let observer = NotificationCenter.default.addObserver( + forName: .NSFileHandleDataAvailable, + object: nil, + queue: OperationQueue.main + ) { note in + guard + // This should always be the case for Notification.Name.NSFileHandleDataAvailable + let handle = note.object as? FileHandle, + handle === stdOutPipe.fileHandleForReading || handle === stdErrPipe.fileHandleForReading + else { return } + + defer { handle.waitForDataInBackgroundAndNotify() } + + let string = String(decoding: handle.availableData, as: UTF8.self) + let regex = try! NSRegularExpression(pattern: #"((?\d+)%\))"#) + let range = NSRange(location: 0, length: string.utf16.count) + + guard + let match = regex.firstMatch(in: string, options: [], range: range), + let matchRange = Range(match.range(withName: "percent"), in: string), + let percentCompleted = Int64(string[matchRange]) + else { return } + + progress.completedUnitCount = percentCompleted + } + + stdOutPipe.fileHandleForReading.waitForDataInBackgroundAndNotify() + stdErrPipe.fileHandleForReading.waitForDataInBackgroundAndNotify() + + do { + try process.run() + } catch { + return (progress, Fail(error: error).eraseToAnyPublisher()) + } + + let publisher = Deferred { + Future { promise in + DispatchQueue.global(qos: .default).async { + process.waitUntilExit() + + NotificationCenter.default.removeObserver(observer, name: .NSFileHandleDataAvailable, object: nil) + + guard process.terminationReason == .exit, process.terminationStatus == 0 else { + if let aria2cError = Aria2CError(exitStatus: process.terminationStatus) { + return promise(.failure(aria2cError)) + } else { + return promise(.failure(ProcessExecutionError(process: process, standardOutput: "", standardError: ""))) + } + } + promise(.success(())) + } + } + } + .handleEvents(receiveCancel: { + process.terminate() + NotificationCenter.default.removeObserver(observer, name: .NSFileHandleDataAvailable, object: nil) + }) + .eraseToAnyPublisher() + + return (progress, publisher) + } } public struct Files { diff --git a/Xcodes/Resources/Licenses.rtf b/Xcodes/Resources/Licenses.rtf index 5f04c8d..cc81dc2 100644 --- a/Xcodes/Resources/Licenses.rtf +++ b/Xcodes/Resources/Licenses.rtf @@ -422,6 +422,352 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\ \ \ +\fs34 aria2c\ +\ + +\fs26 GNU GENERAL PUBLIC LICENSE\ + Version 2, June 1991\ +\ + Copyright (C) 1989, 1991 Free Software Foundation, Inc.\ + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\ + Everyone is permitted to copy and distribute verbatim copies\ + of this license document, but changing it is not allowed.\ +\ + Preamble\ +\ + The licenses for most software are designed to take away your\ +freedom to share and change it. By contrast, the GNU General Public\ +License is intended to guarantee your freedom to share and change free\ +software--to make sure the software is free for all its users. This\ +General Public License applies to most of the Free Software\ +Foundation's software and to any other program whose authors commit to\ +using it. (Some other Free Software Foundation software is covered by\ +the GNU Library General Public License instead.) You can apply it to\ +your programs, too.\ +\ + When we speak of free software, we are referring to freedom, not\ +price. Our General Public Licenses are designed to make sure that you\ +have the freedom to distribute copies of free software (and charge for\ +this service if you wish), that you receive source code or can get it\ +if you want it, that you can change the software or use pieces of it\ +in new free programs; and that you know you can do these things.\ +\ + To protect your rights, we need to make restrictions that forbid\ +anyone to deny you these rights or to ask you to surrender the rights.\ +These restrictions translate to certain responsibilities for you if you\ +distribute copies of the software, or if you modify it.\ +\ + For example, if you distribute copies of such a program, whether\ +gratis or for a fee, you must give the recipients all the rights that\ +you have. You must make sure that they, too, receive or can get the\ +source code. And you must show them these terms so they know their\ +rights.\ +\ + We protect your rights with two steps: (1) copyright the software, and\ +(2) offer you this license which gives you legal permission to copy,\ +distribute and/or modify the software.\ +\ + Also, for each author's protection and ours, we want to make certain\ +that everyone understands that there is no warranty for this free\ +software. If the software is modified by someone else and passed on, we\ +want its recipients to know that what they have is not the original, so\ +that any problems introduced by others will not reflect on the original\ +authors' reputations.\ +\ + Finally, any free program is threatened constantly by software\ +patents. We wish to avoid the danger that redistributors of a free\ +program will individually obtain patent licenses, in effect making the\ +program proprietary. To prevent this, we have made it clear that any\ +patent must be licensed for everyone's free use or not licensed at all.\ +\ + The precise terms and conditions for copying, distribution and\ +modification follow.\ +\page \ + GNU GENERAL PUBLIC LICENSE\ + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\ +\ + 0. This License applies to any program or other work which contains\ +a notice placed by the copyright holder saying it may be distributed\ +under the terms of this General Public License. The "Program", below,\ +refers to any such program or work, and a "work based on the Program"\ +means either the Program or any derivative work under copyright law:\ +that is to say, a work containing the Program or a portion of it,\ +either verbatim or with modifications and/or translated into another\ +language. (Hereinafter, translation is included without limitation in\ +the term "modification".) Each licensee is addressed as "you".\ +\ +Activities other than copying, distribution and modification are not\ +covered by this License; they are outside its scope. The act of\ +running the Program is not restricted, and the output from the Program\ +is covered only if its contents constitute a work based on the\ +Program (independent of having been made by running the Program).\ +Whether that is true depends on what the Program does.\ +\ + 1. You may copy and distribute verbatim copies of the Program's\ +source code as you receive it, in any medium, provided that you\ +conspicuously and appropriately publish on each copy an appropriate\ +copyright notice and disclaimer of warranty; keep intact all the\ +notices that refer to this License and to the absence of any warranty;\ +and give any other recipients of the Program a copy of this License\ +along with the Program.\ +\ +You may charge a fee for the physical act of transferring a copy, and\ +you may at your option offer warranty protection in exchange for a fee.\ +\ + 2. You may modify your copy or copies of the Program or any portion\ +of it, thus forming a work based on the Program, and copy and\ +distribute such modifications or work under the terms of Section 1\ +above, provided that you also meet all of these conditions:\ +\ + a) You must cause the modified files to carry prominent notices\ + stating that you changed the files and the date of any change.\ +\ + b) You must cause any work that you distribute or publish, that in\ + whole or in part contains or is derived from the Program or any\ + part thereof, to be licensed as a whole at no charge to all third\ + parties under the terms of this License.\ +\ + c) If the modified program normally reads commands interactively\ + when run, you must cause it, when started running for such\ + interactive use in the most ordinary way, to print or display an\ + announcement including an appropriate copyright notice and a\ + notice that there is no warranty (or else, saying that you provide\ + a warranty) and that users may redistribute the program under\ + these conditions, and telling the user how to view a copy of this\ + License. (Exception: if the Program itself is interactive but\ + does not normally print such an announcement, your work based on\ + the Program is not required to print an announcement.)\ +\page \ +These requirements apply to the modified work as a whole. If\ +identifiable sections of that work are not derived from the Program,\ +and can be reasonably considered independent and separate works in\ +themselves, then this License, and its terms, do not apply to those\ +sections when you distribute them as separate works. But when you\ +distribute the same sections as part of a whole which is a work based\ +on the Program, the distribution of the whole must be on the terms of\ +this License, whose permissions for other licensees extend to the\ +entire whole, and thus to each and every part regardless of who wrote it.\ +\ +Thus, it is not the intent of this section to claim rights or contest\ +your rights to work written entirely by you; rather, the intent is to\ +exercise the right to control the distribution of derivative or\ +collective works based on the Program.\ +\ +In addition, mere aggregation of another work not based on the Program\ +with the Program (or with a work based on the Program) on a volume of\ +a storage or distribution medium does not bring the other work under\ +the scope of this License.\ +\ + 3. You may copy and distribute the Program (or a work based on it,\ +under Section 2) in object code or executable form under the terms of\ +Sections 1 and 2 above provided that you also do one of the following:\ +\ + a) Accompany it with the complete corresponding machine-readable\ + source code, which must be distributed under the terms of Sections\ + 1 and 2 above on a medium customarily used for software interchange; or,\ +\ + b) Accompany it with a written offer, valid for at least three\ + years, to give any third party, for a charge no more than your\ + cost of physically performing source distribution, a complete\ + machine-readable copy of the corresponding source code, to be\ + distributed under the terms of Sections 1 and 2 above on a medium\ + customarily used for software interchange; or,\ +\ + c) Accompany it with the information you received as to the offer\ + to distribute corresponding source code. (This alternative is\ + allowed only for noncommercial distribution and only if you\ + received the program in object code or executable form with such\ + an offer, in accord with Subsection b above.)\ +\ +The source code for a work means the preferred form of the work for\ +making modifications to it. For an executable work, complete source\ +code means all the source code for all modules it contains, plus any\ +associated interface definition files, plus the scripts used to\ +control compilation and installation of the executable. However, as a\ +special exception, the source code distributed need not include\ +anything that is normally distributed (in either source or binary\ +form) with the major components (compiler, kernel, and so on) of the\ +operating system on which the executable runs, unless that component\ +itself accompanies the executable.\ +\ +If distribution of executable or object code is made by offering\ +access to copy from a designated place, then offering equivalent\ +access to copy the source code from the same place counts as\ +distribution of the source code, even though third parties are not\ +compelled to copy the source along with the object code.\ +\page \ + 4. You may not copy, modify, sublicense, or distribute the Program\ +except as expressly provided under this License. Any attempt\ +otherwise to copy, modify, sublicense or distribute the Program is\ +void, and will automatically terminate your rights under this License.\ +However, parties who have received copies, or rights, from you under\ +this License will not have their licenses terminated so long as such\ +parties remain in full compliance.\ +\ + 5. You are not required to accept this License, since you have not\ +signed it. However, nothing else grants you permission to modify or\ +distribute the Program or its derivative works. These actions are\ +prohibited by law if you do not accept this License. Therefore, by\ +modifying or distributing the Program (or any work based on the\ +Program), you indicate your acceptance of this License to do so, and\ +all its terms and conditions for copying, distributing or modifying\ +the Program or works based on it.\ +\ + 6. Each time you redistribute the Program (or any work based on the\ +Program), the recipient automatically receives a license from the\ +original licensor to copy, distribute or modify the Program subject to\ +these terms and conditions. You may not impose any further\ +restrictions on the recipients' exercise of the rights granted herein.\ +You are not responsible for enforcing compliance by third parties to\ +this License.\ +\ + 7. If, as a consequence of a court judgment or allegation of patent\ +infringement or for any other reason (not limited to patent issues),\ +conditions are imposed on you (whether by court order, agreement or\ +otherwise) that contradict the conditions of this License, they do not\ +excuse you from the conditions of this License. If you cannot\ +distribute so as to satisfy simultaneously your obligations under this\ +License and any other pertinent obligations, then as a consequence you\ +may not distribute the Program at all. For example, if a patent\ +license would not permit royalty-free redistribution of the Program by\ +all those who receive copies directly or indirectly through you, then\ +the only way you could satisfy both it and this License would be to\ +refrain entirely from distribution of the Program.\ +\ +If any portion of this section is held invalid or unenforceable under\ +any particular circumstance, the balance of the section is intended to\ +apply and the section as a whole is intended to apply in other\ +circumstances.\ +\ +It is not the purpose of this section to induce you to infringe any\ +patents or other property right claims or to contest validity of any\ +such claims; this section has the sole purpose of protecting the\ +integrity of the free software distribution system, which is\ +implemented by public license practices. Many people have made\ +generous contributions to the wide range of software distributed\ +through that system in reliance on consistent application of that\ +system; it is up to the author/donor to decide if he or she is willing\ +to distribute software through any other system and a licensee cannot\ +impose that choice.\ +\ +This section is intended to make thoroughly clear what is believed to\ +be a consequence of the rest of this License.\ +\page \ + 8. If the distribution and/or use of the Program is restricted in\ +certain countries either by patents or by copyrighted interfaces, the\ +original copyright holder who places the Program under this License\ +may add an explicit geographical distribution limitation excluding\ +those countries, so that distribution is permitted only in or among\ +countries not thus excluded. In such case, this License incorporates\ +the limitation as if written in the body of this License.\ +\ + 9. The Free Software Foundation may publish revised and/or new versions\ +of the General Public License from time to time. Such new versions will\ +be similar in spirit to the present version, but may differ in detail to\ +address new problems or concerns.\ +\ +Each version is given a distinguishing version number. If the Program\ +specifies a version number of this License which applies to it and "any\ +later version", you have the option of following the terms and conditions\ +either of that version or of any later version published by the Free\ +Software Foundation. If the Program does not specify a version number of\ +this License, you may choose any version ever published by the Free Software\ +Foundation.\ +\ + 10. If you wish to incorporate parts of the Program into other free\ +programs whose distribution conditions are different, write to the author\ +to ask for permission. For software which is copyrighted by the Free\ +Software Foundation, write to the Free Software Foundation; we sometimes\ +make exceptions for this. Our decision will be guided by the two goals\ +of preserving the free status of all derivatives of our free software and\ +of promoting the sharing and reuse of software generally.\ +\ + NO WARRANTY\ +\ + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\ +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN\ +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\ +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\ +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\ +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS\ +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE\ +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\ +REPAIR OR CORRECTION.\ +\ + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\ +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\ +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\ +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\ +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\ +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\ +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\ +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\ +POSSIBILITY OF SUCH DAMAGES.\ +\ + END OF TERMS AND CONDITIONS\ +\page \ + How to Apply These Terms to Your New Programs\ +\ + If you develop a new program, and you want it to be of the greatest\ +possible use to the public, the best way to achieve this is to make it\ +free software which everyone can redistribute and change under these terms.\ +\ + To do so, attach the following notices to the program. It is safest\ +to attach them to the start of each source file to most effectively\ +convey the exclusion of warranty; and each file should have at least\ +the "copyright" line and a pointer to where the full notice is found.\ +\ + \ + Copyright (C) \ +\ + This program is free software; you can redistribute it and/or modify\ + it under the terms of the GNU General Public License as published by\ + the Free Software Foundation; either version 2 of the License, or\ + (at your option) any later version.\ +\ + This program is distributed in the hope that it will be useful,\ + but WITHOUT ANY WARRANTY; without even the implied warranty of\ + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\ + GNU General Public License for more details.\ +\ + You should have received a copy of the GNU General Public License\ + along with this program; if not, write to the Free Software\ + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\ +\ +\ +Also add information on how to contact you by electronic and paper mail.\ +\ +If the program is interactive, make it output a short notice like this\ +when it starts in an interactive mode:\ +\ + Gnomovision version 69, Copyright (C) year name of author\ + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\ + This is free software, and you are welcome to redistribute it\ + under certain conditions; type `show c' for details.\ +\ +The hypothetical commands `show w' and `show c' should show the appropriate\ +parts of the General Public License. Of course, the commands you use may\ +be called something other than `show w' and `show c'; they could even be\ +mouse-clicks or menu items--whatever suits your program.\ +\ +You should also get your employer (if you work as a programmer) or your\ +school, if any, to sign a "copyright disclaimer" for the program, if\ +necessary. Here is a sample; alter the names:\ +\ + Yoyodyne, Inc., hereby disclaims all copyright interest in the program\ + `Gnomovision' (which makes passes at compilers) written by James Hacker.\ +\ + , 1 April 1989\ + Ty Coon, President of Vice\ +\ +This General Public License does not permit incorporating your program into\ +proprietary programs. If your program is a subroutine library, you may\ +consider it more useful to permit linking proprietary applications with the\ +library. If this is what you want to do, use the GNU Library General\ +Public License instead of this License.\ +\ +\ + \fs34 spm-licenses\ \ diff --git a/Xcodes/Resources/aria2-release-1.35.0.tar.gz b/Xcodes/Resources/aria2-release-1.35.0.tar.gz new file mode 100644 index 0000000..61b58d9 Binary files /dev/null and b/Xcodes/Resources/aria2-release-1.35.0.tar.gz differ diff --git a/Xcodes/Resources/aria2c b/Xcodes/Resources/aria2c new file mode 100755 index 0000000..a1e1a4b Binary files /dev/null and b/Xcodes/Resources/aria2c differ diff --git a/Xcodes/Resources/aria2c.LICENSE b/Xcodes/Resources/aria2c.LICENSE new file mode 100644 index 0000000..623b625 --- /dev/null +++ b/Xcodes/Resources/aria2c.LICENSE @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License.