diff --git a/.gitignore b/.gitignore
index c0affc9b..f928111c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -63,6 +63,7 @@ target/
# VS Code
.vscode/*
+cddagl/.vs/*
# PyCharm
.idea/
diff --git a/LICENSES/CC-BY-NC-SA-2.5.txt b/LICENSES/CC-BY-NC-SA-2.5.txt
deleted file mode 100644
index e64b6d7c..00000000
--- a/LICENSES/CC-BY-NC-SA-2.5.txt
+++ /dev/null
@@ -1,87 +0,0 @@
-Creative Commons Attribution-NonCommercial-ShareAlike 2.5
-
- CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM ITS USE.
-
-License
-
-THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED.
-
-BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS.
-
-1. Definitions
-
- a. "Collective Work" means a work, such as a periodical issue, anthology or encyclopedia, in which the Work in its entirety in unmodified form, along with a number of other contributions, constituting separate and independent works in themselves, are assembled into a collective whole. A work that constitutes a Collective Work will not be considered a Derivative Work (as defined below) for the purposes of this License.
-
- b. "Derivative Work" means a work based upon the Work or upon the Work and other pre-existing works, such as a translation, musical arrangement, dramatization, fictionalization, motion picture version, sound recording, art reproduction, abridgment, condensation, or any other form in which the Work may be recast, transformed, or adapted, except that a work that constitutes a Collective Work will not be considered a Derivative Work for the purpose of this License. For the avoidance of doubt, where the Work is a musical composition or sound recording, the synchronization of the Work in timed-relation with a moving image ("synching") will be considered a Derivative Work for the purpose of this License.
-
- c. "Licensor" means the individual or entity that offers the Work under the terms of this License.
-
- d. "Original Author" means the individual or entity who created the Work.
-
- e. "Work" means the copyrightable work of authorship offered under the terms of this License.
-
- f. "You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation.
-
- g. "License Elements" means the following high-level license attributes as selected by Licensor and indicated in the title of this License: Attribution, Noncommercial, ShareAlike.
-
-2. Fair Use Rights. Nothing in this license is intended to reduce, limit, or restrict any rights arising from fair use, first sale or other limitations on the exclusive rights of the copyright owner under copyright law or other applicable laws.
-
-3. License Grant. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below:
-
- a. to reproduce the Work, to incorporate the Work into one or more Collective Works, and to reproduce the Work as incorporated in the Collective Works;
-
- b. to create and reproduce Derivative Works;
-
- c. to distribute copies or phonorecords of, display publicly, perform publicly, and perform publicly by means of a digital audio transmission the Work including as incorporated in Collective Works;
-
- d. to distribute copies or phonorecords of, display publicly, perform publicly, and perform publicly by means of a digital audio transmission Derivative Works;
-
-The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats. All rights not expressly granted by Licensor are hereby reserved, including but not limited to the rights set forth in Sections 4(e) and 4(f).
-
-4. Restrictions. The license granted in Section 3 above is expressly made subject to and limited by the following restrictions:
-
- a. You may distribute, publicly display, publicly perform, or publicly digitally perform the Work only under the terms of this License, and You must include a copy of, or the Uniform Resource Identifier for, this License with every copy or phonorecord of the Work You distribute, publicly display, publicly perform, or publicly digitally perform. You may not offer or impose any terms on the Work that alter or restrict the terms of this License or the recipients' exercise of the rights granted hereunder. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties. You may not distribute, publicly display, publicly perform, or publicly digitally perform the Work with any technological measures that control access or use of the Work in a manner inconsistent with the terms of this License Agreement. The above applies to the Work as incorporated in a Collective Work, but this does not require the Collective Work apart from the Work itself to be made subject to the terms of this License. If You create a Collective Work, upon notice from any Licensor You must, to the extent practicable, remove from the Collective Work any credit as required by clause 4(d), as requested. If You create a Derivative Work, upon notice from any Licensor You must, to the extent practicable, remove from the Derivative Work any credit as required by clause 4(d), as requested.
-
- b. You may distribute, publicly display, publicly perform, or publicly digitally perform a Derivative Work only under the terms of this License, a later version of this License with the same License Elements as this License, or a Creative Commons iCommons license that contains the same License Elements as this License (e.g. Attribution-NonCommercial-ShareAlike 2.5 Japan). You must include a copy of, or the Uniform Resource Identifier for, this License or other license specified in the previous sentence with every copy or phonorecord of each Derivative Work You distribute, publicly display, publicly perform, or publicly digitally perform. You may not offer or impose any terms on the Derivative Works that alter or restrict the terms of this License or the recipients' exercise of the rights granted hereunder, and You must keep intact all notices that refer to this License and to the disclaimer of warranties. You may not distribute, publicly display, publicly perform, or publicly digitally perform the Derivative Work with any technological measures that control access or use of the Work in a manner inconsistent with the terms of this License Agreement. The above applies to the Derivative Work as incorporated in a Collective Work, but this does not require the Collective Work apart from the Derivative Work itself to be made subject to the terms of this License.
-
- c. You may not exercise any of the rights granted to You in Section 3 above in any manner that is primarily intended for or directed toward commercial advantage or private monetary compensation. The exchange of the Work for other copyrighted works by means of digital file-sharing or otherwise shall not be considered to be intended for or directed toward commercial advantage or private monetary compensation, provided there is no payment of any monetary compensation in connection with the exchange of copyrighted works.
-
- d. If you distribute, publicly display, publicly perform, or publicly digitally perform the Work or any Derivative Works or Collective Works, You must keep intact all copyright notices for the Work and provide, reasonable to the medium or means You are utilizing: (i) the name of the Original Author (or pseudonym, if applicable) if supplied, and/or (ii) if the Original Author and/or Licensor designate another party or parties (e.g. a sponsor institute, publishing entity, journal) for attribution in Licensor's copyright notice, terms of service or by other reasonable means, the name of such party or parties; the title of the Work if supplied; to the extent reasonably practicable, the Uniform Resource Identifier, if any, that Licensor specifies to be associated with the Work, unless such URI does not refer to the copyright notice or licensing information for the Work; and in the case of a Derivative Work, a credit identifying the use of the Work in the Derivative Work (e.g., "French translation of the Work by Original Author," or "Screenplay based on original Work by Original Author"). Such credit may be implemented in any reasonable manner; provided, however, that in the case of a Derivative Work or Collective Work, at a minimum such credit will appear where any other comparable authorship credit appears and in a manner at least as prominent as such other comparable authorship credit.
-
- e. For the avoidance of doubt, where the Work is a musical composition:
-
- i. Performance Royalties Under Blanket Licenses. Licensor reserves the exclusive right to collect, whether individually or via a performance rights society (e.g. ASCAP, BMI, SESAC), royalties for the public performance or public digital performance (e.g. webcast) of the Work if that performance is primarily intended for or directed toward commercial advantage or private monetary compensation.
-
- ii. Mechanical Rights and Statutory Royalties. Licensor reserves the exclusive right to collect, whether individually or via a music rights agency or designated agent (e.g. Harry Fox Agency), royalties for any phonorecord You create from the Work ("cover version") and distribute, subject to the compulsory license created by 17 USC Section 115 of the US Copyright Act (or the equivalent in other jurisdictions), if Your distribution of such cover version is primarily intended for or directed toward commercial advantage or private monetary compensation.
-
- f. Webcasting Rights and Statutory Royalties. For the avoidance of doubt, where the Work is a sound recording, Licensor reserves the exclusive right to collect, whether individually or via a performance-rights society (e.g. SoundExchange), royalties for the public digital performance (e.g. webcast) of the Work, subject to the compulsory license created by 17 USC Section 114 of the US Copyright Act (or the equivalent in other jurisdictions), if Your public digital performance is primarily intended for or directed toward commercial advantage or private monetary compensation.
-
-5. Representations, Warranties and Disclaimer
-
-UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU.
-
-6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
-
-7. Termination
-
- a. This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Derivative Works or Collective Works from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License.
-
- b. Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above.
-
-8. Miscellaneous
-
- a. Each time You distribute or publicly digitally perform the Work or a Collective Work, the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License.
-
- b. Each time You distribute or publicly digitally perform a Derivative Work, Licensor offers to the recipient a license to the original Work on the same terms and conditions as the license granted to You under this License.
-
- c. If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.
-
- d. No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent.
-
- e. This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Licensor and You.
-
-Creative Commons is not a party to this License, and makes no warranty whatsoever in connection with the Work. Creative Commons will not be liable to You or any party on any legal theory for any damages whatsoever, including without limitation any general, special, incidental or consequential damages arising in connection to this license. Notwithstanding the foregoing two (2) sentences, if Creative Commons has expressly identified itself as the Licensor hereunder, it shall have all rights and obligations of Licensor.
-
-Except for the limited purpose of indicating to the public that the Work is licensed under the CCPL, neither party will use the trademark "Creative Commons" or any related trademark or logo of Creative Commons without the prior written consent of Creative Commons. Any permitted use will be in compliance with Creative Commons' then-current trademark usage guidelines, as may be published on its website or otherwise made available upon request from time to time.
-
-Creative Commons may be contacted at http://creativecommons.org/.
diff --git a/LICENSES/CC-BY-SA-4.0.txt b/LICENSES/CC-BY-SA-4.0.txt
new file mode 100644
index 00000000..e53ce6d9
--- /dev/null
+++ b/LICENSES/CC-BY-SA-4.0.txt
@@ -0,0 +1,97 @@
+Creative Commons Attribution-ShareAlike 4.0 International Public License
+By exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Creative Commons Attribution-ShareAlike 4.0 International Public License ("Public License"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions.
+
+Section 1 – Definitions.
+
+Adapted Material means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image.
+Adapter's License means the license You apply to Your Copyright and Similar Rights in Your contributions to Adapted Material in accordance with the terms and conditions of this Public License.
+BY-SA Compatible License means a license listed at creativecommons.org/compatiblelicenses, approved by Creative Commons as essentially the equivalent of this Public License.
+Copyright and Similar Rights means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights.
+Effective Technological Measures means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements.
+Exceptions and Limitations means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material.
+License Elements means the license attributes listed in the name of a Creative Commons Public License. The License Elements of this Public License are Attribution and ShareAlike.
+Licensed Material means the artistic or literary work, database, or other material to which the Licensor applied this Public License.
+Licensed Rights means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license.
+Licensor means the individual(s) or entity(ies) granting rights under this Public License.
+Share means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them.
+Sui Generis Database Rights means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world.
+You means the individual or entity exercising the Licensed Rights under this Public License. Your has a corresponding meaning.
+Section 2 – Scope.
+
+License grant.
+Subject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to:
+reproduce and Share the Licensed Material, in whole or in part; and
+produce, reproduce, and Share Adapted Material.
+Exceptions and Limitations. For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions.
+Term. The term of this Public License is specified in Section 6(a).
+Media and formats; technical modifications allowed. The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a)(4) never produces Adapted Material.
+Downstream recipients.
+Offer from the Licensor – Licensed Material. Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License.
+Additional offer from the Licensor – Adapted Material. Every recipient of Adapted Material from You automatically receives an offer from the Licensor to exercise the Licensed Rights in the Adapted Material under the conditions of the Adapter’s License You apply.
+No downstream restrictions. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material.
+No endorsement. Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(A)(i).
+Other rights.
+
+Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise.
+Patent and trademark rights are not licensed under this Public License.
+To the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties.
+Section 3 – License Conditions.
+
+Your exercise of the Licensed Rights is expressly made subject to the following conditions.
+
+Attribution.
+
+If You Share the Licensed Material (including in modified form), You must:
+
+retain the following if it is supplied by the Licensor with the Licensed Material:
+identification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated);
+a copyright notice;
+a notice that refers to this Public License;
+a notice that refers to the disclaimer of warranties;
+a URI or hyperlink to the Licensed Material to the extent reasonably practicable;
+indicate if You modified the Licensed Material and retain an indication of any previous modifications; and
+indicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License.
+You may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information.
+If requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(A) to the extent reasonably practicable.
+ShareAlike.
+In addition to the conditions in Section 3(a), if You Share Adapted Material You produce, the following conditions also apply.
+
+The Adapter’s License You apply must be a Creative Commons license with the same License Elements, this version or later, or a BY-SA Compatible License.
+You must include the text of, or the URI or hyperlink to, the Adapter's License You apply. You may satisfy this condition in any reasonable manner based on the medium, means, and context in which You Share Adapted Material.
+You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, Adapted Material that restrict exercise of the rights granted under the Adapter's License You apply.
+Section 4 – Sui Generis Database Rights.
+
+Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material:
+
+for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database;
+if You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material, including for purposes of Section 3(b); and
+You must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database.
+For the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights.
+Section 5 – Disclaimer of Warranties and Limitation of Liability.
+
+Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You.
+To the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You.
+The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability.
+Section 6 – Term and Termination.
+
+This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically.
+Where Your right to use the Licensed Material has terminated under Section 6(a), it reinstates:
+
+automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or
+upon express reinstatement by the Licensor.
+For the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License.
+For the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License.
+Sections 1, 5, 6, 7, and 8 survive termination of this Public License.
+Section 7 – Other Terms and Conditions.
+
+The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed.
+Any arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License.
+Section 8 – Interpretation.
+
+For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License.
+To the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions.
+No term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor.
+Nothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority.
+Creative Commons is not a party to its public licenses. Notwithstanding, Creative Commons may elect to apply one of its public licenses to material it publishes and in those instances will be considered the “Licensor.” The text of the Creative Commons public licenses is dedicated to the public domain under the CC0 Public Domain Dedication. Except for the limited purpose of indicating that material is shared under a Creative Commons public license or as otherwise permitted by the Creative Commons policies published at creativecommons.org/policies, Creative Commons does not authorize the use of the trademark “Creative Commons” or any other trademark or logo of Creative Commons without its prior written consent including, without limitation, in connection with any unauthorized modifications to any of its public licenses or any other arrangements, understandings, or agreements concerning use of licensed material. For the avoidance of doubt, this paragraph does not form part of the public licenses.
+
+Creative Commons may be contacted at creativecommons.org.
\ No newline at end of file
diff --git a/cddagl/VERSION b/cddagl/VERSION
index 49ebdd60..83d1a5eb 100644
--- a/cddagl/VERSION
+++ b/cddagl/VERSION
@@ -1 +1 @@
-1.6.5
\ No newline at end of file
+1.6.6
\ No newline at end of file
diff --git a/cddagl/resources/launcher.ico.license b/cddagl/resources/launcher.ico.license
index b19dff05..fb2b59f5 100644
--- a/cddagl/resources/launcher.ico.license
+++ b/cddagl/resources/launcher.ico.license
@@ -1,5 +1,5 @@
SPDX-FileCopyrightText: 2022 Aunt Su
-SPDX-License-Identifier: CC-BY-NC-SA-2.5
+SPDX-License-Identifier: CC-BY-SA-4.0
SPDX-FileComment: Launcher Icon By Aunt Su, edited by acepleiades from the CDDA tileset repo
\ No newline at end of file
diff --git a/cddagl/ui/views/main.py b/cddagl/ui/views/main.py
index 1604b141..86b32b4d 100644
--- a/cddagl/ui/views/main.py
+++ b/cddagl/ui/views/main.py
@@ -1249,6 +1249,27 @@ def __init__(self):
layout_row = layout_row + 1
+ build_type_label = QLabel()
+ layout.addWidget(build_type_label, layout_row, 0, Qt.AlignRight)
+ self.build_type_label = build_type_label
+
+ build_type_button_group = QButtonGroup()
+ self.build_type_button_group = build_type_button_group
+
+ msvc_radio_button = QRadioButton()
+ layout.addWidget(msvc_radio_button, layout_row, 1)
+ self.msvc_radio_button = msvc_radio_button
+ build_type_button_group.addButton(msvc_radio_button)
+
+ build_type_button_group.buttonClicked.connect(self.build_type_clicked)
+
+ other_radio_button = QRadioButton()
+ layout.addWidget(other_radio_button, layout_row, 2)
+ self.other_radio_button = other_radio_button
+ build_type_button_group.addButton(other_radio_button)
+
+ layout_row = layout_row + 1
+
available_builds_label = QLabel()
layout.addWidget(available_builds_label, layout_row, 0, Qt.AlignRight)
self.available_builds_label = available_builds_label
@@ -1335,6 +1356,9 @@ def set_text(self):
self.platform_label.setText(_('Platform:'))
self.x64_radio_button.setText('{so} ({bit})'.format(so=_('Windows x64'), bit=_('64-bit')))
self.x86_radio_button.setText('{so} ({bit})'.format(so=_('Windows x86'), bit=_('32-bit')))
+ self.build_type_label.setText(_('Build type:'))
+ self.msvc_radio_button.setText('msvc')
+ self.other_radio_button.setText('other')
self.available_builds_label.setText(_('Available builds:'))
self.find_build_label.setText(_('Find build #:'))
self.find_build_button.setText(_('Add to list'))
@@ -1357,6 +1381,7 @@ def showEvent(self, event):
self.experimental_radio_button.setChecked(True)
platform = get_config_value('platform')
+ build_type = get_config_value('build_type')
if platform == 'Windows x64':
platform = 'x64'
@@ -1369,11 +1394,19 @@ def showEvent(self, event):
else:
platform = 'x86'
+ if build_type is None or build_type not in ('-msvc-','-'):
+ build_type = '-msvc-'
+
if platform == 'x64':
self.x64_radio_button.setChecked(True)
elif platform == 'x86':
self.x86_radio_button.setChecked(True)
+ if build_type == '-msvc-':
+ self.msvc_radio_button.setChecked(True)
+ elif build_type == '-':
+ self.other_radio_button.setChecked(True)
+
self.show_hide_find_build()
self.refresh_builds()
@@ -1480,13 +1513,7 @@ def find_build_finished(self):
target_regex = re.compile(
r'cdda-windows-' +
re.escape(asset_graphics) + r'-' +
- re.escape(asset_platform) + r'-' +
- r'b?(?P[0-9\-]+)\.zip'
- )
- target_regex_msvc = re.compile(
- r'cdda-windows-' +
- re.escape(asset_graphics) + r'-' +
- re.escape(asset_platform) + r'-msvc-' +
+ re.escape(asset_platform) + self.selected_build_type +
r'b?(?P[0-9\-]+)\.zip'
)
@@ -1504,9 +1531,7 @@ def find_build_finished(self):
x for x in release['assets']
if 'browser_download_url' in x
and 'name' in x
- and (
- target_regex.search(x['name']) is not None or
- target_regex_msvc.search(x['name']) is not None )
+ and target_regex.search(x['name']) is not None
)
asset = next(asset_iter, None)
@@ -1924,6 +1949,9 @@ def disable_controls(self, update_button=False):
self.x64_radio_button.setEnabled(False)
self.x86_radio_button.setEnabled(False)
+ self.msvc_radio_button.setEnabled(False)
+ self.other_radio_button.setEnabled(False)
+
self.previous_bc_enabled = self.builds_combo.isEnabled()
self.builds_combo.setEnabled(False)
self.refresh_builds_button.setEnabled(False)
@@ -1942,6 +1970,9 @@ def enable_controls(self, builds_combo=False):
self.x64_radio_button.setEnabled(True)
self.x86_radio_button.setEnabled(True)
+ self.msvc_radio_button.setEnabled(True)
+ self.other_radio_button.setEnabled(True)
+
self.refresh_builds_button.setEnabled(True)
self.find_build_value.setEnabled(True)
self.find_build_button.setEnabled(True)
@@ -2856,7 +2887,7 @@ def download_dl_progress(self, bytes_read, total_bytes):
self.download_last_bytes_read = bytes_read
self.download_last_read = datetime.utcnow()
- def start_lb_request(self, base_asset):
+ def start_lb_request(self, base_asset, selected_build_type):
self.disable_controls(True)
self.refresh_warning_label.hide()
self.find_build_warning_label.hide()
@@ -2873,6 +2904,7 @@ def start_lb_request(self, base_asset):
url = cons.GITHUB_REST_API_URL + cons.CDDA_RELEASES
self.base_asset = base_asset
+ self.selected_build_type = selected_build_type
fetching_label = QLabel()
fetching_label.setText(_('Fetching: {url}').format(url=url))
@@ -3036,14 +3068,7 @@ def lb_http_finished(self):
target_regex = re.compile(
r'cdda-windows-' +
re.escape(asset_graphics) + r'-' +
- re.escape(asset_platform) + r'-' +
- r'b?(?P[0-9\-]+)\.zip'
- )
-
- target_regex_msvc = re.compile(
- r'cdda-windows-' +
- re.escape(asset_graphics) + r'-' +
- re.escape(asset_platform) + r'-msvc-' +
+ re.escape(asset_platform) + self.selected_build_type +
r'b?(?P[0-9\-]+)\.zip'
)
@@ -3061,9 +3086,7 @@ def lb_http_finished(self):
x for x in release['assets']
if 'browser_download_url' in x
and 'name' in x
- and (
- target_regex.search(x['name']) is not None or
- target_regex_msvc.search(x['name']) is not None)
+ and target_regex.search(x['name']) is not None
)
asset = next(asset_iter, None)
@@ -3170,11 +3193,19 @@ def refresh_builds(self):
selected_platform = self.platform_button_group.checkedButton()
+ selected_build_type = self.build_type_button_group.checkedButton()
+
if selected_platform is self.x64_radio_button:
selected_platform = 'x64'
elif selected_platform is self.x86_radio_button:
selected_platform = 'x86'
+ if selected_build_type is self.msvc_radio_button:
+ selected_build_type = '-msvc-'
+ elif selected_build_type is self.other_radio_button:
+ selected_build_type = '-'
+
+
if selected_branch is self.stable_radio_button:
# Populate stable builds and stable changelog
@@ -3231,7 +3262,7 @@ def refresh_builds(self):
elif selected_branch is self.experimental_radio_button:
release_asset = cons.BASE_ASSETS['Tiles'][selected_platform]
- self.start_lb_request( release_asset )
+ self.start_lb_request( release_asset, selected_build_type )
self.refresh_changelog()
def refresh_changelog(self):
@@ -3243,48 +3274,66 @@ def refresh_changelog(self):
### Get the last 100 PR
url = cons.CHANGELOG_URL + '100'
-
- changelog_data = requests.get(url).json()
+ try:
+ changelog_data = requests.get(url).json()
+ except requests.ConnectionError:
+ self.changelog_content.setHtml(_('Can\'t reach changelog...
'))
+ return
changelog_html = StringIO()
- date = str()
+ changelog_sorted = dict()
for entry in changelog_data["items"]:
if entry["state"] == "open":
- continue
+ continue
- if date != entry['closed_at'][0:10]:
- date = entry['closed_at'][0:10]
- changelog_html.write('')
- changelog_html.write(
+ new_date = entry['closed_at'][0:10]
+ new_entry = changelog_entry(title =entry['title'],
+ body = entry['body'].split('####'),
+ node_id =entry['node_id'],
+ number=entry['number'],
+ html_url=entry['html_url']
+ )
+
+ if new_date in changelog_sorted:
+ changelog_sorted[new_date].append(new_entry)
+ else:
+ changelog_sorted.update({new_date : [new_entry]})
+
+ for date in sorted(changelog_sorted):
+ changelog_html.write('')
+ changelog_html.write(
'{0}
'
.format(date)
)
+ for sorted_entry in changelog_sorted[date]:
changelog_html.write('')
- changelog_html.write(
+ changelog_html.write(
'{0}
'
- .format(entry['title'])
+ .format(sorted_entry.title)
)
- changelog_html.write('')
- body = entry['body'].split('####')
- if len(body)>2:
- if body[0] == '':
- msg = body[2]
+ changelog_html.write('')
+ body = sorted_entry.body
+ if len(body)>2:
+ if body[0].rstrip() == '':
+ msg = body[2]
+ elif len(body)>3:
+ msg = body[3]
+ msg=msg[18:]
else:
- msg = body[3]
- msg=msg[18:]
- else:
- msg = entry['title']
- commitid = entry['node_id']
- link_repl = rf'#\g'
- msg = id_regex.sub(link_repl, msg)
- commit_name = entry['number']
- if commitid:
- commit_url = entry['html_url']
- changelog_html.write(f'- {msg} [{commit_name}]
')
- else:
- changelog_html.write(f'- {msg}
')
- changelog_html.write('
')
+ msg = sorted_entry.title
+
+ commitid = sorted_entry.node_id
+ link_repl = rf'#\g'
+ msg = id_regex.sub(link_repl, msg)
+ commit_name = sorted_entry.number
+ if commitid:
+ commit_url = sorted_entry.html_url
+ changelog_html.write(f'- {msg} [{commit_name}]
')
+ else:
+ changelog_html.write(f'- {msg}
')
+ changelog_html.write('
')
+ changelog_html.write('
')
self.changelog_content.setHtml(changelog_html.getvalue())
@@ -3316,6 +3365,24 @@ def platform_clicked(self, button):
self.refresh_builds()
+ def build_type_clicked(self, button):
+ if button is self.msvc_radio_button:
+ config_value = '-msvc-'
+ elif button is self.other_radio_button:
+ config_value = '-'
+
+ set_config_value('build_type', config_value)
+
+ self.refresh_builds()
+
+class changelog_entry():
+ def __init__(self: str, title: str, body:str, node_id: str, number: str, html_url: str) -> None:
+ self.title = title
+ self.body = body
+ self.node_id = node_id
+ self.number = number
+ self.html_url = html_url
+
# Recursively delete an entire directory tree while showing progress in a
# status bar. Also display a dialog to retry the delete if there is a problem.
diff --git a/data/soundpacks.json b/data/soundpacks.json
index f517b67f..0e02a184 100644
--- a/data/soundpacks.json
+++ b/data/soundpacks.json
@@ -1,73 +1,69 @@
-[
- {
- "type": "direct_download",
- "viewname": "ChestHole",
- "name": "ChestHole",
- "url": "http://chezzo.com/cdda/ChestHoleSoundSet.zip",
- "homepage": "https://discourse.cataclysmdda.org/t/ambient-sounds/9710/182"
- },
- {
- "type": "direct_download",
- "viewname": "ChestOldTimey",
- "name": "ChestOldTimey",
- "url": "http://chezzo.com/cdda/ChestOldTimeyLessismore.zip",
- "homepage": "https://www.reddit.com/r/cataclysmdda/comments/53ndzx/music_recommendations_to_listen_to_while_playing/d7vfd7w"
- },
- {
- "type": "direct_download",
- "viewname": "ChestHoleCC",
- "name": "ChestHoleCC",
- "url": "http://chezzo.com/cdda/ChestHoleCCSoundset.zip",
- "homepage": "https://www.reddit.com/r/cataclysmdda/comments/53ndzx/music_recommendations_to_listen_to_while_playing/d7vfd7w"
- },
- {
- "type": "direct_download",
- "viewname": "RRFSounds",
- "name": "RRFSounds",
- "url": "https://www.dropbox.com/s/d8dfmb2facvkdh6/RRFSounds.zip?dl=1",
- "size": 80933991,
- "homepage": "https://discourse.cataclysmdda.org/t/ambient-sounds/9710/201"
- },
- {
- "type": "direct_download",
- "viewname": "CDDA-Soundpack",
- "name": "CDDA-Soundpack",
- "url": "https://github.com/budg3/CDDA-Soundpack/archive/master.zip",
- "size": 48214543,
- "homepage": "https://discourse.cataclysmdda.org/t/cdda-soundpack/15329"
- },
- {
- "type": "browser_download",
- "viewname": "CO.AG SoundPack",
- "name": "CO.AG SoundPack",
- "size": 126161760,
- "url": "https://drive.google.com/uc?id=1kjKQDOD0sYQY8QIH6fg8rgqEQgm8Bbqn&export=download",
- "expected_filename": "CO.AG SoundPack (v1.1) (02-Mar-19).zip",
- "homepage": "https://discourse.cataclysmdda.org/t/soundpack-co-ag-soundpack/18992"
- },
- {
- "type": "browser_download",
- "viewname": "2ch soundpack",
- "name": "2ch soundpack",
- "size": 101963863,
- "url": "https://drive.google.com/open?id=14_ZlFCwqavU8JJ9X4PHVM5vqEXs46OsM",
- "expected_filename": "2ch sounpack.zip",
- "homepage": "https://github.com/DazedNConfused-/CDDA-Game-Launcher/issues/248"
- },
- {
- "type": "direct_download",
- "viewname": "@'s soundpack",
- "name": "@'s soundpack",
- "url": "https://github.com/damalsk/damalsksoundpack/archive/v0.2.zip",
- "size": 164342384,
- "homepage": "https://discourse.cataclysmdda.org/t/soundpack-s-soundpack-vehicle-sounds-licensed-music-and-more/20131"
- },
- {
- "type": "direct_download",
- "viewname": "Otopack",
- "name": "Otopack",
- "url": "https://github.com/Kenan2000/Otopack-Mods-Updates/archive/master.zip",
- "size": 139984997,
- "homepage": "https://github.com/Kenan2000/Otopack-Mods-Updates"
- }
-]
+[
+ {
+ "type": "direct_download",
+ "viewname": "ChestHole",
+ "name": "ChestHole",
+ "url": "http://chezzo.com/cdda/ChestHoleSoundSet.zip",
+ "homepage": "https://discourse.cataclysmdda.org/t/ambient-sounds/9710/182"
+ },
+ {
+ "type": "direct_download",
+ "viewname": "ChestOldTimey",
+ "name": "ChestOldTimey",
+ "url": "http://chezzo.com/cdda/ChestOldTimeyLessismore.zip",
+ "homepage": "https://www.reddit.com/r/cataclysmdda/comments/53ndzx/music_recommendations_to_listen_to_while_playing/d7vfd7w"
+ },
+ {
+ "type": "direct_download",
+ "viewname": "ChestHoleCC",
+ "name": "ChestHoleCC",
+ "url": "http://chezzo.com/cdda/ChestHoleCCSoundset.zip",
+ "homepage": "https://www.reddit.com/r/cataclysmdda/comments/53ndzx/music_recommendations_to_listen_to_while_playing/d7vfd7w"
+ },
+ {
+ "type": "direct_download",
+ "viewname": "RRFSounds",
+ "name": "RRFSounds",
+ "url": "https://www.dropbox.com/s/d8dfmb2facvkdh6/RRFSounds.zip?dl=1",
+ "size": 80933991,
+ "homepage": "https://discourse.cataclysmdda.org/t/ambient-sounds/9710/201"
+ },
+ {
+ "type": "direct_download",
+ "viewname": "CDDA-Soundpack",
+ "name": "CDDA-Soundpack",
+ "url": "https://github.com/budg3/CDDA-Soundpack/archive/master.zip",
+ "size": 48214543,
+ "homepage": "https://github.com/budg3/CDDA-Soundpack"
+ },
+ {
+ "type": "direct_download",
+ "viewname": "CO.AG SoundPack",
+ "name": "CO.AG SoundPack",
+ "url": "https://github.com/Fris0uman/CDDA-Soundpacks/releases/latest/download/CO.AG-Music-Only.zip",
+ "homepage": "https://github.com/Fris0uman/CDDA-Soundpacks"
+ },
+ {
+ "type": "direct_download",
+ "viewname": "CC-Sounds",
+ "name": "CC-Sounds",
+ "url": "https://github.com/Fris0uman/CDDA-Soundpacks/releases/latest/download/CC-Sounds.zip",
+ "homepage": "https://github.com/Fris0uman/CDDA-Soundpacks"
+ },
+ {
+ "type": "direct_download",
+ "viewname": "@'s soundpack",
+ "name": "@'s soundpack",
+ "url": "https://github.com/damalsk/damalsksoundpack/archive/v0.2.zip",
+ "size": 164342384,
+ "homepage": "https://github.com/damalsk/damalsksoundpack"
+ },
+ {
+ "type": "direct_download",
+ "viewname": "Otopack",
+ "name": "Otopack",
+ "url": "https://github.com/Kenan2000/Otopack-Mods-Updates/archive/master.zip",
+ "size": 139984997,
+ "homepage": "https://github.com/Kenan2000/Otopack-Mods-Updates"
+ }
+]