From bb2ea9bd17e54bc39e7dcd0efdbcbca586bce5e1 Mon Sep 17 00:00:00 2001 From: Marcono1234 Date: Wed, 31 Jan 2024 18:45:32 +0100 Subject: [PATCH] Hardcode known wrapper checksums to avoid network requests --- .github/workflows/update-checksums-file.js | 92 ++ .github/workflows/update-checksums-file.yml | 49 + __tests__/checksums.test.ts | 4 +- __tests__/validate.test.ts | 24 + src/checksums.ts | 30 +- src/validate.ts | 31 +- src/wrapper-checksums.json | 986 ++++++++++++++++++++ tsconfig.json | 3 +- 8 files changed, 1208 insertions(+), 11 deletions(-) create mode 100644 .github/workflows/update-checksums-file.js create mode 100644 .github/workflows/update-checksums-file.yml create mode 100644 src/wrapper-checksums.json diff --git a/.github/workflows/update-checksums-file.js b/.github/workflows/update-checksums-file.js new file mode 100644 index 00000000..c492a8a1 --- /dev/null +++ b/.github/workflows/update-checksums-file.js @@ -0,0 +1,92 @@ +/* + * Updates the `wrapper-checksums.json` file + * + * This is intended to be executed by the GitHub workflow, but can also be run + * manually. + */ + +// @ts-check + +const httpm = require('typed-rest-client/HttpClient') + +const path = require('path') +const fs = require('fs') + +/** + * @returns {Promise} + */ +async function main() { + const httpc = new httpm.HttpClient( + 'gradle/wrapper-validation-action/update-checksums-workflow', + undefined, + {allowRetries: true, maxRetries: 3} + ) + + /** + * @param {string} url + * @returns {Promise} + */ + async function httpGetText(url) { + const response = await httpc.get(url) + return await response.readBody() + } + + /** + * @typedef {Object} ApiVersionEntry + * @property {string} version - version name + * @property {string=} wrapperChecksumUrl - wrapper checksum URL; not present for old versions + * @property {boolean} snapshot - whether this is a snapshot version + */ + + /** + * @returns {Promise} + */ + async function httpGetVersions() { + return JSON.parse( + await httpGetText('https://services.gradle.org/versions/all') + ) + } + + const versions = (await httpGetVersions()) + // Only include versions with checksum + .filter(e => e.wrapperChecksumUrl !== undefined) + // Ignore snapshots; they are changing frequently so no point in including them in checksums file + .filter(e => !e.snapshot) + console.info(`Got ${versions.length} relevant Gradle versions`) + + // Note: For simplicity don't sort the entries but keep the order from the API; this also has the + // advantage that the latest versions come first, so compared to appending versions at the end + // this will not cause redundant Git diff due to trailing `,` being forbidden by JSON + + /** + * @typedef {Object} FileVersionEntry + * @property {string} version + * @property {string} checksum + */ + /** @type {FileVersionEntry[]} */ + const fileVersions = [] + for (const entry of versions) { + /** @type {string} */ + // @ts-ignore + const checksumUrl = entry.wrapperChecksumUrl + const checksum = await httpGetText(checksumUrl) + fileVersions.push({version: entry.version, checksum}) + } + + const jsonPath = path.resolve( + __dirname, + '..', + '..', + 'src', + 'wrapper-checksums.json' + ) + console.info(`Writing checksums file to ${jsonPath}`) + // Write pretty-printed JSON (and add trailing line break) + fs.writeFileSync(jsonPath, JSON.stringify(fileVersions, null, 2) + '\n') +} + +main().catch(e => { + console.error(e) + // Manually set error exit code, otherwise error is logged but script exits successfully + process.exitCode = 1 +}) diff --git a/.github/workflows/update-checksums-file.yml b/.github/workflows/update-checksums-file.yml new file mode 100644 index 00000000..b468fd4e --- /dev/null +++ b/.github/workflows/update-checksums-file.yml @@ -0,0 +1,49 @@ +name: 'Update Wrapper checksums file' + +on: + schedule: + # Run weekly (at arbitrary time) + - cron: '24 5 * * 6' + # Support running workflow manually + workflow_dispatch: + +jobs: + update-checksums: + name: Update checksums + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: 20.x + cache: npm + + - name: Install dependencies + run: | + npm install typed-rest-client@1.8.11 --no-save + + - name: Update checksums file + run: node ./.github/workflows/update-checksums-file.js + + # If there are no changes, this action will not create a pull request + - name: Create or update pull request + uses: peter-evans/create-pull-request@v6 + with: + branch: wrapper-checksums-update + commit-message: Update known wrapper checksums + title: Update known wrapper checksums + # Note: Unfortunately this action cannot trigger the regular workflows for the PR automatically, see + # https://github.com/peter-evans/create-pull-request/blob/main/docs/concepts-guidelines.md#triggering-further-workflow-runs + # Therefore suggest below to close and then reopen the PR + body: | + Automatically generated pull request to update the known wrapper checksums. + + In case of conflicts, manually run the workflow from the [Actions tab](https://github.com/gradle/wrapper-validation-action/actions/workflows/update-checksums-file.yml), the changes will then be force-pushed onto this pull request branch. + Do not manually update the pull request branch; those changes might get overwritten. + + > [!IMPORTANT] + > GitHub workflows have not been executed for this pull request yet. Before merging, close and then directly reopen this pull request to trigger the workflows. diff --git a/__tests__/checksums.test.ts b/__tests__/checksums.test.ts index bda8d17f..36efbaf5 100644 --- a/__tests__/checksums.test.ts +++ b/__tests__/checksums.test.ts @@ -6,7 +6,7 @@ jest.setTimeout(30000) test('fetches wrapper jars checksums', async () => { const validChecksums = await checksums.fetchValidChecksums(false) - expect(validChecksums.length).toBeGreaterThan(10) + expect(validChecksums.size).toBeGreaterThan(10) }) describe('retry', () => { @@ -25,7 +25,7 @@ describe('retry', () => { }) const validChecksums = await checksums.fetchValidChecksums(false) - expect(validChecksums.length).toBeGreaterThan(10) + expect(validChecksums.size).toBeGreaterThan(10) nock.isDone() }) }) diff --git a/__tests__/validate.test.ts b/__tests__/validate.test.ts index 4abc79d2..6abf48b2 100644 --- a/__tests__/validate.test.ts +++ b/__tests__/validate.test.ts @@ -12,6 +12,30 @@ test('succeeds if all found wrapper jars are valid', async () => { ]) expect(result.isValid()).toBe(true) + // Only hardcoded and explicitly allowed checksums should have been used + expect(result.fetchedChecksums).toBe(false) + + expect(result.toDisplayString()).toBe( + '✓ Found known Gradle Wrapper JAR files:\n' + + ' e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 __tests__/data/invalid/gradle-wrapper.jar\n' + + ' e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 __tests__/data/invalid/gradlе-wrapper.jar\n' + // homoglyph + ' 3888c76faa032ea8394b8a54e04ce2227ab1f4be64f65d450f8509fe112d38ce __tests__/data/valid/gradle-wrapper.jar' + ) +}) + +test('succeeds if all found wrapper jars are valid (and checksums are fetched from Gradle API)', async () => { + const knownValidChecksums = new Map>() + const result = await validate.findInvalidWrapperJars( + baseDir, + 1, + false, + ['e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'], + knownValidChecksums + ) + + expect(result.isValid()).toBe(true) + // Should have fetched checksums because no known checksums were provided + expect(result.fetchedChecksums).toBe(true) expect(result.toDisplayString()).toBe( '✓ Found known Gradle Wrapper JAR files:\n' + diff --git a/src/checksums.ts b/src/checksums.ts index b82810e2..21658346 100644 --- a/src/checksums.ts +++ b/src/checksums.ts @@ -1,14 +1,40 @@ import * as httpm from 'typed-rest-client/HttpClient' +import fileWrapperChecksums from './wrapper-checksums.json' + const httpc = new httpm.HttpClient( 'gradle/wrapper-validation-action', undefined, {allowRetries: true, maxRetries: 3} ) +function getKnownValidChecksums(): Map> { + const versionsMap = new Map>() + for (const entry of fileWrapperChecksums) { + const checksum = entry.checksum + + let versionNames = versionsMap.get(checksum) + if (versionNames === undefined) { + versionNames = new Set() + versionsMap.set(checksum, versionNames) + } + + versionNames.add(entry.version) + } + + return versionsMap +} + +/** + * Known checksums from previously published Wrapper versions. + * + * Maps from the checksum to the names of the Gradle versions whose wrapper has this checksum. + */ +export const KNOWN_VALID_CHECKSUMS = getKnownValidChecksums() + export async function fetchValidChecksums( allowSnapshots: boolean -): Promise { +): Promise> { const all = await httpGetJsonArray('https://services.gradle.org/versions/all') const withChecksum = all.filter( entry => @@ -27,7 +53,7 @@ export async function fetchValidChecksums( const checksums = await Promise.all( checksumUrls.map(async (url: string) => httpGetText(url)) ) - return [...new Set(checksums)] + return new Set(checksums) } async function httpGetJsonArray(url: string): Promise { diff --git a/src/validate.ts b/src/validate.ts index f10a771a..95ae2fdf 100644 --- a/src/validate.ts +++ b/src/validate.ts @@ -6,7 +6,11 @@ export async function findInvalidWrapperJars( gitRepoRoot: string, minWrapperCount: number, allowSnapshots: boolean, - allowChecksums: string[] + allowedChecksums: string[], + knownValidChecksums: Map< + string, + Set + > = checksums.KNOWN_VALID_CHECKSUMS ): Promise { const wrapperJars = await find.findWrapperJars(gitRepoRoot) const result = new ValidationResult([], []) @@ -16,14 +20,28 @@ export async function findInvalidWrapperJars( ) } if (wrapperJars.length > 0) { - const validChecksums = await checksums.fetchValidChecksums(allowSnapshots) - validChecksums.push(...allowChecksums) + const notYetValidatedWrappers = [] for (const wrapperJar of wrapperJars) { const sha = await hash.sha256File(wrapperJar) - if (!validChecksums.includes(sha)) { - result.invalid.push(new WrapperJar(wrapperJar, sha)) - } else { + if (allowedChecksums.includes(sha) || knownValidChecksums.has(sha)) { result.valid.push(new WrapperJar(wrapperJar, sha)) + } else { + notYetValidatedWrappers.push(new WrapperJar(wrapperJar, sha)) + } + } + + // Otherwise fall back to fetching checksums from Gradle API and compare against them + if (notYetValidatedWrappers.length > 0) { + result.fetchedChecksums = true + const fetchedValidChecksums = + await checksums.fetchValidChecksums(allowSnapshots) + + for (const wrapperJar of notYetValidatedWrappers) { + if (!fetchedValidChecksums.has(wrapperJar.checksum)) { + result.invalid.push(wrapperJar) + } else { + result.valid.push(wrapperJar) + } } } } @@ -33,6 +51,7 @@ export async function findInvalidWrapperJars( export class ValidationResult { valid: WrapperJar[] invalid: WrapperJar[] + fetchedChecksums = false errors: string[] = [] constructor(valid: WrapperJar[], invalid: WrapperJar[]) { diff --git a/src/wrapper-checksums.json b/src/wrapper-checksums.json new file mode 100644 index 00000000..c62c22f3 --- /dev/null +++ b/src/wrapper-checksums.json @@ -0,0 +1,986 @@ +[ + { + "version": "8.6-rc-4", + "checksum": "d3b261c2820e9e3d8d639ed084900f11f4a86050a8f83342ade7b6bc9b0d2bdd" + }, + { + "version": "8.6-rc-3", + "checksum": "d3b261c2820e9e3d8d639ed084900f11f4a86050a8f83342ade7b6bc9b0d2bdd" + }, + { + "version": "8.6-rc-2", + "checksum": "d3b261c2820e9e3d8d639ed084900f11f4a86050a8f83342ade7b6bc9b0d2bdd" + }, + { + "version": "8.6-rc-1", + "checksum": "d3b261c2820e9e3d8d639ed084900f11f4a86050a8f83342ade7b6bc9b0d2bdd" + }, + { + "version": "8.6-milestone-1", + "checksum": "d3b261c2820e9e3d8d639ed084900f11f4a86050a8f83342ade7b6bc9b0d2bdd" + }, + { + "version": "8.5", + "checksum": "d3b261c2820e9e3d8d639ed084900f11f4a86050a8f83342ade7b6bc9b0d2bdd" + }, + { + "version": "8.5-rc-4", + "checksum": "d3b261c2820e9e3d8d639ed084900f11f4a86050a8f83342ade7b6bc9b0d2bdd" + }, + { + "version": "8.5-rc-3", + "checksum": "d3b261c2820e9e3d8d639ed084900f11f4a86050a8f83342ade7b6bc9b0d2bdd" + }, + { + "version": "8.5-rc-2", + "checksum": "d3b261c2820e9e3d8d639ed084900f11f4a86050a8f83342ade7b6bc9b0d2bdd" + }, + { + "version": "8.5-rc-1", + "checksum": "d3b261c2820e9e3d8d639ed084900f11f4a86050a8f83342ade7b6bc9b0d2bdd" + }, + { + "version": "8.4", + "checksum": "0336f591bc0ec9aa0c9988929b93ecc916b3c1d52aed202c7381db144aa0ef15" + }, + { + "version": "7.6.3", + "checksum": "14dfa961b6704bb3decdea06502781edaa796a82e6da41cd2e1962b14fbe21a3" + }, + { + "version": "8.4-rc-3", + "checksum": "0336f591bc0ec9aa0c9988929b93ecc916b3c1d52aed202c7381db144aa0ef15" + }, + { + "version": "8.4-rc-2", + "checksum": "0336f591bc0ec9aa0c9988929b93ecc916b3c1d52aed202c7381db144aa0ef15" + }, + { + "version": "8.4-rc-1", + "checksum": "0336f591bc0ec9aa0c9988929b93ecc916b3c1d52aed202c7381db144aa0ef15" + }, + { + "version": "8.3", + "checksum": "0336f591bc0ec9aa0c9988929b93ecc916b3c1d52aed202c7381db144aa0ef15" + }, + { + "version": "8.3-rc-4", + "checksum": "0336f591bc0ec9aa0c9988929b93ecc916b3c1d52aed202c7381db144aa0ef15" + }, + { + "version": "8.3-rc-3", + "checksum": "0336f591bc0ec9aa0c9988929b93ecc916b3c1d52aed202c7381db144aa0ef15" + }, + { + "version": "8.3-rc-2", + "checksum": "0336f591bc0ec9aa0c9988929b93ecc916b3c1d52aed202c7381db144aa0ef15" + }, + { + "version": "8.3-rc-1", + "checksum": "0336f591bc0ec9aa0c9988929b93ecc916b3c1d52aed202c7381db144aa0ef15" + }, + { + "version": "8.2.1", + "checksum": "a8451eeda314d0568b5340498b36edf147a8f0d692c5ff58082d477abe9146e4" + }, + { + "version": "8.2", + "checksum": "a8451eeda314d0568b5340498b36edf147a8f0d692c5ff58082d477abe9146e4" + }, + { + "version": "7.6.2", + "checksum": "14dfa961b6704bb3decdea06502781edaa796a82e6da41cd2e1962b14fbe21a3" + }, + { + "version": "8.2-rc-3", + "checksum": "a8451eeda314d0568b5340498b36edf147a8f0d692c5ff58082d477abe9146e4" + }, + { + "version": "8.2-rc-2", + "checksum": "5c9a1a6f50b4f8c0264b1ac69013bef9f8363733275fafa56c70c84be3276bb8" + }, + { + "version": "8.2-rc-1", + "checksum": "55e949185c26ba3ddcd2c6a4217d043bfa0ce3cc002bbbb52b709a181a513e81" + }, + { + "version": "8.2-milestone-1", + "checksum": "55e949185c26ba3ddcd2c6a4217d043bfa0ce3cc002bbbb52b709a181a513e81" + }, + { + "version": "8.1.1", + "checksum": "ed2c26eba7cfb93cc2b7785d05e534f07b5b48b5e7fc941921cd098628abca58" + }, + { + "version": "8.1", + "checksum": "ed2c26eba7cfb93cc2b7785d05e534f07b5b48b5e7fc941921cd098628abca58" + }, + { + "version": "8.1-rc-4", + "checksum": "ed2c26eba7cfb93cc2b7785d05e534f07b5b48b5e7fc941921cd098628abca58" + }, + { + "version": "8.1-rc-3", + "checksum": "ed2c26eba7cfb93cc2b7785d05e534f07b5b48b5e7fc941921cd098628abca58" + }, + { + "version": "8.1-rc-2", + "checksum": "ed2c26eba7cfb93cc2b7785d05e534f07b5b48b5e7fc941921cd098628abca58" + }, + { + "version": "8.1-rc-1", + "checksum": "ed2c26eba7cfb93cc2b7785d05e534f07b5b48b5e7fc941921cd098628abca58" + }, + { + "version": "8.0.2", + "checksum": "91941f522fbfd4431cf57e445fc3d5200c85f957bda2de5251353cf11174f4b5" + }, + { + "version": "7.6.1", + "checksum": "c5a643cf80162e665cc228f7b16f343fef868e47d3a4836f62e18b7e17ac018a" + }, + { + "version": "6.9.4", + "checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637" + }, + { + "version": "8.0.1", + "checksum": "91941f522fbfd4431cf57e445fc3d5200c85f957bda2de5251353cf11174f4b5" + }, + { + "version": "8.0", + "checksum": "91941f522fbfd4431cf57e445fc3d5200c85f957bda2de5251353cf11174f4b5" + }, + { + "version": "8.0-rc-5", + "checksum": "91941f522fbfd4431cf57e445fc3d5200c85f957bda2de5251353cf11174f4b5" + }, + { + "version": "8.0-rc-4", + "checksum": "91941f522fbfd4431cf57e445fc3d5200c85f957bda2de5251353cf11174f4b5" + }, + { + "version": "8.0-rc-3", + "checksum": "91941f522fbfd4431cf57e445fc3d5200c85f957bda2de5251353cf11174f4b5" + }, + { + "version": "8.0-rc-2", + "checksum": "91941f522fbfd4431cf57e445fc3d5200c85f957bda2de5251353cf11174f4b5" + }, + { + "version": "8.0-rc-1", + "checksum": "91941f522fbfd4431cf57e445fc3d5200c85f957bda2de5251353cf11174f4b5" + }, + { + "version": "8.0-milestone-6", + "checksum": "91941f522fbfd4431cf57e445fc3d5200c85f957bda2de5251353cf11174f4b5" + }, + { + "version": "8.0-milestone-5", + "checksum": "91941f522fbfd4431cf57e445fc3d5200c85f957bda2de5251353cf11174f4b5" + }, + { + "version": "8.0-milestone-4", + "checksum": "577b2de036000db2e0f04f2ec842a4f1e648c8b6f9c87f29a8d896acb1732538" + }, + { + "version": "7.6", + "checksum": "c5a643cf80162e665cc228f7b16f343fef868e47d3a4836f62e18b7e17ac018a" + }, + { + "version": "7.6-rc-4", + "checksum": "c5a643cf80162e665cc228f7b16f343fef868e47d3a4836f62e18b7e17ac018a" + }, + { + "version": "7.6-rc-3", + "checksum": "c5a643cf80162e665cc228f7b16f343fef868e47d3a4836f62e18b7e17ac018a" + }, + { + "version": "7.6-rc-2", + "checksum": "c5a643cf80162e665cc228f7b16f343fef868e47d3a4836f62e18b7e17ac018a" + }, + { + "version": "8.0-milestone-3", + "checksum": "c5a643cf80162e665cc228f7b16f343fef868e47d3a4836f62e18b7e17ac018a" + }, + { + "version": "7.6-rc-1", + "checksum": "c5a643cf80162e665cc228f7b16f343fef868e47d3a4836f62e18b7e17ac018a" + }, + { + "version": "6.9.3", + "checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637" + }, + { + "version": "8.0-milestone-2", + "checksum": "c5a643cf80162e665cc228f7b16f343fef868e47d3a4836f62e18b7e17ac018a" + }, + { + "version": "8.0-milestone-1", + "checksum": "c5a643cf80162e665cc228f7b16f343fef868e47d3a4836f62e18b7e17ac018a" + }, + { + "version": "7.6-milestone-1", + "checksum": "c5a643cf80162e665cc228f7b16f343fef868e47d3a4836f62e18b7e17ac018a" + }, + { + "version": "7.5.1", + "checksum": "91a239400bb638f36a1795d8fdf7939d532cdc7d794d1119b7261aac158b1e60" + }, + { + "version": "7.5", + "checksum": "91a239400bb638f36a1795d8fdf7939d532cdc7d794d1119b7261aac158b1e60" + }, + { + "version": "7.5-rc-5", + "checksum": "91a239400bb638f36a1795d8fdf7939d532cdc7d794d1119b7261aac158b1e60" + }, + { + "version": "7.5-rc-4", + "checksum": "91a239400bb638f36a1795d8fdf7939d532cdc7d794d1119b7261aac158b1e60" + }, + { + "version": "7.5-rc-3", + "checksum": "91a239400bb638f36a1795d8fdf7939d532cdc7d794d1119b7261aac158b1e60" + }, + { + "version": "7.5-rc-2", + "checksum": "91a239400bb638f36a1795d8fdf7939d532cdc7d794d1119b7261aac158b1e60" + }, + { + "version": "7.5-rc-1", + "checksum": "91a239400bb638f36a1795d8fdf7939d532cdc7d794d1119b7261aac158b1e60" + }, + { + "version": "7.4.2", + "checksum": "575098db54a998ff1c6770b352c3b16766c09848bee7555dab09afc34e8cf590" + }, + { + "version": "7.4.1", + "checksum": "575098db54a998ff1c6770b352c3b16766c09848bee7555dab09afc34e8cf590" + }, + { + "version": "7.4", + "checksum": "575098db54a998ff1c6770b352c3b16766c09848bee7555dab09afc34e8cf590" + }, + { + "version": "7.4-rc-2", + "checksum": "575098db54a998ff1c6770b352c3b16766c09848bee7555dab09afc34e8cf590" + }, + { + "version": "7.4-rc-1", + "checksum": "575098db54a998ff1c6770b352c3b16766c09848bee7555dab09afc34e8cf590" + }, + { + "version": "7.3.3", + "checksum": "33ad4583fd7ee156f533778736fa1b4940bd83b433934d1cc4e9f608e99a6a89" + }, + { + "version": "7.3.3-rc-1", + "checksum": "33ad4583fd7ee156f533778736fa1b4940bd83b433934d1cc4e9f608e99a6a89" + }, + { + "version": "6.9.2", + "checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637" + }, + { + "version": "7.3.2", + "checksum": "33ad4583fd7ee156f533778736fa1b4940bd83b433934d1cc4e9f608e99a6a89" + }, + { + "version": "7.3.1", + "checksum": "33ad4583fd7ee156f533778736fa1b4940bd83b433934d1cc4e9f608e99a6a89" + }, + { + "version": "7.3", + "checksum": "33ad4583fd7ee156f533778736fa1b4940bd83b433934d1cc4e9f608e99a6a89" + }, + { + "version": "7.3-rc-5", + "checksum": "33ad4583fd7ee156f533778736fa1b4940bd83b433934d1cc4e9f608e99a6a89" + }, + { + "version": "7.3-rc-4", + "checksum": "33ad4583fd7ee156f533778736fa1b4940bd83b433934d1cc4e9f608e99a6a89" + }, + { + "version": "7.3-rc-3", + "checksum": "33ad4583fd7ee156f533778736fa1b4940bd83b433934d1cc4e9f608e99a6a89" + }, + { + "version": "7.3-rc-2", + "checksum": "33ad4583fd7ee156f533778736fa1b4940bd83b433934d1cc4e9f608e99a6a89" + }, + { + "version": "7.3-rc-1", + "checksum": "33ad4583fd7ee156f533778736fa1b4940bd83b433934d1cc4e9f608e99a6a89" + }, + { + "version": "6.9.1", + "checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637" + }, + { + "version": "7.2", + "checksum": "33ad4583fd7ee156f533778736fa1b4940bd83b433934d1cc4e9f608e99a6a89" + }, + { + "version": "7.2-rc-3", + "checksum": "33ad4583fd7ee156f533778736fa1b4940bd83b433934d1cc4e9f608e99a6a89" + }, + { + "version": "7.2-rc-2", + "checksum": "33ad4583fd7ee156f533778736fa1b4940bd83b433934d1cc4e9f608e99a6a89" + }, + { + "version": "7.2-rc-1", + "checksum": "33ad4583fd7ee156f533778736fa1b4940bd83b433934d1cc4e9f608e99a6a89" + }, + { + "version": "7.1.1", + "checksum": "33ad4583fd7ee156f533778736fa1b4940bd83b433934d1cc4e9f608e99a6a89" + }, + { + "version": "7.1", + "checksum": "33ad4583fd7ee156f533778736fa1b4940bd83b433934d1cc4e9f608e99a6a89" + }, + { + "version": "7.1-rc-2", + "checksum": "33ad4583fd7ee156f533778736fa1b4940bd83b433934d1cc4e9f608e99a6a89" + }, + { + "version": "7.1-rc-1", + "checksum": "33ad4583fd7ee156f533778736fa1b4940bd83b433934d1cc4e9f608e99a6a89" + }, + { + "version": "7.0.2", + "checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637" + }, + { + "version": "7.0.1", + "checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637" + }, + { + "version": "6.9", + "checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637" + }, + { + "version": "6.9-rc-2", + "checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637" + }, + { + "version": "6.9-rc-1", + "checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637" + }, + { + "version": "7.0", + "checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637" + }, + { + "version": "7.0-rc-2", + "checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637" + }, + { + "version": "7.0-rc-1", + "checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637" + }, + { + "version": "7.0-milestone-3", + "checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637" + }, + { + "version": "7.0-milestone-2", + "checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637" + }, + { + "version": "6.8.3", + "checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637" + }, + { + "version": "6.8.2", + "checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637" + }, + { + "version": "7.0-milestone-1", + "checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637" + }, + { + "version": "6.8.1", + "checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637" + }, + { + "version": "6.8", + "checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637" + }, + { + "version": "6.8-rc-5", + "checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637" + }, + { + "version": "6.8-rc-4", + "checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637" + }, + { + "version": "6.8-rc-3", + "checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637" + }, + { + "version": "6.8-rc-1", + "checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637" + }, + { + "version": "6.7.1", + "checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637" + }, + { + "version": "6.8-milestone-3", + "checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637" + }, + { + "version": "6.8-milestone-2", + "checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637" + }, + { + "version": "6.7", + "checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637" + }, + { + "version": "6.8-milestone-1", + "checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637" + }, + { + "version": "6.7-rc-5", + "checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637" + }, + { + "version": "6.7-rc-4", + "checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637" + }, + { + "version": "6.7-rc-3", + "checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637" + }, + { + "version": "6.7-rc-2", + "checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637" + }, + { + "version": "6.7-rc-1", + "checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637" + }, + { + "version": "6.6.1", + "checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637" + }, + { + "version": "6.6", + "checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637" + }, + { + "version": "6.6-rc-6", + "checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637" + }, + { + "version": "6.6-rc-5", + "checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637" + }, + { + "version": "6.6-rc-4", + "checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637" + }, + { + "version": "6.6-rc-3", + "checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637" + }, + { + "version": "6.6-rc-2", + "checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637" + }, + { + "version": "6.6-rc-1", + "checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637" + }, + { + "version": "6.6-milestone-3", + "checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637" + }, + { + "version": "6.5.1", + "checksum": "70239e6ca1f0d5e3b2808ef6d82390cf9ad58d3a3a0d271677a51d1b89475857" + }, + { + "version": "6.6-milestone-2", + "checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637" + }, + { + "version": "6.6-milestone-1", + "checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637" + }, + { + "version": "6.5", + "checksum": "70239e6ca1f0d5e3b2808ef6d82390cf9ad58d3a3a0d271677a51d1b89475857" + }, + { + "version": "6.5-rc-1", + "checksum": "70239e6ca1f0d5e3b2808ef6d82390cf9ad58d3a3a0d271677a51d1b89475857" + }, + { + "version": "6.4.1", + "checksum": "70239e6ca1f0d5e3b2808ef6d82390cf9ad58d3a3a0d271677a51d1b89475857" + }, + { + "version": "6.5-milestone-2", + "checksum": "70239e6ca1f0d5e3b2808ef6d82390cf9ad58d3a3a0d271677a51d1b89475857" + }, + { + "version": "6.5-milestone-1", + "checksum": "70239e6ca1f0d5e3b2808ef6d82390cf9ad58d3a3a0d271677a51d1b89475857" + }, + { + "version": "6.4", + "checksum": "70239e6ca1f0d5e3b2808ef6d82390cf9ad58d3a3a0d271677a51d1b89475857" + }, + { + "version": "6.4-rc-4", + "checksum": "70239e6ca1f0d5e3b2808ef6d82390cf9ad58d3a3a0d271677a51d1b89475857" + }, + { + "version": "6.4-rc-3", + "checksum": "70239e6ca1f0d5e3b2808ef6d82390cf9ad58d3a3a0d271677a51d1b89475857" + }, + { + "version": "6.4-rc-2", + "checksum": "70239e6ca1f0d5e3b2808ef6d82390cf9ad58d3a3a0d271677a51d1b89475857" + }, + { + "version": "6.4-rc-1", + "checksum": "70239e6ca1f0d5e3b2808ef6d82390cf9ad58d3a3a0d271677a51d1b89475857" + }, + { + "version": "6.3", + "checksum": "1cef53de8dc192036e7b0cc47584449b0cf570a00d560bfaa6c9eabe06e1fc06" + }, + { + "version": "6.3-rc-4", + "checksum": "1cef53de8dc192036e7b0cc47584449b0cf570a00d560bfaa6c9eabe06e1fc06" + }, + { + "version": "6.3-rc-3", + "checksum": "1cef53de8dc192036e7b0cc47584449b0cf570a00d560bfaa6c9eabe06e1fc06" + }, + { + "version": "6.3-rc-2", + "checksum": "1cef53de8dc192036e7b0cc47584449b0cf570a00d560bfaa6c9eabe06e1fc06" + }, + { + "version": "6.3-rc-1", + "checksum": "1cef53de8dc192036e7b0cc47584449b0cf570a00d560bfaa6c9eabe06e1fc06" + }, + { + "version": "6.2.2", + "checksum": "96f793a18e056c23ffeec67c1f3bb8eccff5a4a407fc9ceac183527e7eedf4b6" + }, + { + "version": "6.2.1", + "checksum": "96f793a18e056c23ffeec67c1f3bb8eccff5a4a407fc9ceac183527e7eedf4b6" + }, + { + "version": "6.2", + "checksum": "96f793a18e056c23ffeec67c1f3bb8eccff5a4a407fc9ceac183527e7eedf4b6" + }, + { + "version": "6.2-rc-3", + "checksum": "96f793a18e056c23ffeec67c1f3bb8eccff5a4a407fc9ceac183527e7eedf4b6" + }, + { + "version": "6.2-rc-2", + "checksum": "96f793a18e056c23ffeec67c1f3bb8eccff5a4a407fc9ceac183527e7eedf4b6" + }, + { + "version": "6.2-rc-1", + "checksum": "96f793a18e056c23ffeec67c1f3bb8eccff5a4a407fc9ceac183527e7eedf4b6" + }, + { + "version": "6.1.1", + "checksum": "96f793a18e056c23ffeec67c1f3bb8eccff5a4a407fc9ceac183527e7eedf4b6" + }, + { + "version": "6.1", + "checksum": "96f793a18e056c23ffeec67c1f3bb8eccff5a4a407fc9ceac183527e7eedf4b6" + }, + { + "version": "6.1-rc-3", + "checksum": "96f793a18e056c23ffeec67c1f3bb8eccff5a4a407fc9ceac183527e7eedf4b6" + }, + { + "version": "6.1-rc-2", + "checksum": "96f793a18e056c23ffeec67c1f3bb8eccff5a4a407fc9ceac183527e7eedf4b6" + }, + { + "version": "6.1-rc-1", + "checksum": "96f793a18e056c23ffeec67c1f3bb8eccff5a4a407fc9ceac183527e7eedf4b6" + }, + { + "version": "6.1-milestone-3", + "checksum": "3888c76faa032ea8394b8a54e04ce2227ab1f4be64f65d450f8509fe112d38ce" + }, + { + "version": "6.1-milestone-2", + "checksum": "3888c76faa032ea8394b8a54e04ce2227ab1f4be64f65d450f8509fe112d38ce" + }, + { + "version": "6.1-milestone-1", + "checksum": "3888c76faa032ea8394b8a54e04ce2227ab1f4be64f65d450f8509fe112d38ce" + }, + { + "version": "6.0.1", + "checksum": "28b330c20a9a73881dfe9702df78d4d78bf72368e8906c70080ab6932462fe9e" + }, + { + "version": "6.0", + "checksum": "28b330c20a9a73881dfe9702df78d4d78bf72368e8906c70080ab6932462fe9e" + }, + { + "version": "6.0-rc-3", + "checksum": "28b330c20a9a73881dfe9702df78d4d78bf72368e8906c70080ab6932462fe9e" + }, + { + "version": "5.6.4", + "checksum": "3dc39ad650d40f6c029bd8ff605c6d95865d657dbfdeacdb079db0ddfffedf9f" + }, + { + "version": "6.0-rc-2", + "checksum": "28b330c20a9a73881dfe9702df78d4d78bf72368e8906c70080ab6932462fe9e" + }, + { + "version": "6.0-rc-1", + "checksum": "28b330c20a9a73881dfe9702df78d4d78bf72368e8906c70080ab6932462fe9e" + }, + { + "version": "5.6.3", + "checksum": "3dc39ad650d40f6c029bd8ff605c6d95865d657dbfdeacdb079db0ddfffedf9f" + }, + { + "version": "5.6.2", + "checksum": "3dc39ad650d40f6c029bd8ff605c6d95865d657dbfdeacdb079db0ddfffedf9f" + }, + { + "version": "5.6.1", + "checksum": "3dc39ad650d40f6c029bd8ff605c6d95865d657dbfdeacdb079db0ddfffedf9f" + }, + { + "version": "5.6", + "checksum": "3dc39ad650d40f6c029bd8ff605c6d95865d657dbfdeacdb079db0ddfffedf9f" + }, + { + "version": "5.6-rc-2", + "checksum": "3dc39ad650d40f6c029bd8ff605c6d95865d657dbfdeacdb079db0ddfffedf9f" + }, + { + "version": "5.6-rc-1", + "checksum": "3dc39ad650d40f6c029bd8ff605c6d95865d657dbfdeacdb079db0ddfffedf9f" + }, + { + "version": "5.5.1", + "checksum": "3dc39ad650d40f6c029bd8ff605c6d95865d657dbfdeacdb079db0ddfffedf9f" + }, + { + "version": "5.5", + "checksum": "3dc39ad650d40f6c029bd8ff605c6d95865d657dbfdeacdb079db0ddfffedf9f" + }, + { + "version": "5.5-rc-4", + "checksum": "3dc39ad650d40f6c029bd8ff605c6d95865d657dbfdeacdb079db0ddfffedf9f" + }, + { + "version": "5.5-rc-3", + "checksum": "3dc39ad650d40f6c029bd8ff605c6d95865d657dbfdeacdb079db0ddfffedf9f" + }, + { + "version": "5.5-rc-2", + "checksum": "3dc39ad650d40f6c029bd8ff605c6d95865d657dbfdeacdb079db0ddfffedf9f" + }, + { + "version": "5.5-rc-1", + "checksum": "3dc39ad650d40f6c029bd8ff605c6d95865d657dbfdeacdb079db0ddfffedf9f" + }, + { + "version": "5.4.1", + "checksum": "3dc39ad650d40f6c029bd8ff605c6d95865d657dbfdeacdb079db0ddfffedf9f" + }, + { + "version": "5.4", + "checksum": "3dc39ad650d40f6c029bd8ff605c6d95865d657dbfdeacdb079db0ddfffedf9f" + }, + { + "version": "5.4-rc-1", + "checksum": "3dc39ad650d40f6c029bd8ff605c6d95865d657dbfdeacdb079db0ddfffedf9f" + }, + { + "version": "5.3.1", + "checksum": "3dc39ad650d40f6c029bd8ff605c6d95865d657dbfdeacdb079db0ddfffedf9f" + }, + { + "version": "5.3", + "checksum": "3dc39ad650d40f6c029bd8ff605c6d95865d657dbfdeacdb079db0ddfffedf9f" + }, + { + "version": "5.3-rc-3", + "checksum": "3dc39ad650d40f6c029bd8ff605c6d95865d657dbfdeacdb079db0ddfffedf9f" + }, + { + "version": "5.3-rc-2", + "checksum": "3dc39ad650d40f6c029bd8ff605c6d95865d657dbfdeacdb079db0ddfffedf9f" + }, + { + "version": "5.3-rc-1", + "checksum": "3dc39ad650d40f6c029bd8ff605c6d95865d657dbfdeacdb079db0ddfffedf9f" + }, + { + "version": "5.2.1", + "checksum": "76b12da7f4a7cdd025e5996811a2e49bf5df0fb62d72554ab555c0e434b63aae" + }, + { + "version": "5.2", + "checksum": "76b12da7f4a7cdd025e5996811a2e49bf5df0fb62d72554ab555c0e434b63aae" + }, + { + "version": "5.2-rc-1", + "checksum": "76b12da7f4a7cdd025e5996811a2e49bf5df0fb62d72554ab555c0e434b63aae" + }, + { + "version": "5.1.1", + "checksum": "76b12da7f4a7cdd025e5996811a2e49bf5df0fb62d72554ab555c0e434b63aae" + }, + { + "version": "5.1", + "checksum": "76b12da7f4a7cdd025e5996811a2e49bf5df0fb62d72554ab555c0e434b63aae" + }, + { + "version": "5.1-rc-3", + "checksum": "76b12da7f4a7cdd025e5996811a2e49bf5df0fb62d72554ab555c0e434b63aae" + }, + { + "version": "5.1-rc-2", + "checksum": "76b12da7f4a7cdd025e5996811a2e49bf5df0fb62d72554ab555c0e434b63aae" + }, + { + "version": "5.1-rc-1", + "checksum": "76b12da7f4a7cdd025e5996811a2e49bf5df0fb62d72554ab555c0e434b63aae" + }, + { + "version": "4.10.3", + "checksum": "660ab018b8e319e9ae779fdb1b7ac47d0321bde953bf0eb4545f14952cfdcaa3" + }, + { + "version": "5.1-milestone-1", + "checksum": "8ff6bee43c55efc0cce9e1147860a76fc970398fbef587e64b6e7a5a7e0291df" + }, + { + "version": "5.0", + "checksum": "f1a597a1f2b23089deec11d5b924d074f9e4ed810f2093be7021ded01c8073ad" + }, + { + "version": "4.10.2", + "checksum": "ad63ba21fb91e490e0f6fd0ca7d4049241f0f68a454b0b3075c041c4554e611c" + }, + { + "version": "4.10.1", + "checksum": "d8a69ca8efe271d8de080c42a2ea4b08fc9e85c41aa2d163255c70d9da239db0" + }, + { + "version": "4.10", + "checksum": "778e7f46bd67eaea2de5bcbdbb40878c6614656014ba59a72ce8648eaf43a925" + }, + { + "version": "4.9", + "checksum": "e55e7e47a79e04c26363805b31e2f40b7a9cc89ea12113be7de750a3b2cede85" + }, + { + "version": "4.8.1", + "checksum": "080e30657661539701b66827b96eb0043191e0a7a73090e8a57bd6735e5af5c5" + }, + { + "version": "4.8", + "checksum": "4160d5a6d8d6efc6af336582bbbba8194e4d7a742835f7b0fd3964cbd419c994" + }, + { + "version": "4.7", + "checksum": "7d6fe0a055f133226409de2457fb0e887d1f6b096f36c8d5fd76fb7a9357cd45" + }, + { + "version": "4.6", + "checksum": "381dff8aa434499aa93bc25572b049c8c586a67faff2c02f375e4f23e17e49de" + }, + { + "version": "4.5.1", + "checksum": "3bf04e39ed259ff0a1217a875199a11775855d2a29207b98318ac79178249de8" + }, + { + "version": "4.5", + "checksum": "d283a04caee0e97b666b09e50ab394834934bee6225c2e9cd4650afdeac43828" + }, + { + "version": "4.4.1", + "checksum": "4e318d74d06aa7b998091345c397a3c7c4b291b59da31e6f9c772a596711acac" + }, + { + "version": "4.4", + "checksum": "88b5b31f390a268ab3773df580d83fd1e388f49c2b685f78a16600577bd72fe2" + }, + { + "version": "4.3.1", + "checksum": "383f4efa709b52632a520708e8a07353961970941ab3867ab8ac182132ce1c54" + }, + { + "version": "4.3", + "checksum": "ba496e7e0e03ffa432eaf715bb1466fac2ffc8491a71e7164a5438c48c79d8ea" + }, + { + "version": "4.2.1", + "checksum": "c536e519e65a4bb787e071c6a90d23bd219c9d409a2123db649d3684acbf3ae7" + }, + { + "version": "4.2", + "checksum": "53aa048fef3c06a8442c6a44df5edd2e8c791ee883e42ded6189c7eed112095d" + }, + { + "version": "4.1", + "checksum": "f4d953f31fbf6c38a8c330d19171c8ba6e0d1ff59d4d5c5c2d3ed821c9f3d5a3" + }, + { + "version": "3.2.1", + "checksum": "020ef0245a07b33ca48b12f59415e7e5083cf701ef02690464a8cc2ab3984608" + }, + { + "version": "3.2", + "checksum": "d2d3abae74e89cc4200f48d4a08a7e5960363c33ee62272ef5ffbb39f4c7f83e" + }, + { + "version": "3.1", + "checksum": "0f49043be582d7a39b671f924c66bd9337b92fa88ff5951225acc60560053067" + }, + { + "version": "3.0", + "checksum": "42d7a2f636983aa09d21dfeb6e90d21d7a8dad905351390643ce60cc82c8f8a9" + }, + { + "version": "2.14.1", + "checksum": "8e47da0b2656354d059609cae9d44b196d4f9b14512e688ffee4e0eb7e723ae9" + }, + { + "version": "2.14", + "checksum": "b5ca811c057b3eb4164c78f4155d667c6092ff98ba91a4c90d29e127426f37a7" + }, + { + "version": "2.13", + "checksum": "0c3c576e28b44eddcab6b8b4854f484363dfbcd047657d41654e839835da2c53" + }, + { + "version": "2.12", + "checksum": "4894520b03c007bf38e983bf933320c483a9790010d997029fa8985dc6128559" + }, + { + "version": "2.11", + "checksum": "0bc7b16a0a3fa52af674de44d1fea48abc4dee3431f3d4829cd9ea329836e596" + }, + { + "version": "2.10", + "checksum": "16caeaf66d57a0d1d2087fef6a97efa62de8da69afa5b908f40db35afc4342da" + }, + { + "version": "2.9", + "checksum": "b92386e36a96da6be89e91f71087d1394a26c0450231ba0b22e28ee1ee8fa14b" + }, + { + "version": "2.8", + "checksum": "198159fcd7d29533c0d37423d66c44729982d5280c9e2c7c5f4b7bc6a9317f6b" + }, + { + "version": "2.7", + "checksum": "d7e1975ccf2dc079d4f0b1010febdad466506d1565c5aa8017c88ebc5e471604" + }, + { + "version": "2.6", + "checksum": "695089a2b306f55f0bd63140fbcc5ead8c383819018188ce484cd5a055bec6e4" + }, + { + "version": "2.5", + "checksum": "718d7b25ea60b357fc4cb2212ce10b3f03dfd0e6fe5f23f565b15553ec46bb7e" + }, + { + "version": "2.4", + "checksum": "98420079ffe3e24b1013180d9b9bc2e2ee6a9d867ee232004b75a961d9c18e27" + }, + { + "version": "2.3", + "checksum": "b18a1114ebe81fb7502d40ad9a4f86cef82fff244a865ad45533b4d5e7ff0cc8" + }, + { + "version": "2.2.1", + "checksum": "5f73d431fd1c5dcc2cf11555b8e486c43249c1099f678ccc6088b05be600a2e1" + }, + { + "version": "2.2", + "checksum": "fa9b4294d47cf8db7039cb9b2435de3dd1accb0d3d67926705775a0579dfa397" + }, + { + "version": "2.1", + "checksum": "5e27c39c2336c25748f279d8b105162d14b1a39eb7839d0b658432282d0ce79f" + }, + { + "version": "2.0", + "checksum": "80a33ca14e3bca3116bc8749550397f739f126190c82bb6399fdc8d10f49661f" + }, + { + "version": "1.12", + "checksum": "dea5ceba47b58df0b7f69a65b24357527c1927ccc72b6d4ed90658d39e461b29" + }, + { + "version": "1.11", + "checksum": "a14b54dd3790f5ce1dc08ebbf4b5bcc05f76c4554b43accb84696c970f29aba0" + }, + { + "version": "1.10", + "checksum": "6a6c15e222a0458aa33985b87f67954f4222410b43b1e26866197d0a77d93cbc" + }, + { + "version": "1.9", + "checksum": "134337ea7c13221f9d1a1c14288a5cf8af9f6060167b903b724b115cf5a0cf73" + }, + { + "version": "1.8", + "checksum": "13f23a24252ddca0a0fabef212e3c854f5895b081c09d015c91587a5df9bf9f7" + }, + { + "version": "1.7", + "checksum": "7af529cc3331d38b3d8f8344ddd9b2d3744542b55b68318abd8bb1a6f3812a1c" + }, + { + "version": "1.6", + "checksum": "66dbcc9f0bc33789ea0bdb4d49c8ea037047bda5647ef696c47bdca65f785159" + }, + { + "version": "1.5", + "checksum": "9598ffdf7ee26949d8b861ece267c70c802f21f7fc52596693834792d155195a" + }, + { + "version": "1.4", + "checksum": "c95985b7b5684e133c5d45044fd90faaf6c8f7cd2493d61a11c2b8c5b71ef514" + }, + { + "version": "1.3", + "checksum": "95513eccca99e1ae1aeadc4f69cabd0e7fb64821d3f26c46a489df844c8a7353" + }, + { + "version": "1.2", + "checksum": "5c91fa893665f3051eae14578fac2df14e737423387e75ffbeccd35f335a3d8b" + }, + { + "version": "1.1", + "checksum": "22c56a9780daeee00e5bf31621f991b68e73eff6fe8afca628a1fe2c50c6038e" + }, + { + "version": "1.0", + "checksum": "87e50531ca7aab675f5bb65755ef78328afd64cf0877e37ad876047a8a014055" + } +] diff --git a/tsconfig.json b/tsconfig.json index 652c35a2..afefcd31 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -6,7 +6,8 @@ "rootDir": "./src", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ "strict": true, /* Enable all strict type-checking options. */ "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ - "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ + "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ + "resolveJsonModule": true, /* Enable importing JSON files as module; used for importing wrapper checksums JSON */ }, "exclude": ["node_modules", "**/*.test.ts"] }