From 7cfb19aa65c713520ad03e7b29c834a75dbbaf21 Mon Sep 17 00:00:00 2001 From: Timo Welde Date: Mon, 12 Sep 2022 18:30:40 +0200 Subject: [PATCH 01/36] chore: start off new development versions --- package.json | 2 +- packages/augment-api/package.json | 2 +- packages/chain-helpers/package.json | 2 +- packages/config/package.json | 2 +- packages/core/package.json | 2 +- packages/did/package.json | 2 +- packages/messaging/package.json | 2 +- packages/sdk-js/package.json | 2 +- packages/testing/package.json | 2 +- packages/types/package.json | 2 +- packages/utils/package.json | 2 +- packages/vc-export/package.json | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index f26c58ffa..2a8f940d3 100644 --- a/package.json +++ b/package.json @@ -68,6 +68,6 @@ "typedoc": "^0.22.15", "typescript": "^4.5.4" }, - "version": "0.29.0-rc.1", + "version": "0.30.0-0", "packageManager": "yarn@3.0.2" } diff --git a/packages/augment-api/package.json b/packages/augment-api/package.json index 7d9ba4c6b..188410930 100644 --- a/packages/augment-api/package.json +++ b/packages/augment-api/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/augment-api", - "version": "0.29.0-rc.1", + "version": "0.30.0-0", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/chain-helpers/package.json b/packages/chain-helpers/package.json index f560fcf90..29ffbfcf1 100644 --- a/packages/chain-helpers/package.json +++ b/packages/chain-helpers/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/chain-helpers", - "version": "0.29.0-rc.1", + "version": "0.30.0-0", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/config/package.json b/packages/config/package.json index 5d67f50ae..c09007379 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/config", - "version": "0.29.0-rc.1", + "version": "0.30.0-0", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/core/package.json b/packages/core/package.json index 6e3120e9e..533c02c1b 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/core", - "version": "0.29.0-rc.1", + "version": "0.30.0-0", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/did/package.json b/packages/did/package.json index be6d268fd..0dabb52e5 100644 --- a/packages/did/package.json +++ b/packages/did/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/did", - "version": "0.29.0-rc.1", + "version": "0.30.0-0", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/messaging/package.json b/packages/messaging/package.json index ccb2081c1..ef7445b1d 100644 --- a/packages/messaging/package.json +++ b/packages/messaging/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/messaging", - "version": "0.29.0-rc.1", + "version": "0.30.0-0", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/sdk-js/package.json b/packages/sdk-js/package.json index 03288f436..20c3c9d7e 100644 --- a/packages/sdk-js/package.json +++ b/packages/sdk-js/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/sdk-js", - "version": "0.29.0-rc.1", + "version": "0.30.0-0", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/testing/package.json b/packages/testing/package.json index 0c33793e6..7de2f8025 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -1,7 +1,7 @@ { "name": "@kiltprotocol/testing", "private": true, - "version": "0.29.0-rc.1", + "version": "0.30.0-0", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/types/package.json b/packages/types/package.json index acc16e17f..8fa2ee600 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/types", - "version": "0.29.0-rc.1", + "version": "0.30.0-0", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/utils/package.json b/packages/utils/package.json index 70496f00c..b694b4a1b 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/utils", - "version": "0.29.0-rc.1", + "version": "0.30.0-0", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/vc-export/package.json b/packages/vc-export/package.json index 01804d3f7..1fad3e15a 100644 --- a/packages/vc-export/package.json +++ b/packages/vc-export/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/vc-export", - "version": "0.29.0-rc.1", + "version": "0.30.0-0", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", From 48a1970cfad4efbc6cd7256d60420d1c9ebfd5d1 Mon Sep 17 00:00:00 2001 From: Github Action Date: Mon, 12 Sep 2022 16:35:12 +0000 Subject: [PATCH 02/36] [CI Skip] ci: publish prerelease --- package.json | 2 +- packages/augment-api/package.json | 2 +- packages/chain-helpers/package.json | 2 +- packages/config/package.json | 2 +- packages/core/package.json | 2 +- packages/did/package.json | 2 +- packages/messaging/package.json | 2 +- packages/sdk-js/package.json | 2 +- packages/testing/package.json | 2 +- packages/types/package.json | 2 +- packages/utils/package.json | 2 +- packages/vc-export/package.json | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index 2a8f940d3..e3e88dbf7 100644 --- a/package.json +++ b/package.json @@ -68,6 +68,6 @@ "typedoc": "^0.22.15", "typescript": "^4.5.4" }, - "version": "0.30.0-0", + "version": "0.30.0-1", "packageManager": "yarn@3.0.2" } diff --git a/packages/augment-api/package.json b/packages/augment-api/package.json index 188410930..dfac66573 100644 --- a/packages/augment-api/package.json +++ b/packages/augment-api/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/augment-api", - "version": "0.30.0-0", + "version": "0.30.0-1", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/chain-helpers/package.json b/packages/chain-helpers/package.json index 29ffbfcf1..8d116ce66 100644 --- a/packages/chain-helpers/package.json +++ b/packages/chain-helpers/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/chain-helpers", - "version": "0.30.0-0", + "version": "0.30.0-1", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/config/package.json b/packages/config/package.json index c09007379..5895fd112 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/config", - "version": "0.30.0-0", + "version": "0.30.0-1", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/core/package.json b/packages/core/package.json index 533c02c1b..ebdaff757 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/core", - "version": "0.30.0-0", + "version": "0.30.0-1", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/did/package.json b/packages/did/package.json index 0dabb52e5..318dc54ab 100644 --- a/packages/did/package.json +++ b/packages/did/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/did", - "version": "0.30.0-0", + "version": "0.30.0-1", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/messaging/package.json b/packages/messaging/package.json index ef7445b1d..31556171a 100644 --- a/packages/messaging/package.json +++ b/packages/messaging/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/messaging", - "version": "0.30.0-0", + "version": "0.30.0-1", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/sdk-js/package.json b/packages/sdk-js/package.json index 20c3c9d7e..e877d020a 100644 --- a/packages/sdk-js/package.json +++ b/packages/sdk-js/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/sdk-js", - "version": "0.30.0-0", + "version": "0.30.0-1", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/testing/package.json b/packages/testing/package.json index 7de2f8025..75dac7c0a 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -1,7 +1,7 @@ { "name": "@kiltprotocol/testing", "private": true, - "version": "0.30.0-0", + "version": "0.30.0-1", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/types/package.json b/packages/types/package.json index 8fa2ee600..882a4ffd3 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/types", - "version": "0.30.0-0", + "version": "0.30.0-1", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/utils/package.json b/packages/utils/package.json index b694b4a1b..71b9f3b5d 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/utils", - "version": "0.30.0-0", + "version": "0.30.0-1", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/vc-export/package.json b/packages/vc-export/package.json index 1fad3e15a..2b7a90e2a 100644 --- a/packages/vc-export/package.json +++ b/packages/vc-export/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/vc-export", - "version": "0.30.0-0", + "version": "0.30.0-1", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", From bab2c76508c4bc6a7a6bb984209a15e4ae2a17aa Mon Sep 17 00:00:00 2001 From: Antonio Date: Thu, 15 Sep 2022 13:39:35 +0200 Subject: [PATCH 03/36] feat: add KiltPublishedCredentialV1 and KiltPublishedCredentialCollectionV1 types (#631) * feat: add KiltPublishedCredentialV1 and KiltPublishedCredentialCollectionV1 types * fix: make metadata optional * fix: make also txHash optional --- packages/types/src/Credential.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/packages/types/src/Credential.ts b/packages/types/src/Credential.ts index 29cdc06bc..ea87e986e 100644 --- a/packages/types/src/Credential.ts +++ b/packages/types/src/Credential.ts @@ -29,3 +29,14 @@ export interface ICredential { export interface ICredentialPresentation extends ICredential { claimerSignature: DidSignature & { challenge?: string } } + +export interface KiltPublishedCredentialV1 { + credential: ICredentialPresentation + metadata?: { + label?: string + blockNumber?: number + txHash?: HexString + } +} + +export type KiltPublishedCredentialCollectionV1 = KiltPublishedCredentialV1[] From dc3e5565b09625279e80d945e3d829af74c9d22a Mon Sep 17 00:00:00 2001 From: Github Action Date: Thu, 15 Sep 2022 11:43:33 +0000 Subject: [PATCH 04/36] [CI Skip] ci: publish prerelease --- package.json | 2 +- packages/augment-api/package.json | 2 +- packages/chain-helpers/package.json | 2 +- packages/config/package.json | 2 +- packages/core/package.json | 2 +- packages/did/package.json | 2 +- packages/messaging/package.json | 2 +- packages/sdk-js/package.json | 2 +- packages/testing/package.json | 2 +- packages/types/package.json | 2 +- packages/utils/package.json | 2 +- packages/vc-export/package.json | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index e3e88dbf7..598ec4e1a 100644 --- a/package.json +++ b/package.json @@ -68,6 +68,6 @@ "typedoc": "^0.22.15", "typescript": "^4.5.4" }, - "version": "0.30.0-1", + "version": "0.30.0-2", "packageManager": "yarn@3.0.2" } diff --git a/packages/augment-api/package.json b/packages/augment-api/package.json index dfac66573..0a1e0316d 100644 --- a/packages/augment-api/package.json +++ b/packages/augment-api/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/augment-api", - "version": "0.30.0-1", + "version": "0.30.0-2", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/chain-helpers/package.json b/packages/chain-helpers/package.json index 8d116ce66..3c86b1fe9 100644 --- a/packages/chain-helpers/package.json +++ b/packages/chain-helpers/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/chain-helpers", - "version": "0.30.0-1", + "version": "0.30.0-2", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/config/package.json b/packages/config/package.json index 5895fd112..f31d18dab 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/config", - "version": "0.30.0-1", + "version": "0.30.0-2", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/core/package.json b/packages/core/package.json index ebdaff757..a9c20fd36 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/core", - "version": "0.30.0-1", + "version": "0.30.0-2", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/did/package.json b/packages/did/package.json index 318dc54ab..9faf8be11 100644 --- a/packages/did/package.json +++ b/packages/did/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/did", - "version": "0.30.0-1", + "version": "0.30.0-2", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/messaging/package.json b/packages/messaging/package.json index 31556171a..94d02377e 100644 --- a/packages/messaging/package.json +++ b/packages/messaging/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/messaging", - "version": "0.30.0-1", + "version": "0.30.0-2", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/sdk-js/package.json b/packages/sdk-js/package.json index e877d020a..921950d37 100644 --- a/packages/sdk-js/package.json +++ b/packages/sdk-js/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/sdk-js", - "version": "0.30.0-1", + "version": "0.30.0-2", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/testing/package.json b/packages/testing/package.json index 75dac7c0a..ec6e008d3 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -1,7 +1,7 @@ { "name": "@kiltprotocol/testing", "private": true, - "version": "0.30.0-1", + "version": "0.30.0-2", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/types/package.json b/packages/types/package.json index 882a4ffd3..8aa80977c 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/types", - "version": "0.30.0-1", + "version": "0.30.0-2", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/utils/package.json b/packages/utils/package.json index 71b9f3b5d..2aa761eb0 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/utils", - "version": "0.30.0-1", + "version": "0.30.0-2", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/vc-export/package.json b/packages/vc-export/package.json index 2b7a90e2a..bef2586a3 100644 --- a/packages/vc-export/package.json +++ b/packages/vc-export/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/vc-export", - "version": "0.30.0-1", + "version": "0.30.0-2", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", From 1863827cbd0a966ccb9b8177be548737947d892b Mon Sep 17 00:00:00 2001 From: Tom Adler Date: Thu, 15 Sep 2022 18:18:47 +0200 Subject: [PATCH 05/36] feat!: remove 40+ basic chain wrappers (#613) --- jest.config.js | 1 - .../AccountLinking.spec.ts | 366 ++++++++++++------ .../__integrationtests__/Attestation.spec.ts | 114 ++++-- .../src/__integrationtests__/Balance.spec.ts | 83 ++-- .../__integrationtests__/Blockchain.spec.ts | 9 +- .../src/__integrationtests__/Ctypes.spec.ts | 30 +- .../__integrationtests__/Delegation.spec.ts | 34 +- .../src/__integrationtests__/Deposit.spec.ts | 125 ++++-- .../core/src/__integrationtests__/Did.spec.ts | 179 +++++---- .../__integrationtests__/ErrorHandler.spec.ts | 14 +- .../__integrationtests__/Web3Names.spec.ts | 85 ++-- .../core/src/__integrationtests__/utils.ts | 6 +- .../core/src/attestation/Attestation.chain.ts | 167 +------- packages/core/src/balance/Balance.chain.ts | 114 ------ packages/core/src/balance/Balance.spec.ts | 109 ------ packages/core/src/balance/index.ts | 1 - packages/core/src/ctype/CType.chain.ts | 57 +-- packages/core/src/ctype/CType.spec.ts | 37 +- packages/core/src/ctype/CType.ts | 14 +- .../core/src/delegation/DelegationDecoder.ts | 15 +- .../DelegationHierarchyDetails.chain.ts | 4 +- .../src/delegation/DelegationNode.chain.ts | 128 +----- .../src/delegation/DelegationNode.spec.ts | 50 +-- .../core/src/delegation/DelegationNode.ts | 52 +-- packages/core/src/index.ts | 2 +- packages/did/package.json | 1 + packages/did/src/Did.chain.ts | 352 ++--------------- packages/did/src/Did.utils.ts | 2 +- .../did/src/DidDetails/FullDidDetails.spec.ts | 82 ++-- packages/did/src/DidDetails/FullDidDetails.ts | 18 +- .../DidDocumentExporter.spec.ts | 58 +-- .../did/src/DidLinks/AccountLinks.chain.ts | 332 ++++------------ packages/did/src/DidLinks/Web3Names.chain.ts | 125 ++---- .../did/src/DidResolver/DidResolver.spec.ts | 180 +++++---- packages/did/src/DidResolver/DidResolver.ts | 25 +- packages/testing/src/mocks/mockedApi.ts | 13 +- packages/testing/src/mocks/mockedApi.utils.ts | 14 +- packages/types/src/Deposit.ts | 8 +- packages/utils/src/SDKErrors.ts | 2 - .../src/exportToVerifiableCredential.spec.ts | 53 ++- .../vc-js/suites/KiltAttestedSuite.spec.ts | 44 +-- .../src/vc-js/suites/KiltAttestedSuite.ts | 15 +- packages/vc-export/src/verificationUtils.ts | 11 +- tests/bundle-test.ts | 13 +- yarn.lock | 1 + 45 files changed, 1235 insertions(+), 1910 deletions(-) delete mode 100644 packages/core/src/balance/Balance.chain.ts delete mode 100644 packages/core/src/balance/Balance.spec.ts diff --git a/jest.config.js b/jest.config.js index d21da4cb9..6ffe782c6 100644 --- a/jest.config.js +++ b/jest.config.js @@ -24,7 +24,6 @@ module.exports = { '!**/lib/**', '!**/test/**', '!**/kilt/*', - '!**/blockchainApiConnection/*', '!**/types/**/*', '!**/SDKErrors.ts', '!utils/src/json-schema/*', diff --git a/packages/core/src/__integrationtests__/AccountLinking.spec.ts b/packages/core/src/__integrationtests__/AccountLinking.spec.ts index ceaec39c9..e9c6e5d41 100644 --- a/packages/core/src/__integrationtests__/AccountLinking.spec.ts +++ b/packages/core/src/__integrationtests__/AccountLinking.spec.ts @@ -16,7 +16,6 @@ import { KeyTool, makeSigningKeyTool, } from '@kiltprotocol/testing' -import { ss58Format } from '@kiltprotocol/utils' import type { DidDocument, KeyringPair, @@ -24,8 +23,8 @@ import type { } from '@kiltprotocol/types' import { Keyring } from '@polkadot/keyring' import { BN } from '@polkadot/util' +import type { ApiPromise } from '@polkadot/api' import { mnemonicGenerate } from '@polkadot/util-crypto' -import { Balance } from '../balance' import { convertToTxUnit } from '../balance/Balance.utils' import { createEndowedTestAccount, @@ -36,19 +35,24 @@ import { import { disconnect } from '../kilt' let paymentAccount: KiltKeyringPair +let paymentAccountChain: string let linkDeposit: BN let sign: AccountLinks.LinkingSignCallback +let api: ApiPromise beforeAll(async () => { - await initializeApi() + api = await initializeApi() paymentAccount = await createEndowedTestAccount() - linkDeposit = await AccountLinks.queryDepositAmount() + paymentAccountChain = AccountLinks.accountToChain(paymentAccount.address) + linkDeposit = api.consts.didLookup.deposit.toBn() }, 40_000) describe('When there is an on-chain DID', () => { let did: DidDocument + let didChain: string let didKey: KeyTool let newDid: DidDocument + let newDidChain: string let newDidKey: KeyTool describe('and a tx sender willing to link its account', () => { @@ -56,32 +60,43 @@ describe('When there is an on-chain DID', () => { didKey = makeSigningKeyTool() newDidKey = makeSigningKeyTool() did = await createFullDidFromSeed(paymentAccount, didKey.keypair) + didChain = Did.Chain.didToChain(did.uri) newDid = await createFullDidFromSeed(paymentAccount, newDidKey.keypair) + newDidChain = Did.Chain.didToChain(newDid.uri) }, 40_000) it('should be possible to associate the tx sender', async () => { // Check that no links exist expect( - await AccountLinks.queryConnectedDidForAccount(paymentAccount.address) - ).toBeNull() + (await api.query.didLookup.connectedDids(paymentAccountChain)).isNone + ).toBe(true) expect( - await AccountLinks.queryConnectedAccountsForDid(did.uri) + await api.query.didLookup.connectedAccounts.keys(didChain) ).toStrictEqual([]) expect( - await AccountLinks.queryIsConnected(did.uri, paymentAccount.address) - ).toBe(false) + ( + await api.query.didLookup.connectedAccounts.hash( + didChain, + paymentAccountChain + ) + ).isEmpty + ).toBe(true) - const associateSenderTx = await AccountLinks.getAssociateSenderExtrinsic() + const associateSenderTx = api.tx.didLookup.associateSender() const signedTx = await Did.authorizeExtrinsic( did, associateSenderTx, didKey.sign, paymentAccount.address ) - const balanceBefore = await Balance.getBalances(paymentAccount.address) + const balanceBefore = ( + await api.query.system.account(paymentAccount.address) + ).data await submitExtrinsic(signedTx, paymentAccount) // Check that the deposit has been taken from the sender's balance. - const balanceAfter = await Balance.getBalances(paymentAccount.address) + const balanceAfter = ( + await api.query.system.account(paymentAccount.address) + ).data // Lookup reserve - deposit == 0 expect( balanceAfter.reserved @@ -91,69 +106,105 @@ describe('When there is an on-chain DID', () => { ).toMatchInlineSnapshot('"0"') // Check that the link has been created correctly expect( - await AccountLinks.queryConnectedDidForAccount(paymentAccount.address) + AccountLinks.connectedDidFromChain( + await api.query.didLookup.connectedDids(paymentAccountChain) + ).did ).toStrictEqual(did.uri) + const encoded = await api.query.didLookup.connectedAccounts.keys(didChain) + expect(AccountLinks.connectedAccountsFromChain(encoded)).toStrictEqual([ + paymentAccount.address, + ]) expect( - await AccountLinks.queryConnectedAccountsForDid(did.uri, ss58Format) - ).toStrictEqual([paymentAccount.address]) - expect( - await AccountLinks.queryIsConnected(did.uri, paymentAccount.address) - ).toBe(true) + ( + await api.query.didLookup.connectedAccounts.hash( + didChain, + paymentAccountChain + ) + ).isEmpty + ).toBe(false) }, 30_000) it('should be possible to associate the tx sender to a new DID', async () => { - const associateSenderTx = await AccountLinks.getAssociateSenderExtrinsic() + const associateSenderTx = api.tx.didLookup.associateSender() const signedTx = await Did.authorizeExtrinsic( newDid, associateSenderTx, newDidKey.sign, paymentAccount.address ) - const balanceBefore = await Balance.getBalances(paymentAccount.address) + const balanceBefore = ( + await api.query.system.account(paymentAccount.address) + ).data await submitExtrinsic(signedTx, paymentAccount) // Reserve should not change when replacing the link - const balanceAfter = await Balance.getBalances(paymentAccount.address) + const balanceAfter = ( + await api.query.system.account(paymentAccount.address) + ).data expect( balanceAfter.reserved.sub(balanceBefore.reserved).toString() ).toMatchInlineSnapshot('"0"') // Check that account is linked to new DID expect( - await AccountLinks.queryConnectedDidForAccount(paymentAccount.address) + AccountLinks.connectedDidFromChain( + await api.query.didLookup.connectedDids(paymentAccountChain) + ).did ).toStrictEqual(newDid.uri) // Check that old DID has no accounts linked expect( - await AccountLinks.queryConnectedAccountsForDid(did.uri) + await api.query.didLookup.connectedAccounts.keys(didChain) ).toStrictEqual([]) expect( - await AccountLinks.queryIsConnected(did.uri, paymentAccount.address) - ).toBe(false) + ( + await api.query.didLookup.connectedAccounts.hash( + didChain, + paymentAccountChain + ) + ).isEmpty + ).toBe(true) // Check that new DID has the account linked + const encoded = await api.query.didLookup.connectedAccounts.keys( + newDidChain + ) + expect(AccountLinks.connectedAccountsFromChain(encoded)).toStrictEqual([ + paymentAccount.address, + ]) expect( - await AccountLinks.queryConnectedAccountsForDid(newDid.uri, ss58Format) - ).toStrictEqual([paymentAccount.address]) - expect( - await AccountLinks.queryIsConnected(newDid.uri, paymentAccount.address) - ).toBe(true) + ( + await api.query.didLookup.connectedAccounts.hash( + newDidChain, + paymentAccountChain + ) + ).isEmpty + ).toBe(false) }, 30_000) it('should be possible for the sender to remove the link', async () => { - const removeSenderTx = await AccountLinks.getLinkRemovalByAccountTx() - const balanceBefore = await Balance.getBalances(paymentAccount.address) + const removeSenderTx = api.tx.didLookup.removeSenderAssociation() + const balanceBefore = ( + await api.query.system.account(paymentAccount.address) + ).data await submitExtrinsic(removeSenderTx, paymentAccount) // Check that the deposit has been returned to the sender's balance. - const balanceAfter = await Balance.getBalances(paymentAccount.address) + const balanceAfter = ( + await api.query.system.account(paymentAccount.address) + ).data expect( balanceBefore.reserved.sub(balanceAfter.reserved).toString() ).toStrictEqual(linkDeposit.toString()) expect( - await AccountLinks.queryConnectedDidForAccount(paymentAccount.address) - ).toBeNull() + (await api.query.didLookup.connectedDids(paymentAccountChain)).isNone + ).toBe(true) expect( - await AccountLinks.queryConnectedAccountsForDid(did.uri) + await api.query.didLookup.connectedAccounts.keys(didChain) ).toStrictEqual([]) expect( - await AccountLinks.queryIsConnected(did.uri, paymentAccount.address) - ).toBe(false) + ( + await api.query.didLookup.connectedAccounts.hash( + didChain, + paymentAccountChain + ) + ).isEmpty + ).toBe(true) }) }) @@ -164,6 +215,7 @@ describe('When there is an on-chain DID', () => { const it = keyType === 'ethereum' ? test.skip : test let keypair: KeyringPair + let keypairChain: string beforeAll(async () => { // TODO: remove this line to test against ethereum linking enabled chains if (keyType === 'ethereum') return @@ -172,11 +224,14 @@ describe('When there is an on-chain DID', () => { Did.Utils.signatureAlgForKeyType[keyType] ) keypair = keyTool.keypair + keypairChain = AccountLinks.accountToChain(keypair.address) sign = AccountLinks.makeLinkingSignCallback(keypair) didKey = makeSigningKeyTool() newDidKey = makeSigningKeyTool() did = await createFullDidFromSeed(paymentAccount, didKey.keypair) + didChain = Did.Chain.didToChain(did.uri) newDid = await createFullDidFromSeed(paymentAccount, newDidKey.keypair) + newDidChain = Did.Chain.didToChain(newDid.uri) }, 40_000) it('should be possible to associate the account while the sender pays the deposit', async () => { @@ -192,11 +247,15 @@ describe('When there is an on-chain DID', () => { didKey.sign, paymentAccount.address ) - const balanceBefore = await Balance.getBalances(paymentAccount.address) + const balanceBefore = ( + await api.query.system.account(paymentAccount.address) + ).data await submitExtrinsic(signedTx, paymentAccount) // Check that the deposit has been taken from the sender's balance. - const balanceAfter = await Balance.getBalances(paymentAccount.address) + const balanceAfter = ( + await api.query.system.account(paymentAccount.address) + ).data // Lookup reserve - deposit == 0 expect( balanceAfter.reserved @@ -205,20 +264,35 @@ describe('When there is an on-chain DID', () => { .toString() ).toMatchInlineSnapshot('"0"') expect( - await AccountLinks.queryConnectedDidForAccount(keypair.address) + AccountLinks.connectedDidFromChain( + await api.query.didLookup.connectedDids(keypairChain) + ).did ).toStrictEqual(did.uri) expect( - await AccountLinks.queryConnectedDidForAccount(paymentAccount.address) - ).toBeNull() + (await api.query.didLookup.connectedDids(paymentAccountChain)).isNone + ).toBe(true) + const encoded = await api.query.didLookup.connectedAccounts.keys( + didChain + ) + expect(AccountLinks.connectedAccountsFromChain(encoded)).toStrictEqual([ + keypair.address, + ]) expect( - await AccountLinks.queryConnectedAccountsForDid(did.uri, ss58Format) - ).toStrictEqual([keypair.address]) + ( + await api.query.didLookup.connectedAccounts.hash( + didChain, + paymentAccountChain + ) + ).isEmpty + ).toBe(true) expect( - await AccountLinks.queryIsConnected(did.uri, paymentAccount.address) + ( + await api.query.didLookup.connectedAccounts.hash( + didChain, + keypairChain + ) + ).isEmpty ).toBe(false) - expect( - await AccountLinks.queryIsConnected(did.uri, keypair.address) - ).toBe(true) }) it('should be possible to associate the account to a new DID while the sender pays the deposit', async () => { const linkAuthorization = @@ -233,49 +307,72 @@ describe('When there is an on-chain DID', () => { newDidKey.sign, paymentAccount.address ) - const balanceBefore = await Balance.getBalances(paymentAccount.address) + const balanceBefore = ( + await api.query.system.account(paymentAccount.address) + ).data await submitExtrinsic(signedTx, paymentAccount) // Reserve should not change when replacing the link - const balanceAfter = await Balance.getBalances(paymentAccount.address) + const balanceAfter = ( + await api.query.system.account(paymentAccount.address) + ).data expect( balanceAfter.reserved.sub(balanceBefore.reserved).toString() ).toMatchInlineSnapshot('"0"') expect( - await AccountLinks.queryConnectedDidForAccount(paymentAccount.address) - ).toBeNull() + (await api.query.didLookup.connectedDids(paymentAccountChain)).isNone + ).toBe(true) expect( - await AccountLinks.queryConnectedDidForAccount(keypair.address) + AccountLinks.connectedDidFromChain( + await api.query.didLookup.connectedDids(keypairChain) + ).did ).toStrictEqual(newDid.uri) expect( - await AccountLinks.queryConnectedAccountsForDid(did.uri) + await api.query.didLookup.connectedAccounts.keys(didChain) ).toStrictEqual([]) expect( - await AccountLinks.queryIsConnected(did.uri, paymentAccount.address) - ).toBe(false) + ( + await api.query.didLookup.connectedAccounts.hash( + didChain, + paymentAccountChain + ) + ).isEmpty + ).toBe(true) expect( - await AccountLinks.queryIsConnected(did.uri, keypair.address) - ).toBe(false) + ( + await api.query.didLookup.connectedAccounts.hash( + didChain, + keypairChain + ) + ).isEmpty + ).toBe(true) // Check that new DID has the account linked + const encoded = await api.query.didLookup.connectedAccounts.keys( + newDidChain + ) + expect(AccountLinks.connectedAccountsFromChain(encoded)).toStrictEqual([ + keypair.address, + ]) expect( - await AccountLinks.queryConnectedAccountsForDid( - newDid.uri, - ss58Format - ) - ).toStrictEqual([keypair.address]) + ( + await api.query.didLookup.connectedAccounts.hash( + newDidChain, + paymentAccountChain + ) + ).isEmpty + ).toBe(true) expect( - await AccountLinks.queryIsConnected( - newDid.uri, - paymentAccount.address - ) + ( + await api.query.didLookup.connectedAccounts.hash( + newDidChain, + keypairChain + ) + ).isEmpty ).toBe(false) - expect( - await AccountLinks.queryIsConnected(newDid.uri, keypair.address) - ).toBe(true) }) it('should be possible for the DID to remove the link', async () => { - const removeLinkTx = await AccountLinks.getLinkRemovalByDidExtrinsic( - keypair.address + const removeLinkTx = await api.tx.didLookup.removeAccountAssociation( + keypairChain ) const signedTx = await Did.authorizeExtrinsic( newDid, @@ -283,40 +380,57 @@ describe('When there is an on-chain DID', () => { newDidKey.sign, paymentAccount.address ) - const balanceBefore = await Balance.getBalances(paymentAccount.address) + const balanceBefore = ( + await api.query.system.account(paymentAccount.address) + ).data await submitExtrinsic(signedTx, paymentAccount) // Check that the deposit has been returned to the sender's balance. - const balanceAfter = await Balance.getBalances(paymentAccount.address) + const balanceAfter = ( + await api.query.system.account(paymentAccount.address) + ).data expect( balanceBefore.reserved.sub(balanceAfter.reserved).toString() ).toStrictEqual(linkDeposit.toString()) // Check that the link has been removed completely expect( - await AccountLinks.queryConnectedDidForAccount(paymentAccount.address) - ).toBeNull() + (await api.query.didLookup.connectedDids(paymentAccountChain)).isNone + ).toBe(true) expect( - await AccountLinks.queryConnectedDidForAccount(keypair.address) - ).toBeNull() + (await api.query.didLookup.connectedDids(keypairChain)).isNone + ).toBe(true) expect( - await AccountLinks.queryConnectedAccountsForDid(newDid.uri) + await api.query.didLookup.connectedAccounts.keys(newDidChain) ).toStrictEqual([]) expect( - await AccountLinks.queryIsConnected(did.uri, paymentAccount.address) - ).toBe(false) + ( + await api.query.didLookup.connectedAccounts.hash( + didChain, + paymentAccountChain + ) + ).isEmpty + ).toBe(true) expect( - await AccountLinks.queryIsConnected(did.uri, keypair.address) - ).toBe(false) + ( + await api.query.didLookup.connectedAccounts.hash( + didChain, + keypairChain + ) + ).isEmpty + ).toBe(true) }) } ) describe('and a generic Ecdsa Substrate account different than the sender to link', () => { let genericAccount: KeyringPair + let genericAccountChain: string + beforeAll(async () => { genericAccount = new Keyring({ type: 'ecdsa' }).addFromMnemonic( mnemonicGenerate() ) + genericAccountChain = AccountLinks.accountToChain(genericAccount.address) // also testing that signing with type bitflag works, like the polkadot extension does it sign = async (payload) => genericAccount.sign(payload, { withType: true }) @@ -324,7 +438,9 @@ describe('When there is an on-chain DID', () => { didKey = makeSigningKeyTool() newDidKey = makeSigningKeyTool() did = await createFullDidFromSeed(paymentAccount, didKey.keypair) + didChain = Did.Chain.didToChain(did.uri) newDid = await createFullDidFromSeed(paymentAccount, newDidKey.keypair) + newDidChain = Did.Chain.didToChain(newDid.uri) }, 40_000) it('should be possible to associate the account while the sender pays the deposit', async () => { @@ -340,11 +456,15 @@ describe('When there is an on-chain DID', () => { didKey.sign, paymentAccount.address ) - const balanceBefore = await Balance.getBalances(paymentAccount.address) + const balanceBefore = ( + await api.query.system.account(paymentAccount.address) + ).data await submitExtrinsic(signedTx, paymentAccount) // Check that the deposit has been taken from the sender's balance. - const balanceAfter = await Balance.getBalances(paymentAccount.address) + const balanceAfter = ( + await api.query.system.account(paymentAccount.address) + ).data // Lookup reserve - deposit == 0 expect( balanceAfter.reserved @@ -353,25 +473,38 @@ describe('When there is an on-chain DID', () => { .toString() ).toMatchInlineSnapshot('"0"') expect( - await AccountLinks.queryConnectedDidForAccount(genericAccount.address) + AccountLinks.connectedDidFromChain( + await api.query.didLookup.connectedDids(genericAccountChain) + ).did ).toStrictEqual(did.uri) expect( - await AccountLinks.queryConnectedDidForAccount(paymentAccount.address) - ).toBeNull() + (await api.query.didLookup.connectedDids(paymentAccountChain)).isNone + ).toBe(true) + const encoded = await api.query.didLookup.connectedAccounts.keys(didChain) expect( // Wildcard substrate encoding. Account should match the generated one. - await AccountLinks.queryConnectedAccountsForDid(did.uri, 42) + AccountLinks.connectedAccountsFromChain(encoded, 42) ).toStrictEqual([genericAccount.address]) expect( - await AccountLinks.queryIsConnected(did.uri, paymentAccount.address) - ).toBe(false) - expect( - await AccountLinks.queryIsConnected(did.uri, genericAccount.address) + ( + await api.query.didLookup.connectedAccounts.hash( + didChain, + paymentAccountChain + ) + ).isEmpty ).toBe(true) + expect( + ( + await api.query.didLookup.connectedAccounts.hash( + didChain, + genericAccountChain + ) + ).isEmpty + ).toBe(false) }) it('should be possible to add a Web3 name for the linked DID and retrieve it starting from the linked account', async () => { - const web3NameClaimTx = await Web3Names.getClaimTx('test-name') + const web3NameClaimTx = api.tx.web3Names.claim('test-name') const signedTx = await Did.authorizeExtrinsic( did, web3NameClaimTx, @@ -381,9 +514,10 @@ describe('When there is an on-chain DID', () => { await submitExtrinsic(signedTx, paymentAccount) // Check that the Web3 name has been linked to the DID - expect(await Web3Names.queryDidForWeb3Name('test-name')).toStrictEqual( - did.uri + const { owner } = Web3Names.web3NameOwnerFromChain( + await api.query.web3Names.owner('test-name') ) + expect(owner).toStrictEqual(did.uri) // Check that it is possible to retrieve the web3 name from the account linked to the DID expect( await AccountLinks.queryWeb3Name(genericAccount.address) @@ -392,31 +526,45 @@ describe('When there is an on-chain DID', () => { it('should be possible for the sender to remove the link', async () => { // No need for DID-authorizing this. - const reclaimDepositTx = await AccountLinks.getLinkRemovalByAccountTx() - const balanceBefore = await Balance.getBalances(paymentAccount.address) + const reclaimDepositTx = api.tx.didLookup.removeSenderAssociation() + const balanceBefore = ( + await api.query.system.account(paymentAccount.address) + ).data await submitExtrinsic(reclaimDepositTx, genericAccount) // Check that the deposit has been returned to the sender's balance. - const balanceAfter = await Balance.getBalances(paymentAccount.address) + const balanceAfter = ( + await api.query.system.account(paymentAccount.address) + ).data expect( balanceBefore.reserved.sub(balanceAfter.reserved).toString() ).toStrictEqual(linkDeposit.toString()) // Check that the link has been removed completely expect( - await AccountLinks.queryConnectedDidForAccount(paymentAccount.address) - ).toBeNull() + (await api.query.didLookup.connectedDids(paymentAccountChain)).isNone + ).toBe(true) expect( - await AccountLinks.queryConnectedDidForAccount(genericAccount.address) - ).toBeNull() + (await api.query.didLookup.connectedDids(genericAccountChain)).isNone + ).toBe(true) expect( - await AccountLinks.queryConnectedAccountsForDid(newDid.uri) + await api.query.didLookup.connectedAccounts.keys(newDidChain) ).toStrictEqual([]) expect( - await AccountLinks.queryIsConnected(did.uri, paymentAccount.address) - ).toBe(false) + ( + await api.query.didLookup.connectedAccounts.hash( + didChain, + paymentAccountChain + ) + ).isEmpty + ).toBe(true) expect( - await AccountLinks.queryIsConnected(did.uri, genericAccount.address) - ).toBe(false) + ( + await api.query.didLookup.connectedAccounts.hash( + didChain, + genericAccountChain + ) + ).isEmpty + ).toBe(true) }) }) }) diff --git a/packages/core/src/__integrationtests__/Attestation.spec.ts b/packages/core/src/__integrationtests__/Attestation.spec.ts index 0de8a103b..315588e42 100644 --- a/packages/core/src/__integrationtests__/Attestation.spec.ts +++ b/packages/core/src/__integrationtests__/Attestation.spec.ts @@ -22,8 +22,8 @@ import { } from '@kiltprotocol/testing' import * as Did from '@kiltprotocol/did' import { Crypto } from '@kiltprotocol/utils' +import { ApiPromise } from '@polkadot/api' import * as Attestation from '../attestation' -import { getRemoveTx, getRevokeTx } from '../attestation/Attestation.chain' import * as Credential from '../credential' import { disconnect } from '../kilt' import * as Claim from '../claim' @@ -46,8 +46,9 @@ let anotherAttesterKey: KeyTool let claimer: DidDocument let claimerKey: KeyTool +let api: ApiPromise beforeAll(async () => { - await initializeApi() + api = await initializeApi() }, 30_000) beforeAll(async () => { @@ -64,7 +65,7 @@ beforeAll(async () => { }, 60_000) it('fetches the correct deposit amount', async () => { - const depositAmount = await Attestation.queryDepositAmount() + const depositAmount = api.consts.attestation.deposit.toBn() expect(['120950000000000', '120900000000000']).toContain( depositAmount.toString() ) @@ -73,11 +74,13 @@ it('fetches the correct deposit amount', async () => { describe('handling attestations that do not exist', () => { const claimHash = Crypto.hashStr('abcde') it('Attestation.query', async () => { - expect(await Attestation.query(claimHash)).toBeNull() + expect((await api.query.attestation.attestations(claimHash)).isNone).toBe( + true + ) }, 30_000) it('Attestation.getRevokeTx', async () => { - const draft = await Attestation.getRevokeTx(claimHash, 0) + const draft = api.tx.attestation.revoke(claimHash, null) const authorized = await Did.authorizeExtrinsic( attester, draft, @@ -93,7 +96,7 @@ describe('handling attestations that do not exist', () => { }, 30_000) it('Attestation.getRemoveTx', async () => { - const draft = await Attestation.getRemoveTx(claimHash, 0) + const draft = api.tx.attestation.remove(claimHash, null) const authorized = await Did.authorizeExtrinsic( attester, draft, @@ -115,7 +118,7 @@ describe('When there is an attester, claimer and ctype drivers license', () => { if (ctypeExists) return const tx = await Did.authorizeExtrinsic( attester, - await CType.getStoreTx(driversLicenseCType), + api.tx.ctype.add(CType.toChain(driversLicenseCType)), attesterKey.sign, tokenHolder.address ) @@ -163,7 +166,11 @@ describe('When there is an attester, claimer and ctype drivers license', () => { presentation, attester.uri ) - const storeTx = await Attestation.getStoreTx(attestation) + const storeTx = api.tx.attestation.add( + attestation.claimHash, + attestation.cTypeHash, + null + ) const authorizedStoreTx = await Did.authorizeExtrinsic( attester, storeTx, @@ -171,18 +178,21 @@ describe('When there is an attester, claimer and ctype drivers license', () => { tokenHolder.address ) await submitExtrinsic(authorizedStoreTx, tokenHolder) - const storedAttestation = await Attestation.query(attestation.claimHash) + const storedAttestation = Attestation.fromChain( + await api.query.attestation.attestations(attestation.claimHash), + attestation.claimHash + ) expect(storedAttestation).not.toBeNull() expect(storedAttestation?.revoked).toBe(false) // Claim the deposit back by submitting the reclaimDeposit extrinsic with the deposit payer's account. - const reclaimTx = await Attestation.getReclaimDepositTx( - attestation.claimHash - ) + const reclaimTx = api.tx.attestation.reclaimDeposit(attestation.claimHash) await submitExtrinsic(reclaimTx, tokenHolder) // Test that the attestation has been deleted. - expect(await Attestation.query(attestation.claimHash)).toBeNull() + expect( + (await api.query.attestation.attestations(attestation.claimHash)).isNone + ).toBe(true) }, 60_000) it('should not be possible to attest a claim without enough tokens', async () => { @@ -209,7 +219,11 @@ describe('When there is an attester, claimer and ctype drivers license', () => { ) const { keypair, sign } = makeSigningKeyTool() - const storeTx = await Attestation.getStoreTx(attestation) + const storeTx = api.tx.attestation.add( + attestation.claimHash, + attestation.cTypeHash, + null + ) const authorizedStoreTx = await Did.authorizeExtrinsic( attester, storeTx, @@ -222,7 +236,9 @@ describe('When there is an attester, claimer and ctype drivers license', () => { `"1010: Invalid Transaction: Inability to pay some fees , e.g. account balance too low"` ) - expect(await Attestation.query(attestation.claimHash)).toBeNull() + expect( + (await api.query.attestation.attestations(attestation.claimHash)).isNone + ).toBe(true) }, 60_000) it('should not be possible to attest a claim on a Ctype that is not on chain', async () => { @@ -252,7 +268,11 @@ describe('When there is an attester, claimer and ctype drivers license', () => { credential, attester.uri ) - const storeTx = await Attestation.getStoreTx(attestation) + const storeTx = api.tx.attestation.add( + attestation.claimHash, + attestation.cTypeHash, + null + ) const authorizedStoreTx = await Did.authorizeExtrinsic( attester, storeTx, @@ -283,7 +303,11 @@ describe('When there is an attester, claimer and ctype drivers license', () => { claimerDid: claimer, }) attestation = Attestation.fromCredentialAndDid(credential, attester.uri) - const storeTx = await Attestation.getStoreTx(attestation) + const storeTx = api.tx.attestation.add( + attestation.claimHash, + attestation.cTypeHash, + null + ) const authorizedStoreTx = await Did.authorizeExtrinsic( attester, storeTx, @@ -293,13 +317,20 @@ describe('When there is an attester, claimer and ctype drivers license', () => { await submitExtrinsic(authorizedStoreTx, tokenHolder) await Credential.verifyPresentation(presentation) - const storedAttestation = await Attestation.query(attestation.claimHash) + const storedAttestation = Attestation.fromChain( + await api.query.attestation.attestations(attestation.claimHash), + attestation.claimHash + ) expect(storedAttestation).not.toBeNull() expect(storedAttestation?.revoked).toBe(false) }, 60_000) it('should not be possible to attest the same claim twice', async () => { - const storeTx = await Attestation.getStoreTx(attestation) + const storeTx = api.tx.attestation.add( + attestation.claimHash, + attestation.cTypeHash, + null + ) const authorizedStoreTx = await Did.authorizeExtrinsic( attester, storeTx, @@ -335,7 +366,7 @@ describe('When there is an attester, claimer and ctype drivers license', () => { }, 15_000) it('should not be possible for the claimer to revoke an attestation', async () => { - const revokeTx = await getRevokeTx(attestation.claimHash, 0) + const revokeTx = api.tx.attestation.revoke(attestation.claimHash, null) const authorizedRevokeTx = await Did.authorizeExtrinsic( claimer, revokeTx, @@ -346,17 +377,23 @@ describe('When there is an attester, claimer and ctype drivers license', () => { await expect( submitExtrinsic(authorizedRevokeTx, tokenHolder) ).rejects.toMatchObject({ section: 'attestation', name: 'Unauthorized' }) - const storedAttestation = await Attestation.query(attestation.claimHash) + const storedAttestation = Attestation.fromChain( + await api.query.attestation.attestations(attestation.claimHash), + attestation.claimHash + ) expect(storedAttestation).not.toBeNull() expect(storedAttestation?.revoked).toBe(false) }, 45_000) it('should be possible for the attester to revoke an attestation', async () => { - const storedAttestation = await Attestation.query(attestation.claimHash) + const storedAttestation = Attestation.fromChain( + await api.query.attestation.attestations(attestation.claimHash), + attestation.claimHash + ) expect(storedAttestation).not.toBeNull() expect(storedAttestation?.revoked).toBe(false) - const revokeTx = await getRevokeTx(attestation.claimHash, 0) + const revokeTx = api.tx.attestation.revoke(attestation.claimHash, null) const authorizedRevokeTx = await Did.authorizeExtrinsic( attester, revokeTx, @@ -365,7 +402,8 @@ describe('When there is an attester, claimer and ctype drivers license', () => { ) await submitExtrinsic(authorizedRevokeTx, tokenHolder) - const storedAttestationAfter = await Attestation.query( + const storedAttestationAfter = Attestation.fromChain( + await api.query.attestation.attestations(attestation.claimHash), attestation.claimHash ) expect(storedAttestationAfter).not.toBeNull() @@ -373,7 +411,7 @@ describe('When there is an attester, claimer and ctype drivers license', () => { }, 40_000) it('should be possible for the deposit payer to remove an attestation', async () => { - const removeTx = await getRemoveTx(attestation.claimHash, 0) + const removeTx = api.tx.attestation.remove(attestation.claimHash, null) const authorizedRemoveTx = await Did.authorizeExtrinsic( attester, removeTx, @@ -402,7 +440,9 @@ describe('When there is an attester, claimer and ctype drivers license', () => { beforeAll(async () => { if (await isCtypeOnChain(officialLicenseAuthorityCType)) return - const storeTx = await CType.getStoreTx(officialLicenseAuthorityCType) + const storeTx = api.tx.ctype.add( + CType.toChain(officialLicenseAuthorityCType) + ) const authorizedStoreTx = await Did.authorizeExtrinsic( attester, storeTx, @@ -434,7 +474,11 @@ describe('When there is an attester, claimer and ctype drivers license', () => { credential1, anotherAttester.uri ) - const storeTx = await Attestation.getStoreTx(licenseAuthorizationGranted) + const storeTx = api.tx.attestation.add( + licenseAuthorizationGranted.claimHash, + licenseAuthorizationGranted.cTypeHash, + null + ) const authorizedStoreTx = await Did.authorizeExtrinsic( anotherAttester, storeTx, @@ -461,7 +505,11 @@ describe('When there is an attester, claimer and ctype drivers license', () => { credential2, attester.uri ) - const storeTx2 = await Attestation.getStoreTx(licenseGranted) + const storeTx2 = api.tx.attestation.add( + licenseGranted.claimHash, + licenseGranted.cTypeHash, + null + ) const authorizedStoreTx2 = await Did.authorizeExtrinsic( attester, storeTx2, @@ -470,11 +518,17 @@ describe('When there is an attester, claimer and ctype drivers license', () => { ) await submitExtrinsic(authorizedStoreTx2, tokenHolder) - const storedAttLicense = await Attestation.query(licenseGranted.claimHash) + const storedAttLicense = Attestation.fromChain( + await api.query.attestation.attestations(licenseGranted.claimHash), + licenseGranted.claimHash + ) expect(storedAttLicense).not.toBeNull() expect(storedAttLicense?.revoked).toBe(false) - const storedAttAuthorized = await Attestation.query( + const storedAttAuthorized = Attestation.fromChain( + await api.query.attestation.attestations( + licenseAuthorizationGranted.claimHash + ), licenseAuthorizationGranted.claimHash ) expect(storedAttAuthorized).not.toBeNull() diff --git a/packages/core/src/__integrationtests__/Balance.spec.ts b/packages/core/src/__integrationtests__/Balance.spec.ts index 9853ab6cf..54b3cb423 100644 --- a/packages/core/src/__integrationtests__/Balance.spec.ts +++ b/packages/core/src/__integrationtests__/Balance.spec.ts @@ -9,17 +9,11 @@ * @group integration/balance */ +import { ApiPromise } from '@polkadot/api' import { BN } from '@polkadot/util' import type { KeyringPair } from '@kiltprotocol/types' import { makeSigningKeyTool } from '@kiltprotocol/testing' -import { ConfigService } from '@kiltprotocol/config' - -import { - getBalances, - getTransferTx, - listenToBalanceChanges, -} from '../balance/Balance.chain' import { disconnect } from '../kilt' import { addressFromRandom, @@ -31,8 +25,9 @@ import { submitExtrinsic, } from './utils' +let api: ApiPromise beforeAll(async () => { - await initializeApi() + api = await initializeApi() }, 30_000) describe('when there is a dev chain with a faucet', () => { @@ -47,23 +42,23 @@ describe('when there is a dev chain with a faucet', () => { }) it('should have enough coins available on the faucet', async () => { - const balance = await getBalances(faucet.address) + const balance = (await api.query.system.account(faucet.address)).data expect(balance.free.gt(new BN(100_000_000))).toBe(true) // console.log(`Faucet has ${Number(balance)} micro Kilt`) }) it('Bob has tokens', async () => { - const balance = await getBalances(bob.address) + const balance = (await api.query.system.account(bob.address)).data expect(balance.free.gt(new BN(100_000_000))).toBe(true) }) it('Alice has tokens', async () => { - const balance = await getBalances(alice.address) + const balance = (await api.query.system.account(alice.address)).data expect(balance.free.gt(new BN(100_000_000))).toBe(true) }) it('getBalances should return 0 for new address', async () => { - const { free } = await getBalances(addressFromRandom()) + const { free } = (await api.query.system.account(addressFromRandom())).data expect(free.toNumber()).toEqual(0) }) @@ -72,12 +67,12 @@ describe('when there is a dev chain with a faucet', () => { it('should be able to faucet coins to a new address', async () => { const address = addressFromRandom() const spy = jest.fn() - listenToBalanceChanges(address, spy) - const balanceBefore = await getBalances(faucet.address) - const transferTx = await getTransferTx(address, EXISTENTIAL_DEPOSIT) + api.query.system.account(address, spy) + const balanceBefore = (await api.query.system.account(faucet.address)).data + const transferTx = api.tx.balances.transfer(address, EXISTENTIAL_DEPOSIT) await submitExtrinsic(transferTx, faucet) - const balanceAfter = await getBalances(faucet.address) - const balanceIdent = await getBalances(address) + const balanceAfter = (await api.query.system.account(faucet.address)).data + const balanceIdent = (await api.query.system.account(address)).data expect( balanceBefore.free.sub(balanceAfter.free).gt(EXISTENTIAL_DEPOSIT) @@ -101,78 +96,78 @@ describe('When there are haves and have-nots', () => { }) it('can transfer tokens from the rich to the poor', async () => { - const transferTx = await getTransferTx(stormyD.address, EXISTENTIAL_DEPOSIT) + const transferTx = api.tx.balances.transfer( + stormyD.address, + EXISTENTIAL_DEPOSIT + ) await submitExtrinsic(transferTx, richieRich) - const balanceTo = await getBalances(stormyD.address) + const balanceTo = (await api.query.system.account(stormyD.address)).data expect(balanceTo.free.toNumber()).toBe(EXISTENTIAL_DEPOSIT.toNumber()) }, 40_000) it('should not accept transactions from KeyringPair with zero balance', async () => { - const originalBalance = await getBalances(stormyD.address) - const transferTx = await getTransferTx(stormyD.address, EXISTENTIAL_DEPOSIT) + const originalBalance = (await api.query.system.account(stormyD.address)) + .data + const transferTx = api.tx.balances.transfer( + stormyD.address, + EXISTENTIAL_DEPOSIT + ) await expect(submitExtrinsic(transferTx, bobbyBroke)).rejects.toThrowError( '1010: Invalid Transaction' ) - const newBalance = await getBalances(stormyD.address) - const zeroBalance = await getBalances(bobbyBroke.address) + const newBalance = (await api.query.system.account(stormyD.address)).data + const zeroBalance = (await api.query.system.account(bobbyBroke.address)) + .data expect(newBalance.free.toNumber()).toBe(originalBalance.free.toNumber()) expect(zeroBalance.free.toNumber()).toBe(0) }, 50_000) it.skip('should not accept transactions when sender cannot pay gas, but will keep gas fee', async () => { - const RichieBalance = await getBalances(richieRich.address) - const transferTx = await getTransferTx( + const RichieBalance = (await api.query.system.account(richieRich.address)) + .data + const transferTx = api.tx.balances.transfer( bobbyBroke.address, RichieBalance.free ) await expect(submitExtrinsic(transferTx, richieRich)).rejects.toThrowError() - const newBalance = await getBalances(stormyD.address) - const zeroBalance = await getBalances(bobbyBroke.address) + const newBalance = (await api.query.system.account(stormyD.address)).data + const zeroBalance = (await api.query.system.account(bobbyBroke.address)) + .data expect(zeroBalance.free.toString()).toEqual('0') expect(newBalance.free.lt(RichieBalance.free)) }, 30_000) it('should be able to make a new transaction once the last is ready', async () => { const spy = jest.fn() - listenToBalanceChanges(faucet.address, spy) + api.query.system.account(faucet.address, spy) - const transferTx1 = await getTransferTx( + const transferTx1 = api.tx.balances.transfer( richieRich.address, EXISTENTIAL_DEPOSIT ) await submitExtrinsic(transferTx1, faucet) - const transferTx2 = await getTransferTx( + const transferTx2 = api.tx.balances.transfer( stormyD.address, EXISTENTIAL_DEPOSIT ) await submitExtrinsic(transferTx2, faucet) - expect(spy).toBeCalledWith( - faucet.address, - expect.anything(), - expect.anything() - ) expect(spy).toBeCalledTimes(3) }, 30_000) it('should be able to make multiple transactions at once', async () => { const listener = jest.fn() - listenToBalanceChanges(faucet.address, listener) + api.query.system.account(faucet.address, listener) - const api = ConfigService.get('api') const batch = api.tx.utility.batchAll([ - await getTransferTx(richieRich.address, EXISTENTIAL_DEPOSIT), - await getTransferTx(stormyD.address, EXISTENTIAL_DEPOSIT), + api.tx.balances.transfer(richieRich.address, EXISTENTIAL_DEPOSIT), + api.tx.balances.transfer(stormyD.address, EXISTENTIAL_DEPOSIT), ]) await submitExtrinsic(batch, faucet) - expect(listener).toBeCalledWith( - faucet.address, - expect.anything(), - expect.anything() - ) + expect(listener).toBeCalledTimes(2) }, 50_000) }) diff --git a/packages/core/src/__integrationtests__/Blockchain.spec.ts b/packages/core/src/__integrationtests__/Blockchain.spec.ts index f62fdcef8..76f9c044d 100644 --- a/packages/core/src/__integrationtests__/Blockchain.spec.ts +++ b/packages/core/src/__integrationtests__/Blockchain.spec.ts @@ -10,13 +10,13 @@ */ import { BN } from '@polkadot/util' -import { ApiPromise } from '@polkadot/api' +import type { ApiPromise } from '@polkadot/api' import type { KeyringPair } from '@kiltprotocol/types' import { Blockchain } from '@kiltprotocol/chain-helpers' import { makeSigningKeyTool } from '@kiltprotocol/testing' -import { getTransferTx } from '../balance/Balance.chain' +import { toFemtoKilt } from '../balance/Balance.utils' import { devCharlie, devFaucet, initializeApi, submitExtrinsic } from './utils' import { disconnect } from '../kilt' @@ -34,10 +34,9 @@ describe('Chain returns specific errors, that we check for', () => { testIdentity = makeSigningKeyTool().keypair charlie = devCharlie - const transferTx = await getTransferTx( + const transferTx = api.tx.balances.transfer( testIdentity.address, - new BN(10000), - 0 + toFemtoKilt(10000) ) await submitExtrinsic(transferTx, faucet) }, 40000) diff --git a/packages/core/src/__integrationtests__/Ctypes.spec.ts b/packages/core/src/__integrationtests__/Ctypes.spec.ts index b92fc1cbc..326f5bf6e 100644 --- a/packages/core/src/__integrationtests__/Ctypes.spec.ts +++ b/packages/core/src/__integrationtests__/Ctypes.spec.ts @@ -9,7 +9,7 @@ * @group integration/ctype */ -import { DidDocument, ICType, KiltKeyringPair } from '@kiltprotocol/types' +import type { DidDocument, ICType, KiltKeyringPair } from '@kiltprotocol/types' import * as Did from '@kiltprotocol/did' import { createFullDidFromSeed, @@ -17,8 +17,8 @@ import { makeSigningKeyTool, } from '@kiltprotocol/testing' import { Crypto } from '@kiltprotocol/utils' +import { ApiPromise } from '@polkadot/api' import * as CType from '../ctype' -import { getOwner } from '../ctype/CType.chain' import { disconnect } from '../kilt' import { createEndowedTestAccount, @@ -26,8 +26,9 @@ import { submitExtrinsic, } from './utils' +let api: ApiPromise beforeAll(async () => { - await initializeApi() + api = await initializeApi() }, 30_000) describe('When there is an CtypeCreator and a verifier', () => { @@ -58,7 +59,7 @@ describe('When there is an CtypeCreator and a verifier', () => { it('should not be possible to create a claim type w/o tokens', async () => { const ctype = makeCType() const { keypair, sign } = makeSigningKeyTool() - const storeTx = await CType.getStoreTx(ctype) + const storeTx = api.tx.ctype.add(CType.toChain(ctype)) const authorizedStoreTx = await Did.authorizeExtrinsic( ctypeCreator, storeTx, @@ -73,7 +74,7 @@ describe('When there is an CtypeCreator and a verifier', () => { it('should be possible to create a claim type', async () => { const ctype = makeCType() - const storeTx = await CType.getStoreTx(ctype) + const storeTx = api.tx.ctype.add(CType.toChain(ctype)) const authorizedStoreTx = await Did.authorizeExtrinsic( ctypeCreator, storeTx, @@ -82,7 +83,9 @@ describe('When there is an CtypeCreator and a verifier', () => { ) await submitExtrinsic(authorizedStoreTx, paymentAccount) - expect(await getOwner(ctype.hash)).toBe(ctypeCreator.uri) + expect(CType.fromChain(await api.query.ctype.ctypes(ctype.hash))).toBe( + ctypeCreator.uri + ) expect(await CType.verifyStored(ctype)).toBe(true) ctype.owner = ctypeCreator.uri @@ -91,7 +94,7 @@ describe('When there is an CtypeCreator and a verifier', () => { it('should not be possible to create a claim type that exists', async () => { const ctype = makeCType() - const storeTx = await CType.getStoreTx(ctype) + const storeTx = api.tx.ctype.add(CType.toChain(ctype)) const authorizedStoreTx = await Did.authorizeExtrinsic( ctypeCreator, storeTx, @@ -100,7 +103,7 @@ describe('When there is an CtypeCreator and a verifier', () => { ) await submitExtrinsic(authorizedStoreTx, paymentAccount) - const storeTx2 = await CType.getStoreTx(ctype) + const storeTx2 = api.tx.ctype.add(CType.toChain(ctype)) const authorizedStoreTx2 = await Did.authorizeExtrinsic( ctypeCreator, storeTx2, @@ -111,7 +114,9 @@ describe('When there is an CtypeCreator and a verifier', () => { submitExtrinsic(authorizedStoreTx2, paymentAccount) ).rejects.toMatchObject({ section: 'ctype', name: 'CTypeAlreadyExists' }) - expect(await getOwner(ctype.hash)).toBe(ctypeCreator.uri) + expect(CType.fromChain(await api.query.ctype.ctypes(ctype.hash))).toBe( + ctypeCreator.uri + ) }, 45_000) it('should tell when a ctype is not on chain', async () => { @@ -139,8 +144,11 @@ describe('When there is an CtypeCreator and a verifier', () => { ) expect(await CType.verifyStored(iAmNotThere)).toBe(false) - expect(await getOwner(iAmNotThere.hash)).toBeNull() - expect(await getOwner(Crypto.hashStr('abcdefg'))).toBeNull() + expect((await api.query.ctype.ctypes(iAmNotThere.hash)).isNone).toBe(true) + + const fakeHash = Crypto.hashStr('abcdefg') + expect((await api.query.ctype.ctypes(fakeHash)).isNone).toBe(true) + expect(await CType.verifyStored(iAmNotThereWithOwner)).toBe(false) }) }) diff --git a/packages/core/src/__integrationtests__/Delegation.spec.ts b/packages/core/src/__integrationtests__/Delegation.spec.ts index 0aa386917..857c55343 100644 --- a/packages/core/src/__integrationtests__/Delegation.spec.ts +++ b/packages/core/src/__integrationtests__/Delegation.spec.ts @@ -23,6 +23,7 @@ import { makeSigningKeyTool, } from '@kiltprotocol/testing' import * as Did from '@kiltprotocol/did' +import { ApiPromise } from '@polkadot/api' import { randomAsHex } from '@polkadot/util-crypto' import * as Attestation from '../attestation' import * as Claim from '../claim' @@ -38,10 +39,9 @@ import { isCtypeOnChain, submitExtrinsic, } from './utils' -import { - getAttestationHashes, - getRevokeTx, -} from '../delegation/DelegationNode.chain' +import { getAttestationHashes } from '../delegation/DelegationNode.chain' + +let api: ApiPromise let paymentAccount: KiltKeyringPair let root: DidDocument @@ -104,7 +104,7 @@ async function addDelegation( } beforeAll(async () => { - await initializeApi() + api = await initializeApi() }, 30_000) beforeAll(async () => { @@ -118,7 +118,7 @@ beforeAll(async () => { if (await isCtypeOnChain(driversLicenseCType)) return - const storeTx = await CType.getStoreTx(driversLicenseCType) + const storeTx = api.tx.ctype.add(CType.toChain(driversLicenseCType)) const authorizedStoreTx = await Did.authorizeExtrinsic( attester, storeTx, @@ -129,7 +129,7 @@ beforeAll(async () => { }, 60_000) it('fetches the correct deposit amount', async () => { - const depositAmount = await DelegationNode.queryDepositAmount() + const depositAmount = api.consts.delegation.deposit.toBn() expect(depositAmount.toString()).toMatchInlineSnapshot('"1000000000000000"') }) @@ -200,7 +200,11 @@ describe('and attestation rights have been delegated', () => { credential, attester.uri ) - const storeTx = await Attestation.getStoreTx(attestation) + const storeTx = api.tx.attestation.add( + attestation.claimHash, + attestation.cTypeHash, + { Delegation: { subjectNodeId: delegatedNode.id } } + ) const authorizedStoreTx = await Did.authorizeExtrinsic( attester, storeTx, @@ -209,12 +213,17 @@ describe('and attestation rights have been delegated', () => { ) await submitExtrinsic(authorizedStoreTx, paymentAccount) - const storedAttestation = await Attestation.query(attestation.claimHash) + const storedAttestation = Attestation.fromChain( + await api.query.attestation.attestations(attestation.claimHash), + attestation.claimHash + ) expect(storedAttestation).not.toBeNull() expect(storedAttestation?.revoked).toBe(false) // revoke attestation through root - const revokeTx = await Attestation.getRevokeTx(attestation.claimHash, 1) + const revokeTx = api.tx.attestation.revoke(attestation.claimHash, { + Delegation: { maxChecks: 1 }, + }) const authorizedStoreTx2 = await Did.authorizeExtrinsic( root, revokeTx, @@ -223,7 +232,8 @@ describe('and attestation rights have been delegated', () => { ) await submitExtrinsic(authorizedStoreTx2, paymentAccount) - const storedAttestationAfter = await Attestation.query( + const storedAttestationAfter = Attestation.fromChain( + await api.query.attestation.attestations(attestation.claimHash), attestation.claimHash ) expect(storedAttestationAfter).not.toBeNull() @@ -310,7 +320,7 @@ describe('revocation', () => { delegatorSign, firstDelegateSign ) - const revokeTx = await getRevokeTx(delegationRoot.id, 1, 1) + const revokeTx = api.tx.delegation.revokeDelegation(delegationRoot.id, 1, 1) const authorizedRevokeTx = await Did.authorizeExtrinsic( firstDelegate, revokeTx, diff --git a/packages/core/src/__integrationtests__/Deposit.spec.ts b/packages/core/src/__integrationtests__/Deposit.spec.ts index 7c1e9ffaa..eeaedb477 100644 --- a/packages/core/src/__integrationtests__/Deposit.spec.ts +++ b/packages/core/src/__integrationtests__/Deposit.spec.ts @@ -9,7 +9,6 @@ * @group integration/deposit */ -import { Web3Names } from '@kiltprotocol/did' import * as Did from '@kiltprotocol/did' import { createFullDidFromLightDid, @@ -18,7 +17,7 @@ import { KeyTool, makeSigningKeyTool, } from '@kiltprotocol/testing' -import { +import type { DidDocument, IAttestation, ICredential, @@ -27,6 +26,7 @@ import { SignCallback, SubmittableExtrinsic, } from '@kiltprotocol/types' +import type { ApiPromise } from '@polkadot/api' import { BN } from '@polkadot/util' import { devFaucet, @@ -36,14 +36,13 @@ import { isCtypeOnChain, submitExtrinsic, } from './utils' -import { Balance } from '../balance' import * as Attestation from '../attestation' import * as Claim from '../claim' import * as Credential from '../credential' import { disconnect } from '../kilt' -import { queryRaw } from '../attestation/Attestation.chain' import * as CType from '../ctype' +let api: ApiPromise let tx: SubmittableExtrinsic let authorizedTx: SubmittableExtrinsic let attestation: IAttestation @@ -54,19 +53,27 @@ async function checkDeleteFullDid( fullDid: DidDocument, sign: SignCallback ): Promise { - storedEndpointsCount = await Did.Chain.queryEndpointsCounts(fullDid.uri) - const deleteDid = await Did.Chain.getDeleteDidExtrinsic(storedEndpointsCount) + storedEndpointsCount = await api.query.did.didEndpointsCount( + Did.Chain.didToChain(fullDid.uri) + ) + const deleteDid = api.tx.did.delete(storedEndpointsCount) tx = await Did.authorizeExtrinsic(fullDid, deleteDid, sign, identity.address) - const balanceBeforeDeleting = await Balance.getBalances(identity.address) + const balanceBeforeDeleting = ( + await api.query.system.account(identity.address) + ).data - const didResult = await Did.Chain.queryDetails(fullDid.uri) - const didDeposit = didResult!.deposit + const didResult = Did.Chain.didFromChain( + await api.query.did.did(Did.Chain.didToChain(fullDid.uri)) + ) + const didDeposit = didResult.deposit await submitExtrinsic(tx, identity) - const balanceAfterDeleting = await Balance.getBalances(identity.address) + const balanceAfterDeleting = ( + await api.query.system.account(identity.address) + ).data return balanceBeforeDeleting.reserved .sub(didDeposit.amount) @@ -77,20 +84,28 @@ async function checkReclaimFullDid( identity: KeyringPair, fullDid: DidDocument ): Promise { - storedEndpointsCount = await Did.Chain.queryEndpointsCounts(fullDid.uri) - tx = await Did.Chain.getReclaimDepositExtrinsic( - fullDid.uri, + storedEndpointsCount = await api.query.did.didEndpointsCount( + Did.Chain.didToChain(fullDid.uri) + ) + tx = api.tx.did.reclaimDeposit( + Did.Chain.didToChain(fullDid.uri), storedEndpointsCount ) - const balanceBeforeRevoking = await Balance.getBalances(identity.address) + const balanceBeforeRevoking = ( + await api.query.system.account(identity.address) + ).data - const didResult = await Did.Chain.queryDetails(fullDid.uri) - const didDeposit = didResult!.deposit + const didResult = Did.Chain.didFromChain( + await api.query.did.did(Did.Chain.didToChain(fullDid.uri)) + ) + const didDeposit = didResult.deposit await submitExtrinsic(tx, identity) - const balanceAfterRevoking = await Balance.getBalances(identity.address) + const balanceAfterRevoking = ( + await api.query.system.account(identity.address) + ).data return balanceBeforeRevoking.reserved .sub(didDeposit.amount) @@ -105,7 +120,11 @@ async function checkRemoveFullDidAttestation( ): Promise { attestation = Attestation.fromCredentialAndDid(credential, fullDid.uri) - tx = await Attestation.getStoreTx(attestation) + tx = api.tx.attestation.add( + attestation.claimHash, + attestation.cTypeHash, + null + ) authorizedTx = await Did.authorizeExtrinsic( fullDid, tx, @@ -115,15 +134,19 @@ async function checkRemoveFullDidAttestation( await submitExtrinsic(authorizedTx, identity) - const attestationResult = await queryRaw(attestation.claimHash) + const attestationResult = await api.query.attestation.attestations( + attestation.claimHash + ) const attestationDeposit = attestationResult.isSome ? attestationResult.unwrap().deposit.amount.toBn() : new BN(0) - const balanceBeforeRemoving = await Balance.getBalances(identity.address) + const balanceBeforeRemoving = ( + await api.query.system.account(identity.address) + ).data attestation = Attestation.fromCredentialAndDid(credential, fullDid.uri) - tx = await Attestation.getRemoveTx(attestation.claimHash, 0) + tx = api.tx.attestation.remove(attestation.claimHash, null) authorizedTx = await Did.authorizeExtrinsic( fullDid, tx, @@ -133,7 +156,9 @@ async function checkRemoveFullDidAttestation( await submitExtrinsic(authorizedTx, identity) - const balanceAfterRemoving = await Balance.getBalances(identity.address) + const balanceAfterRemoving = ( + await api.query.system.account(identity.address) + ).data return balanceBeforeRemoving.reserved .sub(attestationDeposit) @@ -148,7 +173,11 @@ async function checkReclaimFullDidAttestation( ): Promise { attestation = Attestation.fromCredentialAndDid(credential, fullDid.uri) - tx = await Attestation.getStoreTx(attestation) + tx = api.tx.attestation.add( + attestation.claimHash, + attestation.cTypeHash, + null + ) authorizedTx = await Did.authorizeExtrinsic( fullDid, tx, @@ -158,19 +187,25 @@ async function checkReclaimFullDidAttestation( await submitExtrinsic(authorizedTx, identity) - const balanceBeforeReclaiming = await Balance.getBalances(identity.address) + const balanceBeforeReclaiming = ( + await api.query.system.account(identity.address) + ).data attestation = Attestation.fromCredentialAndDid(credential, fullDid.uri) - tx = await Attestation.getReclaimDepositTx(attestation.claimHash) + tx = api.tx.attestation.reclaimDeposit(attestation.claimHash) - const attestationResult = await queryRaw(attestation.claimHash) + const attestationResult = await api.query.attestation.attestations( + attestation.claimHash + ) const attestationDeposit = attestationResult.isSome ? attestationResult.unwrap().deposit.amount.toBn() : new BN(0) await submitExtrinsic(tx, identity) - const balanceAfterDeleting = await Balance.getBalances(identity.address) + const balanceAfterDeleting = ( + await api.query.system.account(identity.address) + ).data return balanceBeforeReclaiming.reserved .sub(attestationDeposit) @@ -185,7 +220,11 @@ async function checkDeletedDidReclaimAttestation( ): Promise { attestation = Attestation.fromCredentialAndDid(credential, fullDid.uri) - tx = await Attestation.getStoreTx(attestation) + tx = api.tx.attestation.add( + attestation.claimHash, + attestation.cTypeHash, + null + ) authorizedTx = await Did.authorizeExtrinsic( fullDid, tx, @@ -195,16 +234,18 @@ async function checkDeletedDidReclaimAttestation( await submitExtrinsic(authorizedTx, identity) - storedEndpointsCount = await Did.Chain.queryEndpointsCounts(fullDid.uri) + storedEndpointsCount = await api.query.did.didEndpointsCount( + Did.Chain.didToChain(fullDid.uri) + ) attestation = Attestation.fromCredentialAndDid(credential, fullDid.uri) - const deleteDid = await Did.Chain.getDeleteDidExtrinsic(storedEndpointsCount) + const deleteDid = api.tx.did.delete(storedEndpointsCount) tx = await Did.authorizeExtrinsic(fullDid, deleteDid, sign, identity.address) await submitExtrinsic(tx, identity) - tx = await Attestation.getReclaimDepositTx(attestation.claimHash) + tx = api.tx.attestation.reclaimDeposit(attestation.claimHash) await submitExtrinsic(tx, identity) } @@ -215,10 +256,12 @@ async function checkWeb3Deposit( sign: SignCallback ): Promise { const web3Name = 'test-web3name' - const balanceBeforeClaiming = await Balance.getBalances(identity.address) - const depositAmount = await Web3Names.queryDepositAmount() + const balanceBeforeClaiming = ( + await api.query.system.account(identity.address) + ).data - const claimTx = await Web3Names.getClaimTx(web3Name) + const depositAmount = api.consts.web3Names.deposit.toBn() + const claimTx = api.tx.web3Names.claim(web3Name) let didAuthorizedTx = await Did.authorizeExtrinsic( fullDid, claimTx, @@ -226,7 +269,9 @@ async function checkWeb3Deposit( identity.address ) await submitExtrinsic(didAuthorizedTx, identity) - const balanceAfterClaiming = await Balance.getBalances(identity.address) + const balanceAfterClaiming = ( + await api.query.system.account(identity.address) + ).data if ( !balanceAfterClaiming.reserved .sub(balanceBeforeClaiming.reserved) @@ -235,7 +280,7 @@ async function checkWeb3Deposit( return false } - const releaseTx = await Web3Names.getReleaseByOwnerTx() + const releaseTx = api.tx.web3Names.releaseByOwner() didAuthorizedTx = await Did.authorizeExtrinsic( fullDid, releaseTx, @@ -243,7 +288,9 @@ async function checkWeb3Deposit( identity.address ) await submitExtrinsic(didAuthorizedTx, identity) - const balanceAfterReleasing = await Balance.getBalances(identity.address) + const balanceAfterReleasing = ( + await api.query.system.account(identity.address) + ).data if (!balanceAfterReleasing.reserved.eq(balanceBeforeClaiming.reserved)) { return false @@ -256,7 +303,7 @@ let keys: KeyTool[] let credential: ICredential beforeAll(async () => { - await initializeApi() + api = await initializeApi() }, 30_000) beforeAll(async () => { @@ -278,7 +325,7 @@ beforeAll(async () => { if (!ctypeExists) { const extrinsic = await Did.authorizeExtrinsic( attester, - await CType.getStoreTx(driversLicenseCType), + api.tx.ctype.add(CType.toChain(driversLicenseCType)), attesterKey.sign, devFaucet.address ) diff --git a/packages/core/src/__integrationtests__/Did.spec.ts b/packages/core/src/__integrationtests__/Did.spec.ts index 140f8d9b5..4aef30b9f 100644 --- a/packages/core/src/__integrationtests__/Did.spec.ts +++ b/packages/core/src/__integrationtests__/Did.spec.ts @@ -9,7 +9,7 @@ * @group integration/did */ -import { ApiPromise } from '@polkadot/api' +import type { ApiPromise } from '@polkadot/api' import { BN } from '@polkadot/util' import * as Did from '@kiltprotocol/did' @@ -55,7 +55,7 @@ beforeAll(async () => { }, 30_000) it('fetches the correct deposit amount', async () => { - const depositAmount = await Did.Chain.queryDepositAmount() + const depositAmount = api.consts.did.deposit.toBn() expect(depositAmount.toString()).toMatchInlineSnapshot('"2007900000000000"') }) @@ -137,11 +137,15 @@ describe('write and didDeleteTx', () => { expect(await Did.Chain.queryServiceEndpoints(emptyDid)).toBeDefined() expect(await Did.Chain.queryServiceEndpoints(emptyDid)).toHaveLength(0) - expect( - await Did.Chain.queryServiceEndpoint(emptyDid, '#non-existing-service-id') - ).toBeNull() + const encoded = await api.query.did.serviceEndpoints( + Did.Chain.didToChain(emptyDid), + Did.Chain.resourceIdToChain('#non-existing-service-id') + ) + expect(encoded.isNone).toBe(true) - const endpointsCount = await Did.Chain.queryEndpointsCounts(emptyDid) + const endpointsCount = await api.query.did.didEndpointsCount( + Did.Chain.didToChain(emptyDid) + ) expect(endpointsCount.toString()).toStrictEqual(new BN(0).toString()) }) @@ -155,7 +159,7 @@ describe('write and didDeleteTx', () => { const otherAccount = devBob // 10 is an example value. It is not used here since we are testing another error - let call = await Did.Chain.getDeleteDidExtrinsic(new BN(10)) + let call = api.tx.did.delete(new BN(10)) let submittable = await Did.authorizeExtrinsic( fullDid, @@ -170,7 +174,7 @@ describe('write and didDeleteTx', () => { ).rejects.toMatchObject({ section: 'did', name: 'BadDidOrigin' }) // We use 1 here and this should fail as there are two service endpoints stored. - call = await Did.Chain.getDeleteDidExtrinsic(new BN(1)) + call = api.tx.did.delete(new BN(1)) submittable = await Did.authorizeExtrinsic( fullDid, @@ -195,10 +199,11 @@ describe('write and didDeleteTx', () => { )) as DidDocument expect(fullDid).not.toBeNull() - const storedEndpointsCount = await Did.Chain.queryEndpointsCounts( - fullDid.uri + const encodedDid = Did.Chain.didToChain(fullDid.uri) + const storedEndpointsCount = await api.query.did.didEndpointsCount( + encodedDid ) - const call = await Did.Chain.getDeleteDidExtrinsic(storedEndpointsCount) + const call = api.tx.did.delete(storedEndpointsCount) const submittable = await Did.authorizeExtrinsic( fullDid, @@ -208,16 +213,18 @@ describe('write and didDeleteTx', () => { ) // Check that DID is not blacklisted. - expect(await Did.Chain.queryDeletedDids()).not.toContain(fullDid.uri) - expect(await Did.Chain.queryDidDeletionStatus(fullDid.uri)).toBe(false) + expect((await api.query.did.didBlacklist.hash(encodedDid)).isEmpty).toBe( + true + ) await submitExtrinsic(submittable, paymentAccount) - expect(await Did.Chain.queryDetails(fullDid.uri)).toBeNull() + expect((await api.query.did.did(encodedDid)).isNone).toBe(true) // Check that DID is now blacklisted. - expect(await Did.Chain.queryDeletedDids()).toContain(fullDid.uri) - expect(await Did.Chain.queryDidDeletionStatus(fullDid.uri)).toBe(true) + expect((await api.query.did.didBlacklist.hash(encodedDid)).isEmpty).toBe( + false + ) }, 60_000) }) @@ -236,9 +243,8 @@ it('creates and updates DID, and then reclaims the deposit back', async () => { const newKey = makeSigningKeyTool() - const updateAuthenticationKeyCall = await Did.Chain.getSetKeyExtrinsic( - 'authentication', - newKey.authentication[0] + const updateAuthenticationKeyCall = api.tx.did.setAuthenticationKey( + Did.Chain.publicKeyToChain(newKey.authentication[0]) ) const tx2 = await Did.authorizeExtrinsic( fullDid, @@ -271,13 +277,18 @@ it('creates and updates DID, and then reclaims the deposit back', async () => { paymentAccount.address ) await submitExtrinsic(tx3, paymentAccount) - expect( - await Did.Chain.queryServiceEndpoint(fullDid.uri, newEndpoint.id) - ).toStrictEqual(newEndpoint) + + const encoded = await api.query.did.serviceEndpoints( + Did.Chain.didToChain(fullDid.uri), + Did.Chain.resourceIdToChain(newEndpoint.id) + ) + expect(Did.Chain.serviceEndpointFromChain(encoded.unwrap())).toStrictEqual( + newEndpoint + ) // Delete the added service endpoint - const removeEndpointCall = await Did.Chain.getRemoveEndpointExtrinsic( - newEndpoint.id + const removeEndpointCall = api.tx.did.removeServiceEndpoint( + Did.Chain.resourceIdToChain(newEndpoint.id) ) const tx4 = await Did.authorizeExtrinsic( fullDid, @@ -288,21 +299,29 @@ it('creates and updates DID, and then reclaims the deposit back', async () => { await submitExtrinsic(tx4, paymentAccount) // There should not be any endpoint with the given ID now. - expect( - await Did.Chain.queryServiceEndpoint(fullDid.uri, newEndpoint.id) - ).toBeNull() + const encoded2 = await api.query.did.serviceEndpoints( + Did.Chain.didToChain(fullDid.uri), + Did.Chain.resourceIdToChain(newEndpoint.id) + ) + expect(encoded2.isNone).toBe(true) // Claim the deposit back - const storedEndpointsCount = await Did.Chain.queryEndpointsCounts(fullDid.uri) - const reclaimDepositTx = await Did.Chain.getReclaimDepositExtrinsic( - fullDid.uri, + const storedEndpointsCount = await api.query.did.didEndpointsCount( + Did.Chain.didToChain(fullDid.uri) + ) + const reclaimDepositTx = api.tx.did.reclaimDeposit( + Did.Chain.didToChain(fullDid.uri), storedEndpointsCount ) await submitExtrinsic(reclaimDepositTx, paymentAccount) // Verify that the DID has been deleted - expect(await Did.Chain.queryDetails(fullDid.uri)).toBeNull() + expect( + (await api.query.did.did(Did.Chain.didToChain(fullDid.uri))).isNone + ).toBe(true) expect(await Did.Chain.queryServiceEndpoints(fullDid.uri)).toHaveLength(0) - const newEndpointsCount = await Did.Chain.queryEndpointsCounts(fullDid.uri) + const newEndpointsCount = await api.query.did.didEndpointsCount( + Did.Chain.didToChain(fullDid.uri) + ) expect(newEndpointsCount.toString()).toStrictEqual(new BN(0).toString()) }, 80_000) @@ -344,7 +363,10 @@ describe('DID migration', () => { ], }) - expect(await Did.Chain.queryDetails(migratedFullDid.uri)).not.toBeNull() + expect( + (await api.query.did.did(Did.Chain.didToChain(migratedFullDid.uri))) + .isSome + ).toBe(true) const { metadata } = (await resolve(lightDid.uri)) as DidResolutionResult @@ -379,7 +401,10 @@ describe('DID migration', () => { ], }) - expect(await Did.Chain.queryDetails(migratedFullDid.uri)).not.toBeNull() + expect( + (await api.query.did.did(Did.Chain.didToChain(migratedFullDid.uri))) + .isSome + ).toBe(true) const { metadata } = (await resolve(lightDid.uri)) as DidResolutionResult @@ -439,7 +464,8 @@ describe('DID migration', () => { ], }) - expect(await Did.Chain.queryDetails(migratedFullDid.uri)).not.toBeNull() + const encodedDid = Did.Chain.didToChain(migratedFullDid.uri) + expect((await api.query.did.did(encodedDid)).isSome).toBe(true) const { metadata } = (await resolve(lightDid.uri)) as DidResolutionResult @@ -447,21 +473,21 @@ describe('DID migration', () => { expect(metadata.deactivated).toBe(false) // Remove and claim the deposit back - const storedEndpointsCount = await Did.Chain.queryEndpointsCounts( - migratedFullDid.uri + const storedEndpointsCount = await api.query.did.didEndpointsCount( + encodedDid ) - const reclaimDepositTx = await Did.Chain.getReclaimDepositExtrinsic( - migratedFullDid.uri, + const reclaimDepositTx = api.tx.did.reclaimDeposit( + encodedDid, storedEndpointsCount ) await submitExtrinsic(reclaimDepositTx, paymentAccount) - expect(await Did.Chain.queryDetails(migratedFullDid.uri)).toBeNull() + expect((await api.query.did.did(encodedDid)).isNone).toBe(true) expect( await Did.Chain.queryServiceEndpoints(migratedFullDid.uri) ).toStrictEqual([]) - expect(await Did.Chain.queryDidDeletionStatus(migratedFullDid.uri)).toBe( - true + expect((await api.query.did.didBlacklist.hash(encodedDid)).isEmpty).toBe( + false ) }, 60_000) }) @@ -496,7 +522,7 @@ describe('DID authorization', () => { type: 'object', $schema: 'http://kilt-protocol.org/draft-01/ctype#', }) - const call = await CType.getStoreTx(ctype) + const call = api.tx.ctype.add(CType.toChain(ctype)) const tx = await Did.authorizeExtrinsic( did, call, @@ -509,10 +535,10 @@ describe('DID authorization', () => { }, 60_000) it('no longer authorizes ctype creation after DID deletion', async () => { - const storedEndpointsCount = await Did.Chain.queryEndpointsCounts(did.uri) - const deleteCall = await Did.Chain.getDeleteDidExtrinsic( - storedEndpointsCount + const storedEndpointsCount = await api.query.did.didEndpointsCount( + Did.Chain.didToChain(did.uri) ) + const deleteCall = api.tx.did.delete(storedEndpointsCount) const tx = await Did.authorizeExtrinsic( did, deleteCall, @@ -527,7 +553,7 @@ describe('DID authorization', () => { type: 'object', $schema: 'http://kilt-protocol.org/draft-01/ctype#', }) - const call = await CType.getStoreTx(ctype) + const call = api.tx.ctype.add(CType.toChain(ctype)) const tx2 = await Did.authorizeExtrinsic( did, call, @@ -746,16 +772,16 @@ describe('DID management batching', () => { batchFunction: api.tx.utility.batchAll, did: initialFullDid, extrinsics: [ - await api.tx.did.removeKeyAgreementKey( + api.tx.did.removeKeyAgreementKey( Did.Utils.stripFragment(encryptionKeys[0].id) ), - await api.tx.did.removeKeyAgreementKey( + api.tx.did.removeKeyAgreementKey( Did.Utils.stripFragment(encryptionKeys[1].id) ), - await api.tx.did.removeAttestationKey(), - await api.tx.did.removeDelegationKey(), - await api.tx.did.removeServiceEndpoint('id-1'), - await api.tx.did.removeServiceEndpoint('id-2'), + api.tx.did.removeAttestationKey(), + api.tx.did.removeDelegationKey(), + api.tx.did.removeServiceEndpoint('id-1'), + api.tx.did.removeServiceEndpoint('id-2'), ], sign, submitter: paymentAccount.address, @@ -806,7 +832,9 @@ describe('DID management batching', () => { type: ['type-1'], serviceEndpoint: ['x:url-1'], }), - await Did.Chain.getSetKeyExtrinsic('authentication', newAuthKey), + api.tx.did.setAuthenticationKey( + Did.Chain.publicKeyToChain(newAuthKey) + ), await Did.Chain.getAddEndpointExtrinsic({ id: '#id-2', type: ['type-2'], @@ -861,9 +889,8 @@ describe('DID management batching', () => { batchFunction: api.tx.utility.batch, did: fullDid, extrinsics: [ - await Did.Chain.getSetKeyExtrinsic( - 'assertionMethod', - authentication[0] + api.tx.did.setAttestationKey( + Did.Chain.publicKeyToChain(authentication[0]) ), await Did.Chain.getAddEndpointExtrinsic({ id: '#id-1', @@ -921,9 +948,8 @@ describe('DID management batching', () => { batchFunction: api.tx.utility.batchAll, did: fullDid, extrinsics: [ - await Did.Chain.getSetKeyExtrinsic( - 'assertionMethod', - authentication[0] + api.tx.did.setAttestationKey( + Did.Chain.publicKeyToChain(authentication[0]) ), await Did.Chain.getAddEndpointExtrinsic({ id: '#id-1', @@ -975,7 +1001,7 @@ describe('DID extrinsics batching', () => { type: 'object', $schema: 'http://kilt-protocol.org/draft-01/ctype#', }) - const ctypeStoreTx = await CType.getStoreTx(ctype) + const ctypeStoreTx = api.tx.ctype.add(CType.toChain(ctype)) const rootNode = DelegationNode.newRoot({ account: fullDid.uri, permissions: [Permission.DELEGATE], @@ -1010,7 +1036,7 @@ describe('DID extrinsics batching', () => { type: 'object', $schema: 'http://kilt-protocol.org/draft-01/ctype#', }) - const ctypeStoreTx = await CType.getStoreTx(ctype) + const ctypeStoreTx = api.tx.ctype.add(CType.toChain(ctype)) const rootNode = DelegationNode.newRoot({ account: fullDid.uri, permissions: [Permission.DELEGATE], @@ -1042,7 +1068,7 @@ describe('DID extrinsics batching', () => { }) it('can batch extrinsics for the same required key type', async () => { - const web3NameClaimTx = await Web3Names.getClaimTx('test-1') + const web3NameClaimTx = api.tx.web3Names.claim('test-1') const authorizedTx = await Did.authorizeExtrinsic( fullDid, web3NameClaimTx, @@ -1051,8 +1077,8 @@ describe('DID extrinsics batching', () => { ) await submitExtrinsic(authorizedTx, paymentAccount) - const web3Name1ReleaseExt = await Web3Names.getReleaseByOwnerTx() - const web3Name2ClaimExt = await Web3Names.getClaimTx('test-2') + const web3Name1ReleaseExt = api.tx.web3Names.releaseByOwner() + const web3Name2ClaimExt = api.tx.web3Names.claim('test-2') const tx = await Did.authorizeBatch({ batchFunction: api.tx.utility.batch, did: fullDid, @@ -1063,16 +1089,18 @@ describe('DID extrinsics batching', () => { await submitExtrinsic(tx, paymentAccount) // Test for correct creation and deletion - expect(await Web3Names.queryDidForWeb3Name('test-1')).toBeNull() + const encoded1 = await api.query.web3Names.owner('test-1') + expect(encoded1.isSome).toBe(false) // Test for correct creation of second web3 name - expect(await Web3Names.queryDidForWeb3Name('test-2')).toStrictEqual( + const encoded2 = await api.query.web3Names.owner('test-2') + expect(Web3Names.web3NameOwnerFromChain(encoded2).owner).toStrictEqual( fullDid.uri ) }, 30_000) it('can batch extrinsics for different required key types', async () => { // Authentication key - const web3NameReleaseExt = await Web3Names.getReleaseByOwnerTx() + const web3NameReleaseExt = api.tx.web3Names.releaseByOwner() // Attestation key const ctype1 = CType.fromSchema({ title: UUID.generate(), @@ -1080,7 +1108,7 @@ describe('DID extrinsics batching', () => { type: 'object', $schema: 'http://kilt-protocol.org/draft-01/ctype#', }) - const ctype1Creation = await CType.getStoreTx(ctype1) + const ctype1Creation = api.tx.ctype.add(CType.toChain(ctype1)) // Delegation key const rootNode = DelegationNode.newRoot({ account: fullDid.uri, @@ -1090,7 +1118,7 @@ describe('DID extrinsics batching', () => { const delegationHierarchyCreation = await rootNode.getStoreTx() // Authentication key - const web3NameNewClaimExt = await Web3Names.getClaimTx('test-2') + const web3NameNewClaimExt = api.tx.web3Names.claim('test-2') // Attestation key const ctype2 = CType.fromSchema({ title: UUID.generate(), @@ -1098,7 +1126,7 @@ describe('DID extrinsics batching', () => { type: 'object', $schema: 'http://kilt-protocol.org/draft-01/ctype#', }) - const ctype2Creation = await CType.getStoreTx(ctype2) + const ctype2Creation = api.tx.ctype.add(CType.toChain(ctype2)) // Delegation key const delegationHierarchyRemoval = await rootNode.getRevokeTx(fullDid.uri) @@ -1120,10 +1148,13 @@ describe('DID extrinsics batching', () => { await submitExtrinsic(batchedExtrinsics, paymentAccount) // Test correct use of authentication keys - expect(await Web3Names.queryDidForWeb3Name('test')).toBeNull() - expect(await Web3Names.queryDidForWeb3Name('test-2')).toStrictEqual( - fullDid.uri + const encoded = await api.query.web3Names.owner('test') + expect(encoded.isSome).toBe(false) + + const { owner } = Web3Names.web3NameOwnerFromChain( + await api.query.web3Names.owner('test-2') ) + expect(owner).toStrictEqual(fullDid.uri) // Test correct use of attestation keys expect(await CType.verifyStored(ctype1)).toBe(true) diff --git a/packages/core/src/__integrationtests__/ErrorHandler.spec.ts b/packages/core/src/__integrationtests__/ErrorHandler.spec.ts index 5d8abb053..88d7bc9b5 100644 --- a/packages/core/src/__integrationtests__/ErrorHandler.spec.ts +++ b/packages/core/src/__integrationtests__/ErrorHandler.spec.ts @@ -10,6 +10,7 @@ */ import { BN } from '@polkadot/util' +import { ApiPromise } from '@polkadot/api' import type { DidDocument, IAttestation, @@ -21,8 +22,6 @@ import { makeSigningKeyTool, } from '@kiltprotocol/testing' import * as Did from '@kiltprotocol/did' -import { Attestation } from '../index' -import { getTransferTx } from '../balance/Balance.chain' import { disconnect } from '../kilt' import { addressFromRandom, @@ -34,9 +33,10 @@ import { let paymentAccount: KiltKeyringPair let someDid: DidDocument let key: KeyTool +let api: ApiPromise beforeAll(async () => { - await initializeApi() + api = await initializeApi() }, 30_000) beforeAll(async () => { @@ -46,7 +46,7 @@ beforeAll(async () => { }, 60_000) it('records an extrinsic error when transferring less than the existential amount to new identity', async () => { - const transferTx = await getTransferTx(addressFromRandom(), new BN(1)) + const transferTx = api.tx.balances.transfer(addressFromRandom(), new BN(1)) await expect( submitExtrinsic(transferTx, paymentAccount) ).rejects.toMatchObject({ section: 'balances', name: 'ExistentialDeposit' }) @@ -62,7 +62,11 @@ it('records an extrinsic error when ctype does not exist', async () => { owner: someDid.uri, revoked: false, } - const storeTx = await Attestation.getStoreTx(attestation) + const storeTx = api.tx.attestation.add( + attestation.claimHash, + attestation.cTypeHash, + null + ) const tx = await Did.authorizeExtrinsic( someDid, storeTx, diff --git a/packages/core/src/__integrationtests__/Web3Names.spec.ts b/packages/core/src/__integrationtests__/Web3Names.spec.ts index e9038e412..0ed2157a2 100644 --- a/packages/core/src/__integrationtests__/Web3Names.spec.ts +++ b/packages/core/src/__integrationtests__/Web3Names.spec.ts @@ -23,6 +23,7 @@ import { } from '@kiltprotocol/testing' import { Web3Names } from '@kiltprotocol/did' import * as Did from '@kiltprotocol/did' +import type { ApiPromise } from '@polkadot/api' import { disconnect } from '../kilt' import { createEndowedTestAccount, @@ -30,8 +31,10 @@ import { submitExtrinsic, } from './utils' +let api: ApiPromise + beforeAll(async () => { - await initializeApi() + api = await initializeApi() }, 30_000) describe('When there is an Web3NameCreator and a payer', () => { @@ -70,7 +73,7 @@ describe('When there is an Web3NameCreator and a payer', () => { }, 60_000) it('should not be possible to create a w3n name w/o tokens', async () => { - const tx = await Web3Names.getClaimTx(nick) + const tx = api.tx.web3Names.claim(nick) const bobbyBroke = makeSigningKeyTool().keypair const authorizedTx = await Did.authorizeExtrinsic( w3nCreator, @@ -85,7 +88,7 @@ describe('When there is an Web3NameCreator and a payer', () => { }, 30_000) it('should be possible to create a w3n name with enough tokens', async () => { - const tx = await Web3Names.getClaimTx(nick) + const tx = api.tx.web3Names.claim(nick) const authorizedTx = await Did.authorizeExtrinsic( w3nCreator, tx, @@ -97,17 +100,21 @@ describe('When there is an Web3NameCreator and a payer', () => { }, 30_000) it('should be possible to lookup the DID uri with the given nick', async () => { - const did = await Web3Names.queryDidForWeb3Name(nick) - expect(did).toBe(w3nCreator.uri) + const { owner } = Web3Names.web3NameOwnerFromChain( + await api.query.web3Names.owner(nick) + ) + expect(owner).toBe(w3nCreator.uri) }, 30_000) it('should be possible to lookup the nick with the given DID uri', async () => { - const resolved = await Web3Names.queryWeb3NameForDid(w3nCreator.uri) + const resolved = Web3Names.web3NameFromChain( + await api.query.web3Names.names(Did.Chain.didToChain(w3nCreator.uri)) + ) expect(resolved).toBe(nick) }, 30_000) it('should not be possible to create the same w3n twice', async () => { - const tx = await Web3Names.getClaimTx(nick) + const tx = api.tx.web3Names.claim(nick) const authorizedTx = await Did.authorizeExtrinsic( otherWeb3NameCreator, tx, @@ -124,7 +131,7 @@ describe('When there is an Web3NameCreator and a payer', () => { }, 30_000) it('should not be possible to create a second w3n for the same did', async () => { - const tx = await Web3Names.getClaimTx('nick2') + const tx = api.tx.web3Names.claim('nick2') const authorizedTx = await Did.authorizeExtrinsic( w3nCreator, tx, @@ -141,7 +148,7 @@ describe('When there is an Web3NameCreator and a payer', () => { }, 30_000) it('should not be possible to remove a w3n by another payment account', async () => { - const tx = await Web3Names.getReclaimDepositTx(nick) + const tx = api.tx.web3Names.reclaimDeposit(nick) const p = submitExtrinsic(tx, otherPaymentAccount) await expect(p).rejects.toMatchObject({ section: 'web3Names', @@ -150,13 +157,13 @@ describe('When there is an Web3NameCreator and a payer', () => { }, 30_000) it('should be possible to remove a w3n by the payment account', async () => { - const tx = await Web3Names.getReclaimDepositTx(nick) + const tx = api.tx.web3Names.reclaimDeposit(nick) await submitExtrinsic(tx, paymentAccount) }, 30_000) it('should be possible to remove a w3n by the owner did', async () => { // prepare the w3n on chain - const prepareTx = await Web3Names.getClaimTx(differentNick) + const prepareTx = api.tx.web3Names.claim(differentNick) const prepareAuthorizedTx = await Did.authorizeExtrinsic( w3nCreator, prepareTx, @@ -165,7 +172,7 @@ describe('When there is an Web3NameCreator and a payer', () => { ) await submitExtrinsic(prepareAuthorizedTx, paymentAccount) - const tx = await Web3Names.getReleaseByOwnerTx() + const tx = api.tx.web3Names.releaseByOwner() const authorizedTx = await Did.authorizeExtrinsic( w3nCreator, tx, @@ -177,49 +184,17 @@ describe('When there is an Web3NameCreator and a payer', () => { }) describe('Runtime constraints', () => { - it('should not be possible to create a web3 name that is too short', async () => { - // Minimum is 3 - await Web3Names.getClaimTx('aaa') - // One less than the minimum - await expect( - Web3Names.getClaimTx('aa') - ).rejects.toThrowErrorMatchingInlineSnapshot( - `"The provided name \\"aa\\" is shorter than the minimum number of characters allowed, which is 3"` - ) - }, 30_000) - - it('should not be possible to create a web3 name that is too long', async () => { - // Maximum is 32 - await Web3Names.getClaimTx('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa') - // One more than the maximum - await expect( - Web3Names.getClaimTx('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa') - ).rejects.toThrowErrorMatchingInlineSnapshot( - `"The provided name \\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\" is longer than the maximum number of characters allowed, which is 32"` - ) - }, 30_000) - - it('should not be possible to claim deposit for a web3 name that is too short', async () => { - // Minimum is 3 - await Web3Names.getReclaimDepositTx('aaa') - // One less than the minimum - await expect( - Web3Names.getReclaimDepositTx('aa') - ).rejects.toThrowErrorMatchingInlineSnapshot( - `"The provided name \\"aa\\" is shorter than the minimum number of characters allowed, which is 3"` - ) - }, 30_000) - - it('should not be possible to claim deposit for a web3 name that is too long', async () => { - // Maximum is 32 - await Web3Names.getReclaimDepositTx('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa') - // One more than the maximum - await expect( - Web3Names.getReclaimDepositTx('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa') - ).rejects.toThrowErrorMatchingInlineSnapshot( - `"The provided name \\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\" is longer than the maximum number of characters allowed, which is 32"` - ) - }, 30_000) + it('should not be possible to use a web3 name that is too short', async () => { + const minNameLength = api.consts.web3Names.minNameLength.toNumber() + const shortName = 'aa' + expect(shortName.length).toBeLessThan(minNameLength) + }) + + it('should not be possible to use a web3 name that is too long', async () => { + const maxNameLength = api.consts.web3Names.maxNameLength.toNumber() + const longName = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + expect(longName.length).toBeGreaterThan(maxNameLength) + }) }) afterAll(async () => { diff --git a/packages/core/src/__integrationtests__/utils.ts b/packages/core/src/__integrationtests__/utils.ts index 2cbf9e38b..f8ddb9cb1 100644 --- a/packages/core/src/__integrationtests__/utils.ts +++ b/packages/core/src/__integrationtests__/utils.ts @@ -26,7 +26,6 @@ import type { import { ConfigService } from '@kiltprotocol/config' import * as CType from '../ctype' -import { Balance } from '../balance' import { init } from '../kilt' export const EXISTENTIAL_DEPOSIT = new BN(10 ** 13) @@ -150,7 +149,7 @@ export async function endowAccounts( ): Promise { const api = ConfigService.get('api') const transactions = await Promise.all( - addresses.map((address) => Balance.getTransferTx(address, ENDOWMENT)) + addresses.map((address) => api.tx.balances.transfer(address, ENDOWMENT)) ) const batch = api.tx.utility.batchAll(transactions) await Blockchain.signAndSubmitTx(batch, faucet, { resolveOn }) @@ -160,7 +159,8 @@ export async function fundAccount( address: KeyringPair['address'], amount: BN ): Promise { - const transferTx = await Balance.getTransferTx(address, amount) + const api = ConfigService.get('api') + const transferTx = api.tx.balances.transfer(address, amount) await submitExtrinsic(transferTx, devFaucet) } diff --git a/packages/core/src/attestation/Attestation.chain.ts b/packages/core/src/attestation/Attestation.chain.ts index 2399aeb57..d5ff3fd66 100644 --- a/packages/core/src/attestation/Attestation.chain.ts +++ b/packages/core/src/attestation/Attestation.chain.ts @@ -5,14 +5,11 @@ * found in the LICENSE file in the root directory of this source tree. */ -import type { Option, U128 } from '@polkadot/types' -import type { BN } from '@polkadot/util' - +import type { Option } from '@polkadot/types' import type { IAttestation, ICredential, KiltAddress, - SubmittableExtrinsic, } from '@kiltprotocol/types' import { ConfigService } from '@kiltprotocol/config' import { Utils as DidUtils } from '@kiltprotocol/did' @@ -21,151 +18,29 @@ import type { AttestationAttestationsAttestationDetails } from '@kiltprotocol/au const log = ConfigService.LoggingFactory.getLogger('Attestation') /** - * Prepares an extrinsic to store the provided [[IAttestation]] on chain. + * Decodes the attestation returned by `api.query.attestation.attestations()`. * - * @param attestation The Attestation to write on the blockchain. - * @returns A promise containing the unsigned SubmittableExtrinsic (submittable transaction). + * @param encoded Raw attestation data from blockchain. + * @param claimHash The attestation claimHash. + * @returns The attestation. */ -export async function getStoreTx( - attestation: IAttestation -): Promise { - const { claimHash, cTypeHash, delegationId } = attestation - log.debug(() => `Create tx for 'attestation.add'`) - - const api = ConfigService.get('api') - - return api.tx.attestation.add( - claimHash, - cTypeHash, - delegationId - ? { Delegation: { subjectNodeId: delegationId } } // maxChecks parameter is unused on the chain side and therefore omitted - : null - ) -} - -function decode( +export function fromChain( encoded: Option, claimHash: ICredential['rootHash'] // all the other decoders do not use extra data; they just return partial types -): IAttestation | null { - if (encoded.isSome) { - const chainAttestation = encoded.unwrap() - const delegationId = chainAttestation.authorizationId - .unwrapOr(undefined) - ?.value.toHex() - const attestation: IAttestation = { - claimHash, - cTypeHash: chainAttestation.ctypeHash.toHex(), - owner: DidUtils.getFullDidUri( - chainAttestation.attester.toString() as KiltAddress - ), - delegationId: delegationId || null, - revoked: chainAttestation.revoked.valueOf(), - } - log.info(`Decoded attestation: ${JSON.stringify(attestation)}`) - return attestation - } - return null -} - -/** - * Query an attestation from the blockchain, returning the SCALE encoded value. - * - * @param claimHash The hash of the claim attested in the attestation. - * @returns An Option wrapping scale encoded attestation data. - */ -export async function queryRaw( - claimHash: ICredential['rootHash'] -): Promise> { - log.debug(() => `Query chain for attestations with claim hash ${claimHash}`) - const api = ConfigService.get('api') - return api.query.attestation.attestations(claimHash) -} - -/** - * Queries an attestation from the blockchain given the claim hash it attests. - * - * @param claimHash The hash of the claim attested in the attestation. - * @returns A promise containing the retrieved [[Attestation]] or null. - */ -export async function query( - claimHash: ICredential['rootHash'] | IAttestation['claimHash'] -): Promise { - const encoded = await queryRaw(claimHash) - return decode(encoded, claimHash) -} - -/** - * Prepares an extrinsic to revoke a given attestation. - * The submitter can be the owner of the attestation or an authorized delegator thereof. - * - * @param claimHash The hash of the claim that corresponds to the attestation to revoke. - * @param maxParentChecks The number of levels to walk up the delegation hierarchy until the delegation node is found. - * @returns A promise containing the unsigned SubmittableExtrinsic (submittable transaction). - */ -export async function getRevokeTx( - claimHash: ICredential['rootHash'] | IAttestation['claimHash'], - maxParentChecks: number -): Promise { - const api = ConfigService.get('api') - log.debug(() => `Revoking attestations with claim hash ${claimHash}`) - return api.tx.attestation.revoke( - claimHash, - maxParentChecks > 0 - ? { Delegation: { maxChecks: maxParentChecks } } // subjectNodeId parameter is unused on the chain side and therefore omitted - : null - ) -} - -/** - * Prepares an extrinsic to remove a given attestation. - * The submitter can be the owner of the attestation or an authorized delegator thereof. - * - * @param claimHash The hash of the claim that corresponds to the attestation. - * @param maxParentChecks The number of levels to walk up the delegation hierarchy until the delegation node is found. - * @returns A promise containing the unsigned SubmittableExtrinsic (submittable transaction). - */ -export async function getRemoveTx( - claimHash: ICredential['rootHash'], - maxParentChecks: number -): Promise { - const api = ConfigService.get('api') - log.debug(() => `Removing attestation with claim hash ${claimHash}`) - return api.tx.attestation.remove( +): IAttestation { + const chainAttestation = encoded.unwrap() + const delegationId = chainAttestation.authorizationId + .unwrapOr(undefined) + ?.value.toHex() + const attestation: IAttestation = { claimHash, - maxParentChecks > 0 - ? { Delegation: { maxChecks: maxParentChecks } } // subjectNodeId parameter is unused on the chain side and therefore omitted - : null - ) -} - -/** - * Prepares an extrinsic to reclaim the deposit of an attestation, deleting the attestation in the process. - * The submitter **must** be the KILT account that initially paid for the deposit. - * - * @param claimHash The hash of the claim that corresponds to the attestation. - * @returns A promise containing the unsigned SubmittableExtrinsic (submittable transaction). - */ -export async function getReclaimDepositTx( - claimHash: ICredential['rootHash'] -): Promise { - const api = ConfigService.get('api') - log.debug( - () => `Claiming deposit for the attestation with claim hash ${claimHash}` - ) - return api.tx.attestation.reclaimDeposit(claimHash) -} - -async function queryDepositAmountEncoded(): Promise { - const api = ConfigService.get('api') - return api.consts.attestation.deposit -} - -/** - * Gets the current deposit amount due for the creation of new attestations. - * - * @returns Deposit amount in Femto Kilt as a BigNumber. - */ -export async function queryDepositAmount(): Promise { - const encodedDeposit = await queryDepositAmountEncoded() - return encodedDeposit.toBn() + cTypeHash: chainAttestation.ctypeHash.toHex(), + owner: DidUtils.getFullDidUri( + chainAttestation.attester.toString() as KiltAddress + ), + delegationId: delegationId || null, + revoked: chainAttestation.revoked.valueOf(), + } + log.info(`Decoded attestation: ${JSON.stringify(attestation)}`) + return attestation } diff --git a/packages/core/src/balance/Balance.chain.ts b/packages/core/src/balance/Balance.chain.ts deleted file mode 100644 index 82a38cd7f..000000000 --- a/packages/core/src/balance/Balance.chain.ts +++ /dev/null @@ -1,114 +0,0 @@ -/** - * Copyright (c) 2018-2022, BOTLabs GmbH. - * - * This source code is licensed under the BSD 4-Clause "Original" license - * found in the LICENSE file in the root directory of this source tree. - */ - -/** - * Balance provides the accounts and balances of the KILT protocol. - * - * * Checking Balances between accounts - * * Transfer of assets between accounts. - * - * @packageDocumentation - */ - -import type { UnsubscribePromise } from '@polkadot/api/types' -import { BN } from '@polkadot/util' - -import type { - Balances, - KeyringPair, - SubmittableExtrinsic, -} from '@kiltprotocol/types' -import { ConfigService } from '@kiltprotocol/config' -import { SDKErrors } from '@kiltprotocol/utils' - -import * as BalanceUtils from './Balance.utils.js' - -/** - * Fetches the current balances of the account with [accountAddress]. - * Note that the balance amounts are in Femto-Kilt (1e-15)and must be translated to Kilt-Coin. - * - * @param accountAddress Address of the account for which to get the balances. - * @returns A promise containing the current balances of the account. - */ -export async function getBalances( - accountAddress: KeyringPair['address'] -): Promise { - const api = ConfigService.get('api') - - return (await api.query.system.account(accountAddress)).data -} - -/** - * Attaches the given [listener] for balance changes on the account with [accountAddress]. - * Note that the balance amounts are in Femto-Kilt (1e-15) and must be translated to Kilt-Coin. - * - * @param accountAddress Address of the account on which to listen for all balance changes. - * @param listener Listener to receive all balance change updates. - * @returns A promise containing a function that lets you unsubscribe from all balance changes. - */ -export async function listenToBalanceChanges( - accountAddress: KeyringPair['address'], - listener: ( - account: KeyringPair['address'], - balances: Balances, - changes: Balances - ) => void -): Promise { - const api = ConfigService.get('api') - if (!api.hasSubscriptions) { - throw new SDKErrors.SubscriptionsNotSupportedError() - } - - let previousBalances = await getBalances(accountAddress) - - return api.query.system.account( - accountAddress, - ({ data: { free, reserved, miscFrozen, feeFrozen } }) => { - const balancesChange = { - free: free.sub(previousBalances.free), - reserved: reserved.sub(previousBalances.reserved), - miscFrozen: miscFrozen.sub(previousBalances.miscFrozen), - feeFrozen: feeFrozen.sub(previousBalances.feeFrozen), - } - - const current = { - free: new BN(free), - reserved: new BN(reserved), - miscFrozen: new BN(miscFrozen), - feeFrozen: new BN(feeFrozen), - } - previousBalances = current - - listener(accountAddress, current, balancesChange) - } - ) -} - -/** - * Transfer Kilt [amount] tokens to [toAccountAddress]. - * Note that the value of the transferred currency and the balance amount reported by the chain is in Femto-Kilt (1e-15), and must be translated to Kilt-Coin. - * - * @param accountAddressTo Address of the receiver account. - * @param amount Amount of Units to transfer. - * @param exponent Magnitude of the amount. Default magnitude of -15 represents Femto-Kilt. Use 0 for KILT. - * @returns Promise containing unsigned SubmittableExtrinsic. - */ -export async function getTransferTx( - accountAddressTo: KeyringPair['address'], - amount: BN, - exponent = -15 -): Promise { - const api = ConfigService.get('api') - const cleanExponent = - (exponent >= 0 ? 1 : -1) * Math.floor(Math.abs(exponent)) - return api.tx.balances.transfer( - accountAddressTo, - cleanExponent === -15 - ? amount - : BalanceUtils.convertToTxUnit(amount, cleanExponent) - ) -} diff --git a/packages/core/src/balance/Balance.spec.ts b/packages/core/src/balance/Balance.spec.ts deleted file mode 100644 index b9e3bba00..000000000 --- a/packages/core/src/balance/Balance.spec.ts +++ /dev/null @@ -1,109 +0,0 @@ -/** - * Copyright (c) 2018-2022, BOTLabs GmbH. - * - * This source code is licensed under the BSD 4-Clause "Original" license - * found in the LICENSE file in the root directory of this source tree. - */ - -/** - * @group unit/balance - */ - -import { SubmittableResult } from '@polkadot/api' -import { GenericAccountIndex as AccountIndex } from '@polkadot/types/generic/AccountIndex' -import type { AccountData, AccountInfo } from '@polkadot/types/interfaces' -import { BN } from '@polkadot/util' - -import { Blockchain } from '@kiltprotocol/chain-helpers' -import type { Balances, KeyringPair } from '@kiltprotocol/types' -import { Keyring, ss58Format } from '@kiltprotocol/utils' -import { ApiMocks } from '@kiltprotocol/testing' -import { ConfigService } from '@kiltprotocol/config' - -import { - getBalances, - listenToBalanceChanges, - getTransferTx, -} from './Balance.chain' -import * as BalanceUtils from './Balance.utils' - -const mockedApi: any = ApiMocks.getMockedApi() -ConfigService.set({ api: mockedApi }) - -const BALANCE = 42 -const FEE = 30 - -describe('Balance', () => { - const keyring = new Keyring({ type: 'sr25519', ss58Format }) - let alice: KeyringPair - let bob: KeyringPair - - function accountInfo(balance: number): AccountInfo { - return { - data: { - free: new BN(balance), - reserved: new BN(balance), - miscFrozen: new BN(balance), - feeFrozen: new BN(balance), - } as AccountData, - nonce: new AccountIndex(mockedApi.registry, 0), - } as AccountInfo - } - - mockedApi.query.system.account = jest.fn( - (accountAddress, cb): AccountInfo => { - if (typeof cb === 'function') { - setTimeout(() => { - cb(accountInfo(BALANCE)) - }, 1) - } - return accountInfo(BALANCE - FEE) - } - ) - beforeAll(async () => { - alice = keyring.addFromUri('//Alice') - bob = keyring.addFromUri('//Bob') - }) - it('should listen to balance changes', (done) => { - function listener( - account: string, - balances: Balances, - changes: Balances - ): void { - expect(account).toBe(bob.address) - expect(balances.free.toNumber()).toBe(BALANCE) - expect(changes.free.toNumber()).toBe(FEE) - done() - } - - listenToBalanceChanges(bob.address, listener) - }) - - it('should get the balance', async () => { - const currentBalance = await getBalances(bob.address) - expect(currentBalance.free.toNumber()).toEqual(BALANCE - FEE) - }) - - it('should make transfer', async () => { - const transferTx = await getTransferTx(bob.address, new BN(100)) - const status = await Blockchain.signAndSubmitTx(transferTx, alice) - expect(status).toBeInstanceOf(SubmittableResult) - expect(status.isFinalized).toBe(true) - }) - it('should make transfer of amount with arbitrary exponent', async () => { - const amount = new BN(10) - const exponent = -6.312513431 - const expectedAmount = BalanceUtils.convertToTxUnit( - amount, - (exponent >= 0 ? 1 : -1) * Math.floor(Math.abs(exponent)) - ) - const transferTx = await getTransferTx(bob.address, amount, exponent) - const status = await Blockchain.signAndSubmitTx(transferTx, alice) - expect(mockedApi.tx.balances.transfer).toHaveBeenCalledWith( - bob.address, - expectedAmount - ) - expect(status).toBeInstanceOf(SubmittableResult) - expect(status.isFinalized).toBe(true) - }) -}) diff --git a/packages/core/src/balance/index.ts b/packages/core/src/balance/index.ts index ba48a3fd0..27e6dd20d 100644 --- a/packages/core/src/balance/index.ts +++ b/packages/core/src/balance/index.ts @@ -6,4 +6,3 @@ */ export * as BalanceUtils from './Balance.utils.js' -export * as Balance from './Balance.chain.js' diff --git a/packages/core/src/ctype/CType.chain.ts b/packages/core/src/ctype/CType.chain.ts index ad74f0468..ce2d54937 100644 --- a/packages/core/src/ctype/CType.chain.ts +++ b/packages/core/src/ctype/CType.chain.ts @@ -9,64 +9,27 @@ import type { Option } from '@polkadot/types' import type { AccountId } from '@polkadot/types/interfaces' import { Crypto } from '@kiltprotocol/utils' -import type { - DidUri, - ICType, - KiltAddress, - SubmittableExtrinsic, -} from '@kiltprotocol/types' -import { ConfigService } from '@kiltprotocol/config' +import type { DidUri, ICType, KiltAddress } from '@kiltprotocol/types' import { Utils as DidUtils } from '@kiltprotocol/did' import { getSchemaPropertiesForHash } from './CType.js' -const log = ConfigService.LoggingFactory.getLogger('CType') - /** - * Generate the extrinsic to store the provided [[ICtype]]. - * - * If present, the CType schema id is stripped out before submission, as the same is computed on chain. + * Encodes the provided CType for use in `api.tx.ctype.add()`. * * @param ctype The CType to write on the blockchain. - * @returns The SubmittableExtrinsic for the `add` call. - */ -export async function getStoreTx(ctype: ICType): Promise { - const api = ConfigService.get('api') - log.debug(() => `Create tx for 'ctype.add'`) - const preparedSchema = Crypto.encodeObjectAsStr( - getSchemaPropertiesForHash(ctype.schema) - ) - return api.tx.ctype.add(preparedSchema) -} - -function decode(encoded: Option): DidUri | null { - return encoded.isSome - ? DidUtils.getFullDidUri(encoded.unwrap().toString() as KiltAddress) - : null -} - -/** - * Queries the blockchain and returns the DID of the provided CType owner. - * - * @param ctypeHash The has of the CType to retrieve the owner for. - * @returns The CType owner DID or null if the CType with the given hash does not exist. + * @returns Encoded CType. */ -export async function getOwner( - ctypeHash: ICType['hash'] -): Promise { - const api = ConfigService.get('api') - const encoded = await api.query.ctype.ctypes(ctypeHash) - return decode(encoded) +export function toChain(ctype: ICType): string { + return Crypto.encodeObjectAsStr(getSchemaPropertiesForHash(ctype.schema)) } /** - * Queries the blockchain and returns whether a CType with the provided hash exists. + * Decodes the owner DID from the return value of `api.query.ctype.ctypes(ctypeHash)`. * - * @param ctypeHash The has of the CType to check. - * @returns True if a CType with the provided hash exists, false otherwise. + * @param encoded The data from the blockchain. + * @returns The owner DID. */ -export async function isStored(ctypeHash: ICType['hash']): Promise { - const api = ConfigService.get('api') - const encoded = await api.query.ctype.ctypes(ctypeHash) - return encoded.isSome +export function fromChain(encoded: Option): DidUri { + return DidUtils.getFullDidUri(encoded.unwrap().toString() as KiltAddress) } diff --git a/packages/core/src/ctype/CType.spec.ts b/packages/core/src/ctype/CType.spec.ts index 2e3fe1f71..0bcefa573 100644 --- a/packages/core/src/ctype/CType.spec.ts +++ b/packages/core/src/ctype/CType.spec.ts @@ -10,6 +10,8 @@ */ import { SDKErrors } from '@kiltprotocol/utils' +import { ConfigService } from '@kiltprotocol/config' +import { ApiMocks } from '@kiltprotocol/testing' import type { ICType, CTypeSchemaWithoutId, @@ -18,12 +20,22 @@ import type { } from '@kiltprotocol/types' import * as Claim from '../claim' import * as Credential from '../credential' -import { getOwner, isStored } from './CType.chain' import * as CType from './CType.js' import { CTypeModel, CTypeWrapperModel } from './CType.schemas' -jest.mock('./CType.chain') - +const mockedApi: any = ApiMocks.getMockedApi() +ConfigService.set({ api: mockedApi }) + +const encodedAliceDid = ApiMocks.mockChainQueryReturn( + 'ctype', + 'cTYPEs', + '4p6K4tpdZtY3rNqM2uorQmsS6d3woxtnWMHjtzGftHmDb41N' +) +const encodedBobDid = ApiMocks.mockChainQueryReturn( + 'ctype', + 'cTYPEs', + '4rDeMGr3Hi4NfxRUp8qVyhvgW3BSUBLneQisGa9ASkhh2sXB' +) const didAlice = 'did:kilt:4p6K4tpdZtY3rNqM2uorQmsS6d3woxtnWMHjtzGftHmDb41N' const didBob = 'did:kilt:4rDeMGr3Hi4NfxRUp8qVyhvgW3BSUBLneQisGa9ASkhh2sXB' @@ -135,18 +147,19 @@ describe('CType', () => { }) it('verifies whether a ctype is registered on chain ', async () => { - jest.mocked(isStored).mockResolvedValue(false) expect(await CType.verifyStored(claimCtype)).toBe(false) - jest.mocked(isStored).mockResolvedValue(true) + + mockedApi.query.ctype.ctypes.mockResolvedValueOnce(encodedAliceDid) expect(await CType.verifyStored(claimCtype)).toBe(true) }) it('verifies ctype owner on chain', async () => { - jest.mocked(getOwner).mockResolvedValue(didBob) expect(await CType.verifyOwner(claimCtype)).toBe(false) - jest.mocked(getOwner).mockResolvedValue(claimCtype.owner) + + mockedApi.query.ctype.ctypes.mockResolvedValueOnce(encodedAliceDid) expect(await CType.verifyOwner(claimCtype)).toBe(true) - jest.mocked(getOwner).mockResolvedValue(null) + + mockedApi.query.ctype.ctypes.mockResolvedValueOnce(encodedBobDid) expect(await CType.verifyOwner(claimCtype)).toBe(false) }) }) @@ -273,11 +286,6 @@ describe('CType registration verification', () => { } as ICType['schema'] describe('when CType is not registered', () => { - beforeAll(() => { - jest.mocked(getOwner).mockResolvedValue(null) - jest.mocked(isStored).mockResolvedValue(false) - }) - it('does not verify registration when not registered', async () => { const ctype = CType.fromSchema(rawCType, didAlice) expect(await CType.verifyStored(ctype)).toBe(false) @@ -291,8 +299,7 @@ describe('CType registration verification', () => { describe('when CType is registered', () => { beforeAll(() => { - jest.mocked(getOwner).mockResolvedValue(didAlice) - jest.mocked(isStored).mockResolvedValue(true) + mockedApi.query.ctype.ctypes.mockResolvedValue(encodedAliceDid) }) it('verifies registration when owner not set', async () => { diff --git a/packages/core/src/ctype/CType.ts b/packages/core/src/ctype/CType.ts index 68a648490..00d061ac0 100644 --- a/packages/core/src/ctype/CType.ts +++ b/packages/core/src/ctype/CType.ts @@ -23,8 +23,9 @@ import type { } from '@kiltprotocol/types' import { Crypto, SDKErrors, JsonSchema } from '@kiltprotocol/utils' import { Utils as DidUtils } from '@kiltprotocol/did' -import { HexString } from '@polkadot/util/types' -import { getOwner, isStored } from './CType.chain.js' +import { ConfigService } from '@kiltprotocol/config' +import type { HexString } from '@polkadot/util/types' +import { fromChain } from './CType.chain.js' import { CTypeModel, CTypeWrapperModel, @@ -141,7 +142,9 @@ export function verifyClaimAgainstSchema( * @returns Whether or not the CType is registered on-chain. */ export async function verifyStored(ctype: ICType): Promise { - return isStored(ctype.hash) + const api = ConfigService.get('api') + const encoded = await api.query.ctype.ctypes(ctype.hash) + return encoded.isSome } /** @@ -151,8 +154,9 @@ export async function verifyStored(ctype: ICType): Promise { * @returns Whether or not the CType is registered on-chain to `ctype.owner`. */ export async function verifyOwner(ctype: ICType): Promise { - const owner = await getOwner(ctype.hash) - return owner ? owner === ctype.owner : false + const api = ConfigService.get('api') + const encoded = await api.query.ctype.ctypes(ctype.hash) + return encoded.isSome ? fromChain(encoded) === ctype.owner : false } /** diff --git a/packages/core/src/delegation/DelegationDecoder.ts b/packages/core/src/delegation/DelegationDecoder.ts index e471b05c1..85cd4fc9c 100644 --- a/packages/core/src/delegation/DelegationDecoder.ts +++ b/packages/core/src/delegation/DelegationDecoder.ts @@ -41,7 +41,7 @@ export type DelegationHierarchyDetailsRecord = Pick< export type CtypeHash = Hash -export function decodeDelegationHierarchyDetails( +export function delegationHierarchyDetailsFromChain( encoded: Option ): DelegationHierarchyDetailsRecord | null { if (encoded.isNone) { @@ -57,10 +57,13 @@ export function decodeDelegationHierarchyDetails( * Decode the permissions from the bitset encoded in the given `number`. * We use bitwise `AND` to check if a permission bit flag is set. * - * @param bitset The u32 number used as the bitset to encode permissions. + * @param encoded The u32 number used as the bitset to encode permissions. * @returns The permission set. */ -function decodePermissions(bitset: number): PermissionType[] { +function permissionsFromChain( + encoded: DelegationDelegationHierarchyDelegationNode['details']['permissions'] +): PermissionType[] { + const bitset = encoded.bits.toNumber() const permissions: PermissionType[] = [] // eslint-disable-next-line no-bitwise if ((bitset & Permission.ATTEST) > 0) { @@ -77,7 +80,7 @@ export type DelegationNodeRecord = Omit export type DelegationNodeId = Hash -export function decodeDelegationNode( +export function delegationNodeFromChain( encoded: Option ): DelegationNodeRecord | null { if (encoded.isNone) { @@ -94,9 +97,7 @@ export function decodeDelegationNode( account: DidUtils.getFullDidUri( delegationNode.details.owner.toString() as KiltAddress ), - permissions: decodePermissions( - delegationNode.details.permissions.bits.toNumber() - ), + permissions: permissionsFromChain(delegationNode.details.permissions), revoked: delegationNode.details.revoked.valueOf(), } } diff --git a/packages/core/src/delegation/DelegationHierarchyDetails.chain.ts b/packages/core/src/delegation/DelegationHierarchyDetails.chain.ts index 9a75f64e9..6c6f799ed 100644 --- a/packages/core/src/delegation/DelegationHierarchyDetails.chain.ts +++ b/packages/core/src/delegation/DelegationHierarchyDetails.chain.ts @@ -11,7 +11,7 @@ import type { } from '@kiltprotocol/types' import { ConfigService } from '@kiltprotocol/config' -import { decodeDelegationHierarchyDetails } from './DelegationDecoder.js' +import { delegationHierarchyDetailsFromChain } from './DelegationDecoder.js' /** * Query a delegation hierarchy node from the blockchain given its identifier. @@ -23,7 +23,7 @@ export async function query( rootId: IDelegationNode['id'] ): Promise { const api = ConfigService.get('api') - const decoded = decodeDelegationHierarchyDetails( + const decoded = delegationHierarchyDetailsFromChain( await api.query.delegation.delegationHierarchies(rootId) ) if (!decoded) { diff --git a/packages/core/src/delegation/DelegationNode.chain.ts b/packages/core/src/delegation/DelegationNode.chain.ts index 5799be4fb..650fdaae3 100644 --- a/packages/core/src/delegation/DelegationNode.chain.ts +++ b/packages/core/src/delegation/DelegationNode.chain.ts @@ -5,68 +5,44 @@ * found in the LICENSE file in the root directory of this source tree. */ -import type { U128 } from '@polkadot/types' -import type { BN } from '@polkadot/util' - import type { IAttestation, IDelegationNode, - SubmittableExtrinsic, + KiltAddress, } from '@kiltprotocol/types' import { ConfigService } from '@kiltprotocol/config' import { SDKErrors } from '@kiltprotocol/utils' -import { Utils as DidUtils } from '@kiltprotocol/did' - -import { decodeDelegationNode } from './DelegationDecoder.js' +import { Utils as DidUtils, Chain as DidChain } from '@kiltprotocol/did' +import { delegationNodeFromChain } from './DelegationDecoder.js' import { DelegationNode } from './DelegationNode.js' import { permissionsAsBitset } from './DelegationNode.utils.js' const log = ConfigService.LoggingFactory.getLogger('DelegationNode') /** - * Generate the extrinsic to store a given delegation node as the root of a new delegation hierarchy. - * - * @param delegation The delegation node to store as hierarchy root. - * @returns The SubmittableExtrinsic for the `createHierarchy` call. - */ -export async function getStoreAsRootTx( - delegation: DelegationNode -): Promise { - const api = ConfigService.get('api') - - if (!delegation.isRoot()) { - throw new SDKErrors.InvalidRootNodeError() - } - return api.tx.delegation.createHierarchy( - delegation.hierarchyId, - await delegation.getCTypeHash() - ) -} - -/** - * Generate the extrinsic to store a given delegation node under a given delegation hierarchy. + * Encodes the delegation and the signature for usage as arguments of `api.tx.delegation.addDelegation()`. * * @param delegation The delegation node to store under the hierarchy specified as part of the node. * @param signature The DID signature of the delegate owner of the new delegation node. - * @returns The SubmittableExtrinsic for the `addDelegation` call. + * @returns The array of arguments for `addDelegation`. */ -export async function getStoreAsDelegationTx( +export function addDelegationToChainArgs( delegation: DelegationNode, signature: DidUtils.EncodedSignature -): Promise { - const api = ConfigService.get('api') - - if (delegation.isRoot()) { - throw new SDKErrors.InvalidDelegationNodeError() - } - - return api.tx.delegation.addDelegation( +): [ + DelegationNode['id'], + string, + KiltAddress, + Uint8Array, + DidUtils.EncodedSignature +] { + return [ delegation.id, delegation.parentId || '', - DidUtils.parseDidUri(delegation.account).address, + DidChain.didToChain(delegation.account), permissionsAsBitset(delegation), - signature - ) + signature, + ] } /** @@ -79,7 +55,7 @@ export async function query( delegationId: IDelegationNode['id'] ): Promise { const api = ConfigService.get('api') - const decoded = decodeDelegationNode( + const decoded = delegationNodeFromChain( await api.query.delegation.delegationNodes(delegationId) ) if (!decoded) { @@ -91,59 +67,6 @@ export async function query( }) } -/** - * Generate the extrinsic to revoke a given delegation node. The submitter can be the owner of the delegation node itself or an ancestor thereof. - * - * @param delegationId The identifier of the delegation node to revoke. - * @param maxParentChecks The max number of lookup to perform up the hierarchy chain to verify the authorization of the caller to perform the revocation. - * @param maxRevocations The max number of children nodes that will be revoked as part of the revocation operation. This value does not include the node itself being removed. - * @returns The SubmittableExtrinsic for the `revokeDelegation` call. - */ -export async function getRevokeTx( - delegationId: IDelegationNode['id'], - maxParentChecks: number, - maxRevocations: number -): Promise { - const api = ConfigService.get('api') - return api.tx.delegation.revokeDelegation( - delegationId, - maxParentChecks, - maxRevocations - ) -} - -/** - * Generate the extrinsic to remove a given delegation node. The submitter can be the owner of the delegation node itself or an ancestor thereof. - * - * @param delegationId The identifier of the delegation node to remove. - * @param maxRevocations The max number of children nodes that will be removed as part of the removal operation. This value does not include the node itself being removed. - * @returns The SubmittableExtrinsic for the `removeDelegation` call. - */ -export async function getRemoveTx( - delegationId: IDelegationNode['id'], - maxRevocations: number -): Promise { - const api = ConfigService.get('api') - return api.tx.delegation.removeDelegation(delegationId, maxRevocations) -} - -/** - * Generate the extrinsic to reclaim the deposit for a given delegation node. - * - * The generated extrinsic can only be successfully executed if the submitter is the original payer of the delegation deposit. - * - * @param delegationId The identifier of the delegation node to claim back deposit for. - * @param maxRemovals The max number of children nodes that will be removed as part of the operation. This value does not include the node itself being removed. - * @returns The SubmittableExtrinsic for the `getReclaimDepositTx` call. - */ -export async function getReclaimDepositTx( - delegationId: IDelegationNode['id'], - maxRemovals: number -): Promise { - const api = ConfigService.get('api') - return api.tx.delegation.reclaimDeposit(delegationId, maxRemovals) -} - /** * Query the blockchain to retrieve the number of **direct** children of a given delegation node. * @@ -185,18 +108,3 @@ export async function getAttestationHashes( // extract claimHash from double map key & decode return entries.map((keys) => keys.args[1].toHex()) } - -async function queryDepositAmountEncoded(): Promise { - const api = ConfigService.get('api') - return api.consts.delegation.deposit -} - -/** - * Gets the current deposit amount due for the creation of new delegation node. - * - * @returns Deposit amount in Femto Kilt as a BigNumber. - */ -export async function queryDepositAmount(): Promise { - const encodedDeposit = await queryDepositAmountEncoded() - return encodedDeposit.toBn() -} diff --git a/packages/core/src/delegation/DelegationNode.spec.ts b/packages/core/src/delegation/DelegationNode.spec.ts index b8845cadf..628205d05 100644 --- a/packages/core/src/delegation/DelegationNode.spec.ts +++ b/packages/core/src/delegation/DelegationNode.spec.ts @@ -9,6 +9,7 @@ * @group unit/delegation */ +import type { HexString } from '@polkadot/util/types' import { IDelegationNode, IDelegationHierarchyDetails, @@ -17,10 +18,19 @@ import { ICType, } from '@kiltprotocol/types' import { encodeAddress } from '@polkadot/keyring' +import { ApiMocks } from '@kiltprotocol/testing' +import { ConfigService } from '@kiltprotocol/config' import { Crypto, SDKErrors, ss58Format } from '@kiltprotocol/utils' import { DelegationNode } from './DelegationNode' import { permissionsAsBitset, errorCheck } from './DelegationNode.utils' +let mockedApi: any + +beforeAll(() => { + mockedApi = ApiMocks.getMockedApi() + ConfigService.set({ api: mockedApi }) +}) + let hierarchiesDetails: Record = {} let nodes: Record = {} @@ -29,28 +39,6 @@ jest.mock('./DelegationNode.chain', () => ({ node.childrenIds.map((id) => (id in nodes ? nodes[id] : null)) ), query: jest.fn(async (id: string) => (id in nodes ? nodes[id] : null)), - getStoreAsRootTx: jest.fn(async (node: DelegationNode) => { - nodes[node.id] = node - hierarchiesDetails[node.id] = { - id: node.id, - cTypeHash: await node.getCTypeHash(), - } - }), - getRevokeTx: jest.fn( - async ( - nodeId: IDelegationNode['id'], - // eslint-disable-next-line @typescript-eslint/no-unused-vars - maxDepth: number, - // eslint-disable-next-line @typescript-eslint/no-unused-vars - maxRevocations: number - ) => { - nodes[nodeId] = new DelegationNode({ - ...nodes[nodeId], - childrenIds: nodes[nodeId].childrenIds, - revoked: true, - }) - } - ), })) jest.mock('./DelegationHierarchyDetails.chain', () => ({ @@ -72,6 +60,24 @@ describe('DelegationNode', () => { let addresses: DidUri[] beforeAll(() => { + jest + .mocked(mockedApi.tx.delegation.revokeDelegation) + .mockImplementation((nodeId: IDelegationNode['id']) => { + nodes[nodeId] = new DelegationNode({ + ...nodes[nodeId], + childrenIds: nodes[nodeId].childrenIds, + revoked: true, + }) + }) + jest + .mocked(mockedApi.tx.delegation.createHierarchy) + .mockImplementation(async (nodeId: string, cTypeHash: HexString) => { + hierarchiesDetails[nodeId] = { + id: nodeId, + cTypeHash, + } + }) + successId = Crypto.hashStr('success') hierarchyId = Crypto.hashStr('rootId') id = Crypto.hashStr('id') diff --git a/packages/core/src/delegation/DelegationNode.ts b/packages/core/src/delegation/DelegationNode.ts index 25c88af33..e8f1bcb5b 100644 --- a/packages/core/src/delegation/DelegationNode.ts +++ b/packages/core/src/delegation/DelegationNode.ts @@ -18,20 +18,14 @@ import type { import { Crypto, SDKErrors, UUID } from '@kiltprotocol/utils' import { ConfigService } from '@kiltprotocol/config' import * as Did from '@kiltprotocol/did' -import { BN } from '@polkadot/util' import type { HexString } from '@polkadot/util/types' import type { DelegationHierarchyDetailsRecord } from './DelegationDecoder' -import { query as queryAttestation } from '../attestation/Attestation.chain.js' +import { fromChain as attestationFromChain } from '../attestation/Attestation.chain.js' import { - getChildren, + addDelegationToChainArgs, getAttestationHashes, + getChildren, query, - queryDepositAmount, - getRemoveTx, - getRevokeTx, - getStoreAsDelegationTx, - getStoreAsRootTx, - getReclaimDepositTx, } from './DelegationNode.chain.js' import { query as queryDetails } from './DelegationHierarchyDetails.chain.js' import * as DelegationNodeUtils from './DelegationNode.utils.js' @@ -212,8 +206,14 @@ export class DelegationNode implements IDelegationNode { */ public async getAttestations(): Promise { const attestationHashes = await this.getAttestationHashes() + const api = ConfigService.get('api') + const attestations = await Promise.all( - attestationHashes.map((claimHash) => queryAttestation(claimHash)) + attestationHashes.map(async (claimHash) => { + const encoded = await api.query.attestation.attestations(claimHash) + if (encoded.isNone) return undefined + return attestationFromChain(encoded, claimHash) + }) ) return attestations.filter((value): value is IAttestation => !!value) @@ -272,7 +272,7 @@ export class DelegationNode implements IDelegationNode { sign, delegateDid.authentication[0].id ) - return Did.Chain.encodeDidSignature( + return Did.Chain.didSignatureToChain( delegateDid.authentication[0], delegateSignature ) @@ -300,13 +300,21 @@ export class DelegationNode implements IDelegationNode { public async getStoreTx( signature?: Did.Utils.EncodedSignature ): Promise { + const api = ConfigService.get('api') + if (this.isRoot()) { - return getStoreAsRootTx(this) + return api.tx.delegation.createHierarchy( + this.hierarchyId, + await this.getCTypeHash() + ) } if (!signature) { throw new SDKErrors.DelegateSignatureMissingError() } - return getStoreAsDelegationTx(this, signature) + + return api.tx.delegation.addDelegation( + ...addDelegationToChainArgs(this, signature) + ) } isRoot(): boolean { @@ -387,7 +395,8 @@ export class DelegationNode implements IDelegationNode { log.debug( `:: revoke(${this.id}) with maxRevocations=${childCount} and maxDepth = ${steps} through delegation node ${node?.id} and identity ${did}` ) - return getRevokeTx(this.id, steps, childCount) + const api = ConfigService.get('api') + return api.tx.delegation.revokeDelegation(this.id, steps, childCount) } /** @@ -398,7 +407,8 @@ export class DelegationNode implements IDelegationNode { public async getRemoveTx(): Promise { const childCount = await this.subtreeNodeCount() log.debug(`:: remove(${this.id}) with maxRevocations=${childCount}`) - return getRemoveTx(this.id, childCount) + const api = ConfigService.get('api') + return api.tx.delegation.removeDelegation(this.id, childCount) } /** @@ -413,7 +423,8 @@ export class DelegationNode implements IDelegationNode { log.debug( `:: getReclaimDepositTx(${this.id}) with maxRemovals=${childCount}` ) - return getReclaimDepositTx(this.id, childCount) + const api = ConfigService.get('api') + return api.tx.delegation.reclaimDeposit(this.id, childCount) } /** @@ -430,13 +441,4 @@ export class DelegationNode implements IDelegationNode { log.info(`result: ${JSON.stringify(result)}`) return result } - - /** - * Query and return the amount of KILTs (in femto notation) needed to deposit in order to create a delegation. - * - * @returns The amount of femtoKILTs required to deposit to create the delegation. - */ - public static queryDepositAmount(): Promise { - return queryDepositAmount() - } } diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index aea630523..1aa3ba565 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -13,7 +13,7 @@ import '@kiltprotocol/augment-api' export * as Attestation from './attestation/index.js' export * as Credential from './credential/index.js' -export { Balance, BalanceUtils } from './balance/index.js' +export { BalanceUtils } from './balance/index.js' export * as Claim from './claim/index.js' export * as CType from './ctype/index.js' export { DelegationNode, DelegationNodeUtils } from './delegation/index.js' diff --git a/packages/did/package.json b/packages/did/package.json index 9faf8be11..6a67d950c 100644 --- a/packages/did/package.json +++ b/packages/did/package.json @@ -42,6 +42,7 @@ "@polkadot/api": "^9.0.0", "@polkadot/keyring": "^10.0.0", "@polkadot/types": "^9.0.0", + "@polkadot/types-codec": "9.1.1", "@polkadot/util": "^10.0.0", "@polkadot/util-crypto": "^10.0.0", "cbor": "^8.0.2" diff --git a/packages/did/src/Did.chain.ts b/packages/did/src/Did.chain.ts index 6c849d5fe..4d2ca3086 100644 --- a/packages/did/src/Did.chain.ts +++ b/packages/did/src/Did.chain.ts @@ -5,13 +5,14 @@ * found in the LICENSE file in the root directory of this source tree. */ -import type { GenericAccountId, Option, u128, u32 } from '@polkadot/types' +import type { Option } from '@polkadot/types' import type { Extrinsic, Hash } from '@polkadot/types/interfaces' import type { AnyNumber } from '@polkadot/types/types' import { BN, hexToU8a } from '@polkadot/util' import type { ApiPromise } from '@polkadot/api' import type { + Deposit, DidDocument, DidEncryptionKey, DidKey, @@ -19,15 +20,15 @@ import type { DidSignature, DidUri, DidVerificationKey, - KeyRelationship, KiltAddress, NewDidEncryptionKey, NewDidVerificationKey, SignCallback, SigningOptions, SubmittableExtrinsic, + UriFragment, } from '@kiltprotocol/types' -import { encryptionKeyTypes, verificationKeyTypes } from '@kiltprotocol/types' +import { verificationKeyTypes } from '@kiltprotocol/types' import { Crypto, SDKErrors, ss58Format } from '@kiltprotocol/utils' import { ConfigService } from '@kiltprotocol/config' import type { @@ -36,6 +37,7 @@ import type { DidDidDetailsDidPublicKey, DidDidDetailsDidPublicKeyDetails, DidServiceEndpointsDidEndpoint, + KiltSupportDeposit, } from '@kiltprotocol/augment-api' import { @@ -46,7 +48,6 @@ import { EncodedSignature, EncodedVerificationKey, getAddressByKey, - getFullDidUri, keyTypeForSignatureAlg, parseDidUri, signatureAlgForKeyType, @@ -60,36 +61,19 @@ export type ChainDidPublicKeyDetails = DidDidDetailsDidPublicKeyDetails // ### RAW QUERYING (lowest layer) -export function encodeDid(did: DidUri): KiltAddress { +export function didToChain(did: DidUri): KiltAddress { return parseDidUri(did).address } -// Query a full DID. -// Interacts with the DID storage map. -async function queryDidEncoded(did: DidUri): Promise> { - const api = ConfigService.get('api') - return api.query.did.did(encodeDid(did)) -} - -// Query ALL deleted DIDs, which can be very time-consuming if the number of deleted DIDs gets large. -async function queryDeletedDidsEncoded(): Promise { - const api = ConfigService.get('api') - // Query all the storage keys, and then only take the relevant property, i.e., the encoded DID address. - const entries = await api.query.did.didBlacklist.keys() - return entries.map(({ args: [encodedAddresses] }) => encodedAddresses) +export function resourceIdToChain(id: UriFragment): string { + return stripFragment(id) } -// Query a DID service given the DID and the service ID. -// Interacts with the ServiceEndpoints storage double map. -async function queryServiceEncoded( - did: DidUri, - serviceId: DidServiceEndpoint['id'] -): Promise> { - const api = ConfigService.get('api') - return api.query.did.serviceEndpoints( - encodeDid(did), - stripFragment(serviceId) - ) +export function depositFromChain(deposit: KiltSupportDeposit): Deposit { + return { + owner: deposit.owner.toString() as KiltAddress, + amount: deposit.amount.toBn(), + } } // Query all services for a DID given the DID. @@ -99,23 +83,11 @@ async function queryAllServicesEncoded( ): Promise { const api = ConfigService.get('api') const encodedEndpoints = await api.query.did.serviceEndpoints.entries( - encodeDid(did) + didToChain(did) ) return encodedEndpoints.map(([, encodedValue]) => encodedValue.unwrap()) } -// Query the # of services stored under a DID without fetching all the services. -// Interacts with the DidEndpointsCount storage map. -async function queryEndpointsCountsEncoded(did: DidUri): Promise { - const api = ConfigService.get('api') - return api.query.did.didEndpointsCount(encodeDid(did)) -} - -async function queryDepositAmountEncoded(): Promise { - const api = ConfigService.get('api') - return api.consts.did.deposit -} - // ### DECODED QUERYING types export type EncodedDid = Pick< @@ -123,15 +95,12 @@ export type EncodedDid = Pick< 'authentication' | 'assertionMethod' | 'capabilityDelegation' | 'keyAgreement' > & { lastTxCounter: BN - deposit: { - owner: KiltAddress - amount: BN - } + deposit: Deposit } // ### DECODED QUERYING (builds on top of raw querying) -function decodeDidPublicKeyDetails( +function didPublicKeyDetailsFromChain( keyId: Hash, keyDetails: ChainDidPublicKeyDetails ): DidKey { @@ -145,19 +114,23 @@ function decodeDidPublicKeyDetails( } } -function decodeDid({ - publicKeys, - authenticationKey, - attestationKey, - delegationKey, - keyAgreementKeys, - lastTxCounter, - deposit, -}: DidDidDetails): EncodedDid { +export function didFromChain(encoded: Option): EncodedDid { + const { + publicKeys, + authenticationKey, + attestationKey, + delegationKey, + keyAgreementKeys, + lastTxCounter, + deposit, + } = encoded.unwrap() + const keys: Record = [...publicKeys.entries()] - .map(([keyId, keyDetails]) => decodeDidPublicKeyDetails(keyId, keyDetails)) + .map(([keyId, keyDetails]) => + didPublicKeyDetailsFromChain(keyId, keyDetails) + ) .reduce((res, key) => { - res[stripFragment(key.id)] = key + res[resourceIdToChain(key.id)] = key return res }, {}) @@ -192,20 +165,6 @@ function decodeDid({ return didRecord } -/** - * Query data associated with the full DID from the KILT blockchain. - * - * @param did The Full DID. - * @returns Data associated with this DID or null if the DID has not been claimed or has been deleted. - */ -export async function queryDetails(did: DidUri): Promise { - const result = await queryDidEncoded(did) - if (result.isNone) { - return null - } - return decodeDid(result.unwrap()) -} - interface BlockchainEndpoint { id: string serviceTypes: DidServiceEndpoint['type'] @@ -218,7 +177,7 @@ function endpointToBlockchainEndpoint({ serviceEndpoint, }: DidServiceEndpoint): BlockchainEndpoint { return { - id: stripFragment(id), + id: resourceIdToChain(id), serviceTypes: type, urls: serviceEndpoint, } @@ -236,7 +195,7 @@ function blockchainEndpointToEndpoint({ } } -function decodeService({ +export function serviceEndpointFromChain({ id, serviceTypes, urls, @@ -258,84 +217,7 @@ export async function queryServiceEndpoints( did: DidUri ): Promise { const encoded = await queryAllServicesEncoded(did) - return encoded.map((e) => decodeService(e)) -} - -/** - * Query a service endpoint record associated with the full DID from the KILT blockchain. - * - * @param did Full DID. - * @param serviceId ID of the requested service endpoint (not the full endpoint uri). - * @returns Service endpoint data or null if the requested endpoint is not found on this full DID, or if the full DID does not exist. - */ -export async function queryServiceEndpoint( - did: DidUri, - serviceId: DidServiceEndpoint['id'] -): Promise { - const serviceEncoded = await queryServiceEncoded(did, serviceId) - if (serviceEncoded.isNone) return null - - return decodeService(serviceEncoded.unwrap()) -} - -/** - * Gets the total number of service endpoints associated with the given full DID. - * - * @param did Full DID. - * @returns Number of endpoints. - */ -export async function queryEndpointsCounts(did: DidUri): Promise { - const endpointsCountEncoded = await queryEndpointsCountsEncoded(did) - return endpointsCountEncoded.toBn() -} - -/** - * Gets the state of the full DID’s transaction counter which is bumped with each transaction authorized by that DID for replay protection purposes. - * - * @param did Full DID. - * @returns Current state of the transaction counter which must be increased by one to yield the next transaction's nonce. - */ -export async function queryNonce(did: DidUri): Promise { - const encoded = await queryDidEncoded(did) - return encoded.isSome ? encoded.unwrap().lastTxCounter.toBn() : new BN(0) -} - -/** - * Checks whether this full DID had previously been deleted, resulting in it being blocked from (re)creation. - * - * @param did Full DID. - * @returns Whether or not the DID is listed in the block list. - */ -export async function queryDidDeletionStatus(did: DidUri): Promise { - const api = ConfigService.get('api') - // The following function returns something different from 0x00 if there is an entry for the provided key, 0x00 otherwise. - const encodedStorageHash = await api.query.did.didBlacklist.hash( - encodeDid(did) - ) - // isEmpty returns true if there is no entry for the given key -> the function should return false. - return !encodedStorageHash.isEmpty -} - -/** - * Gets the current deposit amount due for the creation of new full DIDs. - * - * @returns Deposit amount in Femto Kilt as a BigNumber. - */ -export async function queryDepositAmount(): Promise { - const encodedDeposit = await queryDepositAmountEncoded() - return encodedDeposit.toBn() -} - -/** - * Queries the full list of full DIDs that have previously been deleted, resulting in them being blocked from (re)creation. - * - * @returns An array of DID addresses that have been deleted. - */ -export async function queryDeletedDids(): Promise { - const encodedAddresses = await queryDeletedDidsEncoded() - return encodedAddresses.map((id) => - getFullDidUri(id.toHuman() as KiltAddress) - ) + return encoded.map((e) => serviceEndpointFromChain(e)) } // ### EXTRINSICS types @@ -350,10 +232,10 @@ export type AuthorizeCallInput = { // ### EXTRINSICS -export function encodePublicKey( +export function publicKeyToChain( key: NewDidVerificationKey ): EncodedVerificationKey -export function encodePublicKey(key: NewDidEncryptionKey): EncodedEncryptionKey +export function publicKeyToChain(key: NewDidEncryptionKey): EncodedEncryptionKey /** * Transforms a DID public key record to an enum-type key-value pair required in many key-related extrinsics. @@ -361,7 +243,7 @@ export function encodePublicKey(key: NewDidEncryptionKey): EncodedEncryptionKey * @param key Object describing data associated with a public key. * @returns Data restructured to allow SCALE encoding by polkadot api. */ -export function encodePublicKey( +export function publicKeyToChain( key: NewDidVerificationKey | NewDidEncryptionKey ): EncodedKey { // TypeScript can't infer type here, so we have to add a type assertion. @@ -464,14 +346,14 @@ export async function getStoreTx( const newAttestationKey = assertionMethod && assertionMethod.length > 0 && - encodePublicKey(assertionMethod[0]) + publicKeyToChain(assertionMethod[0]) const newDelegationKey = capabilityDelegation && capabilityDelegation.length > 0 && - encodePublicKey(capabilityDelegation[0]) + publicKeyToChain(capabilityDelegation[0]) - const newKeyAgreementKeys = keyAgreement.map(encodePublicKey) + const newKeyAgreementKeys = keyAgreement.map(publicKeyToChain) const newServiceDetails = service.map(endpointToBlockchainEndpoint) const apiInput = { @@ -498,106 +380,6 @@ export async function getStoreTx( return api.tx.did.create(encoded, encodedSignature) } -/** - * Builds an extrinsic to set a new public key for a given verification relationship, replacing any keys that occupied this role previously. - * - * @param keyRelationship The role or relationship which the new key should have according to the DID specifications (e.g. Authentication, assertionMethod, capabilityDelegation...). - * @param key Data describing the public key. - * @returns An extrinsic that must be authorized (signed) by the full DID whose keys should be changed. - */ -export async function getSetKeyExtrinsic( - keyRelationship: KeyRelationship, - key: NewDidVerificationKey -): Promise { - if (!verificationKeyTypes.includes(key.type)) { - throw new SDKErrors.DidError( - `Unacceptable key type for key with role ${keyRelationship}: ${ - (key as any).type - }` - ) - } - const typedKey = encodePublicKey(key) - const api = ConfigService.get('api') - switch (keyRelationship) { - case 'authentication': - return api.tx.did.setAuthenticationKey(typedKey) - case 'capabilityDelegation': - return api.tx.did.setDelegationKey(typedKey) - case 'assertionMethod': - return api.tx.did.setAttestationKey(typedKey) - default: - throw new SDKErrors.DidError( - `Setting a key is only allowed for the following key types: ${[ - 'authentication', - 'capabilityDelegation', - 'assertionMethod', - ]}` - ) - } -} - -/** - * Builds an extrinsic to remove a public key for a given verification relationship. - * - * @param keyRelationship The key's role or relationship according to the DID specifications (e.g. Authentication, assertionMethod, capabilityDelegation, keyAgreement...). - * @param keyId Where a verification relationship allows multiple keys in the same role, you will need to identify the key to be removed with its id (not the full key uri). - * @returns An extrinsic that must be authorized (signed) by the full DID whose keys should be changed. - */ -export async function getRemoveKeyExtrinsic( - keyRelationship: KeyRelationship, - keyId?: DidKey['id'] -): Promise { - const api = ConfigService.get('api') - switch (keyRelationship) { - case 'capabilityDelegation': - return api.tx.did.removeDelegationKey() - case 'assertionMethod': - return api.tx.did.removeAttestationKey() - case 'keyAgreement': - if (!keyId) { - throw new SDKErrors.DidError( - 'When removing a keyAgreement key it is required to specify the id of the key to be removed' - ) - } - return api.tx.did.removeKeyAgreementKey(keyId) - default: - throw new SDKErrors.DidError( - `Key removal is only allowed for the following key types: ${[ - 'keyAgreement', - 'capabilityDelegation', - 'assertionMethod', - ]}` - ) - } -} - -/** - * Builds an extrinsic to add another public key for a given verification relationship if this allows multiple keys in the same role. - * - * @param keyRelationship The role or relationship which the new key should have according to the DID specifications (currently only keyAgreement allows multiple keys). - * @param key Data describing the public key. - * @returns An extrinsic that must be authorized (signed) by the full DID whose keys should be changed. - */ -export async function getAddKeyExtrinsic( - keyRelationship: KeyRelationship, - key: NewDidEncryptionKey -): Promise { - const api = ConfigService.get('api') - if (keyRelationship === 'keyAgreement') { - if (!encryptionKeyTypes.includes(key.type)) - throw new SDKErrors.DidError( - `Unacceptable key type for key with role ${keyRelationship}: ${key.type}` - ) - const keyAsEnum = encodePublicKey(key) - return api.tx.did.addKeyAgreementKey(keyAsEnum) - } - throw new SDKErrors.DidError( - `Adding to the key set is only allowed for the following key types: ${[ - 'keyAgreement', - ]}` - ) -} - /** * Generate an extrinsic to add the provided [[DidServiceEndpoint]] to the authorizing DID. * @@ -616,56 +398,6 @@ export async function getAddEndpointExtrinsic( return api.tx.did.addServiceEndpoint(endpointToBlockchainEndpoint(endpoint)) } -/** - * Generate an extrinsic to remove the service endpoint with the provided ID from to the state of the authorizing DID. - * - * @param endpointId The ID of the service endpoint to include in the extrinsic. - * The ID must be at most 50 ASCII characters long. - * @returns An extrinsic that must be authorized (signed) by the full DID associated with the service endpoint to be removed. - */ -export async function getRemoveEndpointExtrinsic( - endpointId: DidServiceEndpoint['id'] -): Promise { - const strippedId = stripFragment(endpointId) - const api = ConfigService.get('api') - const maxServiceIdLength = api.consts.did.maxServiceIdLength.toNumber() - if (strippedId.length > maxServiceIdLength) { - throw new SDKErrors.DidError( - `The service ID "${endpointId}" has is too long. Max number of characters allowed for a service ID is ${maxServiceIdLength}.` - ) - } - - return api.tx.did.removeServiceEndpoint(strippedId) -} - -/** - * Produces an extrinsic to remove the signing full DID from the KILT blockchain. - * - * @param endpointsCount The current number of service endpoints associated with the full DID to be deleted, which is important for the precalculation of the deletion fee. - * @returns An extrinsic that must be authorized (signed) by the full DID to be deleted. - */ -export async function getDeleteDidExtrinsic( - endpointsCount: BN -): Promise { - const api = ConfigService.get('api') - return api.tx.did.delete(endpointsCount) -} - -/** - * Produces an extrinsic to reclaim a deposit paid for storing a full DID record on the KILT blockchain, resulting in the deletion of that DID. - * - * @param did Full DID. - * @param endpointsCount The current number of service endpoints associated with the full DID to be deleted, which is important for the precalculation of the deletion fee. - * @returns An extrinsic that is to be signed by the payment account owning the deposit, without prior DID authorization. - */ -export async function getReclaimDepositExtrinsic( - did: DidUri, - endpointsCount: BN -): Promise { - const api = ConfigService.get('api') - return api.tx.did.reclaimDeposit(encodeDid(did), endpointsCount) -} - /** * DID related operations on the KILT blockchain require authorization by a full DID. This is realized by requiring that relevant extrinsics are signed with a key featured by a full DID as a verification method. * Such extrinsics can be produced using this function. @@ -697,7 +429,7 @@ export async function generateDidAuthenticatedTx({ api.tx.did.submitDidCall.meta.args[0].type.toString(), { txCounter, - did: encodeDid(did), + did: didToChain(did), call, submitter, blockNumber: blockNumber ?? (await api.query.system.number()), @@ -730,7 +462,7 @@ export async function generateDidAuthenticatedTx({ * @param signature Object containing a signature generated with a full DID associated public key. * @returns Data restructured to allow SCALE encoding by polkadot api. */ -export function encodeDidSignature( +export function didSignatureToChain( key: DidVerificationKey, signature: Pick ): EncodedSignature { diff --git a/packages/did/src/Did.utils.ts b/packages/did/src/Did.utils.ts index c4ce12e7e..4bb9683db 100644 --- a/packages/did/src/Did.utils.ts +++ b/packages/did/src/Did.utils.ts @@ -7,7 +7,7 @@ import { blake2AsU8a, checkAddress, encodeAddress } from '@polkadot/util-crypto' import { stringToU8a } from '@polkadot/util' -import { ApiPromise } from '@polkadot/api' +import type { ApiPromise } from '@polkadot/api' import { DidResourceUri, diff --git a/packages/did/src/DidDetails/FullDidDetails.spec.ts b/packages/did/src/DidDetails/FullDidDetails.spec.ts index d659ad31d..352e224e9 100644 --- a/packages/did/src/DidDetails/FullDidDetails.spec.ts +++ b/packages/did/src/DidDetails/FullDidDetails.spec.ts @@ -8,20 +8,27 @@ import { BN } from '@polkadot/util' import { randomAsHex } from '@polkadot/util-crypto' -import { +import type { DidDocument, DidServiceEndpoint, DidUri, KiltKeyringPair, SignCallback, + SubmittableExtrinsic, } from '@kiltprotocol/types' import { ApiMocks, createLocalDemoFullDidFromKeypair, makeSigningKeyTool, } from '@kiltprotocol/testing' +import { ConfigService } from '@kiltprotocol/config' import type { EncodedDid } from '../Did.chain' +import { + generateDidAuthenticatedTx, + queryServiceEndpoints, + didFromChain, +} from '../Did.chain' import * as Did from './index.js' @@ -31,7 +38,9 @@ import * as Did from './index.js' * @group unit/did */ -const mockApi = ApiMocks.createAugmentedApi() +const augmentedApi = ApiMocks.createAugmentedApi() +const mockedApi: any = ApiMocks.getMockedApi() +ConfigService.set({ api: mockedApi }) const existingAddress = '4rp4rcDHP71YrBNvDhcH5iRoM3YzVoQVnCZvQPwPom9bjo2e' const existingDid: DidUri = `did:kilt:${existingAddress}` @@ -96,23 +105,24 @@ const existingServiceEndpoints: DidServiceEndpoint[] = [ }, ] -jest.mock('../Did.chain.ts', () => ({ - queryDetails: jest.fn(async (did: DidUri): Promise => { - if (did === existingDid) { - return existingDidRecord - } - return null - }), - queryServiceEndpoints: jest.fn( - async (did: DidUri): Promise => { - if (did === existingDid) { - return existingServiceEndpoints - } - return [] - } - ), - generateDidAuthenticatedTx: jest.fn().mockResolvedValue({}), -})) +jest.mock('../Did.chain') +jest.mocked(didFromChain).mockReturnValue(existingDidRecord) +jest.mocked(queryServiceEndpoints).mockResolvedValue(existingServiceEndpoints) +jest + .mocked(generateDidAuthenticatedTx) + .mockResolvedValue({} as SubmittableExtrinsic) + +mockedApi.query.did.did.mockReturnValue( + ApiMocks.mockChainQueryReturn('did', 'did', [ + '01234567890123456789012345678901', + [], + undefined, + undefined, + [], + '123', + [existingAddress, '0'], + ]) +) /* * Functions tested: @@ -186,6 +196,10 @@ describe('When creating an instance from the chain', () => { }) it('returns null if the DID does not exist', async () => { + mockedApi.query.did.did.mockReturnValueOnce( + ApiMocks.mockChainQueryReturn('did', 'did') + ) + const fullDid = await Did.query(nonExistingDid) expect(fullDid).toBeNull() }) @@ -202,11 +216,11 @@ describe('When creating an instance from the chain', () => { describe('.addSingleExtrinsic()', () => { it('fails if the extrinsic does not require a DID', async () => { - const extrinsic = mockApi.tx.indices.claim(1) + const extrinsic = augmentedApi.tx.indices.claim(1) await expect(async () => Did.authorizeBatch({ did: fullDid, - batchFunction: mockApi.tx.utility.batchAll, + batchFunction: augmentedApi.tx.utility.batchAll, extrinsics: [extrinsic, extrinsic], sign, submitter: keypair.address, @@ -217,13 +231,13 @@ describe('When creating an instance from the chain', () => { }) it('fails if the extrinsic is a utility (batch) extrinsic containing valid extrinsics', async () => { - const extrinsic = mockApi.tx.utility.batch([ - await mockApi.tx.ctype.add('test-ctype'), + const extrinsic = augmentedApi.tx.utility.batch([ + await augmentedApi.tx.ctype.add('test-ctype'), ]) await expect(async () => Did.authorizeBatch({ did: fullDid, - batchFunction: mockApi.tx.utility.batchAll, + batchFunction: augmentedApi.tx.utility.batchAll, extrinsics: [extrinsic, extrinsic], sign, submitter: keypair.address, @@ -239,12 +253,12 @@ describe('When creating an instance from the chain', () => { uri: fullDid.uri, authentication: [fullDid.authentication[0]], } - const extrinsic = await mockApi.tx.ctype.add('test-ctype') + const extrinsic = await augmentedApi.tx.ctype.add('test-ctype') await expect(async () => Did.authorizeBatch({ did: newFullDid, - batchFunction: mockApi.tx.utility.batchAll, + batchFunction: augmentedApi.tx.utility.batchAll, extrinsics: [extrinsic, extrinsic], nonce: new BN(0), sign, @@ -256,23 +270,23 @@ describe('When creating an instance from the chain', () => { }) it('adds different batches requiring different keys', async () => { - const ctype1Extrinsic = await mockApi.tx.ctype.add(randomAsHex(32)) - const ctype2Extrinsic = await mockApi.tx.ctype.add(randomAsHex(32)) + const ctype1Extrinsic = await augmentedApi.tx.ctype.add(randomAsHex(32)) + const ctype2Extrinsic = await augmentedApi.tx.ctype.add(randomAsHex(32)) const delegationExtrinsic1 = - await mockApi.tx.delegation.createHierarchy( + await augmentedApi.tx.delegation.createHierarchy( randomAsHex(32), randomAsHex(32) ) const delegationExtrinsic2 = - await mockApi.tx.delegation.createHierarchy( + await augmentedApi.tx.delegation.createHierarchy( randomAsHex(32), randomAsHex(32) ) - const ctype3Extrinsic = await mockApi.tx.ctype.add(randomAsHex(32)) - const ctype4Extrinsic = await mockApi.tx.ctype.add(randomAsHex(32)) + const ctype3Extrinsic = await augmentedApi.tx.ctype.add(randomAsHex(32)) + const ctype4Extrinsic = await augmentedApi.tx.ctype.add(randomAsHex(32)) const batchFunction = - jest.fn() as unknown as typeof mockApi.tx.utility.batchAll + jest.fn() as unknown as typeof augmentedApi.tx.utility.batchAll const extrinsics = [ ctype1Extrinsic, ctype2Extrinsic, @@ -311,7 +325,7 @@ describe('When creating an instance from the chain', () => { await expect(async () => Did.authorizeBatch({ did: fullDid, - batchFunction: mockApi.tx.utility.batchAll, + batchFunction: augmentedApi.tx.utility.batchAll, extrinsics: [], sign, submitter: keypair.address, diff --git a/packages/did/src/DidDetails/FullDidDetails.ts b/packages/did/src/DidDetails/FullDidDetails.ts index f1f33dac0..d654d5b50 100644 --- a/packages/did/src/DidDetails/FullDidDetails.ts +++ b/packages/did/src/DidDetails/FullDidDetails.ts @@ -20,11 +20,12 @@ import type { } from '@kiltprotocol/types' import { SDKErrors } from '@kiltprotocol/utils' +import { ConfigService } from '@kiltprotocol/config' import { + didFromChain, + didToChain, generateDidAuthenticatedTx, - queryDetails, - queryNonce, queryServiceEndpoints, } from '../Did.chain.js' import { parseDidUri, signatureAlgForKeyType } from '../Did.utils.js' @@ -52,8 +53,11 @@ export async function query(didUri: DidUri): Promise { `DID URI "${didUri}" does not refer to a full DID` ) } - const didRec = await queryDetails(didUri) - if (!didRec) return null + + const api = ConfigService.get('api') + const encoded = await api.query.did.did(didToChain(didUri)) + if (encoded.isNone) return null + const didRec = didFromChain(encoded) const did: DidDocument = { uri: didUri, @@ -96,7 +100,11 @@ export function getKeysForExtrinsic( * @returns The next valid nonce, i.e., the nonce currently stored on the blockchain + 1, wrapping around the max value when reached. */ export async function getNextNonce(did: DidDocument): Promise { - const currentNonce = await queryNonce(did.uri) + const api = ConfigService.get('api') + const queried = await api.query.did.did(didToChain(did.uri)) + const currentNonce = queried.isSome + ? didFromChain(queried).lastTxCounter + : new BN(0) return increaseNonce(currentNonce) } diff --git a/packages/did/src/DidDocumentExporter/DidDocumentExporter.spec.ts b/packages/did/src/DidDocumentExporter/DidDocumentExporter.spec.ts index c0cbf444a..b0ecd42dd 100644 --- a/packages/did/src/DidDocumentExporter/DidDocumentExporter.spec.ts +++ b/packages/did/src/DidDocumentExporter/DidDocumentExporter.spec.ts @@ -7,7 +7,7 @@ import { BN } from '@polkadot/util' -import { +import type { DidServiceEndpoint, NewDidVerificationKey, DidDocument, @@ -17,10 +17,9 @@ import { DidUri, } from '@kiltprotocol/types' -import type { EncodedDid } from '../Did.chain.js' import { exportToDidDocument } from './DidDocumentExporter.js' import * as Did from '../index.js' -import { parseDidUri, stripFragment } from '../Did.utils' +import { stripFragment } from '../Did.utils' /** * @group unit/did @@ -72,50 +71,17 @@ function generateServiceEndpoint(serviceId: UriFragment): DidServiceEndpoint { } } -jest.mock('../Did.chain', () => { - const queryDetails = jest.fn( - async (didUri: DidUri): Promise => { - const authKey = generateAuthenticationKey() - const encKey = generateEncryptionKey() - const attKey = generateAttestationKey() - const delKey = generateDelegationKey() - - return { - authentication: [authKey], - keyAgreement: [encKey], - assertionMethod: [attKey], - capabilityDelegation: [delKey], - lastTxCounter: new BN(0), - deposit: { - amount: new BN(2), - owner: parseDidUri(didUri).address, - }, - } - } - ) - const queryServiceEndpoint = jest.fn( - async ( - didUri: DidUri, - serviceId: DidServiceEndpoint['id'] - ): Promise => generateServiceEndpoint(serviceId) - ) - const queryServiceEndpoints = jest.fn( - async (didUri: DidUri): Promise => [ - (await queryServiceEndpoint(didUri, '#id-1')) as DidServiceEndpoint, - (await queryServiceEndpoint(didUri, '#id-2')) as DidServiceEndpoint, - ] - ) - return { - queryDetails, - queryServiceEndpoint, - queryServiceEndpoints, - } -}) +const fullDid: DidDocument = { + uri: did, + authentication: [generateAuthenticationKey()], + keyAgreement: [generateEncryptionKey()], + assertionMethod: [generateAttestationKey()], + capabilityDelegation: [generateDelegationKey()], + service: [generateServiceEndpoint('#id-1'), generateServiceEndpoint('#id-2')], +} describe('When exporting a DID Document from a full DID', () => { it('exports the expected application/json W3C DID Document with an Ed25519 authentication key, one x25519 encryption key, an Sr25519 assertion key, an Ecdsa delegation key, and two service endpoints', async () => { - const fullDid = (await Did.query(did)) as DidDocument - const didDoc = exportToDidDocument(fullDid, 'application/json') expect(didDoc).toStrictEqual({ @@ -170,8 +136,6 @@ describe('When exporting a DID Document from a full DID', () => { }) it('exports the expected application/ld+json W3C DID Document with an Ed25519 authentication key, two x25519 encryption keys, an Sr25519 assertion key, an Ecdsa delegation key, and two service endpoints', async () => { - const fullDid = (await Did.query(did)) as DidDocument - const didDoc = exportToDidDocument(fullDid, 'application/ld+json') expect(didDoc).toStrictEqual({ @@ -227,8 +191,6 @@ describe('When exporting a DID Document from a full DID', () => { }) it('fails to export to an unsupported mimetype', async () => { - const fullDid = (await Did.query(did)) as DidDocument - expect(() => // @ts-ignore exportToDidDocument(fullDid, 'random-mime-type') diff --git a/packages/did/src/DidLinks/AccountLinks.chain.ts b/packages/did/src/DidLinks/AccountLinks.chain.ts index 2ab7f81ae..908e2fcca 100644 --- a/packages/did/src/DidLinks/AccountLinks.chain.ts +++ b/packages/did/src/DidLinks/AccountLinks.chain.ts @@ -11,40 +11,29 @@ import { ethereumEncode, signatureVerify, } from '@polkadot/util-crypto' -import type { bool, Enum, Option, u64, U8aFixed } from '@polkadot/types' +import type { Enum, Option, StorageKey, U8aFixed } from '@polkadot/types' import type { AccountId32, Extrinsic } from '@polkadot/types/interfaces' import type { AnyNumber, Codec, TypeDef } from '@polkadot/types/types' import type { HexString } from '@polkadot/util/types' import type { KeyringPair } from '@polkadot/keyring/types' import type { KeypairType } from '@polkadot/util-crypto/types' import { - BN, stringToU8a, u8aConcatStrict, u8aToHex, u8aWrapBytes, U8A_WRAP_ETHEREUM, } from '@polkadot/util' -import type { - AugmentedQuery, - AugmentedQueryDoubleMap, - AugmentedSubmittable, -} from '@polkadot/api/types' import { ApiPromise } from '@polkadot/api' import { SDKErrors, ss58Format } from '@kiltprotocol/utils' -import type { - Deposit, - DidUri, - KiltAddress, - SubmittableExtrinsic, -} from '@kiltprotocol/types' +import type { Deposit, DidUri, KiltAddress } from '@kiltprotocol/types' import type { PalletDidLookupConnectionRecord } from '@kiltprotocol/augment-api' import { ConfigService } from '@kiltprotocol/config' import { EncodedSignature, getFullDidUri } from '../Did.utils.js' -import { queryWeb3NameForDid, Web3Name } from './Web3Names.chain.js' -import { encodeDid } from '../Did.chain.js' +import { Web3Name, web3NameFromChain } from './Web3Names.chain.js' +import { depositFromChain, didToChain } from '../Did.chain.js' /// A chain-agnostic address, which can be encoded using any network prefix. export type SubstrateAddress = KeyringPair['address'] @@ -77,75 +66,22 @@ interface PalletDidLookupLinkableAccountLinkableAccountId extends Enum { readonly type: 'AccountId20' | 'AccountId32' } -type AssociateAccountRequestValue = [ - string | Uint8Array, // AccountId - string | Uint8Array | EncodedSignature // signature -] - -/** - * Type required for encoding Enum type for association request extrinsics. - */ -type AssociateAccountRequest = - | { Dotsama: AssociateAccountRequestValue } - | { Ethereum: AssociateAccountRequestValue } - /** - * Api augmentation override for when the ethereum enabled pallet version has landed. - */ -type WithEtherumSupport = { - tx: { - didLookup: { - associateAccount: AugmentedSubmittable< - ( - req: AssociateAccountRequest, - expiration: u64 | AnyNumber | Uint8Array - ) => SubmittableExtrinsic - > - removeAccountAssociation: AugmentedSubmittable< - (account: EncodedMultiAddress) => SubmittableExtrinsic, - [PalletDidLookupLinkableAccountLinkableAccountId] - > - } - } - query: { - didLookup: { - connectedDids: AugmentedQuery< - 'promise', - (arg: EncodedMultiAddress) => Option, - [PalletDidLookupLinkableAccountLinkableAccountId] - > - connectedAccounts: AugmentedQueryDoubleMap< - 'promise', - ( - didId: string | Uint8Array, - accountId: EncodedMultiAddress - ) => Option, - [AccountId32, PalletDidLookupLinkableAccountLinkableAccountId] - > - } - } -} - -/** - * Detects whether api augmentation indicates presence of Ethereum linking enabled pallet. + * Detects whether api decoration indicates presence of Ethereum linking enabled pallet. * * @param api The api object. * @returns True if Ethereum linking is supported. */ -function isEthereumEnabled(api: unknown): api is WithEtherumSupport { - return ( - api instanceof ApiPromise && - ('isAccountId20' in - api.createType( - api.tx.didLookup.removeAccountAssociation.meta.args[0]?.type?.toString() || - 'bool' - ) || - 'isEthereum' in - api.createType( - api.tx.didLookup.associateAccount.meta.args[0]?.type?.toString() || - 'bool' - )) +function isEthereumEnabled(api: ApiPromise): boolean { + const removeType = api.createType( + api.tx.didLookup.removeAccountAssociation.meta.args[0]?.type?.toString() || + 'bool' + ) + const associateType = api.createType( + api.tx.didLookup.associateAccount.meta.args[0]?.type?.toString() || 'bool' ) + + return 'isAccountId20' in removeType || 'isEthereum' in associateType } /** @@ -164,42 +100,34 @@ function encodeMultiAddress(address: Address): EncodedMultiAddress { /* ### QUERY ### */ -async function queryConnectedDid( - linkedAccount: Address -): Promise> { +export function accountToChain(account: Address): Address { const api = ConfigService.get('api') - if (isEthereumEnabled(api)) { - return api.query.didLookup.connectedDids(encodeMultiAddress(linkedAccount)) + if (!isEthereumEnabled(api)) { + // No change for the old blockchain version + return account } - return api.query.didLookup.connectedDids(linkedAccount) -} - -/** - * Gets deposit information for a given account link. - * - * @param linkedAccount The linked account. - * @returns Deposit info giving amount and owner of deposit, null if this account is not linked. - */ -export async function queryAccountLinkDepositInfo( - linkedAccount: Address -): Promise { - const connectedDid = await queryConnectedDid(linkedAccount) - return connectedDid.isSome ? connectedDid.unwrap().deposit : null + const encoded: EncodedMultiAddress = encodeMultiAddress(account) + // Force type cast to enable the old blockchain types to accept the future format + return encoded as unknown as Address } /** - * Return the addresses of the DID linked to the provided account, if present. + * Decodes the information about the connection between an address and a DID. * - * @param linkedAccount The account to use for the lookup. - * @returns The linked DID if present, or null otherwise. + * @param encoded The output of `api.query.didLookup.connectedDids()`. + * @returns The connection details. */ -export async function queryConnectedDidForAccount( - linkedAccount: Address -): Promise { - const connectedDid = await queryConnectedDid(linkedAccount) - return connectedDid.isNone - ? null - : getFullDidUri(connectedDid.unwrap().did.toString() as KiltAddress) +export function connectedDidFromChain( + encoded: Option +): { + did: DidUri + deposit: Deposit +} { + const { did, deposit } = encoded.unwrap() + return { + did: getFullDidUri(did.toString() as KiltAddress), + deposit: depositFromChain(deposit), + } } function isLinkableAccountId( @@ -209,33 +137,28 @@ function isLinkableAccountId( } /** - * Return all the accounts linked to the provided DID. + * Decodes the accounts linked to the provided DID. * - * @param linkedDid The DID to use for the lookup. + * @param encoded The data returned by `api.query.didLookup.connectedAccounts.keys()`. * @param networkPrefix The optional network prefix to use to encode the returned addresses. Defaults to KILT prefix (38). Use `42` for the chain-agnostic wildcard Substrate prefix. - * @returns A list of addresses of accounts linked to the DID, encoded using `networkPrefix`. + * @returns A list of addresses of accounts, encoded using `networkPrefix`. */ -export async function queryConnectedAccountsForDid( - linkedDid: DidUri, +export function connectedAccountsFromChain( + encoded: Array>, networkPrefix = ss58Format -): Promise> { - const api = ConfigService.get('api') - const connectedAccountsRecords = - await api.query.didLookup.connectedAccounts.keys(encodeDid(linkedDid)) - return connectedAccountsRecords.map( - ({ args: [, accountAddress] }) => { - if (isLinkableAccountId(accountAddress)) { - // linked account is substrate address (ethereum-enabled storage version) - if (accountAddress.isAccountId32) - return encodeAddress(accountAddress.asAccountId32, networkPrefix) - // linked account is ethereum address (ethereum-enabled storage version) - if (accountAddress.isAccountId20) - return ethereumEncode(accountAddress.asAccountId20) - } - // linked account is substrate account (legacy storage version) - return encodeAddress(accountAddress.toU8a(), networkPrefix) +): Array { + return encoded.map(({ args: [, accountAddress] }) => { + if (isLinkableAccountId(accountAddress)) { + // linked account is substrate address (ethereum-enabled storage version) + if (accountAddress.isAccountId32) + return encodeAddress(accountAddress.asAccountId32, networkPrefix) + // linked account is ethereum address (ethereum-enabled storage version) + if (accountAddress.isAccountId20) + return ethereumEncode(accountAddress.asAccountId20) } - ) + // linked account is substrate account (legacy storage version) + return encodeAddress(accountAddress.toU8a(), networkPrefix) + }) } /** @@ -247,98 +170,44 @@ export async function queryConnectedAccountsForDid( export async function queryWeb3Name( linkedAccount: Address ): Promise { + const api = ConfigService.get('api') // TODO: Replace with custom RPC call when available. - const linkedDid = await queryConnectedDidForAccount(linkedAccount) - if (!linkedDid) { + const encoded = await api.query.didLookup.connectedDids( + accountToChain(linkedAccount) + ) + if (encoded.isNone) { return null } - return queryWeb3NameForDid(linkedDid) -} - -/** - * Return true whether the provided account has been linked to the provided DID. - * - * @param did The DID to use for the lookup. - * @param account The account to use for the lookup. - * @returns True if the DID and account is linked, false otherwise. - */ -export async function queryIsConnected( - did: DidUri, - account: Address -): Promise { - const api = ConfigService.get('api') - if (isEthereumEnabled(api)) { - // The following function returns something different than 0x00 if there is an entry for the provided key, 0x00 otherwise. - return !( - await api.query.didLookup.connectedAccounts.hash( - encodeDid(did), - encodeMultiAddress(account) - ) - ).isEmpty - // isEmpty returns true if there is no entry for the given key -> the function should return false. - } - return !( - await api.query.didLookup.connectedAccounts.hash(encodeDid(did), account) - ).isEmpty -} - -/** - * Retrieves the deposit amount to link an account to a DID as currently stored in the runtime. - * - * @returns The deposit amount. The value is indicated in femto KILTs. - */ -export async function queryDepositAmount(): Promise { - const api = ConfigService.get('api') - return api.consts.didLookup.deposit.toBn() + return web3NameFromChain( + await api.query.web3Names.names(encoded.unwrap().did) + ) } /* ### EXTRINSICS ### */ -/** - * Signing (authorizing) this extrinsic with a full DID and submitting it with an Account - * will link Account to full DID and remove any pre-existing links of Account. - * Account must hold balance to cover for submission fees and storage deposit. - * - * @returns An extrinsic that must be DID-authorized. - */ -export async function getAssociateSenderExtrinsic(): Promise { - const api = ConfigService.get('api') - return api.tx.didLookup.associateSender() -} +type AssociateAccountToChainResult = [string, AnyNumber, EncodedSignature] -/** - * Signing (authorizing) this extrinsic with a full DID and submitting it with any Account - * will link Account to full DID and remove any pre-existing links of Account. - * Account must give permission by signing a Scale-encoded tuple consisting of the full DID address - * and a block number representing the expiration block of the signature (after which it cannot be submitted anymore). - * Account does not need to hold balance. The submitting account will pay and own the deposit for the link. - * - * @param account The account to link to the authorizing full DID. - * @param signatureValidUntilBlock The link request will be rejected if submitted later than this block number. - * @param signature Account's signature over `(DidAddress, BlockNumber).toU8a()`. - * @param sigType The type of key/substrate account which produced the `signature`. - * @returns An extrinsic that must be DID-authorized. - */ -export async function getAccountSignedAssociationExtrinsic( +function associateAccountToChainArgs( account: Address, signatureValidUntilBlock: AnyNumber, signature: Uint8Array | HexString, sigType: KeypairType -): Promise { +): AssociateAccountToChainResult { const proof = { [sigType]: signature } as EncodedSignature const api = ConfigService.get('api') if (isEthereumEnabled(api)) { if (sigType === 'ethereum') { - return api.tx.didLookup.associateAccount( + const result = [ { Ethereum: [account, signature] }, - signatureValidUntilBlock - ) + signatureValidUntilBlock, + ] + // Force type cast to enable the old blockchain types to accept the future format + return result as unknown as AssociateAccountToChainResult } - return api.tx.didLookup.associateAccount( - { Dotsama: [account, proof] }, - signatureValidUntilBlock - ) + const result = [{ Dotsama: [account, proof] }, signatureValidUntilBlock] + // Force type cast to enable the old blockchain types to accept the future format + return result as unknown as AssociateAccountToChainResult } if (sigType === 'ethereum') @@ -346,55 +215,7 @@ export async function getAccountSignedAssociationExtrinsic( 'Ethereum linking is not yet supported by this chain' ) - return api.tx.didLookup.associateAccount( - account, - signatureValidUntilBlock, - proof - ) -} - -/** - * Returns an extrinsic to release an account link by the account that owns the deposit. - * Must be signed and submitted by the deposit owner account. - * - * @param linkedAccount Account whose link should be released (not the deposit owner). - * @returns The a submittable extrinsic for the `reclaimDeposit` call. - */ -export async function getReclaimDepositTx( - linkedAccount: Address -): Promise { - const api = ConfigService.get('api') - return api.tx.didLookup.reclaimDeposit(linkedAccount) -} - -/** - * Allows the submitting account to unilaterally remove its link to a DID. - * This is not DID-authorized, but directly submitted by the linked account. - * - * @returns A SubmittableExtrinsic that must be signed by the linked account. - */ -export async function getLinkRemovalByAccountTx(): Promise { - const api = ConfigService.get('api') - return api.tx.didLookup.removeSenderAssociation() -} - -/** - * Allows the authorizing full DID to unilaterally remove its link to a given account. - * This must be DID-authorized, but can be submitted by any account. - * - * @param linkedAccount An account linked to the full DID which should be unlinked. - * @returns An Extrinsic that must be DID-authorized by the full DID linked to `linkedAccount`. - */ -export async function getLinkRemovalByDidExtrinsic( - linkedAccount: Address -): Promise { - const api = ConfigService.get('api') - if (isEthereumEnabled(api)) { - return api.tx.didLookup.removeAccountAssociation( - encodeMultiAddress(linkedAccount) - ) - } - return api.tx.didLookup.removeAccountAssociation(linkedAccount) + return [account, signatureValidUntilBlock, proof] } /* ### HELPERS ### */ @@ -478,7 +299,7 @@ export async function getAuthorizeLinkWithAccountExtrinsic( )[0].type // get the type of the first key, which is the DidAddress const encoded = api - .createType(`(${DidAddress}, ${BlockNumber})`, [encodeDid(did), validTill]) + .createType(`(${DidAddress}, ${BlockNumber})`, [didToChain(did), validTill]) .toU8a() const isAccountId32 = decodeAddress(accountAddress).length > 20 @@ -495,10 +316,7 @@ export async function getAuthorizeLinkWithAccountExtrinsic( accountAddress ) - return getAccountSignedAssociationExtrinsic( - accountAddress, - validTill, - signature, - type + return api.tx.didLookup.associateAccount( + ...associateAccountToChainArgs(accountAddress, validTill, signature, type) ) } diff --git a/packages/did/src/DidLinks/Web3Names.chain.ts b/packages/did/src/DidLinks/Web3Names.chain.ts index 1a4e01fec..739085f88 100644 --- a/packages/did/src/DidLinks/Web3Names.chain.ts +++ b/packages/did/src/DidLinks/Web3Names.chain.ts @@ -5,127 +5,46 @@ * found in the LICENSE file in the root directory of this source tree. */ -import type { ApiPromise } from '@polkadot/api' +import { PalletWeb3NamesWeb3NameWeb3NameOwnership } from '@polkadot/types/lookup' +import type { Bytes, Option } from '@polkadot/types-codec' +import type { Deposit, DidUri, KiltAddress } from '@kiltprotocol/types' import type { BN } from '@polkadot/util' -import type { - SubmittableExtrinsic, - DidUri, - KiltAddress, -} from '@kiltprotocol/types' -import { SDKErrors } from '@kiltprotocol/utils' -import { ConfigService } from '@kiltprotocol/config' - import * as DidUtils from '../Did.utils.js' -import { encodeDid } from '../Did.chain.js' +import { depositFromChain } from '../Did.chain.js' /** * Web3Name is the type of a nickname for a DID. */ export type Web3Name = string -function checkWeb3NameInputConstraints( - api: ApiPromise, - web3Name: Web3Name -): void { - const [minLength, maxLength] = [ - api.consts.web3Names.minNameLength.toNumber(), - api.consts.web3Names.maxNameLength.toNumber(), - ] - - if (web3Name.length < minLength) { - throw new SDKErrors.Web3NameError( - `The provided name "${web3Name}" is shorter than the minimum number of characters allowed, which is ${minLength}` - ) - } - if (web3Name.length > maxLength) { - throw new SDKErrors.Web3NameError( - `The provided name "${web3Name}" is longer than the maximum number of characters allowed, which is ${maxLength}` - ) - } -} - -/** - * Returns an extrinsic to claim a new web3name. - * - * @param name Web3Name that should be claimed. - * The name must only contain ASCII characters and have a length in the inclusive range [3, 32]. - * @returns The SubmittableExtrinsic for the `claim` call. - */ -export async function getClaimTx( - name: Web3Name -): Promise { - const api = ConfigService.get('api') - checkWeb3NameInputConstraints(api, name) - return api.tx.web3Names.claim(name) -} - /** - * Returns an extrinsic to release a web3name by its owner. + * Decodes the web3name of a DID. * - * @returns The SubmittableExtrinsic for the `releaseByOwner` call. - */ -export async function getReleaseByOwnerTx(): Promise { - const api = ConfigService.get('api') - return api.tx.web3Names.releaseByOwner() -} - -/** - * Returns an extrinsic to release a web3name by the account that owns the deposit. - * - * @param name Web3Name that should be released. - * The name must only contain ASCII characters and have a length in the inclusive range [3, 32]. - * @returns The SubmittableExtrinsic for the `reclaimDeposit` call. - */ -export async function getReclaimDepositTx( - name: Web3Name -): Promise { - const api = ConfigService.get('api') - checkWeb3NameInputConstraints(api, name) - return api.tx.web3Names.reclaimDeposit(name) -} - -/** - * Retrieve the Web3Name for a specific DID uri. - * - * @param did DID of the web3name owner, i.e. 'did:kilt:4abc...'. + * @param encoded The value returned by `api.query.web3Names.names()`. * @returns The registered web3name for this DID if any. */ -export async function queryWeb3NameForDid( - did: DidUri -): Promise { - const api = ConfigService.get('api') - const encoded = await api.query.web3Names.names(encodeDid(did)) - return encoded.isSome ? encoded.unwrap().toUtf8() : null +export function web3NameFromChain(encoded: Option): Web3Name { + return encoded.unwrap().toUtf8() } /** - * Retrieve the DID uri for a specific web3 name. + * Decodes the DID of the owner of web3name. * - * @param name Web3 name that should be looked up. + * @param encoded The value returned by `api.query.web3Names.owner()`. * @returns The full DID uri, i.e. 'did:kilt:4abc...', if any. */ -export async function queryDidForWeb3Name( - name: Web3Name -): Promise { - const api = ConfigService.get('api') - const encoded = await api.query.web3Names.owner(name) - - const address = encoded.isSome - ? (encoded.unwrap().owner.toString() as KiltAddress) - : null - if (address === null) { - return null +export function web3NameOwnerFromChain( + encoded: Option +): { + owner: DidUri + deposit: Deposit + claimedAt: BN +} { + const { owner, deposit, claimedAt } = encoded.unwrap() + return { + owner: DidUtils.getFullDidUri(owner.toString() as KiltAddress), + deposit: depositFromChain(deposit), + claimedAt: claimedAt.toBn(), } - return DidUtils.getFullDidUri(address) -} - -/** - * Retrieves the deposit amount to claim a web3 name as currently stored in the runtime. - * - * @returns The deposit amount. The value is indicated in femto KILTs. - */ -export async function queryDepositAmount(): Promise { - const api = ConfigService.get('api') - return api.consts.web3Names.deposit.toBn() } diff --git a/packages/did/src/DidResolver/DidResolver.spec.ts b/packages/did/src/DidResolver/DidResolver.spec.ts index b8ff513f7..1442d9564 100644 --- a/packages/did/src/DidResolver/DidResolver.spec.ts +++ b/packages/did/src/DidResolver/DidResolver.spec.ts @@ -22,10 +22,15 @@ import type { UriFragment, } from '@kiltprotocol/types' import { ss58Format } from '@kiltprotocol/utils' -import { makeSigningKeyTool } from '@kiltprotocol/testing' +import { ApiMocks, makeSigningKeyTool } from '@kiltprotocol/testing' +import { ConfigService } from '@kiltprotocol/config' -import type { EncodedDid } from '../Did.chain' -import { getFullDidUriFromKey, parseDidUri, stripFragment } from '../Did.utils' +import { getFullDidUriFromKey, stripFragment } from '../Did.utils' +import { + didFromChain, + serviceEndpointFromChain, + queryServiceEndpoints, +} from '../Did.chain.js' import { resolve, @@ -49,6 +54,41 @@ const didWithServiceEndpoints: DidUri = `did:kilt:${addressWithServiceEndpoints} const deletedAddress = '4rrVTLAXgeoE8jo8si571HnqHtd5WmvLuzfH6e1xBsVXsRo7' const deletedDid: DidUri = `did:kilt:${deletedAddress}` +const didNotFound = ApiMocks.mockChainQueryReturn('did', 'did') +const encodedDidWithAuthenticationKey = ApiMocks.mockChainQueryReturn( + 'did', + 'did', + [ + '01234567890123456789012345678901', + [], + undefined, + undefined, + [], + '123', + [addressWithAuthenticationKey, '0'], + ] +) +const didIsBlacklisted = ApiMocks.mockChainQueryReturn( + 'did', + 'didBlacklist', + 'true' +) + +let mockedApi: any +beforeAll(() => { + mockedApi = ApiMocks.getMockedApi() + ConfigService.set({ api: mockedApi }) + + mockedApi.query.did.did.mockReturnValue(encodedDidWithAuthenticationKey) + mockedApi.query.did.serviceEndpoints.mockReturnValue( + ApiMocks.mockChainQueryReturn('did', 'serviceEndpoints', [ + 'foo', + ['type-service-1'], + ['x:url-service-1'], + ]) + ) +}) + function generateAuthenticationKey(): DidVerificationKey { return { id: '#auth', @@ -93,88 +133,22 @@ function generateServiceEndpoint(serviceId: UriFragment): DidServiceEndpoint { } } -jest.mock('../Did.chain', () => { - const queryDetails = jest.fn( - async (did: DidUri): Promise => { - const authKey = generateAuthenticationKey() - const encKey = generateEncryptionKey() - const attKey = generateAttestationKey() - const delKey = generateDelegationKey() - const { address: didAddress } = parseDidUri(did) - - switch (didAddress) { - case addressWithAuthenticationKey: - return { - authentication: [authKey], - lastTxCounter: new BN(0), - deposit: { - amount: new BN(2), - owner: didAddress, - }, - } - case addressWithAllKeys: - return { - authentication: [authKey], - keyAgreement: [encKey], - assertionMethod: [attKey], - capabilityDelegation: [delKey], - lastTxCounter: new BN(0), - deposit: { - amount: new BN(2), - owner: didAddress, - }, - } - case addressWithServiceEndpoints: - return { - authentication: [authKey], - lastTxCounter: new BN(0), - deposit: { - amount: new BN(2), - owner: didAddress, - }, - } - default: - return null - } - } - ) - const queryServiceEndpoint = jest.fn( - async ( - did: DidUri, - serviceId: DidServiceEndpoint['id'] - ): Promise => { - switch (parseDidUri(did).address) { - case addressWithServiceEndpoints: - return generateServiceEndpoint(serviceId) - default: - return null - } - } - ) - const queryServiceEndpoints = jest.fn( - async (did: DidUri): Promise => { - switch (parseDidUri(did).address) { - case addressWithServiceEndpoints: - return [ - (await queryServiceEndpoint(did, '#id-1')) as DidServiceEndpoint, - (await queryServiceEndpoint(did, '#id-2')) as DidServiceEndpoint, - ] - default: - return [] - } - } - ) - const queryDidDeletionStatus = jest.fn( - async (did: DidUri): Promise => - parseDidUri(did).address === deletedAddress - ) - return { - queryDetails, - queryServiceEndpoint, - queryServiceEndpoints, - queryDidDeletionStatus, - } +jest.mock('../Did.chain.js') + +jest.mocked(didFromChain).mockReturnValue({ + authentication: [generateAuthenticationKey()], + lastTxCounter: new BN(0), + deposit: { + amount: new BN(0), + owner: addressWithAuthenticationKey, + }, }) +jest + .mocked(serviceEndpointFromChain) + .mockReturnValue(generateServiceEndpoint('#service-1')) +jest + .mocked(queryServiceEndpoints) + .mockResolvedValue([generateServiceEndpoint('#service-1')]) describe('When resolving a key', () => { it('correctly resolves it for a full DID if both the DID and the key exist', async () => { @@ -226,6 +200,13 @@ describe('When resolving a service endpoint', () => { }) it('returns null if either the DID or the service do not exist', async () => { + mockedApi.query.did.serviceEndpoints.mockReturnValueOnce( + ApiMocks.mockChainQueryReturn('did', 'serviceEndpoints') + ) + mockedApi.query.did.serviceEndpoints.mockReturnValueOnce( + ApiMocks.mockChainQueryReturn('did', 'serviceEndpoints') + ) + let serviceIdUri: DidResourceUri = `${deletedDid}#service-1` expect(await resolveServiceEndpoint(serviceIdUri)).toBeNull() @@ -269,6 +250,17 @@ describe('When resolving a full DID', () => { }) it('correctly resolves the document with all keys', async () => { + jest.mocked(didFromChain).mockReturnValueOnce({ + authentication: [generateAuthenticationKey()], + keyAgreement: [generateEncryptionKey()], + assertionMethod: [generateAttestationKey()], + capabilityDelegation: [generateDelegationKey()], + lastTxCounter: new BN(0), + deposit: { + amount: new BN(0), + owner: addressWithAuthenticationKey, + }, + }) const fullDidWithAllKeys = didWithAllKeys const { document, metadata } = (await resolve( fullDidWithAllKeys @@ -307,6 +299,12 @@ describe('When resolving a full DID', () => { }) it('correctly resolves the document with service endpoints', async () => { + jest + .mocked(queryServiceEndpoints) + .mockResolvedValue([ + generateServiceEndpoint('#id-1'), + generateServiceEndpoint('#id-2'), + ]) const fullDidWithServiceEndpoints = didWithServiceEndpoints const { document, metadata } = (await resolve( fullDidWithServiceEndpoints @@ -332,6 +330,7 @@ describe('When resolving a full DID', () => { }) it('correctly resolves a non-existing DID', async () => { + mockedApi.query.did.did.mockReturnValueOnce(didNotFound) const randomDid = getFullDidUriFromKey( makeSigningKeyTool().authentication[0] ) @@ -339,6 +338,9 @@ describe('When resolving a full DID', () => { }) it('correctly resolves a deleted DID', async () => { + mockedApi.query.did.did.mockReturnValueOnce(didNotFound) + mockedApi.query.did.didBlacklist.hash.mockReturnValueOnce(didIsBlacklisted) + const { document, metadata } = (await resolve( deletedDid )) as DidResolutionResult @@ -368,6 +370,10 @@ describe('When resolving a light DID', () => { const authKey = keyring.addFromMnemonic('auth') const encryptionKey = keyring.addFromMnemonic('enc') + beforeEach(() => { + mockedApi.query.did.did.mockReturnValue(didNotFound) + }) + it('correctly resolves the document with an authentication key', async () => { const lightDidWithAuthenticationKey = Did.createLightDidDocument({ authentication: [{ publicKey: authKey.publicKey, type: 'sr25519' }], @@ -435,6 +441,8 @@ describe('When resolving a light DID', () => { }) it('correctly resolves a migrated and not deleted DID', async () => { + mockedApi.query.did.did.mockReturnValueOnce(encodedDidWithAuthenticationKey) + const migratedDid: DidUri = `did:kilt:light:00${addressWithAuthenticationKey}` const { document, metadata } = (await resolve( migratedDid @@ -448,6 +456,8 @@ describe('When resolving a light DID', () => { }) it('correctly resolves a migrated and not deleted DID in compliant mode', async () => { + mockedApi.query.did.did.mockReturnValueOnce(encodedDidWithAuthenticationKey) + const migratedDid: DidUri = `did:kilt:light:00${addressWithAuthenticationKey}` const { document, metadata } = (await strictResolve( migratedDid @@ -462,6 +472,8 @@ describe('When resolving a light DID', () => { }) it('correctly resolves a migrated and deleted DID', async () => { + mockedApi.query.did.didBlacklist.hash.mockReturnValueOnce(didIsBlacklisted) + const migratedDid: DidUri = `did:kilt:light:00${deletedAddress}` const { document, metadata } = (await resolve( migratedDid diff --git a/packages/did/src/DidResolver/DidResolver.ts b/packages/did/src/DidResolver/DidResolver.ts index d83bb88c6..7498bc96b 100644 --- a/packages/did/src/DidResolver/DidResolver.ts +++ b/packages/did/src/DidResolver/DidResolver.ts @@ -5,7 +5,7 @@ * found in the LICENSE file in the root directory of this source tree. */ -import { +import type { DidDocument, DidResolutionResult, DidResourceUri, @@ -14,9 +14,14 @@ import { ResolvedDidServiceEndpoint, } from '@kiltprotocol/types' import { SDKErrors } from '@kiltprotocol/utils' +import { ConfigService } from '@kiltprotocol/config' import * as Did from '../index.js' -import { queryDidDeletionStatus, queryServiceEndpoint } from '../Did.chain.js' +import { + didToChain, + resourceIdToChain, + serviceEndpointFromChain, +} from '../Did.chain.js' import { getFullDidUri, parseDidUri } from '../Did.utils.js' /** @@ -31,6 +36,7 @@ export async function resolve( did: DidUri ): Promise { const { type } = parseDidUri(did) + const api = ConfigService.get('api') const document = await Did.query(getFullDidUri(did)) if (type === 'full' && document) { @@ -44,7 +50,9 @@ export async function resolve( // If the full DID has been deleted (or the light DID was upgraded and deleted), // return the info in the resolution metadata. - const isFullDidDeleted = await queryDidDeletionStatus(did) + const isFullDidDeleted = !( + await api.query.did.didBlacklist.hash(didToChain(did)) + ).isEmpty if (isFullDidDeleted) { return { // No canonicalId and no details are returned as we consider this DID deactivated/deleted. @@ -176,14 +184,19 @@ export async function resolveServiceEndpoint( if (!serviceId) { throw new SDKErrors.InvalidDidFormatError(serviceUri) } + const api = ConfigService.get('api') if (type === 'full') { - const endpoint = await queryServiceEndpoint(serviceUri, serviceId) - if (!endpoint) { + const encoded = await api.query.did.serviceEndpoints( + didToChain(serviceUri), + resourceIdToChain(serviceId) + ) + if (encoded.isNone) { return null } + const serviceEndpoint = serviceEndpointFromChain(encoded.unwrap()) return { - ...endpoint, + ...serviceEndpoint, id: serviceUri, } } diff --git a/packages/testing/src/mocks/mockedApi.ts b/packages/testing/src/mocks/mockedApi.ts index cf6f022e5..70f5afd0d 100644 --- a/packages/testing/src/mocks/mockedApi.ts +++ b/packages/testing/src/mocks/mockedApi.ts @@ -332,8 +332,8 @@ export function getMockedApi(): MockApiPromise { }, did: { // default return value decodes to null, represents dID not found - dIDs: jest.fn(async (address: string) => - mockChainQueryReturn('did', 'dIDs') + did: jest.fn(async (address: string) => + mockChainQueryReturn('did', 'did') ), /* example return value: new Option( @@ -346,6 +346,14 @@ export function getMockedApi(): MockApiPromise { ] ) */ + serviceEndpoints: jest.fn(async () => + mockChainQueryReturn('did', 'serviceEndpoints') + ), + didBlacklist: { + hash: jest + .fn() + .mockReturnValue(mockChainQueryReturn('did', 'didBlacklist')), + }, }, portablegabi: { accumulatorList: jest.fn((address: string, index: number) => @@ -368,5 +376,6 @@ export function getMockedApi(): MockApiPromise { registry: TYPE_REGISTRY, hasSubscriptions: true, } + MockedApi.query.did.serviceEndpoints.entries = jest.fn().mockReturnValue([]) return MockedApi as MockApiPromise } diff --git a/packages/testing/src/mocks/mockedApi.utils.ts b/packages/testing/src/mocks/mockedApi.utils.ts index 1dbf9c215..38504a7f0 100644 --- a/packages/testing/src/mocks/mockedApi.utils.ts +++ b/packages/testing/src/mocks/mockedApi.utils.ts @@ -14,13 +14,13 @@ const TYPE_REGISTRY = createRegistryFromMetadata() TYPE_REGISTRY.setChainProperties(TYPE_REGISTRY.getChainProperties()) -const AccountId = TYPE_REGISTRY.getOrThrow('AccountId') +const AccountId32 = TYPE_REGISTRY.getOrThrow('AccountId32') type ChainQueryTypes = { attestation: 'attestations' | 'delegatedAttestations' ctype: 'cTYPEs' delegation: 'hierarchies' | 'delegations' - did: 'dIDs' + did: 'did' | 'serviceEndpoints' | 'didBlacklist' portablegabi: 'accumulatorList' | 'accumulatorCount' | 'accountState' } @@ -37,7 +37,7 @@ const chainQueryReturnTuples: { } = { ctype: { // CTYPEs: ctype-hash -> account-id? - cTYPEs: AccountId, + cTYPEs: AccountId32, }, delegation: { // Delegation hierarchies: root-id -> (ctype-hash)? @@ -59,7 +59,11 @@ const chainQueryReturnTuples: { }, did: { // DID: account-id -> (public-signing-key, public-encryption-key, did-reference?)? - dIDs: TYPE_REGISTRY.getOrUnknown('DidDidDetails'), + did: TYPE_REGISTRY.getOrUnknown('DidDidDetails'), + serviceEndpoints: TYPE_REGISTRY.getOrUnknown( + 'DidServiceEndpointsDidEndpoint' + ), + didBlacklist: TYPE_REGISTRY.getOrUnknown('Bool'), }, portablegabi: { // AccumulatorList: account-id -> [accumulators]? @@ -110,10 +114,12 @@ export function mockChainQueryReturn( mockValue as Constructor[] ) } + // helper function to wrap values into an option function wrapInOption(): Option { return new Option(TYPE_REGISTRY, chainQueryReturnTuple, mockValue) } + // check cases switch (outerQuery) { case 'attestation': { diff --git a/packages/types/src/Deposit.ts b/packages/types/src/Deposit.ts index f284fcfad..41fd515ee 100644 --- a/packages/types/src/Deposit.ts +++ b/packages/types/src/Deposit.ts @@ -5,9 +5,13 @@ * found in the LICENSE file in the root directory of this source tree. */ -import type { KiltSupportDeposit } from '@kiltprotocol/augment-api' +import type { BN } from '@polkadot/util' +import type { KiltAddress } from './Address' /** * An on-chain deposit. It contains information about the deposit owner and the balance used. */ -export type Deposit = KiltSupportDeposit +export type Deposit = { + owner: KiltAddress + amount: BN +} diff --git a/packages/utils/src/SDKErrors.ts b/packages/utils/src/SDKErrors.ts index af08fae70..718f44933 100644 --- a/packages/utils/src/SDKErrors.ts +++ b/packages/utils/src/SDKErrors.ts @@ -50,8 +50,6 @@ export class DidExporterError extends SDKError {} // TODO: rename me export class DidBuilderError extends SDKError {} -export class Web3NameError extends SDKError {} - export class ClaimHashMissingError extends SDKError {} export class RevokedTypeError extends SDKError {} diff --git a/packages/vc-export/src/exportToVerifiableCredential.spec.ts b/packages/vc-export/src/exportToVerifiableCredential.spec.ts index dbfcf0ca4..654d5f61c 100644 --- a/packages/vc-export/src/exportToVerifiableCredential.spec.ts +++ b/packages/vc-export/src/exportToVerifiableCredential.spec.ts @@ -19,6 +19,7 @@ import { import { Attestation } from '@kiltprotocol/core' import { Utils as DidUtils } from '@kiltprotocol/did' import { Crypto } from '@kiltprotocol/utils' +import { ApiMocks } from '@kiltprotocol/testing' import { DocumentLoader } from 'jsonld-signatures' import { base58Encode } from '@polkadot/util-crypto' import * as toVC from './exportToVerifiableCredential' @@ -32,6 +33,8 @@ import { KILT_VERIFIABLECREDENTIAL_TYPE, } from './constants' +const mockedApi: any = ApiMocks.getMockedApi() + const ctype: ICType = { schema: { $schema: 'http://kilt-protocol.org/draft-01/ctype#', @@ -103,6 +106,18 @@ const attestation: IAttestation = { revoked: false, } +const encodedAttestation = ApiMocks.mockChainQueryReturn( + 'attestation', + 'attestations', + [ + '0x24195dd6313c0bb560f3043f839533b54bcd32d602dd848471634b0345ec88ad', + '4sejigvu6STHdYmmYf2SuN92aNp8TbrsnBBDUj7tMrJ9Z3cG', + undefined, + false, + ['4sejigvu6STHdYmmYf2SuN92aNp8TbrsnBBDUj7tMrJ9Z3cG', 0], + ] +) + it('exports credential to VC', () => { expect( toVC.fromCredentialAndAttestation(credential, attestation) @@ -315,9 +330,16 @@ describe('proofs', () => { }) it('verifies attestation proof on chain', async () => { - jest.spyOn(Attestation, 'query').mockResolvedValue(attestation) + mockedApi.query.attestation.attestations.mockResolvedValueOnce( + encodedAttestation + ) + jest.spyOn(Attestation, 'fromChain').mockReturnValue(attestation) - const result = await verificationUtils.verifyAttestedProof(VC, VC.proof[1]) + const result = await verificationUtils.verifyAttestedProof( + VC, + VC.proof[1], + mockedApi + ) expect(result.errors).toEqual([]) expect(result).toMatchObject({ verified: true, @@ -346,7 +368,7 @@ describe('proofs', () => { verified: false, }) expect( - await verificationUtils.verifyAttestedProof(VC, VC.proof[2]) + await verificationUtils.verifyAttestedProof(VC, VC.proof[2], mockedApi) ).toMatchObject({ verified: false, }) @@ -388,8 +410,6 @@ describe('proofs', () => { }) it('it detects tampering with credential fields', async () => { - jest.spyOn(Attestation, 'query').mockResolvedValue(attestation) - VC.delegationId = '0x123' expect( await verificationUtils.verifyCredentialDigestProof(VC, VC.proof[2]) @@ -397,7 +417,7 @@ describe('proofs', () => { verified: false, }) expect( - await verificationUtils.verifyAttestedProof(VC, VC.proof[1]) + await verificationUtils.verifyAttestedProof(VC, VC.proof[1], mockedApi) ).toMatchObject({ verified: false, status: 'invalid', @@ -422,11 +442,10 @@ describe('proofs', () => { }) it('fails if attestation not on chain', async () => { - jest.spyOn(Attestation, 'query').mockResolvedValue(null) - const result = await verificationUtils.verifyAttestedProof( VC, - VC.proof[1] + VC.proof[1], + mockedApi ) expect(result).toMatchObject({ verified: false, @@ -435,14 +454,10 @@ describe('proofs', () => { }) it('fails if attestation on chain not identical', async () => { - jest.spyOn(Attestation, 'query').mockResolvedValue({ - ...attestation, - owner: credential.claim.owner, - }) - const result = await verificationUtils.verifyAttestedProof( VC, - VC.proof[1] + VC.proof[1], + mockedApi ) expect(result).toMatchObject({ verified: false, @@ -451,14 +466,18 @@ describe('proofs', () => { }) it('fails if attestation revoked', async () => { - jest.spyOn(Attestation, 'query').mockResolvedValue({ + mockedApi.query.attestation.attestations.mockResolvedValueOnce( + encodedAttestation + ) + jest.spyOn(Attestation, 'fromChain').mockReturnValue({ ...attestation, revoked: true, }) const result = await verificationUtils.verifyAttestedProof( VC, - VC.proof[1] + VC.proof[1], + mockedApi ) expect(result).toMatchObject({ verified: false, diff --git a/packages/vc-export/src/vc-js/suites/KiltAttestedSuite.spec.ts b/packages/vc-export/src/vc-js/suites/KiltAttestedSuite.spec.ts index bbbdd60d1..e81865bd4 100644 --- a/packages/vc-export/src/vc-js/suites/KiltAttestedSuite.spec.ts +++ b/packages/vc-export/src/vc-js/suites/KiltAttestedSuite.spec.ts @@ -21,6 +21,8 @@ import { documentLoader } from '../documentLoader' import type { AttestedProof } from '../../types' import { KILT_ATTESTED_PROOF_TYPE } from '../../constants' +const mockedApi: any = ApiMocks.getMockedApi() + const attestation: IAttestation = { claimHash: '0x24195dd6313c0bb560f3043f839533b54bcd32d602dd848471634b0345ec88ad', @@ -31,17 +33,27 @@ const attestation: IAttestation = { revoked: false, } -const spy = jest - .spyOn(Attestation, 'query') - .mockImplementation(async (): Promise => attestation) +const encodedAttestation = ApiMocks.mockChainQueryReturn( + 'attestation', + 'attestations', + [ + '0x24195dd6313c0bb560f3043f839533b54bcd32d602dd848471634b0345ec88ad', + '4sejigvu6STHdYmmYf2SuN92aNp8TbrsnBBDUj7tMrJ9Z3cG', + undefined, + false, + ['4sejigvu6STHdYmmYf2SuN92aNp8TbrsnBBDUj7tMrJ9Z3cG', 0], + ] +) +mockedApi.query.attestation.attestations.mockResolvedValue(encodedAttestation) + +const spy = jest.spyOn(Attestation, 'fromChain').mockReturnValue(attestation) let suite: AttestationSuite let purpose: purposes.ProofPurpose let proof: AttestedProof beforeAll(async () => { - const KiltConnection = ApiMocks.createAugmentedApi() - suite = new AttestationSuite({ KiltConnection }) + suite = new AttestationSuite({ KiltConnection: mockedApi }) purpose = new purposes.AssertionProofPurpose() credential.proof.some((p) => { if (p.type === KILT_ATTESTED_PROOF_TYPE) { @@ -85,7 +97,7 @@ describe('jsigs', () => { describe('attested', () => { beforeAll(() => { - spy.mockImplementation(async (): Promise => attestation) + spy.mockReturnValue(attestation) }) it('verifies Kilt Attestation Proof', async () => { @@ -97,10 +109,7 @@ describe('jsigs', () => { describe('revoked', () => { beforeAll(() => { - const revoked = { ...attestation, revoked: true } - spy.mockImplementation( - async (): Promise => revoked as IAttestation - ) + spy.mockReturnValue({ ...attestation, revoked: true }) }) it('fails to verify Kilt Attestation Proof', async () => { @@ -111,10 +120,6 @@ describe('jsigs', () => { }) describe('not attested', () => { - beforeAll(() => { - spy.mockImplementation(async (): Promise => null) - }) - it('fails to verify Kilt Attestation Proof', async () => { expect( await jsigs.verify(credential, { suite, purpose, documentLoader }) @@ -126,7 +131,7 @@ describe('jsigs', () => { describe('vc-js', () => { describe('attested', () => { beforeAll(() => { - spy.mockImplementation(async (): Promise => attestation) + spy.mockReturnValue(attestation) }) it('verifies Kilt Attestation Proof', async () => { @@ -143,10 +148,7 @@ describe('vc-js', () => { describe('revoked', () => { beforeAll(() => { - const revoked = { ...attestation, revoked: true } - spy.mockImplementation( - async (): Promise => revoked as IAttestation - ) + spy.mockReturnValue({ ...attestation, revoked: true }) }) it('fails to verify Kilt Attestation Proof', async () => { @@ -162,10 +164,6 @@ describe('vc-js', () => { }) describe('not attested', () => { - beforeAll(() => { - spy.mockImplementation(async (): Promise => null) - }) - it('fails to verify Kilt Attestation Proof', async () => { expect( await vcjs.verifyCredential({ diff --git a/packages/vc-export/src/vc-js/suites/KiltAttestedSuite.ts b/packages/vc-export/src/vc-js/suites/KiltAttestedSuite.ts index 57a5e9c0f..6d8b7686e 100644 --- a/packages/vc-export/src/vc-js/suites/KiltAttestedSuite.ts +++ b/packages/vc-export/src/vc-js/suites/KiltAttestedSuite.ts @@ -16,8 +16,6 @@ import type { } from 'jsonld-signatures' import type { JsonLdObj } from 'jsonld/jsonld-spec' -import { ConfigService } from '@kiltprotocol/config' - import type { AttestedProof } from '../../types.js' import { verifyAttestedProof, @@ -42,18 +40,11 @@ export class KiltAttestedSuite extends KiltAbstractSuite { constructor(options: { KiltConnection: ApiPromise }) { // vc-js complains when there is no verificationMethod super({ type: KILT_ATTESTED_PROOF_TYPE, verificationMethod: '' }) - if ( - !('KiltConnection' in options) || - !(options.KiltConnection instanceof ApiPromise) - ) + if (!('KiltConnection' in options)) throw new TypeError('KiltConnection must be a Kilt blockchain connection') this.provider = options.KiltConnection } - private setConnection(): void { - ConfigService.set({ api: this.provider }) - } - /** * @inheritdoc */ @@ -75,10 +66,10 @@ export class KiltAttestedSuite extends KiltAbstractSuite { proof, options ) - this.setConnection() const { verified, errors, status } = await verifyAttestedProof( compactedDoc, - compactedProof + compactedProof, + this.provider ) if (errors.length > 0) return { diff --git a/packages/vc-export/src/verificationUtils.ts b/packages/vc-export/src/verificationUtils.ts index e874d55d0..29d05fd81 100644 --- a/packages/vc-export/src/verificationUtils.ts +++ b/packages/vc-export/src/verificationUtils.ts @@ -14,6 +14,7 @@ import { base58Decode, } from '@polkadot/util-crypto' import jsonld from 'jsonld' +import { ApiPromise } from '@polkadot/api' import { Attestation, CType } from '@kiltprotocol/core' import { Crypto, JsonSchema, SDKErrors } from '@kiltprotocol/utils' import { DocumentLoader } from 'jsonld-signatures' @@ -143,11 +144,13 @@ export async function verifySelfSignedProof( * * @param credential Verifiable Credential to verify proof against. * @param proof KILT self-signed proof object. + * @param api The API connection. * @returns Object indicating whether proof could be verified. */ export async function verifyAttestedProof( credential: VerifiableCredential, - proof: AttestedProof + proof: AttestedProof, + api: ApiPromise ): Promise { let status: AttestationStatus = 'unknown' try { @@ -180,15 +183,17 @@ export async function verifyAttestedProof( default: throw new CredentialMalformedError('delegationId not understood') } + // query on-chain data by credential id (= claim root hash) - const onChain = await Attestation.query(claimHash) + const encoded = await api.query.attestation.attestations(claimHash) // if not found, credential has not been attested, proof is invalid - if (onChain === null) { + if (encoded.isNone) { status = 'invalid' throw new Error( `Attestation for credential with id "${claimHash}" not found` ) } + const onChain = Attestation.fromChain(encoded, claimHash) // if data on proof does not correspond to data on chain, proof is incorrect if (onChain.owner !== attester || onChain.delegationId !== delegationId) { status = 'invalid' diff --git a/tests/bundle-test.ts b/tests/bundle-test.ts index 889d56855..093ed4369 100644 --- a/tests/bundle-test.ts +++ b/tests/bundle-test.ts @@ -148,7 +148,7 @@ async function createFullDidFromKeypair( async function runAll() { // init sdk kilt config and connect to chain - await kilt.connect('ws://127.0.0.1:9944') + const api = await kilt.connect('ws://127.0.0.1:9944') // Accounts console.log('Account setup started') @@ -230,7 +230,7 @@ async function runAll() { const deleteTx = await Did.authorizeExtrinsic( fullDid, - await Did.Chain.getDeleteDidExtrinsic(BalanceUtils.toFemtoKilt(0)), + api.tx.did.delete(BalanceUtils.toFemtoKilt(0)), sign, payer.address ) @@ -262,7 +262,7 @@ async function runAll() { const cTypeStoreTx = await Did.authorizeExtrinsic( alice, - await CType.getStoreTx(DriversLicense), + api.tx.ctype.add(CType.toChain(DriversLicense)), aliceSign, payer.address ) @@ -348,12 +348,15 @@ async function runAll() { const attestationStoreTx = await Did.authorizeExtrinsic( alice, - await Attestation.getStoreTx(attestation), + api.tx.attestation.add(attestation.claimHash, attestation.cTypeHash, null), aliceSign, payer.address ) await Blockchain.signAndSubmitTx(attestationStoreTx, payer) - const storedAttestation = await Attestation.query(credential.rootHash) + const storedAttestation = Attestation.fromChain( + await api.query.attestation.attestations(credential.rootHash), + credential.rootHash + ) if (storedAttestation?.revoked === false) { console.info('Attestation verified with chain') } else { diff --git a/yarn.lock b/yarn.lock index ce250d9d1..9d24b9bd9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1311,6 +1311,7 @@ __metadata: "@polkadot/api": ^9.0.0 "@polkadot/keyring": ^10.0.0 "@polkadot/types": ^9.0.0 + "@polkadot/types-codec": 9.1.1 "@polkadot/util": ^10.0.0 "@polkadot/util-crypto": ^10.0.0 cbor: ^8.0.2 From faf4b180a6a4a99b1bf5cfd88f696b7386d7fa79 Mon Sep 17 00:00:00 2001 From: Github Action Date: Thu, 15 Sep 2022 16:22:49 +0000 Subject: [PATCH 06/36] [CI Skip] ci: publish prerelease --- package.json | 2 +- packages/augment-api/package.json | 2 +- packages/chain-helpers/package.json | 2 +- packages/config/package.json | 2 +- packages/core/package.json | 2 +- packages/did/package.json | 2 +- packages/messaging/package.json | 2 +- packages/sdk-js/package.json | 2 +- packages/testing/package.json | 2 +- packages/types/package.json | 2 +- packages/utils/package.json | 2 +- packages/vc-export/package.json | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index 598ec4e1a..3c83f1741 100644 --- a/package.json +++ b/package.json @@ -68,6 +68,6 @@ "typedoc": "^0.22.15", "typescript": "^4.5.4" }, - "version": "0.30.0-2", + "version": "0.30.0-3", "packageManager": "yarn@3.0.2" } diff --git a/packages/augment-api/package.json b/packages/augment-api/package.json index 0a1e0316d..2aaf39a7f 100644 --- a/packages/augment-api/package.json +++ b/packages/augment-api/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/augment-api", - "version": "0.30.0-2", + "version": "0.30.0-3", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/chain-helpers/package.json b/packages/chain-helpers/package.json index 3c86b1fe9..6104759f9 100644 --- a/packages/chain-helpers/package.json +++ b/packages/chain-helpers/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/chain-helpers", - "version": "0.30.0-2", + "version": "0.30.0-3", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/config/package.json b/packages/config/package.json index f31d18dab..b032054ac 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/config", - "version": "0.30.0-2", + "version": "0.30.0-3", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/core/package.json b/packages/core/package.json index a9c20fd36..79d83a255 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/core", - "version": "0.30.0-2", + "version": "0.30.0-3", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/did/package.json b/packages/did/package.json index 6a67d950c..7c92d3b0b 100644 --- a/packages/did/package.json +++ b/packages/did/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/did", - "version": "0.30.0-2", + "version": "0.30.0-3", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/messaging/package.json b/packages/messaging/package.json index 94d02377e..c4b2eac07 100644 --- a/packages/messaging/package.json +++ b/packages/messaging/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/messaging", - "version": "0.30.0-2", + "version": "0.30.0-3", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/sdk-js/package.json b/packages/sdk-js/package.json index 921950d37..f69013237 100644 --- a/packages/sdk-js/package.json +++ b/packages/sdk-js/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/sdk-js", - "version": "0.30.0-2", + "version": "0.30.0-3", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/testing/package.json b/packages/testing/package.json index ec6e008d3..c325e5236 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -1,7 +1,7 @@ { "name": "@kiltprotocol/testing", "private": true, - "version": "0.30.0-2", + "version": "0.30.0-3", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/types/package.json b/packages/types/package.json index 8aa80977c..330b8a799 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/types", - "version": "0.30.0-2", + "version": "0.30.0-3", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/utils/package.json b/packages/utils/package.json index 2aa761eb0..2d27f9b7d 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/utils", - "version": "0.30.0-2", + "version": "0.30.0-3", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/vc-export/package.json b/packages/vc-export/package.json index bef2586a3..8d40edd3c 100644 --- a/packages/vc-export/package.json +++ b/packages/vc-export/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/vc-export", - "version": "0.30.0-2", + "version": "0.30.0-3", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", From e1edbc3daa11062c3d173e5ba7b76f84cc14c945 Mon Sep 17 00:00:00 2001 From: Raphael Flechtner Date: Fri, 16 Sep 2022 10:13:48 +0200 Subject: [PATCH 07/36] chore: do not pin types-codec --- packages/did/package.json | 2 +- yarn.lock | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/did/package.json b/packages/did/package.json index 7c92d3b0b..223f7cbf2 100644 --- a/packages/did/package.json +++ b/packages/did/package.json @@ -42,7 +42,7 @@ "@polkadot/api": "^9.0.0", "@polkadot/keyring": "^10.0.0", "@polkadot/types": "^9.0.0", - "@polkadot/types-codec": "9.1.1", + "@polkadot/types-codec": "^9.0.0", "@polkadot/util": "^10.0.0", "@polkadot/util-crypto": "^10.0.0", "cbor": "^8.0.2" diff --git a/yarn.lock b/yarn.lock index 9d24b9bd9..c9b687dec 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1311,7 +1311,7 @@ __metadata: "@polkadot/api": ^9.0.0 "@polkadot/keyring": ^10.0.0 "@polkadot/types": ^9.0.0 - "@polkadot/types-codec": 9.1.1 + "@polkadot/types-codec": ^9.0.0 "@polkadot/util": ^10.0.0 "@polkadot/util-crypto": ^10.0.0 cbor: ^8.0.2 @@ -1726,7 +1726,7 @@ __metadata: languageName: node linkType: hard -"@polkadot/types-codec@npm:9.1.1": +"@polkadot/types-codec@npm:9.1.1, @polkadot/types-codec@npm:^9.0.0": version: 9.1.1 resolution: "@polkadot/types-codec@npm:9.1.1" dependencies: From 716e640513665d05c7087e6f771feca1187feb81 Mon Sep 17 00:00:00 2001 From: Github Action Date: Fri, 16 Sep 2022 08:17:57 +0000 Subject: [PATCH 08/36] [CI Skip] ci: publish prerelease --- package.json | 2 +- packages/augment-api/package.json | 2 +- packages/chain-helpers/package.json | 2 +- packages/config/package.json | 2 +- packages/core/package.json | 2 +- packages/did/package.json | 2 +- packages/messaging/package.json | 2 +- packages/sdk-js/package.json | 2 +- packages/testing/package.json | 2 +- packages/types/package.json | 2 +- packages/utils/package.json | 2 +- packages/vc-export/package.json | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index 3c83f1741..b50712878 100644 --- a/package.json +++ b/package.json @@ -68,6 +68,6 @@ "typedoc": "^0.22.15", "typescript": "^4.5.4" }, - "version": "0.30.0-3", + "version": "0.30.0-4", "packageManager": "yarn@3.0.2" } diff --git a/packages/augment-api/package.json b/packages/augment-api/package.json index 2aaf39a7f..6ca3e2a74 100644 --- a/packages/augment-api/package.json +++ b/packages/augment-api/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/augment-api", - "version": "0.30.0-3", + "version": "0.30.0-4", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/chain-helpers/package.json b/packages/chain-helpers/package.json index 6104759f9..c34ee1eae 100644 --- a/packages/chain-helpers/package.json +++ b/packages/chain-helpers/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/chain-helpers", - "version": "0.30.0-3", + "version": "0.30.0-4", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/config/package.json b/packages/config/package.json index b032054ac..742e020a6 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/config", - "version": "0.30.0-3", + "version": "0.30.0-4", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/core/package.json b/packages/core/package.json index 79d83a255..445f8c7c1 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/core", - "version": "0.30.0-3", + "version": "0.30.0-4", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/did/package.json b/packages/did/package.json index 223f7cbf2..37a8ff0c4 100644 --- a/packages/did/package.json +++ b/packages/did/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/did", - "version": "0.30.0-3", + "version": "0.30.0-4", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/messaging/package.json b/packages/messaging/package.json index c4b2eac07..42ab62579 100644 --- a/packages/messaging/package.json +++ b/packages/messaging/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/messaging", - "version": "0.30.0-3", + "version": "0.30.0-4", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/sdk-js/package.json b/packages/sdk-js/package.json index f69013237..3888788dc 100644 --- a/packages/sdk-js/package.json +++ b/packages/sdk-js/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/sdk-js", - "version": "0.30.0-3", + "version": "0.30.0-4", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/testing/package.json b/packages/testing/package.json index c325e5236..000e5ca4f 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -1,7 +1,7 @@ { "name": "@kiltprotocol/testing", "private": true, - "version": "0.30.0-3", + "version": "0.30.0-4", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/types/package.json b/packages/types/package.json index 330b8a799..824f34663 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/types", - "version": "0.30.0-3", + "version": "0.30.0-4", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/utils/package.json b/packages/utils/package.json index 2d27f9b7d..dc71fe5df 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/utils", - "version": "0.30.0-3", + "version": "0.30.0-4", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/vc-export/package.json b/packages/vc-export/package.json index 8d40edd3c..e7f4c9d8e 100644 --- a/packages/vc-export/package.json +++ b/packages/vc-export/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/vc-export", - "version": "0.30.0-3", + "version": "0.30.0-4", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", From df448dbf442ec69aa7ef323df31e438854819459 Mon Sep 17 00:00:00 2001 From: Tom Adler Date: Fri, 16 Sep 2022 14:33:04 +0200 Subject: [PATCH 09/36] feat: Did.uriFromChain and encode replaces type cast (#633) --- packages/core/src/attestation/Attestation.chain.ts | 12 +++--------- packages/core/src/ctype/CType.chain.ts | 6 +++--- packages/core/src/delegation/DelegationDecoder.ts | 7 ++----- packages/did/src/Did.chain.ts | 14 ++++++++------ packages/did/src/DidLinks/AccountLinks.chain.ts | 6 +++--- packages/did/src/DidLinks/Web3Names.chain.ts | 8 +++----- 6 files changed, 22 insertions(+), 31 deletions(-) diff --git a/packages/core/src/attestation/Attestation.chain.ts b/packages/core/src/attestation/Attestation.chain.ts index d5ff3fd66..23bb19857 100644 --- a/packages/core/src/attestation/Attestation.chain.ts +++ b/packages/core/src/attestation/Attestation.chain.ts @@ -6,13 +6,9 @@ */ import type { Option } from '@polkadot/types' -import type { - IAttestation, - ICredential, - KiltAddress, -} from '@kiltprotocol/types' +import type { IAttestation, ICredential } from '@kiltprotocol/types' import { ConfigService } from '@kiltprotocol/config' -import { Utils as DidUtils } from '@kiltprotocol/did' +import { Chain as DidChain } from '@kiltprotocol/did' import type { AttestationAttestationsAttestationDetails } from '@kiltprotocol/augment-api' const log = ConfigService.LoggingFactory.getLogger('Attestation') @@ -35,9 +31,7 @@ export function fromChain( const attestation: IAttestation = { claimHash, cTypeHash: chainAttestation.ctypeHash.toHex(), - owner: DidUtils.getFullDidUri( - chainAttestation.attester.toString() as KiltAddress - ), + owner: DidChain.uriFromChain(chainAttestation.attester), delegationId: delegationId || null, revoked: chainAttestation.revoked.valueOf(), } diff --git a/packages/core/src/ctype/CType.chain.ts b/packages/core/src/ctype/CType.chain.ts index ce2d54937..a187d2cf7 100644 --- a/packages/core/src/ctype/CType.chain.ts +++ b/packages/core/src/ctype/CType.chain.ts @@ -9,8 +9,8 @@ import type { Option } from '@polkadot/types' import type { AccountId } from '@polkadot/types/interfaces' import { Crypto } from '@kiltprotocol/utils' -import type { DidUri, ICType, KiltAddress } from '@kiltprotocol/types' -import { Utils as DidUtils } from '@kiltprotocol/did' +import type { DidUri, ICType } from '@kiltprotocol/types' +import { Chain as DidChain } from '@kiltprotocol/did' import { getSchemaPropertiesForHash } from './CType.js' @@ -31,5 +31,5 @@ export function toChain(ctype: ICType): string { * @returns The owner DID. */ export function fromChain(encoded: Option): DidUri { - return DidUtils.getFullDidUri(encoded.unwrap().toString() as KiltAddress) + return DidChain.uriFromChain(encoded.unwrap()) } diff --git a/packages/core/src/delegation/DelegationDecoder.ts b/packages/core/src/delegation/DelegationDecoder.ts index 85cd4fc9c..2adb8caf7 100644 --- a/packages/core/src/delegation/DelegationDecoder.ts +++ b/packages/core/src/delegation/DelegationDecoder.ts @@ -18,12 +18,11 @@ import type { IDelegationNode, IDelegationHierarchyDetails, - KiltAddress, } from '@kiltprotocol/types' import { Permission, PermissionType } from '@kiltprotocol/types' import type { Option } from '@polkadot/types' import type { Hash } from '@polkadot/types/interfaces/runtime' -import { Utils as DidUtils } from '@kiltprotocol/did' +import { Chain as DidChain } from '@kiltprotocol/did' import type { DelegationDelegationHierarchyDelegationHierarchyDetails, DelegationDelegationHierarchyDelegationNode, @@ -94,9 +93,7 @@ export function delegationNodeFromChain( ? delegationNode.parent.toHex() : undefined, childrenIds: [...delegationNode.children].map((id) => id.toHex()), - account: DidUtils.getFullDidUri( - delegationNode.details.owner.toString() as KiltAddress - ), + account: DidChain.uriFromChain(delegationNode.details.owner), permissions: permissionsFromChain(delegationNode.details.permissions), revoked: delegationNode.details.revoked.valueOf(), } diff --git a/packages/did/src/Did.chain.ts b/packages/did/src/Did.chain.ts index 4d2ca3086..da14b1ea5 100644 --- a/packages/did/src/Did.chain.ts +++ b/packages/did/src/Did.chain.ts @@ -6,7 +6,7 @@ */ import type { Option } from '@polkadot/types' -import type { Extrinsic, Hash } from '@polkadot/types/interfaces' +import type { AccountId32, Extrinsic, Hash } from '@polkadot/types/interfaces' import type { AnyNumber } from '@polkadot/types/types' import { BN, hexToU8a } from '@polkadot/util' import type { ApiPromise } from '@polkadot/api' @@ -48,6 +48,7 @@ import { EncodedSignature, EncodedVerificationKey, getAddressByKey, + getFullDidUri, keyTypeForSignatureAlg, parseDidUri, signatureAlgForKeyType, @@ -71,7 +72,7 @@ export function resourceIdToChain(id: UriFragment): string { export function depositFromChain(deposit: KiltSupportDeposit): Deposit { return { - owner: deposit.owner.toString() as KiltAddress, + owner: Crypto.encodeAddress(deposit.owner, ss58Format), amount: deposit.amount.toBn(), } } @@ -114,6 +115,10 @@ function didPublicKeyDetailsFromChain( } } +export function uriFromChain(encoded: AccountId32): DidUri { + return getFullDidUri(Crypto.encodeAddress(encoded, ss58Format)) +} + export function didFromChain(encoded: Option): EncodedDid { const { publicKeys, @@ -139,10 +144,7 @@ export function didFromChain(encoded: Option): EncodedDid { const didRecord: EncodedDid = { authentication: [authentication], lastTxCounter: lastTxCounter.toBn(), - deposit: { - amount: deposit.amount.toBn(), - owner: deposit.owner.toString() as KiltAddress, - }, + deposit: depositFromChain(deposit), } if (attestationKey.isSome) { const key = keys[attestationKey.unwrap().toHex()] as DidVerificationKey diff --git a/packages/did/src/DidLinks/AccountLinks.chain.ts b/packages/did/src/DidLinks/AccountLinks.chain.ts index 908e2fcca..a92a6f29f 100644 --- a/packages/did/src/DidLinks/AccountLinks.chain.ts +++ b/packages/did/src/DidLinks/AccountLinks.chain.ts @@ -31,9 +31,9 @@ import type { Deposit, DidUri, KiltAddress } from '@kiltprotocol/types' import type { PalletDidLookupConnectionRecord } from '@kiltprotocol/augment-api' import { ConfigService } from '@kiltprotocol/config' -import { EncodedSignature, getFullDidUri } from '../Did.utils.js' +import { EncodedSignature } from '../Did.utils.js' import { Web3Name, web3NameFromChain } from './Web3Names.chain.js' -import { depositFromChain, didToChain } from '../Did.chain.js' +import { depositFromChain, didToChain, uriFromChain } from '../Did.chain.js' /// A chain-agnostic address, which can be encoded using any network prefix. export type SubstrateAddress = KeyringPair['address'] @@ -125,7 +125,7 @@ export function connectedDidFromChain( } { const { did, deposit } = encoded.unwrap() return { - did: getFullDidUri(did.toString() as KiltAddress), + did: uriFromChain(did), deposit: depositFromChain(deposit), } } diff --git a/packages/did/src/DidLinks/Web3Names.chain.ts b/packages/did/src/DidLinks/Web3Names.chain.ts index 739085f88..361121726 100644 --- a/packages/did/src/DidLinks/Web3Names.chain.ts +++ b/packages/did/src/DidLinks/Web3Names.chain.ts @@ -7,11 +7,9 @@ import { PalletWeb3NamesWeb3NameWeb3NameOwnership } from '@polkadot/types/lookup' import type { Bytes, Option } from '@polkadot/types-codec' -import type { Deposit, DidUri, KiltAddress } from '@kiltprotocol/types' +import type { Deposit, DidUri } from '@kiltprotocol/types' import type { BN } from '@polkadot/util' - -import * as DidUtils from '../Did.utils.js' -import { depositFromChain } from '../Did.chain.js' +import { depositFromChain, uriFromChain } from '../Did.chain.js' /** * Web3Name is the type of a nickname for a DID. @@ -43,7 +41,7 @@ export function web3NameOwnerFromChain( } { const { owner, deposit, claimedAt } = encoded.unwrap() return { - owner: DidUtils.getFullDidUri(owner.toString() as KiltAddress), + owner: uriFromChain(owner), deposit: depositFromChain(deposit), claimedAt: claimedAt.toBn(), } From e3a55b2260e797303cd82c2c6915af8137849ea7 Mon Sep 17 00:00:00 2001 From: Github Action Date: Fri, 16 Sep 2022 12:37:11 +0000 Subject: [PATCH 10/36] [CI Skip] ci: publish prerelease --- package.json | 2 +- packages/augment-api/package.json | 2 +- packages/chain-helpers/package.json | 2 +- packages/config/package.json | 2 +- packages/core/package.json | 2 +- packages/did/package.json | 2 +- packages/messaging/package.json | 2 +- packages/sdk-js/package.json | 2 +- packages/testing/package.json | 2 +- packages/types/package.json | 2 +- packages/utils/package.json | 2 +- packages/vc-export/package.json | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index b50712878..15eb357da 100644 --- a/package.json +++ b/package.json @@ -68,6 +68,6 @@ "typedoc": "^0.22.15", "typescript": "^4.5.4" }, - "version": "0.30.0-4", + "version": "0.30.0-5", "packageManager": "yarn@3.0.2" } diff --git a/packages/augment-api/package.json b/packages/augment-api/package.json index 6ca3e2a74..a37d1be7b 100644 --- a/packages/augment-api/package.json +++ b/packages/augment-api/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/augment-api", - "version": "0.30.0-4", + "version": "0.30.0-5", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/chain-helpers/package.json b/packages/chain-helpers/package.json index c34ee1eae..b1a7db626 100644 --- a/packages/chain-helpers/package.json +++ b/packages/chain-helpers/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/chain-helpers", - "version": "0.30.0-4", + "version": "0.30.0-5", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/config/package.json b/packages/config/package.json index 742e020a6..05c1cc61c 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/config", - "version": "0.30.0-4", + "version": "0.30.0-5", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/core/package.json b/packages/core/package.json index 445f8c7c1..f405a8821 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/core", - "version": "0.30.0-4", + "version": "0.30.0-5", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/did/package.json b/packages/did/package.json index 37a8ff0c4..8d46a3eb9 100644 --- a/packages/did/package.json +++ b/packages/did/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/did", - "version": "0.30.0-4", + "version": "0.30.0-5", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/messaging/package.json b/packages/messaging/package.json index 42ab62579..f9c25e91d 100644 --- a/packages/messaging/package.json +++ b/packages/messaging/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/messaging", - "version": "0.30.0-4", + "version": "0.30.0-5", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/sdk-js/package.json b/packages/sdk-js/package.json index 3888788dc..6c9f618dd 100644 --- a/packages/sdk-js/package.json +++ b/packages/sdk-js/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/sdk-js", - "version": "0.30.0-4", + "version": "0.30.0-5", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/testing/package.json b/packages/testing/package.json index 000e5ca4f..f24f1ec20 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -1,7 +1,7 @@ { "name": "@kiltprotocol/testing", "private": true, - "version": "0.30.0-4", + "version": "0.30.0-5", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/types/package.json b/packages/types/package.json index 824f34663..24a77123d 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/types", - "version": "0.30.0-4", + "version": "0.30.0-5", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/utils/package.json b/packages/utils/package.json index dc71fe5df..f7cca8a13 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/utils", - "version": "0.30.0-4", + "version": "0.30.0-5", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/vc-export/package.json b/packages/vc-export/package.json index e7f4c9d8e..0ddf88f18 100644 --- a/packages/vc-export/package.json +++ b/packages/vc-export/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/vc-export", - "version": "0.30.0-4", + "version": "0.30.0-5", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", From 98fea77ba8fe75dca3d85e74c2c922c379b749ae Mon Sep 17 00:00:00 2001 From: Tom Adler Date: Fri, 16 Sep 2022 14:56:53 +0200 Subject: [PATCH 11/36] feat: avoid .hash().isEmpty (#634) --- .../AccountLinking.spec.ts | 90 ++++++++----------- .../core/src/__integrationtests__/Did.spec.ts | 12 +-- .../did/src/DidResolver/DidResolver.spec.ts | 4 +- packages/did/src/DidResolver/DidResolver.ts | 5 +- packages/testing/src/mocks/mockedApi.ts | 8 +- 5 files changed, 49 insertions(+), 70 deletions(-) diff --git a/packages/core/src/__integrationtests__/AccountLinking.spec.ts b/packages/core/src/__integrationtests__/AccountLinking.spec.ts index e9c6e5d41..0e77eee73 100644 --- a/packages/core/src/__integrationtests__/AccountLinking.spec.ts +++ b/packages/core/src/__integrationtests__/AccountLinking.spec.ts @@ -74,11 +74,11 @@ describe('When there is an on-chain DID', () => { ).toStrictEqual([]) expect( ( - await api.query.didLookup.connectedAccounts.hash( + await api.query.didLookup.connectedAccounts( didChain, paymentAccountChain ) - ).isEmpty + ).isNone ).toBe(true) const associateSenderTx = api.tx.didLookup.associateSender() @@ -116,12 +116,12 @@ describe('When there is an on-chain DID', () => { ]) expect( ( - await api.query.didLookup.connectedAccounts.hash( + await api.query.didLookup.connectedAccounts( didChain, paymentAccountChain ) - ).isEmpty - ).toBe(false) + ).isSome + ).toBe(true) }, 30_000) it('should be possible to associate the tx sender to a new DID', async () => { const associateSenderTx = api.tx.didLookup.associateSender() @@ -155,11 +155,11 @@ describe('When there is an on-chain DID', () => { ).toStrictEqual([]) expect( ( - await api.query.didLookup.connectedAccounts.hash( + await api.query.didLookup.connectedAccounts( didChain, paymentAccountChain ) - ).isEmpty + ).isNone ).toBe(true) // Check that new DID has the account linked const encoded = await api.query.didLookup.connectedAccounts.keys( @@ -170,12 +170,12 @@ describe('When there is an on-chain DID', () => { ]) expect( ( - await api.query.didLookup.connectedAccounts.hash( + await api.query.didLookup.connectedAccounts( newDidChain, paymentAccountChain ) - ).isEmpty - ).toBe(false) + ).isSome + ).toBe(true) }, 30_000) it('should be possible for the sender to remove the link', async () => { const removeSenderTx = api.tx.didLookup.removeSenderAssociation() @@ -199,11 +199,11 @@ describe('When there is an on-chain DID', () => { ).toStrictEqual([]) expect( ( - await api.query.didLookup.connectedAccounts.hash( + await api.query.didLookup.connectedAccounts( didChain, paymentAccountChain ) - ).isEmpty + ).isNone ).toBe(true) }) }) @@ -279,20 +279,16 @@ describe('When there is an on-chain DID', () => { ]) expect( ( - await api.query.didLookup.connectedAccounts.hash( + await api.query.didLookup.connectedAccounts( didChain, paymentAccountChain ) - ).isEmpty + ).isNone ).toBe(true) expect( - ( - await api.query.didLookup.connectedAccounts.hash( - didChain, - keypairChain - ) - ).isEmpty - ).toBe(false) + (await api.query.didLookup.connectedAccounts(didChain, keypairChain)) + .isSome + ).toBe(true) }) it('should be possible to associate the account to a new DID while the sender pays the deposit', async () => { const linkAuthorization = @@ -332,19 +328,15 @@ describe('When there is an on-chain DID', () => { ).toStrictEqual([]) expect( ( - await api.query.didLookup.connectedAccounts.hash( + await api.query.didLookup.connectedAccounts( didChain, paymentAccountChain ) - ).isEmpty + ).isNone ).toBe(true) expect( - ( - await api.query.didLookup.connectedAccounts.hash( - didChain, - keypairChain - ) - ).isEmpty + (await api.query.didLookup.connectedAccounts(didChain, keypairChain)) + .isNone ).toBe(true) // Check that new DID has the account linked const encoded = await api.query.didLookup.connectedAccounts.keys( @@ -355,20 +347,20 @@ describe('When there is an on-chain DID', () => { ]) expect( ( - await api.query.didLookup.connectedAccounts.hash( + await api.query.didLookup.connectedAccounts( newDidChain, paymentAccountChain ) - ).isEmpty + ).isNone ).toBe(true) expect( ( - await api.query.didLookup.connectedAccounts.hash( + await api.query.didLookup.connectedAccounts( newDidChain, keypairChain ) - ).isEmpty - ).toBe(false) + ).isSome + ).toBe(true) }) it('should be possible for the DID to remove the link', async () => { const removeLinkTx = await api.tx.didLookup.removeAccountAssociation( @@ -404,19 +396,15 @@ describe('When there is an on-chain DID', () => { ).toStrictEqual([]) expect( ( - await api.query.didLookup.connectedAccounts.hash( + await api.query.didLookup.connectedAccounts( didChain, paymentAccountChain ) - ).isEmpty + ).isNone ).toBe(true) expect( - ( - await api.query.didLookup.connectedAccounts.hash( - didChain, - keypairChain - ) - ).isEmpty + (await api.query.didLookup.connectedAccounts(didChain, keypairChain)) + .isNone ).toBe(true) }) } @@ -487,20 +475,20 @@ describe('When there is an on-chain DID', () => { ).toStrictEqual([genericAccount.address]) expect( ( - await api.query.didLookup.connectedAccounts.hash( + await api.query.didLookup.connectedAccounts( didChain, paymentAccountChain ) - ).isEmpty + ).isNone ).toBe(true) expect( ( - await api.query.didLookup.connectedAccounts.hash( + await api.query.didLookup.connectedAccounts( didChain, genericAccountChain ) - ).isEmpty - ).toBe(false) + ).isSome + ).toBe(true) }) it('should be possible to add a Web3 name for the linked DID and retrieve it starting from the linked account', async () => { @@ -551,19 +539,19 @@ describe('When there is an on-chain DID', () => { ).toStrictEqual([]) expect( ( - await api.query.didLookup.connectedAccounts.hash( + await api.query.didLookup.connectedAccounts( didChain, paymentAccountChain ) - ).isEmpty + ).isNone ).toBe(true) expect( ( - await api.query.didLookup.connectedAccounts.hash( + await api.query.didLookup.connectedAccounts( didChain, genericAccountChain ) - ).isEmpty + ).isNone ).toBe(true) }) }) diff --git a/packages/core/src/__integrationtests__/Did.spec.ts b/packages/core/src/__integrationtests__/Did.spec.ts index 4aef30b9f..f44c3b352 100644 --- a/packages/core/src/__integrationtests__/Did.spec.ts +++ b/packages/core/src/__integrationtests__/Did.spec.ts @@ -213,18 +213,14 @@ describe('write and didDeleteTx', () => { ) // Check that DID is not blacklisted. - expect((await api.query.did.didBlacklist.hash(encodedDid)).isEmpty).toBe( - true - ) + expect((await api.query.did.didBlacklist(encodedDid)).isNone).toBe(true) await submitExtrinsic(submittable, paymentAccount) expect((await api.query.did.did(encodedDid)).isNone).toBe(true) // Check that DID is now blacklisted. - expect((await api.query.did.didBlacklist.hash(encodedDid)).isEmpty).toBe( - false - ) + expect((await api.query.did.didBlacklist(encodedDid)).isSome).toBe(true) }, 60_000) }) @@ -486,9 +482,7 @@ describe('DID migration', () => { expect( await Did.Chain.queryServiceEndpoints(migratedFullDid.uri) ).toStrictEqual([]) - expect((await api.query.did.didBlacklist.hash(encodedDid)).isEmpty).toBe( - false - ) + expect((await api.query.did.didBlacklist(encodedDid)).isSome).toBe(true) }, 60_000) }) diff --git a/packages/did/src/DidResolver/DidResolver.spec.ts b/packages/did/src/DidResolver/DidResolver.spec.ts index 1442d9564..cd13255d0 100644 --- a/packages/did/src/DidResolver/DidResolver.spec.ts +++ b/packages/did/src/DidResolver/DidResolver.spec.ts @@ -339,7 +339,7 @@ describe('When resolving a full DID', () => { it('correctly resolves a deleted DID', async () => { mockedApi.query.did.did.mockReturnValueOnce(didNotFound) - mockedApi.query.did.didBlacklist.hash.mockReturnValueOnce(didIsBlacklisted) + mockedApi.query.did.didBlacklist.mockReturnValueOnce(didIsBlacklisted) const { document, metadata } = (await resolve( deletedDid @@ -472,7 +472,7 @@ describe('When resolving a light DID', () => { }) it('correctly resolves a migrated and deleted DID', async () => { - mockedApi.query.did.didBlacklist.hash.mockReturnValueOnce(didIsBlacklisted) + mockedApi.query.did.didBlacklist.mockReturnValueOnce(didIsBlacklisted) const migratedDid: DidUri = `did:kilt:light:00${deletedAddress}` const { document, metadata } = (await resolve( diff --git a/packages/did/src/DidResolver/DidResolver.ts b/packages/did/src/DidResolver/DidResolver.ts index 7498bc96b..1176a5110 100644 --- a/packages/did/src/DidResolver/DidResolver.ts +++ b/packages/did/src/DidResolver/DidResolver.ts @@ -50,9 +50,8 @@ export async function resolve( // If the full DID has been deleted (or the light DID was upgraded and deleted), // return the info in the resolution metadata. - const isFullDidDeleted = !( - await api.query.did.didBlacklist.hash(didToChain(did)) - ).isEmpty + const isFullDidDeleted = (await api.query.did.didBlacklist(didToChain(did))) + .isSome if (isFullDidDeleted) { return { // No canonicalId and no details are returned as we consider this DID deactivated/deleted. diff --git a/packages/testing/src/mocks/mockedApi.ts b/packages/testing/src/mocks/mockedApi.ts index 70f5afd0d..1e31b0e64 100644 --- a/packages/testing/src/mocks/mockedApi.ts +++ b/packages/testing/src/mocks/mockedApi.ts @@ -349,11 +349,9 @@ export function getMockedApi(): MockApiPromise { serviceEndpoints: jest.fn(async () => mockChainQueryReturn('did', 'serviceEndpoints') ), - didBlacklist: { - hash: jest - .fn() - .mockReturnValue(mockChainQueryReturn('did', 'didBlacklist')), - }, + didBlacklist: jest + .fn() + .mockReturnValue(mockChainQueryReturn('did', 'didBlacklist')), }, portablegabi: { accumulatorList: jest.fn((address: string, index: number) => From a117b5af4fe56f0f4cbd34b5ba3856ff3ee5f260 Mon Sep 17 00:00:00 2001 From: Github Action Date: Fri, 16 Sep 2022 13:01:47 +0000 Subject: [PATCH 12/36] [CI Skip] ci: publish prerelease --- package.json | 2 +- packages/augment-api/package.json | 2 +- packages/chain-helpers/package.json | 2 +- packages/config/package.json | 2 +- packages/core/package.json | 2 +- packages/did/package.json | 2 +- packages/messaging/package.json | 2 +- packages/sdk-js/package.json | 2 +- packages/testing/package.json | 2 +- packages/types/package.json | 2 +- packages/utils/package.json | 2 +- packages/vc-export/package.json | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index 15eb357da..7bf6e3bf5 100644 --- a/package.json +++ b/package.json @@ -68,6 +68,6 @@ "typedoc": "^0.22.15", "typescript": "^4.5.4" }, - "version": "0.30.0-5", + "version": "0.30.0-6", "packageManager": "yarn@3.0.2" } diff --git a/packages/augment-api/package.json b/packages/augment-api/package.json index a37d1be7b..5bbd0de86 100644 --- a/packages/augment-api/package.json +++ b/packages/augment-api/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/augment-api", - "version": "0.30.0-5", + "version": "0.30.0-6", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/chain-helpers/package.json b/packages/chain-helpers/package.json index b1a7db626..0b55bcfdf 100644 --- a/packages/chain-helpers/package.json +++ b/packages/chain-helpers/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/chain-helpers", - "version": "0.30.0-5", + "version": "0.30.0-6", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/config/package.json b/packages/config/package.json index 05c1cc61c..a28dc3c66 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/config", - "version": "0.30.0-5", + "version": "0.30.0-6", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/core/package.json b/packages/core/package.json index f405a8821..ba0408689 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/core", - "version": "0.30.0-5", + "version": "0.30.0-6", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/did/package.json b/packages/did/package.json index 8d46a3eb9..b524aa548 100644 --- a/packages/did/package.json +++ b/packages/did/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/did", - "version": "0.30.0-5", + "version": "0.30.0-6", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/messaging/package.json b/packages/messaging/package.json index f9c25e91d..8ffe2c0f1 100644 --- a/packages/messaging/package.json +++ b/packages/messaging/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/messaging", - "version": "0.30.0-5", + "version": "0.30.0-6", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/sdk-js/package.json b/packages/sdk-js/package.json index 6c9f618dd..9817e8356 100644 --- a/packages/sdk-js/package.json +++ b/packages/sdk-js/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/sdk-js", - "version": "0.30.0-5", + "version": "0.30.0-6", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/testing/package.json b/packages/testing/package.json index f24f1ec20..dfa92be38 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -1,7 +1,7 @@ { "name": "@kiltprotocol/testing", "private": true, - "version": "0.30.0-5", + "version": "0.30.0-6", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/types/package.json b/packages/types/package.json index 24a77123d..f2a8b14d0 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/types", - "version": "0.30.0-5", + "version": "0.30.0-6", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/utils/package.json b/packages/utils/package.json index f7cca8a13..226d86db4 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/utils", - "version": "0.30.0-5", + "version": "0.30.0-6", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/vc-export/package.json b/packages/vc-export/package.json index 0ddf88f18..5a11f068f 100644 --- a/packages/vc-export/package.json +++ b/packages/vc-export/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/vc-export", - "version": "0.30.0-5", + "version": "0.30.0-6", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", From fd37610fa536c086d678a0c948e8e21085c28c89 Mon Sep 17 00:00:00 2001 From: Antonio Date: Mon, 19 Sep 2022 09:05:05 +0200 Subject: [PATCH 13/36] fix: update type of published credential and export constant (#635) Update type and export constant --- packages/types/src/Credential.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/types/src/Credential.ts b/packages/types/src/Credential.ts index ea87e986e..38a462eb1 100644 --- a/packages/types/src/Credential.ts +++ b/packages/types/src/Credential.ts @@ -31,7 +31,7 @@ export interface ICredentialPresentation extends ICredential { } export interface KiltPublishedCredentialV1 { - credential: ICredentialPresentation + credential: ICredential metadata?: { label?: string blockNumber?: number @@ -40,3 +40,6 @@ export interface KiltPublishedCredentialV1 { } export type KiltPublishedCredentialCollectionV1 = KiltPublishedCredentialV1[] + +export const KiltPublishedCredentialCollectionV1Type = + 'KiltPublishedCredentialCollectionV1' From c8df116f2b28790c941e2fb9d523bd23909b4f8e Mon Sep 17 00:00:00 2001 From: Github Action Date: Mon, 19 Sep 2022 07:08:58 +0000 Subject: [PATCH 14/36] [CI Skip] ci: publish prerelease --- package.json | 2 +- packages/augment-api/package.json | 2 +- packages/chain-helpers/package.json | 2 +- packages/config/package.json | 2 +- packages/core/package.json | 2 +- packages/did/package.json | 2 +- packages/messaging/package.json | 2 +- packages/sdk-js/package.json | 2 +- packages/testing/package.json | 2 +- packages/types/package.json | 2 +- packages/utils/package.json | 2 +- packages/vc-export/package.json | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index 7bf6e3bf5..0cde083d6 100644 --- a/package.json +++ b/package.json @@ -68,6 +68,6 @@ "typedoc": "^0.22.15", "typescript": "^4.5.4" }, - "version": "0.30.0-6", + "version": "0.30.0-7", "packageManager": "yarn@3.0.2" } diff --git a/packages/augment-api/package.json b/packages/augment-api/package.json index 5bbd0de86..acceb0501 100644 --- a/packages/augment-api/package.json +++ b/packages/augment-api/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/augment-api", - "version": "0.30.0-6", + "version": "0.30.0-7", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/chain-helpers/package.json b/packages/chain-helpers/package.json index 0b55bcfdf..ac867673d 100644 --- a/packages/chain-helpers/package.json +++ b/packages/chain-helpers/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/chain-helpers", - "version": "0.30.0-6", + "version": "0.30.0-7", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/config/package.json b/packages/config/package.json index a28dc3c66..0c9b15fae 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/config", - "version": "0.30.0-6", + "version": "0.30.0-7", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/core/package.json b/packages/core/package.json index ba0408689..f158d7d36 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/core", - "version": "0.30.0-6", + "version": "0.30.0-7", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/did/package.json b/packages/did/package.json index b524aa548..ebaab8dbc 100644 --- a/packages/did/package.json +++ b/packages/did/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/did", - "version": "0.30.0-6", + "version": "0.30.0-7", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/messaging/package.json b/packages/messaging/package.json index 8ffe2c0f1..e77940234 100644 --- a/packages/messaging/package.json +++ b/packages/messaging/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/messaging", - "version": "0.30.0-6", + "version": "0.30.0-7", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/sdk-js/package.json b/packages/sdk-js/package.json index 9817e8356..8872d8bed 100644 --- a/packages/sdk-js/package.json +++ b/packages/sdk-js/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/sdk-js", - "version": "0.30.0-6", + "version": "0.30.0-7", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/testing/package.json b/packages/testing/package.json index dfa92be38..ed25b277c 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -1,7 +1,7 @@ { "name": "@kiltprotocol/testing", "private": true, - "version": "0.30.0-6", + "version": "0.30.0-7", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/types/package.json b/packages/types/package.json index f2a8b14d0..2c6a0116f 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/types", - "version": "0.30.0-6", + "version": "0.30.0-7", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/utils/package.json b/packages/utils/package.json index 226d86db4..e59690cc7 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/utils", - "version": "0.30.0-6", + "version": "0.30.0-7", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/vc-export/package.json b/packages/vc-export/package.json index 5a11f068f..cbeec0cee 100644 --- a/packages/vc-export/package.json +++ b/packages/vc-export/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/vc-export", - "version": "0.30.0-6", + "version": "0.30.0-7", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", From 035f169ec688cb268c579e7ac82c3316590e40a1 Mon Sep 17 00:00:00 2001 From: Tom Adler Date: Mon, 19 Sep 2022 15:14:05 +0200 Subject: [PATCH 15/36] refactor!: remove more chain wrappers (#636) --- .../AccountLinking.spec.ts | 44 +- .../core/src/__integrationtests__/Did.spec.ts | 380 ++++-------------- packages/did/src/Did.chain.spec.ts | 26 +- packages/did/src/Did.chain.ts | 98 +---- packages/did/src/Did.utils.ts | 108 +---- .../did/src/DidDetails/FullDidDetails.spec.ts | 4 +- packages/did/src/DidDetails/FullDidDetails.ts | 6 +- .../src/DidDetails/LightDidDetails.utils.ts | 5 +- .../did/src/DidLinks/AccountLinks.chain.ts | 63 ++- .../did/src/DidResolver/DidResolver.spec.ts | 14 +- packages/did/src/DidResolver/DidResolver.ts | 4 +- 11 files changed, 171 insertions(+), 581 deletions(-) diff --git a/packages/core/src/__integrationtests__/AccountLinking.spec.ts b/packages/core/src/__integrationtests__/AccountLinking.spec.ts index 0e77eee73..84754a436 100644 --- a/packages/core/src/__integrationtests__/AccountLinking.spec.ts +++ b/packages/core/src/__integrationtests__/AccountLinking.spec.ts @@ -235,15 +235,14 @@ describe('When there is an on-chain DID', () => { }, 40_000) it('should be possible to associate the account while the sender pays the deposit', async () => { - const linkAuthorization = - await AccountLinks.getAuthorizeLinkWithAccountExtrinsic( - keypair.address, - did.uri, - sign - ) + const args = await AccountLinks.associateAccountToChainArgs( + keypair.address, + did.uri, + sign + ) const signedTx = await Did.authorizeExtrinsic( did, - linkAuthorization, + api.tx.didLookup.associateAccount(...args), didKey.sign, paymentAccount.address ) @@ -291,15 +290,14 @@ describe('When there is an on-chain DID', () => { ).toBe(true) }) it('should be possible to associate the account to a new DID while the sender pays the deposit', async () => { - const linkAuthorization = - await AccountLinks.getAuthorizeLinkWithAccountExtrinsic( - keypair.address, - newDid.uri, - sign - ) + const args = await AccountLinks.associateAccountToChainArgs( + keypair.address, + newDid.uri, + sign + ) const signedTx = await Did.authorizeExtrinsic( newDid, - linkAuthorization, + api.tx.didLookup.associateAccount(...args), newDidKey.sign, paymentAccount.address ) @@ -363,9 +361,8 @@ describe('When there is an on-chain DID', () => { ).toBe(true) }) it('should be possible for the DID to remove the link', async () => { - const removeLinkTx = await api.tx.didLookup.removeAccountAssociation( - keypairChain - ) + const removeLinkTx = + api.tx.didLookup.removeAccountAssociation(keypairChain) const signedTx = await Did.authorizeExtrinsic( newDid, removeLinkTx, @@ -432,15 +429,14 @@ describe('When there is an on-chain DID', () => { }, 40_000) it('should be possible to associate the account while the sender pays the deposit', async () => { - const linkAuthorization = - await AccountLinks.getAuthorizeLinkWithAccountExtrinsic( - genericAccount.address, - did.uri, - sign - ) + const args = await AccountLinks.associateAccountToChainArgs( + genericAccount.address, + did.uri, + sign + ) const signedTx = await Did.authorizeExtrinsic( did, - linkAuthorization, + api.tx.didLookup.associateAccount(...args), didKey.sign, paymentAccount.address ) diff --git a/packages/core/src/__integrationtests__/Did.spec.ts b/packages/core/src/__integrationtests__/Did.spec.ts index f44c3b352..3dd767d77 100644 --- a/packages/core/src/__integrationtests__/Did.spec.ts +++ b/packages/core/src/__integrationtests__/Did.spec.ts @@ -134,18 +134,18 @@ describe('write and didDeleteTx', () => { makeSigningKeyTool().authentication[0] ) - expect(await Did.Chain.queryServiceEndpoints(emptyDid)).toBeDefined() - expect(await Did.Chain.queryServiceEndpoints(emptyDid)).toHaveLength(0) + const encodedDid = Did.Chain.didToChain(emptyDid) + expect( + await api.query.did.serviceEndpoints.entries(encodedDid) + ).toHaveLength(0) const encoded = await api.query.did.serviceEndpoints( - Did.Chain.didToChain(emptyDid), + encodedDid, Did.Chain.resourceIdToChain('#non-existing-service-id') ) expect(encoded.isNone).toBe(true) - const endpointsCount = await api.query.did.didEndpointsCount( - Did.Chain.didToChain(emptyDid) - ) + const endpointsCount = await api.query.did.didEndpointsCount(encodedDid) expect(endpointsCount.toString()).toStrictEqual(new BN(0).toString()) }) @@ -262,8 +262,8 @@ it('creates and updates DID, and then reclaims the deposit back', async () => { type: ['new-type'], serviceEndpoint: ['x:new-url'], } - const updateEndpointCall = await Did.Chain.getAddEndpointExtrinsic( - newEndpoint + const updateEndpointCall = api.tx.did.addServiceEndpoint( + Did.Chain.serviceToChain(newEndpoint) ) const tx3 = await Did.authorizeExtrinsic( @@ -274,13 +274,12 @@ it('creates and updates DID, and then reclaims the deposit back', async () => { ) await submitExtrinsic(tx3, paymentAccount) + const encodedDid = Did.Chain.didToChain(fullDid.uri) const encoded = await api.query.did.serviceEndpoints( - Did.Chain.didToChain(fullDid.uri), + encodedDid, Did.Chain.resourceIdToChain(newEndpoint.id) ) - expect(Did.Chain.serviceEndpointFromChain(encoded.unwrap())).toStrictEqual( - newEndpoint - ) + expect(Did.Chain.serviceFromChain(encoded)).toStrictEqual(newEndpoint) // Delete the added service endpoint const removeEndpointCall = api.tx.did.removeServiceEndpoint( @@ -296,28 +295,24 @@ it('creates and updates DID, and then reclaims the deposit back', async () => { // There should not be any endpoint with the given ID now. const encoded2 = await api.query.did.serviceEndpoints( - Did.Chain.didToChain(fullDid.uri), + encodedDid, Did.Chain.resourceIdToChain(newEndpoint.id) ) expect(encoded2.isNone).toBe(true) // Claim the deposit back - const storedEndpointsCount = await api.query.did.didEndpointsCount( - Did.Chain.didToChain(fullDid.uri) - ) + const storedEndpointsCount = await api.query.did.didEndpointsCount(encodedDid) const reclaimDepositTx = api.tx.did.reclaimDeposit( - Did.Chain.didToChain(fullDid.uri), + encodedDid, storedEndpointsCount ) await submitExtrinsic(reclaimDepositTx, paymentAccount) // Verify that the DID has been deleted - expect( - (await api.query.did.did(Did.Chain.didToChain(fullDid.uri))).isNone - ).toBe(true) - expect(await Did.Chain.queryServiceEndpoints(fullDid.uri)).toHaveLength(0) - const newEndpointsCount = await api.query.did.didEndpointsCount( - Did.Chain.didToChain(fullDid.uri) + expect((await api.query.did.did(encodedDid)).isNone).toBe(true) + expect(await api.query.did.serviceEndpoints.entries(encodedDid)).toHaveLength( + 0 ) + const newEndpointsCount = await api.query.did.didEndpointsCount(encodedDid) expect(newEndpointsCount.toString()).toStrictEqual(new BN(0).toString()) }, 80_000) @@ -480,7 +475,7 @@ describe('DID migration', () => { expect((await api.query.did.did(encodedDid)).isNone).toBe(true) expect( - await Did.Chain.queryServiceEndpoints(migratedFullDid.uri) + await api.query.did.serviceEndpoints.entries(encodedDid) ).toStrictEqual([]) expect((await api.query.did.didBlacklist(encodedDid)).isSome).toBe(true) }, 60_000) @@ -821,19 +816,23 @@ describe('DID management batching', () => { batchFunction: api.tx.utility.batchAll, did: initialFullDid, extrinsics: [ - await Did.Chain.getAddEndpointExtrinsic({ - id: '#id-1', - type: ['type-1'], - serviceEndpoint: ['x:url-1'], - }), + api.tx.did.addServiceEndpoint( + Did.Chain.serviceToChain({ + id: '#id-1', + type: ['type-1'], + serviceEndpoint: ['x:url-1'], + }) + ), api.tx.did.setAuthenticationKey( Did.Chain.publicKeyToChain(newAuthKey) ), - await Did.Chain.getAddEndpointExtrinsic({ - id: '#id-2', - type: ['type-2'], - serviceEndpoint: ['x:url-2'], - }), + api.tx.did.addServiceEndpoint( + Did.Chain.serviceToChain({ + id: '#id-2', + type: ['type-2'], + serviceEndpoint: ['x:url-2'], + }) + ), ], sign, submitter: paymentAccount.address, @@ -886,11 +885,13 @@ describe('DID management batching', () => { api.tx.did.setAttestationKey( Did.Chain.publicKeyToChain(authentication[0]) ), - await Did.Chain.getAddEndpointExtrinsic({ - id: '#id-1', - type: ['type-2'], - serviceEndpoint: ['x:url-2'], - }), + api.tx.did.addServiceEndpoint( + Did.Chain.serviceToChain({ + id: '#id-1', + type: ['type-2'], + serviceEndpoint: ['x:url-2'], + }) + ), ], sign, submitter: paymentAccount.address, @@ -945,11 +946,13 @@ describe('DID management batching', () => { api.tx.did.setAttestationKey( Did.Chain.publicKeyToChain(authentication[0]) ), - await Did.Chain.getAddEndpointExtrinsic({ - id: '#id-1', - type: ['type-2'], - serviceEndpoint: ['x:url-2'], - }), + api.tx.did.addServiceEndpoint( + Did.Chain.serviceToChain({ + id: '#id-1', + type: ['type-2'], + serviceEndpoint: ['x:url-2'], + }) + ), ], sign, submitter: paymentAccount.address, @@ -1246,282 +1249,35 @@ describe('Runtime constraints', () => { }, 30_000) it('should not be possible to create a DID with a service endpoint that is too long', async () => { - await Did.Chain.getStoreTx( - { - authentication: [testAuthKey], - service: [ - { - // Maximum is 50 - id: '#aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', - type: ['type-a'], - serviceEndpoint: ['x:url-a'], - }, - ], - }, - paymentAccount.address, - sign - ) - await expect( - Did.Chain.getStoreTx( - { - authentication: [testAuthKey], - service: [ - { - // One more than the maximum - id: '#aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', - type: ['type-a'], - serviceEndpoint: ['x:url-a'], - }, - ], - }, - - paymentAccount.address, - sign - ) - ).rejects.toThrowErrorMatchingInlineSnapshot( - `"The service ID \\"#aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\" is too long (51 bytes). Max number of bytes allowed for a service ID is 50."` - ) - }, 30_000) + const serviceId = '#aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + const limit = api.consts.did.maxServiceIdLength.toNumber() + expect(serviceId.length).toBeGreaterThan(limit) + }) it('should not be possible to create a DID with a service endpoint that has too many types', async () => { - const newEndpoint: DidServiceEndpoint = { - id: '#id-1', - // Maximum is 1 - type: Array(1).map((_, index): string => `type-${index}`), - serviceEndpoint: ['x:url-1'], - } - await Did.Chain.getStoreTx( - { - authentication: [testAuthKey], - service: [newEndpoint], - }, - paymentAccount.address, - sign - ) - // One more than the maximum - newEndpoint.type.push('new-type') - await expect( - Did.Chain.getStoreTx( - { - authentication: [testAuthKey], - service: [newEndpoint], - }, - paymentAccount.address, - sign - ) - ).rejects.toThrowErrorMatchingInlineSnapshot( - `"The service with ID \\"#id-1\\" has too many types (2). Max number of types allowed per service is 1."` - ) - }, 30_000) + const types = ['type-1', 'type-2'] + const limit = api.consts.did.maxNumberOfTypesPerService.toNumber() + expect(types.length).toBeGreaterThan(limit) + }) it('should not be possible to create a DID with a service endpoint that has too many URIs', async () => { - const newEndpoint: DidServiceEndpoint = { - id: '#id-1', - // Maximum is 1 - type: ['type-1'], - serviceEndpoint: Array(1).map((_, index): string => `x:url-${index}`), - } - await Did.Chain.getStoreTx( - { - authentication: [testAuthKey], - service: [newEndpoint], - }, - paymentAccount.address, - sign - ) - // One more than the maximum - newEndpoint.serviceEndpoint.push('x:new-url') - await expect( - Did.Chain.getStoreTx( - { - authentication: [testAuthKey], - service: [newEndpoint], - }, - - paymentAccount.address, - sign - ) - ).rejects.toThrowErrorMatchingInlineSnapshot( - `"The service with ID \\"#id-1\\" has too many URIs (2). Max number of URIs allowed per service is 1."` - ) - }, 30_000) + const uris = ['x:url-1', 'x:url-2'] + const limit = api.consts.did.maxNumberOfUrlsPerService.toNumber() + expect(uris.length).toBeGreaterThan(limit) + }) it('should not be possible to create a DID with a service endpoint that has a type that is too long', async () => { - await Did.Chain.getStoreTx( - { - authentication: [testAuthKey], - service: [ - { - id: '#id-1', - // Maximum is 50 - type: ['aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'], - serviceEndpoint: ['x:url-1'], - }, - ], - }, - paymentAccount.address, - sign - ) - await expect( - Did.Chain.getStoreTx( - { - authentication: [testAuthKey], - service: [ - { - id: '#id-1', - // One more than the maximum - type: ['aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'], - serviceEndpoint: ['x:url-1'], - }, - ], - }, - - paymentAccount.address, - sign - ) - ).rejects.toThrowErrorMatchingInlineSnapshot( - `"The service with ID \\"#id-1\\" has the type \\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\" that is too long (51 bytes). Max number of bytes allowed for a service type is 50."` - ) - }, 30_000) + const type = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + const limit = api.consts.did.maxServiceTypeLength.toNumber() + expect(type.length).toBeGreaterThan(limit) + }) it('should not be possible to create a DID with a service endpoint that has a URI that is too long', async () => { - await Did.Chain.getStoreTx( - { - authentication: [testAuthKey], - service: [ - { - id: '#id-1', - type: ['type-1'], - // Maximum is 200 - serviceEndpoint: [ - 'a:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', - ], - }, - ], - }, - paymentAccount.address, - sign - ) - await expect( - Did.Chain.getStoreTx( - { - authentication: [testAuthKey], - service: [ - { - id: '#id-1', - type: ['type-1'], - // One more than the maximum - serviceEndpoint: [ - 'a:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', - ], - }, - ], - }, - - paymentAccount.address, - sign - ) - ).rejects.toThrowErrorMatchingInlineSnapshot( - `"The service with ID \\"#id-1\\" has the URI \\"a:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\" that is too long (202 bytes). Max number of bytes allowed for a service URI is 200."` - ) - }, 30_000) - }) - - describe('Service endpoint addition', () => { - it('should not be possible to add a service endpoint that is too long', async () => { - await Did.Chain.getAddEndpointExtrinsic({ - // Maximum is 50 - id: '#aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', - type: ['type-a'], - serviceEndpoint: ['x:url-a'], - }) - await expect( - Did.Chain.getAddEndpointExtrinsic({ - // One more than maximum - id: '#aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', - type: ['type-a'], - serviceEndpoint: ['x:url-a'], - }) - ).rejects.toThrowErrorMatchingInlineSnapshot( - `"The service ID \\"#aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\" is too long (51 bytes). Max number of bytes allowed for a service ID is 50."` - ) - }, 30_000) - - it('should not be possible to add a service endpoint that has too many types', async () => { - const newEndpoint: DidServiceEndpoint = { - id: '#id-1', - // Maximum is 1 - type: Array(1).map((_, index): string => `type-${index}`), - serviceEndpoint: ['x:url-1'], - } - await Did.Chain.getAddEndpointExtrinsic(newEndpoint) - // One more than the maximum - newEndpoint.type.push('new-type') - await expect( - Did.Chain.getAddEndpointExtrinsic(newEndpoint) - ).rejects.toThrowErrorMatchingInlineSnapshot( - `"The service with ID \\"#id-1\\" has too many types (2). Max number of types allowed per service is 1."` - ) - }, 30_000) - - it('should not be possible to add a service endpoint that has too many URIs', async () => { - const newEndpoint: DidServiceEndpoint = { - id: '#id-1', - // Maximum is 1 - type: ['type-1'], - serviceEndpoint: Array(1).map((_, index): string => `x:url-${index}`), - } - await Did.Chain.getAddEndpointExtrinsic(newEndpoint) - // One more than the maximum - newEndpoint.serviceEndpoint.push('x:new-url') - await expect( - Did.Chain.getAddEndpointExtrinsic(newEndpoint) - ).rejects.toThrowErrorMatchingInlineSnapshot( - `"The service with ID \\"#id-1\\" has too many URIs (2). Max number of URIs allowed per service is 1."` - ) - }, 30_000) - - it('should not be possible to add a service endpoint that has a type that is too long', async () => { - await Did.Chain.getAddEndpointExtrinsic({ - id: '#id-1', - // Maximum is 50 - type: ['aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'], - serviceEndpoint: ['x:url-1'], - }) - await expect( - Did.Chain.getAddEndpointExtrinsic({ - id: '#id-1', - // One more than the maximum - type: ['aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'], - serviceEndpoint: ['x:url-1'], - }) - ).rejects.toThrowErrorMatchingInlineSnapshot( - `"The service with ID \\"#id-1\\" has the type \\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\" that is too long (51 bytes). Max number of bytes allowed for a service type is 50."` - ) - }, 30_000) - - it('should not be possible to add a service endpoint that has a URI that is too long', async () => { - await Did.Chain.getAddEndpointExtrinsic({ - id: '#id-1', - type: ['type-1'], - // Maximum is 200 - serviceEndpoint: [ - 'a:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', - ], - }) - await expect( - Did.Chain.getAddEndpointExtrinsic({ - id: '#id-1', - type: ['type-1'], - // One more than the maximum - serviceEndpoint: [ - 'a:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', - ], - }) - ).rejects.toThrowErrorMatchingInlineSnapshot( - `"The service with ID \\"#id-1\\" has the URI \\"a:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\" that is too long (201 bytes). Max number of bytes allowed for a service URI is 200."` - ) - }, 30_000) + const uri = + 'a:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + const limit = api.consts.did.maxServiceUrlLength.toNumber() + expect(uri.length).toBeGreaterThan(limit) + }) }) }) diff --git a/packages/did/src/Did.chain.spec.ts b/packages/did/src/Did.chain.spec.ts index 61efd3e21..2676f778b 100644 --- a/packages/did/src/Did.chain.spec.ts +++ b/packages/did/src/Did.chain.spec.ts @@ -12,7 +12,7 @@ import { ConfigService } from '@kiltprotocol/config' import { ApiMocks } from '@kiltprotocol/testing' -import { getAddEndpointExtrinsic } from './Did.chain' +import { serviceToChain } from './Did.chain' let api: any @@ -56,9 +56,9 @@ describe('services validation', () => { it.each([...validTestURIs, ...unencodedTestUris.map(encodeURI)])( 'allows adding services with valid URI "%s"', - async (uri) => { + (uri) => { expect( - await getAddEndpointExtrinsic({ + serviceToChain({ id: '#service_1', type: [], serviceEndpoint: [uri], @@ -69,9 +69,9 @@ describe('services validation', () => { it.each([...validTestIds, ...invalidTestIds.map(encodeURIComponent)])( 'allows adding services with valid id "%s"', - async (id) => { + (id) => { expect( - await getAddEndpointExtrinsic({ + serviceToChain({ id: `#${id}`, type: [], serviceEndpoint: [], @@ -82,27 +82,27 @@ describe('services validation', () => { it.each(invalidTestIds)( 'disallows adding services with invalid id "%s"', - async (id) => { - await expect( - getAddEndpointExtrinsic({ + (id) => { + expect(() => + serviceToChain({ id: `#${id}`, type: [], serviceEndpoint: [], }) - ).rejects.toThrow('ID') + ).toThrow('ID') } ) it.each([...malformedTestUris, ...unencodedTestUris])( 'disallows adding services with invalid URI "%s"', - async (uri) => { - await expect( - getAddEndpointExtrinsic({ + (uri) => { + expect(() => + serviceToChain({ id: '#service_1', type: [], serviceEndpoint: [uri], }) - ).rejects.toThrow('URI') + ).toThrow('URI') } ) }) diff --git a/packages/did/src/Did.chain.ts b/packages/did/src/Did.chain.ts index da14b1ea5..86e820c49 100644 --- a/packages/did/src/Did.chain.ts +++ b/packages/did/src/Did.chain.ts @@ -9,7 +9,6 @@ import type { Option } from '@polkadot/types' import type { AccountId32, Extrinsic, Hash } from '@polkadot/types/interfaces' import type { AnyNumber } from '@polkadot/types/types' import { BN, hexToU8a } from '@polkadot/util' -import type { ApiPromise } from '@polkadot/api' import type { Deposit, @@ -41,7 +40,6 @@ import type { } from '@kiltprotocol/augment-api' import { - checkServiceEndpointSizeConstraints, checkServiceEndpointSyntax, EncodedEncryptionKey, EncodedKey, @@ -77,18 +75,6 @@ export function depositFromChain(deposit: KiltSupportDeposit): Deposit { } } -// Query all services for a DID given the DID. -// Interacts with the ServiceEndpoints storage double map. -async function queryAllServicesEncoded( - did: DidUri -): Promise { - const api = ConfigService.get('api') - const encodedEndpoints = await api.query.did.serviceEndpoints.entries( - didToChain(did) - ) - return encodedEndpoints.map(([, encodedValue]) => encodedValue.unwrap()) -} - // ### DECODED QUERYING types export type EncodedDid = Pick< @@ -173,11 +159,11 @@ interface BlockchainEndpoint { urls: DidServiceEndpoint['serviceEndpoint'] } -function endpointToBlockchainEndpoint({ - id, - type, - serviceEndpoint, -}: DidServiceEndpoint): BlockchainEndpoint { +export function serviceToChain( + endpoint: DidServiceEndpoint +): BlockchainEndpoint { + checkServiceEndpointSyntax(endpoint) + const { id, type, serviceEndpoint } = endpoint return { id: resourceIdToChain(id), serviceTypes: type, @@ -185,41 +171,27 @@ function endpointToBlockchainEndpoint({ } } -function blockchainEndpointToEndpoint({ - id, - serviceTypes, - urls, -}: BlockchainEndpoint): DidServiceEndpoint { +export function serviceFromChain( + encoded: Option +): DidServiceEndpoint { + const { id, serviceTypes, urls } = encoded.unwrap() return { - id: `#${id}`, - type: serviceTypes, - serviceEndpoint: urls, + id: `#${id.toUtf8()}`, + type: serviceTypes.map((type) => type.toUtf8()), + serviceEndpoint: urls.map((url) => url.toUtf8()), } } -export function serviceEndpointFromChain({ - id, - serviceTypes, - urls, -}: DidServiceEndpointsDidEndpoint): DidServiceEndpoint { - return blockchainEndpointToEndpoint({ - id: id.toUtf8(), - serviceTypes: serviceTypes.map((type) => type.toUtf8()), - urls: urls.map((url) => url.toUtf8()), - }) -} - /** - * Query service endpoint records associated with the full DID from the KILT blockchain. + * Decode service endpoint records associated with the full DID from the KILT blockchain. * - * @param did Full DID. + * @param encoded The data returned by `api.query.did.serviceEndpoints.entries`. * @returns An array of service endpoint data or an empty array if the full DID does not exist or has no service endpoints associated with it. */ -export async function queryServiceEndpoints( - did: DidUri -): Promise { - const encoded = await queryAllServicesEncoded(did) - return encoded.map((e) => serviceEndpointFromChain(e)) +export function servicesFromChain( + encoded: Array<[any, Option]> +): DidServiceEndpoint[] { + return encoded.map(([, encodedValue]) => serviceFromChain(encodedValue)) } // ### EXTRINSICS types @@ -252,16 +224,6 @@ export function publicKeyToChain( return { [key.type]: key.publicKey } as EncodedKey } -function checkServiceEndpointInput( - api: ApiPromise, - endpoint: DidServiceEndpoint -): void { - const [, syntaxErrors] = checkServiceEndpointSyntax(endpoint) - if (syntaxErrors && syntaxErrors.length > 0) throw syntaxErrors[0] - const [, sizeErrors] = checkServiceEndpointSizeConstraints(api, endpoint) - if (sizeErrors && sizeErrors.length > 0) throw sizeErrors[0] -} - interface GetStoreTxInput { authentication: [NewDidVerificationKey] assertionMethod?: [NewDidVerificationKey] @@ -338,10 +300,6 @@ export async function getStoreTx( ) } - service.forEach((endpoint) => { - checkServiceEndpointInput(api, endpoint) - }) - const [authenticationKey] = authentication const did = getAddressByKey(authenticationKey) @@ -356,7 +314,7 @@ export async function getStoreTx( publicKeyToChain(capabilityDelegation[0]) const newKeyAgreementKeys = keyAgreement.map(publicKeyToChain) - const newServiceDetails = service.map(endpointToBlockchainEndpoint) + const newServiceDetails = service.map(serviceToChain) const apiInput = { did, @@ -382,24 +340,6 @@ export async function getStoreTx( return api.tx.did.create(encoded, encodedSignature) } -/** - * Generate an extrinsic to add the provided [[DidServiceEndpoint]] to the authorizing DID. - * - * @param endpoint The new service endpoint to include in the extrinsic. - * The service endpoint must respect the following conditions: - * - The service endpoint ID is at most 50 ASCII characters long and is a valid URI fragment according to RFC#3986. - * - The service endpoint has at most 1 service type, with a value that is at most 50 ASCII characters long. - * - The service endpoint has at most 1 URI, with a value that is at most 200 ASCII characters long, and which is a valid URI according to RFC#3986. - * @returns An extrinsic that must be authorized (signed) by the full DID with which the service endpoint should be associated. - */ -export async function getAddEndpointExtrinsic( - endpoint: DidServiceEndpoint -): Promise { - const api = ConfigService.get('api') - checkServiceEndpointInput(api, endpoint) - return api.tx.did.addServiceEndpoint(endpointToBlockchainEndpoint(endpoint)) -} - /** * DID related operations on the KILT blockchain require authorization by a full DID. This is realized by requiring that relevant extrinsics are signed with a key featured by a full DID as a verification method. * Such extrinsics can be produced using this function. diff --git a/packages/did/src/Did.utils.ts b/packages/did/src/Did.utils.ts index 4bb9683db..4acd74ae4 100644 --- a/packages/did/src/Did.utils.ts +++ b/packages/did/src/Did.utils.ts @@ -6,8 +6,6 @@ */ import { blake2AsU8a, checkAddress, encodeAddress } from '@polkadot/util-crypto' -import { stringToU8a } from '@polkadot/util' -import type { ApiPromise } from '@polkadot/api' import { DidResourceUri, @@ -278,110 +276,26 @@ export function stripFragment(id: UriFragment): string { * - If the `uris` property contains one or more strings, they must be valid URIs according to RFC#3986. * * @param endpoint A service endpoint object to check. - * @returns Validation result and errors, if any. */ -export function checkServiceEndpointSyntax( - endpoint: DidServiceEndpoint -): [boolean, Error[] | undefined] { - const errors: Error[] = [] - if (endpoint.id.startsWith('did:kilt')) { - errors.push( - new SDKErrors.DidError( - `This function requires only the URI fragment part (following '#') of the service ID, not the full DID URI, which is violated by id "${endpoint.id}"` - ) +export function checkServiceEndpointSyntax(endpoint: DidServiceEndpoint): void { + const { id, serviceEndpoint } = endpoint + if (id.startsWith('did:kilt')) { + throw new SDKErrors.DidError( + `This function requires only the URI fragment part (following '#') of the service ID, not the full DID URI, which is violated by id "${id}"` ) } - if (!isUriFragment(stripFragment(endpoint.id))) { - errors.push( - new SDKErrors.DidError( - `The service ID must be valid as a URI fragment according to RFC#3986, which "${endpoint.id}" is not. Make sure not to use disallowed characters (e.g. whitespace) or consider URL-encoding the desired id.` - ) + if (!isUriFragment(stripFragment(id))) { + throw new SDKErrors.DidError( + `The service ID must be valid as a URI fragment according to RFC#3986, which "${id}" is not. Make sure not to use disallowed characters (e.g. whitespace) or consider URL-encoding the desired id.` ) } - endpoint.serviceEndpoint.forEach((uri) => { + serviceEndpoint.forEach((uri) => { if (!isUri(uri)) { - errors.push( - new SDKErrors.DidError( - `A service URI must be a URI according to RFC#3986, which "${uri}" (service id "${endpoint.id}") is not. Make sure not to use disallowed characters (e.g. whitespace) or consider URL-encoding resource locators beforehand.` - ) - ) - } - }) - return errors.length > 0 ? [false, errors] : [true, undefined] -} - -/** - * Performs size checks on service endpoint data, making sure that the following conditions are met: - * - The `endpoint.id` is at most 50 ASCII characters long. - * - The `endpoint.types` array has at most 1 service type, with a value that is at most 50 ASCII characters long. - * - The `endpoint.uris` array has at most 1 URI, with a value that is at most 200 ASCII characters long. - * - * @param api An api instance required for reading up-to-date size constraints from the blockchain runtime. - * @param endpoint A service endpoint object to check. - * @returns Validation result and errors, if any. - */ -export function checkServiceEndpointSizeConstraints( - api: ApiPromise, - endpoint: DidServiceEndpoint -): [boolean, Error[] | undefined] { - const [ - maxServiceIdLength, - maxNumberOfTypesPerService, - maxNumberOfUrlsPerService, - maxServiceTypeLength, - maxServiceUrlLength, - ] = [ - api.consts.did.maxServiceIdLength.toNumber(), - api.consts.did.maxNumberOfTypesPerService.toNumber(), - api.consts.did.maxNumberOfUrlsPerService.toNumber(), - api.consts.did.maxServiceTypeLength.toNumber(), - api.consts.did.maxServiceUrlLength.toNumber(), - ] - const errors: Error[] = [] - - const idEncodedLength = stringToU8a(stripFragment(endpoint.id)).length - if (idEncodedLength > maxServiceIdLength) { - errors.push( - new SDKErrors.DidError( - `The service ID "${endpoint.id}" is too long (${idEncodedLength} bytes). Max number of bytes allowed for a service ID is ${maxServiceIdLength}.` - ) - ) - } - if (endpoint.type.length > maxNumberOfTypesPerService) { - errors.push( - new SDKErrors.DidError( - `The service with ID "${endpoint.id}" has too many types (${endpoint.type.length}). Max number of types allowed per service is ${maxNumberOfTypesPerService}.` - ) - ) - } - if (endpoint.serviceEndpoint.length > maxNumberOfUrlsPerService) { - errors.push( - new SDKErrors.DidError( - `The service with ID "${endpoint.id}" has too many URIs (${endpoint.serviceEndpoint.length}). Max number of URIs allowed per service is ${maxNumberOfUrlsPerService}.` - ) - ) - } - endpoint.type.forEach((type) => { - const typeEncodedLength = stringToU8a(type).length - if (typeEncodedLength > maxServiceTypeLength) { - errors.push( - new SDKErrors.DidError( - `The service with ID "${endpoint.id}" has the type "${type}" that is too long (${typeEncodedLength} bytes). Max number of bytes allowed for a service type is ${maxServiceTypeLength}.` - ) - ) - } - }) - endpoint.serviceEndpoint.forEach((uri) => { - const uriEncodedLength = stringToU8a(uri).length - if (uriEncodedLength > maxServiceUrlLength) { - errors.push( - new SDKErrors.DidError( - `The service with ID "${endpoint.id}" has the URI "${uri}" that is too long (${uriEncodedLength} bytes). Max number of bytes allowed for a service URI is ${maxServiceUrlLength}.` - ) + throw new SDKErrors.DidError( + `A service URI must be a URI according to RFC#3986, which "${uri}" (service id "${id}") is not. Make sure not to use disallowed characters (e.g. whitespace) or consider URL-encoding resource locators beforehand.` ) } }) - return errors.length > 0 ? [false, errors] : [true, undefined] } export function getAddressByKey({ diff --git a/packages/did/src/DidDetails/FullDidDetails.spec.ts b/packages/did/src/DidDetails/FullDidDetails.spec.ts index 352e224e9..341a9461b 100644 --- a/packages/did/src/DidDetails/FullDidDetails.spec.ts +++ b/packages/did/src/DidDetails/FullDidDetails.spec.ts @@ -26,8 +26,8 @@ import { ConfigService } from '@kiltprotocol/config' import type { EncodedDid } from '../Did.chain' import { generateDidAuthenticatedTx, - queryServiceEndpoints, didFromChain, + servicesFromChain, } from '../Did.chain' import * as Did from './index.js' @@ -107,7 +107,7 @@ const existingServiceEndpoints: DidServiceEndpoint[] = [ jest.mock('../Did.chain') jest.mocked(didFromChain).mockReturnValue(existingDidRecord) -jest.mocked(queryServiceEndpoints).mockResolvedValue(existingServiceEndpoints) +jest.mocked(servicesFromChain).mockReturnValue(existingServiceEndpoints) jest .mocked(generateDidAuthenticatedTx) .mockResolvedValue({} as SubmittableExtrinsic) diff --git a/packages/did/src/DidDetails/FullDidDetails.ts b/packages/did/src/DidDetails/FullDidDetails.ts index d654d5b50..214d2d58f 100644 --- a/packages/did/src/DidDetails/FullDidDetails.ts +++ b/packages/did/src/DidDetails/FullDidDetails.ts @@ -26,7 +26,7 @@ import { didFromChain, didToChain, generateDidAuthenticatedTx, - queryServiceEndpoints, + servicesFromChain, } from '../Did.chain.js' import { parseDidUri, signatureAlgForKeyType } from '../Did.utils.js' @@ -67,7 +67,9 @@ export async function query(didUri: DidUri): Promise { keyAgreement: didRec.keyAgreement, } - const service = await queryServiceEndpoints(didUri) + const service = servicesFromChain( + await api.query.did.serviceEndpoints.entries(didToChain(didUri)) + ) if (service.length > 0) { did.service = service } diff --git a/packages/did/src/DidDetails/LightDidDetails.utils.ts b/packages/did/src/DidDetails/LightDidDetails.utils.ts index da1951bf9..9db3363ba 100644 --- a/packages/did/src/DidDetails/LightDidDetails.utils.ts +++ b/packages/did/src/DidDetails/LightDidDetails.utils.ts @@ -96,10 +96,7 @@ export function validateCreateDocumentInput(input: CreateDocumentInput): void { `Cannot specify a service ID with the name "${service.id}" as it is a reserved keyword` ) } - const [, errors] = checkServiceEndpointSyntax(service) - if (errors && errors.length > 0) { - throw errors[0] - } + checkServiceEndpointSyntax(service) }) } diff --git a/packages/did/src/DidLinks/AccountLinks.chain.ts b/packages/did/src/DidLinks/AccountLinks.chain.ts index a92a6f29f..d0ba4f2ef 100644 --- a/packages/did/src/DidLinks/AccountLinks.chain.ts +++ b/packages/did/src/DidLinks/AccountLinks.chain.ts @@ -12,7 +12,7 @@ import { signatureVerify, } from '@polkadot/util-crypto' import type { Enum, Option, StorageKey, U8aFixed } from '@polkadot/types' -import type { AccountId32, Extrinsic } from '@polkadot/types/interfaces' +import type { AccountId32 } from '@polkadot/types/interfaces' import type { AnyNumber, Codec, TypeDef } from '@polkadot/types/types' import type { HexString } from '@polkadot/util/types' import type { KeyringPair } from '@polkadot/keyring/types' @@ -187,37 +187,6 @@ export async function queryWeb3Name( type AssociateAccountToChainResult = [string, AnyNumber, EncodedSignature] -function associateAccountToChainArgs( - account: Address, - signatureValidUntilBlock: AnyNumber, - signature: Uint8Array | HexString, - sigType: KeypairType -): AssociateAccountToChainResult { - const proof = { [sigType]: signature } as EncodedSignature - - const api = ConfigService.get('api') - if (isEthereumEnabled(api)) { - if (sigType === 'ethereum') { - const result = [ - { Ethereum: [account, signature] }, - signatureValidUntilBlock, - ] - // Force type cast to enable the old blockchain types to accept the future format - return result as unknown as AssociateAccountToChainResult - } - const result = [{ Dotsama: [account, proof] }, signatureValidUntilBlock] - // Force type cast to enable the old blockchain types to accept the future format - return result as unknown as AssociateAccountToChainResult - } - - if (sigType === 'ethereum') - throw new SDKErrors.CodecMismatchError( - 'Ethereum linking is not yet supported by this chain' - ) - - return [account, signatureValidUntilBlock, proof] -} - /* ### HELPERS ### */ /** @@ -265,7 +234,7 @@ function getUnprefixedSignature( } /** - * Builds an extrinsic to link `account` to a `did` where the fees and deposit are covered by some third account. + * Builds the parameters for an extrinsic to link the `account` to the `did` where the fees and deposit are covered by some third account. * This extrinsic must be authorized using the same full DID. * Note that in addition to the signing account and DID used here, the submitting account will also be able to dissolve the link via reclaiming its deposit! * @@ -273,14 +242,14 @@ function getUnprefixedSignature( * @param did Full DID to be linked. * @param sign The sign callback that generates the account signature over the encoded (DidAddress, BlockNumber) tuple. * @param nBlocksValid The link request will be rejected if submitted later than (current block number + nBlocksValid)? - * @returns An Extrinsic that must be DID-authorized by the full DID used. + * @returns An array of parameters for `api.tx.didLookup.associateAccount` that must be DID-authorized by the full DID used. */ -export async function getAuthorizeLinkWithAccountExtrinsic( +export async function associateAccountToChainArgs( accountAddress: Address, did: DidUri, sign: LinkingSignCallback, nBlocksValid = 10 -): Promise { +): Promise { const api = ConfigService.get('api') const blockNo = await api.query.system.number() @@ -316,7 +285,23 @@ export async function getAuthorizeLinkWithAccountExtrinsic( accountAddress ) - return api.tx.didLookup.associateAccount( - ...associateAccountToChainArgs(accountAddress, validTill, signature, type) - ) + const proof = { [type]: signature } as EncodedSignature + + if (isEthereumEnabled(api)) { + if (type === 'ethereum') { + const result = [{ Ethereum: [accountAddress, signature] }, validTill] + // Force type cast to enable the old blockchain types to accept the future format + return result as unknown as AssociateAccountToChainResult + } + const result = [{ Dotsama: [accountAddress, proof] }, validTill] + // Force type cast to enable the old blockchain types to accept the future format + return result as unknown as AssociateAccountToChainResult + } + + if (type === 'ethereum') + throw new SDKErrors.CodecMismatchError( + 'Ethereum linking is not yet supported by this chain' + ) + + return [accountAddress, validTill, proof] } diff --git a/packages/did/src/DidResolver/DidResolver.spec.ts b/packages/did/src/DidResolver/DidResolver.spec.ts index cd13255d0..805d17b86 100644 --- a/packages/did/src/DidResolver/DidResolver.spec.ts +++ b/packages/did/src/DidResolver/DidResolver.spec.ts @@ -28,8 +28,8 @@ import { ConfigService } from '@kiltprotocol/config' import { getFullDidUriFromKey, stripFragment } from '../Did.utils' import { didFromChain, - serviceEndpointFromChain, - queryServiceEndpoints, + serviceFromChain, + servicesFromChain, } from '../Did.chain.js' import { @@ -144,11 +144,11 @@ jest.mocked(didFromChain).mockReturnValue({ }, }) jest - .mocked(serviceEndpointFromChain) + .mocked(serviceFromChain) .mockReturnValue(generateServiceEndpoint('#service-1')) jest - .mocked(queryServiceEndpoints) - .mockResolvedValue([generateServiceEndpoint('#service-1')]) + .mocked(servicesFromChain) + .mockReturnValue([generateServiceEndpoint('#service-1')]) describe('When resolving a key', () => { it('correctly resolves it for a full DID if both the DID and the key exist', async () => { @@ -300,8 +300,8 @@ describe('When resolving a full DID', () => { it('correctly resolves the document with service endpoints', async () => { jest - .mocked(queryServiceEndpoints) - .mockResolvedValue([ + .mocked(servicesFromChain) + .mockReturnValue([ generateServiceEndpoint('#id-1'), generateServiceEndpoint('#id-2'), ]) diff --git a/packages/did/src/DidResolver/DidResolver.ts b/packages/did/src/DidResolver/DidResolver.ts index 1176a5110..713318c06 100644 --- a/packages/did/src/DidResolver/DidResolver.ts +++ b/packages/did/src/DidResolver/DidResolver.ts @@ -20,7 +20,7 @@ import * as Did from '../index.js' import { didToChain, resourceIdToChain, - serviceEndpointFromChain, + serviceFromChain, } from '../Did.chain.js' import { getFullDidUri, parseDidUri } from '../Did.utils.js' @@ -193,7 +193,7 @@ export async function resolveServiceEndpoint( if (encoded.isNone) { return null } - const serviceEndpoint = serviceEndpointFromChain(encoded.unwrap()) + const serviceEndpoint = serviceFromChain(encoded) return { ...serviceEndpoint, id: serviceUri, From 8b3c75dccb1ce06549b0ee2184e0be7b04195e18 Mon Sep 17 00:00:00 2001 From: Github Action Date: Mon, 19 Sep 2022 13:17:59 +0000 Subject: [PATCH 16/36] [CI Skip] ci: publish prerelease --- package.json | 2 +- packages/augment-api/package.json | 2 +- packages/chain-helpers/package.json | 2 +- packages/config/package.json | 2 +- packages/core/package.json | 2 +- packages/did/package.json | 2 +- packages/messaging/package.json | 2 +- packages/sdk-js/package.json | 2 +- packages/testing/package.json | 2 +- packages/types/package.json | 2 +- packages/utils/package.json | 2 +- packages/vc-export/package.json | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index 0cde083d6..43065db49 100644 --- a/package.json +++ b/package.json @@ -68,6 +68,6 @@ "typedoc": "^0.22.15", "typescript": "^4.5.4" }, - "version": "0.30.0-7", + "version": "0.30.0-8", "packageManager": "yarn@3.0.2" } diff --git a/packages/augment-api/package.json b/packages/augment-api/package.json index acceb0501..8ab178e26 100644 --- a/packages/augment-api/package.json +++ b/packages/augment-api/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/augment-api", - "version": "0.30.0-7", + "version": "0.30.0-8", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/chain-helpers/package.json b/packages/chain-helpers/package.json index ac867673d..ae7e759d4 100644 --- a/packages/chain-helpers/package.json +++ b/packages/chain-helpers/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/chain-helpers", - "version": "0.30.0-7", + "version": "0.30.0-8", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/config/package.json b/packages/config/package.json index 0c9b15fae..2689b4508 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/config", - "version": "0.30.0-7", + "version": "0.30.0-8", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/core/package.json b/packages/core/package.json index f158d7d36..33f19f65a 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/core", - "version": "0.30.0-7", + "version": "0.30.0-8", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/did/package.json b/packages/did/package.json index ebaab8dbc..080b91dd4 100644 --- a/packages/did/package.json +++ b/packages/did/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/did", - "version": "0.30.0-7", + "version": "0.30.0-8", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/messaging/package.json b/packages/messaging/package.json index e77940234..99d432adb 100644 --- a/packages/messaging/package.json +++ b/packages/messaging/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/messaging", - "version": "0.30.0-7", + "version": "0.30.0-8", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/sdk-js/package.json b/packages/sdk-js/package.json index 8872d8bed..f419fe1cb 100644 --- a/packages/sdk-js/package.json +++ b/packages/sdk-js/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/sdk-js", - "version": "0.30.0-7", + "version": "0.30.0-8", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/testing/package.json b/packages/testing/package.json index ed25b277c..74256a2f5 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -1,7 +1,7 @@ { "name": "@kiltprotocol/testing", "private": true, - "version": "0.30.0-7", + "version": "0.30.0-8", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/types/package.json b/packages/types/package.json index 2c6a0116f..e9cc504a7 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/types", - "version": "0.30.0-7", + "version": "0.30.0-8", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/utils/package.json b/packages/utils/package.json index e59690cc7..f648fbf57 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/utils", - "version": "0.30.0-7", + "version": "0.30.0-8", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/vc-export/package.json b/packages/vc-export/package.json index cbeec0cee..e97e33285 100644 --- a/packages/vc-export/package.json +++ b/packages/vc-export/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/vc-export", - "version": "0.30.0-7", + "version": "0.30.0-8", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", From f84e9f421005263a47a13049a96e06458797d18a Mon Sep 17 00:00:00 2001 From: Albrecht Date: Tue, 20 Sep 2022 13:08:56 +0200 Subject: [PATCH 17/36] feat: derive KeyRelationship for batched calls (#628) * feat: derive KeyRelationship for batched calls * fix: cleaner code, less dependencies * refactor: rename * fix: wrong type in test * Update packages/did/src/DidDetails/FullDidDetails.utils.ts Co-authored-by: Timo Welde * Apply suggestions from code review Co-authored-by: Tom Adler * style: more style * style: named generic * refactor: rename call -> method * Update packages/did/src/DidDetails/FullDidDetails.utils.spec.ts Co-authored-by: Tom Adler * refactor: use Extrinsic['method'] instead of CallBase Co-authored-by: Timo Welde Co-authored-by: Tom Adler --- .../did/src/DidDetails/FullDidDetails.spec.ts | 22 ++--- .../DidDetails/FullDidDetails.utils.spec.ts | 88 +++++++++++++++++++ .../src/DidDetails/FullDidDetails.utils.ts | 26 +++++- 3 files changed, 121 insertions(+), 15 deletions(-) create mode 100644 packages/did/src/DidDetails/FullDidDetails.utils.spec.ts diff --git a/packages/did/src/DidDetails/FullDidDetails.spec.ts b/packages/did/src/DidDetails/FullDidDetails.spec.ts index 341a9461b..98c323447 100644 --- a/packages/did/src/DidDetails/FullDidDetails.spec.ts +++ b/packages/did/src/DidDetails/FullDidDetails.spec.ts @@ -234,17 +234,17 @@ describe('When creating an instance from the chain', () => { const extrinsic = augmentedApi.tx.utility.batch([ await augmentedApi.tx.ctype.add('test-ctype'), ]) - await expect(async () => - Did.authorizeBatch({ - did: fullDid, - batchFunction: augmentedApi.tx.utility.batchAll, - extrinsics: [extrinsic, extrinsic], - sign, - submitter: keypair.address, - }) - ).rejects.toMatchInlineSnapshot( - '[DidBuilderError: Can only batch extrinsics that require a DID signature]' - ) + const batchFunction = + jest.fn() as unknown as typeof mockedApi.tx.utility.batchAll + await Did.authorizeBatch({ + did: fullDid, + batchFunction, + extrinsics: [extrinsic, extrinsic], + sign, + submitter: keypair.address, + }) + + expect(batchFunction).toHaveBeenCalledWith([extrinsic, extrinsic]) }) it('fails if the DID does not have any key required to sign the batch', async () => { diff --git a/packages/did/src/DidDetails/FullDidDetails.utils.spec.ts b/packages/did/src/DidDetails/FullDidDetails.utils.spec.ts new file mode 100644 index 000000000..07317ef68 --- /dev/null +++ b/packages/did/src/DidDetails/FullDidDetails.utils.spec.ts @@ -0,0 +1,88 @@ +/** + * Copyright (c) 2018-2022, BOTLabs GmbH. + * + * This source code is licensed under the BSD 4-Clause "Original" license + * found in the LICENSE file in the root directory of this source tree. + */ + +import { ApiMocks } from '@kiltprotocol/testing' +import { getKeyRelationshipForExtrinsic } from './FullDidDetails.utils.js' + +/** + * @group unit/did + */ + +const mockApi = ApiMocks.createAugmentedApi() + +describe('When creating an instance from the chain', () => { + it('Should return correct KeyRelationship for single valid call', () => { + const keyRelationship = getKeyRelationshipForExtrinsic( + mockApi.tx.attestation.add(new Uint8Array(32), new Uint8Array(32), null) + ) + expect(keyRelationship).toBe('assertionMethod') + }) + it('Should return correct KeyRelationship for batched call', () => { + const keyRelationship = getKeyRelationshipForExtrinsic( + mockApi.tx.utility.batch([ + mockApi.tx.attestation.add( + new Uint8Array(32), + new Uint8Array(32), + null + ), + mockApi.tx.attestation.add( + new Uint8Array(32), + new Uint8Array(32), + null + ), + ]) + ) + expect(keyRelationship).toBe('assertionMethod') + }) + it('Should return correct KeyRelationship for batchAll call', () => { + const keyRelationship = getKeyRelationshipForExtrinsic( + mockApi.tx.utility.batchAll([ + mockApi.tx.attestation.add( + new Uint8Array(32), + new Uint8Array(32), + null + ), + mockApi.tx.attestation.add( + new Uint8Array(32), + new Uint8Array(32), + null + ), + ]) + ) + expect(keyRelationship).toBe('assertionMethod') + }) + it('Should return correct KeyRelationship for forceBatch call', () => { + const keyRelationship = getKeyRelationshipForExtrinsic( + mockApi.tx.utility.forceBatch([ + mockApi.tx.attestation.add( + new Uint8Array(32), + new Uint8Array(32), + null + ), + mockApi.tx.attestation.add( + new Uint8Array(32), + new Uint8Array(32), + null + ), + ]) + ) + expect(keyRelationship).toBe('assertionMethod') + }) + it('Should return undefined for batch with mixed KeyRelationship calls', () => { + const keyRelationship = getKeyRelationshipForExtrinsic( + mockApi.tx.utility.forceBatch([ + mockApi.tx.attestation.add( + new Uint8Array(32), + new Uint8Array(32), + null + ), + mockApi.tx.web3Names.claim('awesomename'), + ]) + ) + expect(keyRelationship).toBeUndefined() + }) +}) diff --git a/packages/did/src/DidDetails/FullDidDetails.utils.ts b/packages/did/src/DidDetails/FullDidDetails.utils.ts index b3934b2ef..3c67e601b 100644 --- a/packages/did/src/DidDetails/FullDidDetails.utils.ts +++ b/packages/did/src/DidDetails/FullDidDetails.utils.ts @@ -8,10 +8,10 @@ // This module is not part of the public-facing api. /* eslint-disable jsdoc/require-jsdoc */ -import type { Extrinsic } from '@polkadot/types/interfaces' import { BN } from '@polkadot/util' import type { VerificationKeyRelationship } from '@kiltprotocol/types' +import { Extrinsic } from '@polkadot/types/interfaces/extrinsics' // Must be in sync with what's implemented in impl did::DeriveDidCallAuthorizationVerificationKeyRelationship for Call // in https://github.com/KILTprotocol/mashnet-node/blob/develop/runtimes/spiritnet/src/lib.rs @@ -28,10 +28,22 @@ const methodMapping: Record = { web3Names: 'authentication', } -export function getKeyRelationshipForExtrinsic( - extrinsic: Extrinsic +function getKeyRelationshipForMethod( + call: Extrinsic['method'] ): VerificationKeyRelationship | undefined { - const { section, method } = extrinsic.method + const { section, method } = call + + // get the VerificationKeyRelationship of a batched call + if ( + section === 'utility' && + ['batch', 'batchAll', 'forceBatch'].includes(method) && + call.args[0].toRawType() === 'Vec' + ) { + // map all calls to their VerificationKeyRelationship and deduplicate the items + return (call.args[0] as unknown as Array) + .map(getKeyRelationshipForMethod) + .reduce((prev, value) => (prev === value ? prev : undefined)) + } const signature = `${section}.${method}` if (signature in methodMapping) { @@ -41,6 +53,12 @@ export function getKeyRelationshipForExtrinsic( return methodMapping[section] } +export function getKeyRelationshipForExtrinsic( + extrinsic: Extrinsic +): VerificationKeyRelationship | undefined { + return getKeyRelationshipForMethod(extrinsic.method) +} + // Max nonce value is (2^64) - 1 const maxNonceValue = new BN(2).pow(new BN(64)).subn(1) From b189f905312ab2002782b71dd25c2a86e598048d Mon Sep 17 00:00:00 2001 From: Github Action Date: Tue, 20 Sep 2022 11:14:00 +0000 Subject: [PATCH 18/36] [CI Skip] ci: publish prerelease --- package.json | 2 +- packages/augment-api/package.json | 2 +- packages/chain-helpers/package.json | 2 +- packages/config/package.json | 2 +- packages/core/package.json | 2 +- packages/did/package.json | 2 +- packages/messaging/package.json | 2 +- packages/sdk-js/package.json | 2 +- packages/testing/package.json | 2 +- packages/types/package.json | 2 +- packages/utils/package.json | 2 +- packages/vc-export/package.json | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index 43065db49..aa383e8a9 100644 --- a/package.json +++ b/package.json @@ -68,6 +68,6 @@ "typedoc": "^0.22.15", "typescript": "^4.5.4" }, - "version": "0.30.0-8", + "version": "0.30.0-9", "packageManager": "yarn@3.0.2" } diff --git a/packages/augment-api/package.json b/packages/augment-api/package.json index 8ab178e26..a03064519 100644 --- a/packages/augment-api/package.json +++ b/packages/augment-api/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/augment-api", - "version": "0.30.0-8", + "version": "0.30.0-9", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/chain-helpers/package.json b/packages/chain-helpers/package.json index ae7e759d4..19c9b6b11 100644 --- a/packages/chain-helpers/package.json +++ b/packages/chain-helpers/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/chain-helpers", - "version": "0.30.0-8", + "version": "0.30.0-9", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/config/package.json b/packages/config/package.json index 2689b4508..a8fb4ad3e 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/config", - "version": "0.30.0-8", + "version": "0.30.0-9", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/core/package.json b/packages/core/package.json index 33f19f65a..93c0de651 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/core", - "version": "0.30.0-8", + "version": "0.30.0-9", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/did/package.json b/packages/did/package.json index 080b91dd4..8cd2c9d58 100644 --- a/packages/did/package.json +++ b/packages/did/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/did", - "version": "0.30.0-8", + "version": "0.30.0-9", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/messaging/package.json b/packages/messaging/package.json index 99d432adb..9e01456aa 100644 --- a/packages/messaging/package.json +++ b/packages/messaging/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/messaging", - "version": "0.30.0-8", + "version": "0.30.0-9", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/sdk-js/package.json b/packages/sdk-js/package.json index f419fe1cb..d96da68e4 100644 --- a/packages/sdk-js/package.json +++ b/packages/sdk-js/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/sdk-js", - "version": "0.30.0-8", + "version": "0.30.0-9", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/testing/package.json b/packages/testing/package.json index 74256a2f5..dc709fb5d 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -1,7 +1,7 @@ { "name": "@kiltprotocol/testing", "private": true, - "version": "0.30.0-8", + "version": "0.30.0-9", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/types/package.json b/packages/types/package.json index e9cc504a7..c3a4a6531 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/types", - "version": "0.30.0-8", + "version": "0.30.0-9", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/utils/package.json b/packages/utils/package.json index f648fbf57..59e35ac21 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/utils", - "version": "0.30.0-8", + "version": "0.30.0-9", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/vc-export/package.json b/packages/vc-export/package.json index e97e33285..a4767f769 100644 --- a/packages/vc-export/package.json +++ b/packages/vc-export/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/vc-export", - "version": "0.30.0-8", + "version": "0.30.0-9", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", From 94acf9bf0965b09d3f7ffa5d638c0850b22db899 Mon Sep 17 00:00:00 2001 From: Raphael Flechtner <39338561+rflechtner@users.noreply.github.com> Date: Tue, 20 Sep 2022 15:51:36 +0200 Subject: [PATCH 19/36] refactor!: verify* throws (#632) * refactor: rename dataUtils functions * chore: bump typescript for correct def of error.cause * chore: use polkadot builtin isHex for hex validation --- package.json | 2 +- packages/augment-api/package.json | 2 +- packages/chain-helpers/package.json | 2 +- packages/config/package.json | 2 +- packages/core/package.json | 2 +- .../__integrationtests__/Attestation.spec.ts | 41 +++-- .../src/__integrationtests__/Ctypes.spec.ts | 10 +- .../__integrationtests__/Delegation.spec.ts | 28 +-- .../core/src/__integrationtests__/Did.spec.ts | 12 +- .../core/src/__integrationtests__/utils.ts | 11 +- packages/core/src/attestation/Attestation.ts | 21 ++- packages/core/src/claim/Claim.ts | 59 +++---- .../core/src/credential/Credential.spec.ts | 44 ++--- packages/core/src/credential/Credential.ts | 80 +++------ .../core/src/ctype/CType.metadata.spec.ts | 10 +- packages/core/src/ctype/CType.spec.ts | 72 +++----- packages/core/src/ctype/CType.ts | 68 +++---- packages/core/src/ctype/Ctype.nested.spec.ts | 12 +- .../src/delegation/DelegationNode.spec.ts | 12 +- .../core/src/delegation/DelegationNode.ts | 10 +- packages/core/src/quote/Quote.spec.ts | 4 +- packages/core/src/quote/Quote.ts | 12 +- packages/did/package.json | 2 +- packages/did/src/Did.signature.spec.ts | 115 ++++-------- packages/did/src/Did.signature.ts | 167 +++++++----------- packages/did/src/Did.utils.ts | 14 +- packages/messaging/package.json | 2 +- packages/messaging/src/Message.ts | 34 +--- packages/sdk-js/package.json | 2 +- packages/testing/package.json | 2 +- packages/types/package.json | 2 +- packages/utils/package.json | 2 +- packages/utils/src/Crypto.ts | 7 +- packages/utils/src/DataUtils.spec.ts | 98 +++------- packages/utils/src/DataUtils.ts | 69 +++----- packages/vc-export/package.json | 2 +- tests/bundle-test.ts | 33 +--- yarn.lock | 40 ++--- 38 files changed, 422 insertions(+), 685 deletions(-) diff --git a/package.json b/package.json index aa383e8a9..c800caea1 100644 --- a/package.json +++ b/package.json @@ -66,7 +66,7 @@ "ts-jest": "^27.1.2", "ts-jest-resolver": "^2.0.0", "typedoc": "^0.22.15", - "typescript": "^4.5.4" + "typescript": "^4.8.3" }, "version": "0.30.0-9", "packageManager": "yarn@3.0.2" diff --git a/packages/augment-api/package.json b/packages/augment-api/package.json index a03064519..6d2eff884 100644 --- a/packages/augment-api/package.json +++ b/packages/augment-api/package.json @@ -42,7 +42,7 @@ "glob": "^7.1.1", "rimraf": "^3.0.2", "ts-node": "^10.4.0", - "typescript": "^4.5.4", + "typescript": "^4.8.3", "websocket": "^1.0.31", "yargs": "^16.2.0" } diff --git a/packages/chain-helpers/package.json b/packages/chain-helpers/package.json index 19c9b6b11..31a274e50 100644 --- a/packages/chain-helpers/package.json +++ b/packages/chain-helpers/package.json @@ -33,7 +33,7 @@ "@kiltprotocol/testing": "workspace:*", "@polkadot/keyring": "^10.0.0", "rimraf": "^3.0.2", - "typescript": "^4.5.4" + "typescript": "^4.8.3" }, "dependencies": { "@kiltprotocol/augment-api": "workspace:*", diff --git a/packages/config/package.json b/packages/config/package.json index a8fb4ad3e..76ae95aa9 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -31,7 +31,7 @@ "homepage": "https://github.com/KILTprotocol/sdk-js#readme", "devDependencies": { "rimraf": "^3.0.2", - "typescript": "^4.5.4" + "typescript": "^4.8.3" }, "dependencies": { "@kiltprotocol/types": "workspace:*", diff --git a/packages/core/package.json b/packages/core/package.json index 93c0de651..a27bbe93a 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -34,7 +34,7 @@ "@types/uuid": "^8.0.0", "rimraf": "^3.0.2", "testcontainers": "^8.6.1", - "typescript": "^4.5.4" + "typescript": "^4.8.3" }, "dependencies": { "@kiltprotocol/augment-api": "workspace:*", diff --git a/packages/core/src/__integrationtests__/Attestation.spec.ts b/packages/core/src/__integrationtests__/Attestation.spec.ts index 315588e42..9368793d1 100644 --- a/packages/core/src/__integrationtests__/Attestation.spec.ts +++ b/packages/core/src/__integrationtests__/Attestation.spec.ts @@ -138,8 +138,10 @@ describe('When there is an attester, claimer and ctype drivers license', () => { signCallback: claimerKey.sign, claimerDid: claimer, }) - expect(Credential.verifyDataIntegrity(presentation)).toBe(true) - expect(await Credential.verifySignature(presentation)).toBe(true) + expect(() => Credential.verifyDataIntegrity(presentation)).not.toThrow() + await expect( + Credential.verifySignature(presentation) + ).resolves.not.toThrow() expect(credential.claim.contents).toMatchObject(content) }) @@ -152,14 +154,16 @@ describe('When there is an attester, claimer and ctype drivers license', () => { claimer.uri ) const credential = Credential.fromClaim(claim) - expect(Credential.verifyDataIntegrity(credential)).toBe(true) + expect(() => Credential.verifyDataIntegrity(credential)).not.toThrow() const presentation = await Credential.createPresentation({ credential, signCallback: claimerKey.sign, claimerDid: claimer, }) - expect(await Credential.verifySignature(presentation)).toBe(true) + await expect( + Credential.verifySignature(presentation) + ).resolves.not.toThrow() await Credential.verifyPresentation(presentation) const attestation = Attestation.fromCredentialAndDid( @@ -204,14 +208,16 @@ describe('When there is an attester, claimer and ctype drivers license', () => { claimer.uri ) const credential = Credential.fromClaim(claim) - expect(Credential.verifyDataIntegrity(credential)).toBe(true) + expect(() => Credential.verifyDataIntegrity(credential)).not.toThrow() const presentation = await Credential.createPresentation({ credential, signCallback: claimerKey.sign, claimerDid: claimer, }) - expect(await Credential.verifySignature(presentation)).toBe(true) + await expect( + Credential.verifySignature(presentation) + ).resolves.not.toThrow() const attestation = Attestation.fromCredentialAndDid( presentation, @@ -360,9 +366,9 @@ describe('When there is an attester, claimer and ctype drivers license', () => { claimerDid: claimer, }) - expect( + expect(() => Attestation.verifyAgainstCredential(attestation, fakeCredential) - ).toBe(false) + ).toThrow() }, 15_000) it('should not be possible for the claimer to revoke an attestation', async () => { @@ -525,24 +531,25 @@ describe('When there is an attester, claimer and ctype drivers license', () => { expect(storedAttLicense).not.toBeNull() expect(storedAttLicense?.revoked).toBe(false) + const queried = await api.query.attestation.attestations( + licenseAuthorizationGranted.claimHash + ) + expect(queried.isSome).toBe(true) const storedAttAuthorized = Attestation.fromChain( - await api.query.attestation.attestations( - licenseAuthorizationGranted.claimHash - ), + queried, licenseAuthorizationGranted.claimHash ) - expect(storedAttAuthorized).not.toBeNull() - expect(storedAttAuthorized?.revoked).toBe(false) + expect(storedAttAuthorized.revoked).toBe(false) - expect( + expect(() => Attestation.verifyAgainstCredential(licenseGranted, credential2) - ).toBe(true) - expect( + ).not.toThrow() + expect(() => Attestation.verifyAgainstCredential( licenseAuthorizationGranted, credential1 ) - ).toBe(true) + ).not.toThrow() }, 70_000) }) }) diff --git a/packages/core/src/__integrationtests__/Ctypes.spec.ts b/packages/core/src/__integrationtests__/Ctypes.spec.ts index 326f5bf6e..eee37c7f7 100644 --- a/packages/core/src/__integrationtests__/Ctypes.spec.ts +++ b/packages/core/src/__integrationtests__/Ctypes.spec.ts @@ -69,7 +69,7 @@ describe('When there is an CtypeCreator and a verifier', () => { await expect( submitExtrinsic(authorizedStoreTx, keypair) ).rejects.toThrowError() - expect(await CType.verifyStored(ctype)).toBe(false) + await expect(CType.verifyStored(ctype)).rejects.toThrow() }, 20_000) it('should be possible to create a claim type', async () => { @@ -86,10 +86,10 @@ describe('When there is an CtypeCreator and a verifier', () => { expect(CType.fromChain(await api.query.ctype.ctypes(ctype.hash))).toBe( ctypeCreator.uri ) - expect(await CType.verifyStored(ctype)).toBe(true) + await expect(CType.verifyStored(ctype)).resolves.not.toThrow() ctype.owner = ctypeCreator.uri - expect(await CType.verifyStored(ctype)).toBe(true) + await expect(CType.verifyStored(ctype)).resolves.not.toThrow() }, 40_000) it('should not be possible to create a claim type that exists', async () => { @@ -143,13 +143,13 @@ describe('When there is an CtypeCreator and a verifier', () => { ctypeCreator.uri ) - expect(await CType.verifyStored(iAmNotThere)).toBe(false) + await expect(CType.verifyStored(iAmNotThere)).rejects.toThrow() expect((await api.query.ctype.ctypes(iAmNotThere.hash)).isNone).toBe(true) const fakeHash = Crypto.hashStr('abcdefg') expect((await api.query.ctype.ctypes(fakeHash)).isNone).toBe(true) - expect(await CType.verifyStored(iAmNotThereWithOwner)).toBe(false) + await expect(CType.verifyStored(iAmNotThereWithOwner)).rejects.toThrow() }) }) diff --git a/packages/core/src/__integrationtests__/Delegation.spec.ts b/packages/core/src/__integrationtests__/Delegation.spec.ts index 857c55343..58bfdd7fc 100644 --- a/packages/core/src/__integrationtests__/Delegation.spec.ts +++ b/packages/core/src/__integrationtests__/Delegation.spec.ts @@ -147,8 +147,8 @@ it('should be possible to delegate attestation rights', async () => { rootKey.sign, attesterKey.sign ) - expect(await rootNode.verify()).toBe(true) - expect(await delegatedNode.verify()).toBe(true) + await expect(rootNode.verify()).resolves.not.toThrow() + await expect(delegatedNode.verify()).resolves.not.toThrow() }, 60_000) describe('and attestation rights have been delegated', () => { @@ -170,8 +170,8 @@ describe('and attestation rights have been delegated', () => { attesterKey.sign ) - expect(await rootNode.verify()).toBe(true) - expect(await delegatedNode.verify()).toBe(true) + await expect(rootNode.verify()).resolves.not.toThrow() + await expect(delegatedNode.verify()).resolves.not.toThrow() }, 75_000) it("should be possible to attest a claim in the root's name and revoke it by the root", async () => { @@ -192,8 +192,10 @@ describe('and attestation rights have been delegated', () => { signCallback: claimerKey.sign, claimerDid: claimer, }) - expect(Credential.verifyDataIntegrity(credential)).toBe(true) - expect(await Credential.verifySignature(presentation)).toBe(true) + expect(() => Credential.verifyDataIntegrity(credential)).not.toThrow() + await expect( + Credential.verifySignature(presentation) + ).resolves.not.toThrow() await Credential.verifyPresentation(presentation) const attestation = Attestation.fromCredentialAndDid( @@ -282,7 +284,7 @@ describe('revocation', () => { paymentAccount.address ) await submitExtrinsic(authorizedRevokeTx, paymentAccount) - expect(await delegationA.verify()).toBe(false) + await expect(delegationA.verify()).rejects.toThrow() // Delegation removal can only be done by either the delegation owner themselves via DID call // or the deposit owner as a regular signed call. @@ -302,7 +304,7 @@ describe('revocation', () => { }) // Check that delegation fails to verify but that it is still on the blockchain (i.e., not removed) - expect(await delegationA.verify()).toBe(false) + await expect(delegationA.verify()).rejects.toThrow() expect(await DelegationNode.query(delegationA.id)).not.toBeNull() }, 60_000) @@ -333,7 +335,7 @@ describe('revocation', () => { section: 'delegation', name: 'UnauthorizedRevocation', }) - expect(await delegationRoot.verify()).toBe(true) + await expect(delegationRoot.verify()).resolves.not.toThrow() const revokeTx2 = await delegationA.getRevokeTx(firstDelegate.uri) const authorizedRevokeTx2 = await Did.authorizeExtrinsic( @@ -343,7 +345,7 @@ describe('revocation', () => { paymentAccount.address ) await submitExtrinsic(authorizedRevokeTx2, paymentAccount) - expect(await delegationA.verify()).toBe(false) + await expect(delegationA.verify()).rejects.toThrow() }, 60_000) it('delegator can revoke root, revoking all delegations in tree', async () => { @@ -378,9 +380,9 @@ describe('revocation', () => { ) await submitExtrinsic(authorizedRevokeTx, paymentAccount) - expect(await delegationRoot.verify()).toBe(false) - expect(await delegationA.verify()).toBe(false) - expect(await delegationB.verify()).toBe(false) + await expect(delegationRoot.verify()).rejects.toThrow() + await expect(delegationA.verify()).rejects.toThrow() + await expect(delegationB.verify()).rejects.toThrow() }, 60_000) }) diff --git a/packages/core/src/__integrationtests__/Did.spec.ts b/packages/core/src/__integrationtests__/Did.spec.ts index 3dd767d77..8467887d3 100644 --- a/packages/core/src/__integrationtests__/Did.spec.ts +++ b/packages/core/src/__integrationtests__/Did.spec.ts @@ -520,7 +520,7 @@ describe('DID authorization', () => { ) await submitExtrinsic(tx, paymentAccount) - expect(await CType.verifyStored(ctype)).toEqual(true) + await expect(CType.verifyStored(ctype)).resolves.not.toThrow() }, 60_000) it('no longer authorizes ctype creation after DID deletion', async () => { @@ -554,7 +554,7 @@ describe('DID authorization', () => { name: 'DidNotPresent', }) - expect(await CType.verifyStored(ctype)).toEqual(false) + await expect(CType.verifyStored(ctype)).rejects.toThrow() }, 60_000) }) @@ -1023,7 +1023,7 @@ describe('DID extrinsics batching', () => { await submitExtrinsic(tx, paymentAccount) // The ctype has been created, even though the delegation operations failed. - expect(await CType.verifyStored(ctype)).toBe(true) + await expect(CType.verifyStored(ctype)).resolves.not.toThrow() }) it('batchAll fails if any extrinsics fail', async () => { @@ -1061,7 +1061,7 @@ describe('DID extrinsics batching', () => { }) // The ctype has not been created, since atomicity ensures the whole batch is reverted in case of failure. - expect(await CType.verifyStored(ctype)).toBe(false) + await expect(CType.verifyStored(ctype)).rejects.toThrow() }) it('can batch extrinsics for the same required key type', async () => { @@ -1154,8 +1154,8 @@ describe('DID extrinsics batching', () => { expect(owner).toStrictEqual(fullDid.uri) // Test correct use of attestation keys - expect(await CType.verifyStored(ctype1)).toBe(true) - expect(await CType.verifyStored(ctype2)).toBe(true) + await expect(CType.verifyStored(ctype1)).resolves.not.toThrow() + await expect(CType.verifyStored(ctype2)).resolves.not.toThrow() // Test correct use of delegation keys const node = await DelegationNode.query(rootNode.id) diff --git a/packages/core/src/__integrationtests__/utils.ts b/packages/core/src/__integrationtests__/utils.ts index f8ddb9cb1..a9ad6d899 100644 --- a/packages/core/src/__integrationtests__/utils.ts +++ b/packages/core/src/__integrationtests__/utils.ts @@ -54,9 +54,9 @@ async function getStartedTestContainer(): Promise { async function buildConnection(wsEndpoint: string): Promise { const provider = new WsProvider(wsEndpoint) - const api = await ApiPromise.create({ provider }) + const api = new ApiPromise({ provider }) await init({ api, submitTxResolveOn: Blockchain.IS_IN_BLOCK }) - return api + return api.isReadyOrError } export async function initializeApi(): Promise { @@ -97,7 +97,12 @@ export function addressFromRandom(): KiltAddress { } export async function isCtypeOnChain(ctype: ICType): Promise { - return CType.verifyStored(ctype) + try { + await CType.verifyStored(ctype) + return true + } catch { + return false + } } export const driversLicenseCType = CType.fromSchema({ diff --git a/packages/core/src/attestation/Attestation.ts b/packages/core/src/attestation/Attestation.ts index c3f688103..d3eaa0697 100644 --- a/packages/core/src/attestation/Attestation.ts +++ b/packages/core/src/attestation/Attestation.ts @@ -36,12 +36,12 @@ export function verifyDataStructure(input: IAttestation): void { if (!input.cTypeHash) { throw new SDKErrors.CTypeHashMissingError() } - DataUtils.validateHash(input.cTypeHash, 'CType') + DataUtils.verifyIsHex(input.cTypeHash, 256) if (!input.claimHash) { throw new SDKErrors.ClaimHashMissingError() } - DataUtils.validateHash(input.claimHash, 'Claim') + DataUtils.verifyIsHex(input.claimHash, 256) if (typeof input.delegationId !== 'string' && input.delegationId !== null) { throw new SDKErrors.DelegationIdTypeError() @@ -134,15 +134,18 @@ export function isIAttestation(input: unknown): input is IAttestation { * * @param attestation - The attestation to verify. * @param credential - The credential to verify against. - * @returns Whether the data is valid. */ export function verifyAgainstCredential( attestation: IAttestation, credential: ICredential -): boolean { - return ( - credential.claim.cTypeHash === attestation.cTypeHash && - credential.rootHash === attestation.claimHash && - Credential.verifyDataIntegrity(credential) - ) +): void { + if ( + credential.claim.cTypeHash !== attestation.cTypeHash || + credential.rootHash !== attestation.claimHash + ) { + throw new SDKErrors.CredentialUnverifiableError( + 'Attestation does not match credential' + ) + } + Credential.verifyDataIntegrity(credential) } diff --git a/packages/core/src/claim/Claim.ts b/packages/core/src/claim/Claim.ts index 635eca94c..71a70dd33 100644 --- a/packages/core/src/claim/Claim.ts +++ b/packages/core/src/claim/Claim.ts @@ -22,12 +22,7 @@ import type { HexString } from '@polkadot/util/types' import type { DidUri, IClaim, ICType, PartialClaim } from '@kiltprotocol/types' import { Crypto, DataUtils, SDKErrors } from '@kiltprotocol/utils' import { Utils as DidUtils } from '@kiltprotocol/did' -import { - getIdForCTypeHash, - isICType, - verifyClaimAgainstNestedSchemas, - verifyClaimAgainstSchema, -} from '../ctype/index.js' +import * as CType from '../ctype/index.js' const VC_VOCAB = 'https://www.w3.org/2018/credentials#' @@ -45,7 +40,7 @@ function jsonLDcontents( ): Record { const { cTypeHash, contents, owner } = claim if (!cTypeHash) throw new SDKErrors.CTypeHashMissingError() - const vocabulary = `${getIdForCTypeHash(cTypeHash)}#` + const vocabulary = `${CType.getIdForCTypeHash(cTypeHash)}#` const result: Record = {} if (owner) result['@id'] = owner if (!expanded) { @@ -79,7 +74,7 @@ export function toJsonLD( [`${prefix}credentialSubject`]: credentialSubject, } result[`${prefix}credentialSchema`] = { - '@id': getIdForCTypeHash(claim.cTypeHash), + '@id': CType.getIdForCTypeHash(claim.cTypeHash), } if (!expanded) result['@context'] = { '@vocab': VC_VOCAB } return result @@ -143,7 +138,6 @@ export function hashClaimContents( * @param options Object containing optional parameters. * @param options.canonicalisation Canonicalisation routine that produces an array of statement strings from the [IClaim]. Default produces individual `{"key":"value"}` JSON representations where keys are transformed to expanded JSON-LD. * @param options.hasher The hasher to be used. Required but defaults to 256 bit blake2 over `${nonce}${statement}`. - * @returns `verified` is a boolean indicating whether the proof is valid. `errors` is an array of all errors in case it is not. */ export function verifyDisclosedAttributes( claim: PartialClaim, @@ -154,7 +148,7 @@ export function verifyDisclosedAttributes( options: Pick & { canonicalisation?: (claim: PartialClaim) => string[] } = {} -): { verified: boolean; errors: Error[] } { +): void { // apply defaults const defaults = { canonicalisation: makeStatementsJsonLD } const canonicalisation = options.canonicalisation || defaults.canonicalisation @@ -165,7 +159,10 @@ export function verifyDisclosedAttributes( const hashed = Crypto.hashStatements(statements, { ...options, nonces }) // check resulting hashes const digestsInProof = Object.keys(nonces) - return hashed.reduce<{ verified: boolean; errors: Error[] }>( + const { verified, errors } = hashed.reduce<{ + verified: boolean + errors: Error[] + }>( (status, { saltedHash, statement, digest, nonce }) => { // check if the statement digest was contained in the proof and mapped it to a nonce if (!digestsInProof.includes(digest) || !nonce) { @@ -183,6 +180,12 @@ export function verifyDisclosedAttributes( }, { verified: true, errors: [] } ) + if (verified !== true) { + throw new SDKErrors.ClaimUnverifiableError( + 'One or more statements in the claim could not be verified', + { cause: errors } + ) + } } /** @@ -209,14 +212,14 @@ export function verifyDataStructure(input: IClaim | PartialClaim): void { } }) } - DataUtils.validateHash(input.cTypeHash, 'Claim CType') + DataUtils.verifyIsHex(input.cTypeHash, 256) } function verifyAgainstCType( claimContents: IClaim['contents'], cTypeSchema: ICType['schema'] -): boolean { - return verifyClaimAgainstSchema(claimContents, cTypeSchema) +): void { + CType.verifyClaimAgainstSchema(claimContents, cTypeSchema) } /** @@ -229,10 +232,7 @@ export function verify( claimInput: IClaim, cTypeSchema: ICType['schema'] ): void { - if (!verifyAgainstCType(claimInput.contents, cTypeSchema)) { - throw new SDKErrors.ClaimUnverifiableError() - } - + verifyAgainstCType(claimInput.contents, cTypeSchema) verifyDataStructure(claimInput) } @@ -252,15 +252,12 @@ export function fromNestedCTypeClaim( claimContents: IClaim['contents'], claimOwner: DidUri ): IClaim { - if ( - !verifyClaimAgainstNestedSchemas( - cTypeInput.schema, - nestedCType, - claimContents - ) - ) { - throw new SDKErrors.NestedClaimUnverifiableError() - } + CType.verifyClaimAgainstNestedSchemas( + cTypeInput.schema, + nestedCType, + claimContents + ) + const claim = { cTypeHash: cTypeInput.hash, contents: claimContents, @@ -283,12 +280,8 @@ export function fromCTypeAndClaimContents( claimContents: IClaim['contents'], claimOwner: DidUri ): IClaim { - if ( - !isICType(ctypeInput) || - !verifyAgainstCType(claimContents, ctypeInput.schema) - ) { - throw new SDKErrors.ClaimUnverifiableError() - } + CType.verifyDataStructure(ctypeInput) + verifyAgainstCType(claimContents, ctypeInput.schema) const claim = { cTypeHash: ctypeInput.hash, contents: claimContents, diff --git a/packages/core/src/credential/Credential.spec.ts b/packages/core/src/credential/Credential.spec.ts index 1500fb025..685560d2f 100644 --- a/packages/core/src/credential/Credential.spec.ts +++ b/packages/core/src/credential/Credential.spec.ts @@ -92,7 +92,7 @@ describe('Credential', () => { [legitimation] ) // check proof on complete data - expect(Credential.verifyDataIntegrity(credential)).toBe(true) + expect(() => Credential.verifyDataIntegrity(credential)).not.toThrow() const testCType = CType.fromSchema(rawCType) await Credential.verifyCredential(credential, { ctype: testCType, @@ -101,7 +101,7 @@ describe('Credential', () => { // just deleting a field will result in a wrong proof delete credential.claimNonceMap[Object.keys(credential.claimNonceMap)[0]] expect(() => Credential.verifyDataIntegrity(credential)).toThrowError( - SDKErrors.NoProofForStatementError + SDKErrors.ClaimUnverifiableError ) }) @@ -131,8 +131,8 @@ describe('Credential', () => { newCredential.claimHashes.length - 1 ) expect((newCredential.claim.contents as any).b).toBe('b') - expect(Credential.verifyDataIntegrity(newCredential)).toBe(true) - expect(Credential.verifyRootHash(newCredential)).toBe(true) + expect(() => Credential.verifyDataIntegrity(newCredential)).not.toThrow() + expect(() => Credential.verifyRootHash(newCredential)).not.toThrow() }) it('should throw error on faulty constructor input', async () => { @@ -256,13 +256,13 @@ describe('Credential', () => { ).toThrowError(SDKErrors.RootHashUnverifiableError) expect(() => Credential.verifyDataIntegrity(builtCredentialIncompleteClaimHashTree) - ).toThrowError(SDKErrors.NoProofForStatementError) + ).toThrowError(SDKErrors.ClaimUnverifiableError) expect(Credential.isPresentation(builtCredentialMalformedSignature)).toBe( false ) expect(() => Credential.verifyDataIntegrity(builtCredentialMalformedHashes) - ).toThrowError(SDKErrors.NoProofForStatementError) + ).toThrowError(SDKErrors.ClaimUnverifiableError) expect(() => Credential.verifyDataStructure(builtCredential)).not.toThrow() expect(() => { Credential.verifyDataStructure(builtCredentialWithLegitimation) @@ -296,11 +296,13 @@ describe('Credential', () => { }, [] ) - expect(Credential.verifyAgainstCType(builtCredential, testCType)).toBe(true) + expect(() => + Credential.verifyAgainstCType(builtCredential, testCType) + ).not.toThrow() builtCredential.claim.contents.name = 123 - expect(Credential.verifyAgainstCType(builtCredential, testCType)).toBe( - false - ) + expect(() => + Credential.verifyAgainstCType(builtCredential, testCType) + ).toThrow() }) }) @@ -424,7 +426,7 @@ describe('Credential', () => { ) // check proof on complete data - expect(Credential.verifyDataIntegrity(presentation)).toBe(true) + expect(() => Credential.verifyDataIntegrity(presentation)).not.toThrow() await Credential.verifyPresentation(presentation, { didResolve: mockResolve, }) @@ -448,7 +450,7 @@ describe('Credential', () => { ) // check proof on complete data - expect(Credential.verifyDataIntegrity(presentation)).toBe(true) + expect(() => Credential.verifyDataIntegrity(presentation)).not.toThrow() await Credential.verifyPresentation(presentation, { didResolve: mockResolve, }) @@ -496,7 +498,7 @@ describe('Credential', () => { ) // check proof on complete data - expect(Credential.verifyDataIntegrity(presentation)).toBe(true) + expect(() => Credential.verifyDataIntegrity(presentation)).not.toThrow() await expect( Credential.verifyPresentation(presentation, { didResolve: mockResolve, @@ -525,9 +527,9 @@ describe('Credential', () => { [], keyAlice.sign ) - expect(Attestation.verifyAgainstCredential(attestation, credential)).toBe( - true - ) + expect(() => + Attestation.verifyAgainstCredential(attestation, credential) + ).not.toThrow() const { cTypeHash } = attestation // @ts-ignore attestation.cTypeHash = [ @@ -535,9 +537,9 @@ describe('Credential', () => { ((parseInt(cTypeHash.charAt(15), 16) + 1) % 16).toString(16), cTypeHash.slice(16), ].join('') - expect(Attestation.verifyAgainstCredential(attestation, credential)).toBe( - false - ) + expect(() => + Attestation.verifyAgainstCredential(attestation, credential) + ).toThrow() }) it('returns Claim Hash of the attestation', async () => { const [credential, attestation] = await buildPresentation( @@ -804,9 +806,9 @@ describe('create presentation', () => { }) it('should verify the credential claims structure against the ctype', () => { - expect(Credential.verifyAgainstCType(credential, ctype)).toBe(true) + expect(() => Credential.verifyAgainstCType(credential, ctype)).not.toThrow() credential.claim.contents.name = 123 - expect(Credential.verifyAgainstCType(credential, ctype)).toBe(false) + expect(() => Credential.verifyAgainstCType(credential, ctype)).toThrow() }) }) diff --git a/packages/core/src/credential/Credential.ts b/packages/core/src/credential/Credential.ts index 4f5714aef..f959cbb04 100644 --- a/packages/core/src/credential/Credential.ts +++ b/packages/core/src/credential/Credential.ts @@ -126,41 +126,30 @@ export function makeSigningData( * Verifies if the credential hash matches the contents of it. * * @param input - The credential to check. - * @returns Whether they match or not. */ -export function verifyRootHash(input: ICredential): boolean { - return input.rootHash === calculateRootHash(input) +export function verifyRootHash(input: ICredential): void { + if (input.rootHash !== calculateRootHash(input)) + throw new SDKErrors.RootHashUnverifiableError() } /** - * Verifies the data of the [[Credential]] object; used to check that the data was not tampered with, by checking the data against hashes. + * Verifies the data of the [[Credential]] object; used to check that the data was not tampered with, + * by checking the data against hashes. Throws if invalid. * * @param input - The [[Credential]] for which to verify data. - * @returns Whether the data is valid. */ -export function verifyDataIntegrity(input: ICredential): boolean { +export function verifyDataIntegrity(input: ICredential): void { // check claim hash - if (!verifyRootHash(input)) { - throw new SDKErrors.RootHashUnverifiableError() - } + verifyRootHash(input) // verify properties against selective disclosure proof - const { errors, verified } = Claim.verifyDisclosedAttributes(input.claim, { + Claim.verifyDisclosedAttributes(input.claim, { nonces: input.claimNonceMap, hashes: input.claimHashes, }) - // TODO: how do we want to deal with multiple errors during claim verification? - if (!verified) - throw errors.length > 0 ? errors[0] : new SDKErrors.ClaimUnverifiableError() // check legitimations - input.legitimations.forEach((legitimation) => { - if (!verifyDataIntegrity(legitimation)) { - throw new SDKErrors.LegitimationsUnverifiableError() - } - }) - - return true + input.legitimations.forEach(verifyDataIntegrity) } /** @@ -186,18 +175,13 @@ export function verifyDataStructure(input: ICredential): void { if (!('claimNonceMap' in input)) { throw new SDKErrors.ClaimNonceMapMissingError() } - if ( - typeof input.claimNonceMap !== 'object' || - Object.entries(input.claimNonceMap).some( - ([digest, nonce]) => - !digest || - !DataUtils.validateHash(digest, 'statement digest') || - typeof nonce !== 'string' || - !nonce - ) - ) { + if (typeof input.claimNonceMap !== 'object') throw new SDKErrors.ClaimNonceMapMalformedError() - } + Object.entries(input.claimNonceMap).forEach(([digest, nonce]) => { + DataUtils.verifyIsHex(digest, 256) + if (!digest || typeof nonce !== 'string' || !nonce) + throw new SDKErrors.ClaimNonceMapMalformedError() + }) if (!('claimHashes' in input)) { throw new SDKErrors.DataStructureError('claim hashes not provided') @@ -213,19 +197,13 @@ export function verifyDataStructure(input: ICredential): void { * * @param credential A [[Credential]] for the attester. * @param ctype A [[CType]] to verify the [[Claim]] structure. - * - * @returns A boolean if the [[Claim]] structure in the [[Credential]] is valid. */ export function verifyAgainstCType( credential: ICredential, ctype: ICType -): boolean { - try { - verifyDataStructure(credential) - } catch { - return false - } - return verifyClaimAgainstSchema(credential.claim.contents, ctype.schema) +): void { + verifyDataStructure(credential) + verifyClaimAgainstSchema(credential.claim.contents, ctype.schema) } /** @@ -238,7 +216,6 @@ export function verifyAgainstCType( * @param verificationOpts Additional verification options. * @param verificationOpts.didResolve - The function used to resolve the claimer's identity. Defaults to [[resolve]]. * @param verificationOpts.challenge - The expected value of the challenge. Verification will fail in case of a mismatch. - * @returns Whether the signature is correct. */ export async function verifySignature( input: ICredentialPresentation, @@ -249,18 +226,19 @@ export async function verifySignature( challenge?: string didResolve?: DidResolve } = {} -): Promise { +): Promise { const { claimerSignature } = input - if (!isDidSignature(claimerSignature)) return false - if (challenge && challenge !== claimerSignature.challenge) return false + if (challenge && challenge !== claimerSignature.challenge) + throw new SDKErrors.SignatureUnverifiableError( + 'Challenge differs from expected' + ) const signingData = makeSigningData(input, claimerSignature.challenge) - const { verified } = await verifyDidSignature({ + await verifyDidSignature({ signature: claimerSignature, message: signingData, expectedVerificationMethod: 'authentication', didResolve, }) - return verified } export type Options = { @@ -323,11 +301,7 @@ export async function verifyCredential( verifyDataIntegrity(credential) if (ctype) { - const isSchemaValid = verifyAgainstCType(credential, ctype) - if (!isSchemaValid) - throw new SDKErrors.CredentialUnverifiableError( - 'CType verification failed' - ) + verifyAgainstCType(credential, ctype) } } @@ -347,12 +321,10 @@ export async function verifyPresentation( { ctype, challenge, didResolve = resolve }: VerifyOptions = {} ): Promise { await verifyCredential(presentation, { ctype }) - const isSignatureCorrect = await verifySignature(presentation, { + await verifySignature(presentation, { challenge, didResolve, }) - if (!isSignatureCorrect) - throw new SDKErrors.CredentialUnverifiableError('Signature not verifiable') } /** diff --git a/packages/core/src/ctype/CType.metadata.spec.ts b/packages/core/src/ctype/CType.metadata.spec.ts index 67a89712e..dd2b54e49 100644 --- a/packages/core/src/ctype/CType.metadata.spec.ts +++ b/packages/core/src/ctype/CType.metadata.spec.ts @@ -52,10 +52,12 @@ describe('CType', () => { it('verifies the metadata of a ctype', async () => { expect(() => CType.verifyCTypeMetadata(metadata)).not.toThrow() expect(metadata.ctypeHash).not.toHaveLength(0) - expect(CType.verifyObjectAgainstSchema(metadata, MetadataModel)).toBe(true) - expect(CType.verifyObjectAgainstSchema(ctypeMetadata, MetadataModel)).toBe( - false - ) + expect(() => + CType.verifyObjectAgainstSchema(metadata, MetadataModel) + ).not.toThrow() + expect(() => + CType.verifyObjectAgainstSchema(ctypeMetadata, MetadataModel) + ).toThrow() }) it('checks if the metadata matches corresponding ctype hash', async () => { expect(metadata.ctypeHash).toEqual(ctype.hash) diff --git a/packages/core/src/ctype/CType.spec.ts b/packages/core/src/ctype/CType.spec.ts index 0bcefa573..6c9ae50eb 100644 --- a/packages/core/src/ctype/CType.spec.ts +++ b/packages/core/src/ctype/CType.spec.ts @@ -31,11 +31,6 @@ const encodedAliceDid = ApiMocks.mockChainQueryReturn( 'cTYPEs', '4p6K4tpdZtY3rNqM2uorQmsS6d3woxtnWMHjtzGftHmDb41N' ) -const encodedBobDid = ApiMocks.mockChainQueryReturn( - 'ctype', - 'cTYPEs', - '4rDeMGr3Hi4NfxRUp8qVyhvgW3BSUBLneQisGa9ASkhh2sXB' -) const didAlice = 'did:kilt:4p6K4tpdZtY3rNqM2uorQmsS6d3woxtnWMHjtzGftHmDb41N' const didBob = 'did:kilt:4rDeMGr3Hi4NfxRUp8qVyhvgW3BSUBLneQisGa9ASkhh2sXB' @@ -84,13 +79,13 @@ describe('CType', () => { }) it('verifies the claim structure', () => { - expect( + expect(() => CType.verifyClaimAgainstSchema(claim.contents, claimCtype.schema) - ).toBe(true) + ).not.toThrow() claim.contents.name = 123 - expect( + expect(() => CType.verifyClaimAgainstSchema(claim.contents, claimCtype.schema) - ).toBe(false) + ).toThrow() }) it('throws error on faulty input', () => { @@ -147,20 +142,10 @@ describe('CType', () => { }) it('verifies whether a ctype is registered on chain ', async () => { - expect(await CType.verifyStored(claimCtype)).toBe(false) + await expect(CType.verifyStored(claimCtype)).rejects.toThrow() mockedApi.query.ctype.ctypes.mockResolvedValueOnce(encodedAliceDid) - expect(await CType.verifyStored(claimCtype)).toBe(true) - }) - - it('verifies ctype owner on chain', async () => { - expect(await CType.verifyOwner(claimCtype)).toBe(false) - - mockedApi.query.ctype.ctypes.mockResolvedValueOnce(encodedAliceDid) - expect(await CType.verifyOwner(claimCtype)).toBe(true) - - mockedApi.query.ctype.ctypes.mockResolvedValueOnce(encodedBobDid) - expect(await CType.verifyOwner(claimCtype)).toBe(false) + await expect(CType.verifyStored(claimCtype)).resolves.not.toThrow() }) }) @@ -254,23 +239,23 @@ describe('CType verification', () => { 'third-property': true, } it('verifies claims', () => { - expect(CType.verifyClaimAgainstSchema(goodClaim, ctypeWrapperModel)).toBe( - true - ) - expect(CType.verifyClaimAgainstSchema(badClaim, ctypeWrapperModel)).toBe( - false - ) - expect( + expect(() => + CType.verifyClaimAgainstSchema(goodClaim, ctypeWrapperModel) + ).not.toThrow() + expect(() => + CType.verifyClaimAgainstSchema(badClaim, ctypeWrapperModel) + ).toThrow() + expect(() => CType.verifyObjectAgainstSchema(badClaim, CTypeWrapperModel, []) - ).toBe(false) + ).toThrow() expect(() => { CType.verifyClaimAgainstSchema(badClaim, ctypeInput) }).toThrow(SDKErrors.ObjectUnverifiableError) }) it('verifies ctypes', () => { - expect(CType.verifyObjectAgainstSchema(ctypeWrapperModel, CTypeModel)).toBe( - true - ) + expect(() => + CType.verifyObjectAgainstSchema(ctypeWrapperModel, CTypeModel) + ).not.toThrow() }) }) @@ -288,12 +273,7 @@ describe('CType registration verification', () => { describe('when CType is not registered', () => { it('does not verify registration when not registered', async () => { const ctype = CType.fromSchema(rawCType, didAlice) - expect(await CType.verifyStored(ctype)).toBe(false) - }) - - it('does not verify owner when not registered', async () => { - const ctype = CType.fromSchema(rawCType, didAlice) - expect(await CType.verifyOwner(ctype)).toBe(false) + await expect(CType.verifyStored(ctype)).rejects.toThrow() }) }) @@ -304,27 +284,17 @@ describe('CType registration verification', () => { it('verifies registration when owner not set', async () => { const ctype = CType.fromSchema(rawCType) - expect(await CType.verifyStored(ctype)).toBe(true) + await expect(CType.verifyStored(ctype)).resolves.not.toThrow() }) it('verifies registration when owner matches', async () => { const ctype = CType.fromSchema(rawCType, didAlice) - expect(await CType.verifyStored(ctype)).toBe(true) + await expect(CType.verifyStored(ctype)).resolves.not.toThrow() }) it('verifies registration when owner does not match', async () => { const ctype = CType.fromSchema(rawCType, didBob) - expect(await CType.verifyStored(ctype)).toBe(true) - }) - - it('verifies owner when owner matches', async () => { - const ctype = CType.fromSchema(rawCType, didAlice) - expect(await CType.verifyOwner(ctype)).toBe(true) - }) - - it('does not verify owner when owner does not match', async () => { - const ctype = CType.fromSchema(rawCType, didBob) - expect(await CType.verifyOwner(ctype)).toBe(false) + await expect(CType.verifyStored(ctype)).resolves.not.toThrow() }) }) }) diff --git a/packages/core/src/ctype/CType.ts b/packages/core/src/ctype/CType.ts index 00d061ac0..51f47a9a7 100644 --- a/packages/core/src/ctype/CType.ts +++ b/packages/core/src/ctype/CType.ts @@ -25,7 +25,6 @@ import { Crypto, SDKErrors, JsonSchema } from '@kiltprotocol/utils' import { Utils as DidUtils } from '@kiltprotocol/did' import { ConfigService } from '@kiltprotocol/config' import type { HexString } from '@polkadot/util/types' -import { fromChain } from './CType.chain.js' import { CTypeModel, CTypeWrapperModel, @@ -96,24 +95,27 @@ export function getIdForSchema( * @param object Data to be verified against schema. * @param schema Schema to verify against. * @param messages Optional empty array. If passed, this receives all verification errors. - * @returns Whether or not verification was successful. */ export function verifyObjectAgainstSchema( object: Record, schema: Record, messages?: string[] -): boolean { +): void { const validator = new JsonSchema.Validator(schema, '7', false) if (schema.$id !== CTypeModel.$id) { validator.addSchema(CTypeModel) } - const result = validator.validate(object) - if (!result.valid && messages) { - result.errors.forEach((error) => { + const { valid, errors } = validator.validate(object) + if (valid === true) return + if (messages) { + errors.forEach((error) => { messages.push(error.error) }) } - return result.valid + throw new SDKErrors.ObjectUnverifiableError( + 'JSON schema verification failed for object', + { cause: errors } + ) } /** @@ -122,41 +124,28 @@ export function verifyObjectAgainstSchema( * @param claimContents IClaim['contents'] to be verified against the schema. * @param schema ICType['schema'] to be verified against the [CTypeModel]. * @param messages An array, which will be filled by schema errors. - * @returns Boolean whether both claimContents and schema could be verified. */ export function verifyClaimAgainstSchema( claimContents: IClaim['contents'], schema: ICType['schema'], messages?: string[] -): boolean { - if (!verifyObjectAgainstSchema(schema, CTypeModel)) { - throw new SDKErrors.ObjectUnverifiableError() - } - return verifyObjectAgainstSchema(claimContents, schema, messages) +): void { + verifyObjectAgainstSchema(schema, CTypeModel) + verifyObjectAgainstSchema(claimContents, schema, messages) } /** * Checks on the KILT blockchain whether a CType is registered. * * @param ctype CType data. - * @returns Whether or not the CType is registered on-chain. - */ -export async function verifyStored(ctype: ICType): Promise { - const api = ConfigService.get('api') - const encoded = await api.query.ctype.ctypes(ctype.hash) - return encoded.isSome -} - -/** - * Checks on the KILT blockchain whether a CType is registered to the owner listed in the CType record. - * - * @param ctype CType data. - * @returns Whether or not the CType is registered on-chain to `ctype.owner`. */ -export async function verifyOwner(ctype: ICType): Promise { +export async function verifyStored(ctype: ICType): Promise { const api = ConfigService.get('api') const encoded = await api.query.ctype.ctypes(ctype.hash) - return encoded.isSome ? fromChain(encoded) === ctype.owner : false + if (encoded.isNone) + throw new SDKErrors.CTypeHashMissingError( + `CType with hash ${ctype.hash} is not registered on chain` + ) } /** @@ -166,9 +155,7 @@ export async function verifyOwner(ctype: ICType): Promise { * @param input The potentially only partial ICType. */ export function verifyDataStructure(input: ICType): void { - if (!verifyObjectAgainstSchema(input, CTypeWrapperModel)) { - throw new SDKErrors.ObjectUnverifiableError() - } + verifyObjectAgainstSchema(input, CTypeWrapperModel) if (!('schema' in input) || getHashForSchema(input.schema) !== input.hash) { throw new SDKErrors.HashMalformedError(input.hash, 'CType') } @@ -190,27 +177,28 @@ export function verifyDataStructure(input: ICType): void { * @param nestedCTypes - An array of [[CType]] schemas. * @param claimContents - The contents of a [[Claim]] to be validated. * @param messages - Optional empty array. If passed, this receives all verification errors. - * - * @returns Whether the contents is valid. */ export function verifyClaimAgainstNestedSchemas( cType: ICType['schema'], nestedCTypes: Array, claimContents: Record, messages?: string[] -): boolean { +): void { const validator = new JsonSchema.Validator(cType, '7', false) nestedCTypes.forEach((ctype) => { validator.addSchema(ctype) }) validator.addSchema(CTypeModel) - const result = validator.validate(claimContents) - if (!result.valid && messages) { - result.errors.forEach((error) => { + const { valid, errors } = validator.validate(claimContents) + if (valid === true) return + if (messages) { + errors.forEach((error) => { messages.push(error.error) }) } - return result.valid + throw new SDKErrors.NestedClaimUnverifiableError(undefined, { + cause: errors, + }) } /** @@ -219,9 +207,7 @@ export function verifyClaimAgainstNestedSchemas( * @param metadata [[ICTypeMetadata]] that is to be instantiated. */ export function verifyCTypeMetadata(metadata: ICTypeMetadata): void { - if (!verifyObjectAgainstSchema(metadata, MetadataModel)) { - throw new SDKErrors.ObjectUnverifiableError() - } + verifyObjectAgainstSchema(metadata, MetadataModel) } /** diff --git a/packages/core/src/ctype/Ctype.nested.spec.ts b/packages/core/src/ctype/Ctype.nested.spec.ts index 741504f0e..f891863fc 100644 --- a/packages/core/src/ctype/Ctype.nested.spec.ts +++ b/packages/core/src/ctype/Ctype.nested.spec.ts @@ -153,13 +153,13 @@ describe('Nested CTypes', () => { }) it('verify json-schema validator', () => { - expect( + expect(() => CType.verifyClaimAgainstNestedSchemas( nestedCType.schema, [passport.schema, kyc.schema], claimContents ) - ).toBe(true) + ).not.toThrow() claimContents.fullName = {} expect(() => @@ -170,21 +170,21 @@ describe('Nested CTypes', () => { didAlice ) ).toThrowError(SDKErrors.NestedClaimUnverifiableError) - expect( + expect(() => CType.verifyClaimAgainstNestedSchemas( deeplyNestedCType.schema, [passport.schema, kyc.schema], claimDeepContents ) - ).toBe(true) + ).not.toThrow() ;(claimDeepContents.passport as Record).fullName = {} - expect( + expect(() => CType.verifyClaimAgainstNestedSchemas( deeplyNestedCType.schema, [passport.schema, kyc.schema], claimDeepContents ) - ).toBe(false) + ).toThrow() }) it('verify claim from a nested ctype', () => { diff --git a/packages/core/src/delegation/DelegationNode.spec.ts b/packages/core/src/delegation/DelegationNode.spec.ts index 628205d05..50eae3a06 100644 --- a/packages/core/src/delegation/DelegationNode.spec.ts +++ b/packages/core/src/delegation/DelegationNode.spec.ts @@ -145,8 +145,8 @@ describe('DelegationNode', () => { } as DelegationNode, } - expect( - await new DelegationNode({ + await expect( + new DelegationNode({ id: successId, hierarchyId, account: didAlice, @@ -155,10 +155,10 @@ describe('DelegationNode', () => { parentId: undefined, revoked: false, }).verify() - ).toBe(true) + ).resolves.not.toThrow() - expect( - await new DelegationNode({ + await expect( + new DelegationNode({ id: failureId, hierarchyId, account: didAlice, @@ -167,7 +167,7 @@ describe('DelegationNode', () => { parentId: undefined, revoked: false, }).verify() - ).toBe(false) + ).rejects.toThrow() }) it('get delegation root', async () => { diff --git a/packages/core/src/delegation/DelegationNode.ts b/packages/core/src/delegation/DelegationNode.ts index e8f1bcb5b..bca5cbe72 100644 --- a/packages/core/src/delegation/DelegationNode.ts +++ b/packages/core/src/delegation/DelegationNode.ts @@ -323,12 +323,14 @@ export class DelegationNode implements IDelegationNode { /** * Verifies the delegation node by querying it from chain and checking its revocation status. - * - * @returns Promise containing a boolean flag. */ - public async verify(): Promise { + public async verify(): Promise { const node = await query(this.id) - return node !== null && !node.revoked + if (!node || node.revoked !== false) { + throw new SDKErrors.InvalidDelegationNodeError( + 'Delegation node not found or revoked' + ) + } } /** diff --git a/packages/core/src/quote/Quote.spec.ts b/packages/core/src/quote/Quote.spec.ts index d0d0d953b..a89ff80d0 100644 --- a/packages/core/src/quote/Quote.spec.ts +++ b/packages/core/src/quote/Quote.spec.ts @@ -168,7 +168,7 @@ describe('Quote', () => { validAttesterSignedQuote.attesterSignature.keyUri ) - expect( + expect(() => Crypto.verify( Crypto.hashObjectAsStr({ attesterDid: validQuoteData.attesterDid, @@ -184,7 +184,7 @@ describe('Quote', () => { new Uint8Array() ) ) - ).toBe(true) + ).not.toThrow() await Quote.verifyAttesterSignedQuote(validAttesterSignedQuote, { didResolve: mockResolve, }) diff --git a/packages/core/src/quote/Quote.ts b/packages/core/src/quote/Quote.ts index 444b743da..56562727f 100644 --- a/packages/core/src/quote/Quote.ts +++ b/packages/core/src/quote/Quote.ts @@ -108,18 +108,13 @@ export async function verifyAttesterSignedQuote( } = {} ): Promise { const { attesterSignature, ...basicQuote } = quote - const result = await verifyDidSignature({ + await verifyDidSignature({ signature: attesterSignature, message: Crypto.hashObjectAsStr(basicQuote), expectedVerificationMethod: 'authentication', didResolve, }) - if (!result.verified) { - // TODO: should throw a "signature not verifiable" error, with the reason attached. - throw new SDKErrors.QuoteUnverifiableError() - } - const messages: string[] = [] if (!validateQuoteSchema(QuoteSchema, basicQuote, messages)) { throw new SDKErrors.QuoteUnverifiableError() @@ -158,15 +153,12 @@ export async function createQuoteAgreement( attesterSignedQuote.attesterDid ) - const { verified, reason } = await verifyDidSignature({ + await verifyDidSignature({ signature: attesterSignature, message: Crypto.hashObjectAsStr(basicQuote), expectedVerificationMethod: 'authentication', didResolve, }) - if (!verified && reason) { - throw new SDKErrors.SignatureUnverifiableError(reason) - } const signature = await Did.signPayload( claimerIdentity, diff --git a/packages/did/package.json b/packages/did/package.json index 8cd2c9d58..183b148af 100644 --- a/packages/did/package.json +++ b/packages/did/package.json @@ -32,7 +32,7 @@ "devDependencies": { "@kiltprotocol/testing": "workspace:*", "rimraf": "^3.0.2", - "typescript": "^4.5.4" + "typescript": "^4.8.3" }, "dependencies": { "@kiltprotocol/augment-api": "workspace:*", diff --git a/packages/did/src/Did.signature.spec.ts b/packages/did/src/Did.signature.spec.ts index 3844ea13d..5d2fb6573 100644 --- a/packages/did/src/Did.signature.spec.ts +++ b/packages/did/src/Did.signature.spec.ts @@ -26,11 +26,7 @@ import { import { ss58Format } from '@kiltprotocol/utils' import { makeSigningKeyTool } from '@kiltprotocol/testing' import * as Did from './index.js' -import { - VerificationResult, - verifyDidSignature, - isDidSignature, -} from './Did.signature' +import { verifyDidSignature, isDidSignature } from './Did.signature' import { resolve } from './DidResolver' jest.mock('./DidResolver') @@ -72,17 +68,13 @@ describe('light DID', () => { sign, did.authentication[0].id ) - expect( - await verifyDidSignature({ + await expect( + verifyDidSignature({ message: SIGNED_STRING, signature, expectedVerificationMethod: 'authentication', }) - ).toMatchObject({ - verified: true, - did, - key: did.authentication[0], - }) + ).resolves.not.toThrow() }) it('verifies old did signature (with `keyId` property) over string', async () => { @@ -110,11 +102,7 @@ describe('light DID', () => { signature, expectedVerificationMethod: 'authentication', }) - ).resolves.toMatchObject({ - verified: true, - did, - key: did.authentication[0], - }) + ).resolves.not.toThrow() }) it('verifies did signature over bytes', async () => { @@ -125,17 +113,13 @@ describe('light DID', () => { sign, did.authentication[0].id ) - expect( - await verifyDidSignature({ + await expect( + verifyDidSignature({ message: SIGNED_BYTES, signature, expectedVerificationMethod: 'authentication', }) - ).toMatchObject({ - verified: true, - did, - key: did.authentication[0], - }) + ).resolves.not.toThrow() }) it('fails if relationship does not match', async () => { @@ -146,16 +130,13 @@ describe('light DID', () => { sign, did.authentication[0].id ) - expect( - await verifyDidSignature({ + await expect(() => + verifyDidSignature({ message: SIGNED_STRING, signature, expectedVerificationMethod: 'assertionMethod', }) - ).toMatchObject({ - verified: false, - reason: expect.stringMatching(/verification method/i), - }) + ).rejects.toThrow() }) it('fails if key id does not match', async () => { @@ -167,16 +148,13 @@ describe('light DID', () => { did.authentication[0].id ) signature.keyUri += '1a' - expect( - await verifyDidSignature({ + await expect(() => + verifyDidSignature({ message: SIGNED_STRING, signature, expectedVerificationMethod: 'authentication', }) - ).toMatchObject({ - verified: false, - reason: expect.stringMatching(/no key with id/i), - }) + ).rejects.toThrow() }) it('fails if signature does not match', async () => { @@ -187,16 +165,13 @@ describe('light DID', () => { sign, did.authentication[0].id ) - expect( - await verifyDidSignature({ + await expect(() => + verifyDidSignature({ message: SIGNED_STRING.substring(1), signature, expectedVerificationMethod: 'authentication', }) - ).toMatchObject({ - verified: false, - reason: expect.stringMatching(/invalid signature/i), - }) + ).rejects.toThrow() }) it('fails if key id malformed', async () => { @@ -209,16 +184,13 @@ describe('light DID', () => { ) // @ts-expect-error signature.keyUri = signature.keyUri.replace('#', '?') - expect( - await verifyDidSignature({ + await expect(() => + verifyDidSignature({ message: SIGNED_STRING, signature, expectedVerificationMethod: 'authentication', }) - ).toMatchObject({ - verified: false, - reason: expect.stringMatching(/Signature key URI .+ invalid/i), - }) + ).rejects.toThrow() }) it('does not verify if migrated to Full DID', async () => { @@ -236,16 +208,13 @@ describe('light DID', () => { sign, did.authentication[0].id ) - expect( - await verifyDidSignature({ + await expect(() => + verifyDidSignature({ message: SIGNED_STRING, signature, expectedVerificationMethod: 'authentication', }) - ).toMatchObject({ - verified: false, - reason: expect.stringMatching(/migrated/i), - }) + ).rejects.toThrow() }) it('typeguard accepts legal signature objects', () => { @@ -302,17 +271,13 @@ describe('full DID', () => { sign, did.authentication[0].id ) - expect( - await verifyDidSignature({ + await expect( + verifyDidSignature({ message: SIGNED_STRING, signature, expectedVerificationMethod: 'authentication', }) - ).toMatchObject({ - verified: true, - did, - key: did.authentication[0], - }) + ).resolves.not.toThrow() }) it('verifies did signature over bytes', async () => { @@ -323,17 +288,13 @@ describe('full DID', () => { sign, did.authentication[0].id ) - expect( - await verifyDidSignature({ + await expect( + verifyDidSignature({ message: SIGNED_BYTES, signature, expectedVerificationMethod: 'authentication', }) - ).toMatchObject({ - verified: true, - did, - key: did.authentication[0], - }) + ).resolves.not.toThrow() }) it('does not verify if deactivated', async () => { @@ -350,16 +311,13 @@ describe('full DID', () => { sign, did.authentication[0].id ) - expect( - await verifyDidSignature({ + await expect(() => + verifyDidSignature({ message: SIGNED_STRING, signature, expectedVerificationMethod: 'authentication', }) - ).toMatchObject({ - verified: false, - reason: expect.stringMatching(/deactivated/i), - }) + ).rejects.toThrow() }) it('does not verify if not on chain', async () => { @@ -371,16 +329,13 @@ describe('full DID', () => { sign, did.authentication[0].id ) - expect( - await verifyDidSignature({ + await expect(() => + verifyDidSignature({ message: SIGNED_STRING, signature, expectedVerificationMethod: 'authentication', }) - ).toMatchObject({ - verified: false, - reason: expect.stringMatching(/no result/i), - }) + ).rejects.toThrow() }) it('typeguard accepts legal signature objects', () => { diff --git a/packages/did/src/Did.signature.ts b/packages/did/src/Did.signature.ts index 6f11883a6..8d654329f 100644 --- a/packages/did/src/Did.signature.ts +++ b/packages/did/src/Did.signature.ts @@ -12,78 +12,44 @@ import { DidResolve, DidResourceUri, DidSignature, - DidVerificationKey, UriFragment, VerificationKeyRelationship, } from '@kiltprotocol/types' -import { Crypto } from '@kiltprotocol/utils' +import { Crypto, SDKErrors } from '@kiltprotocol/utils' import { resolve } from './DidResolver/index.js' -import { parseDidUri, isKiltDidUri } from './Did.utils.js' +import { parseDidUri, validateKiltDidUri } from './Did.utils.js' import * as Did from './index.js' -type DidSignatureVerificationFromDetailsInput = { +export type DidSignatureVerificationInput = { message: string | Uint8Array - signature: string - keyId: DidVerificationKey['id'] + signature: DidSignature expectedVerificationMethod?: VerificationKeyRelationship - did: DidDocument + didResolve?: DidResolve } -export type VerificationResult = { - verified: boolean - reason?: string - did?: DidDocument - key?: DidVerificationKey +// Used solely for retro-compatibility with previously-generated DID signatures. +// It is reasonable to think that it will be removed at some point in the future. +type OldDidSignature = Pick & { + keyId: DidSignature['keyUri'] } -function verifyDidSignatureFromDetails({ - message, - signature, - keyId, - expectedVerificationMethod, - did, -}: DidSignatureVerificationFromDetailsInput): VerificationResult { - const key = Did.getKey(did, keyId) - if (!key) { - return { - verified: false, - reason: `No key with ID "${keyId}" for the DID ${did.uri}`, - } - } - // Check whether the provided key ID is within the keys for a given verification relationship, if provided. - if ( - expectedVerificationMethod && - !did[expectedVerificationMethod]?.map((verKey) => verKey.id).includes(keyId) - ) { - return { - verified: false, - reason: `No key with ID "${keyId}" for the verification method "${expectedVerificationMethod}"`, - } - } - const isSignatureValid = Crypto.verify( - message, - signature, - u8aToHex(key.publicKey) - ) - if (!isSignatureValid) { - return { - verified: false, - reason: 'Invalid signature', - } - } - return { - verified: true, - did, - key: key as DidVerificationKey, +/** + * Checks whether the input is a valid DidSignature object, consisting of a signature as hex and the uri of the signing key. + * Does not cryptographically verify the signature itself! + * + * @param input Arbitrary input. + */ +export function verifyDidSignatureDataStructure( + input: DidSignature | OldDidSignature +): void { + const keyUri = 'keyUri' in input ? input.keyUri : input.keyId + if (!isHex(input.signature)) { + throw new SDKErrors.SignatureMalformedError( + `Expected signature as a hex string, got ${input.signature}` + ) } -} - -export type DidSignatureVerificationInput = { - message: string | Uint8Array - signature: DidSignature - expectedVerificationMethod?: VerificationKeyRelationship - didResolve?: DidResolve + validateKiltDidUri(keyUri, 'ResourceUri') } /** @@ -95,53 +61,43 @@ export type DidSignatureVerificationInput = { * @param input.signature An object containing signature and signer key. * @param input.expectedVerificationMethod Which relationship to the signer DID the key must have. * @param input.didResolve Allows specifying a custom DID resolve. Defaults to the built-in [[resolve]]. - * @returns Object indicating verification result and optionally reason for failure. */ export async function verifyDidSignature({ message, signature, expectedVerificationMethod, didResolve = resolve, -}: DidSignatureVerificationInput): Promise { - let keyId: UriFragment - let keyUri: DidResourceUri - try { - // Add support for old signatures that had the `keyId` instead of the `keyUri` - const inputUri = signature.keyUri || (signature as any).keyId - // Verification fails if the signature key URI is not valid - const { fragment } = parseDidUri(inputUri) - if (!fragment) throw new Error() +}: DidSignatureVerificationInput): Promise { + verifyDidSignatureDataStructure(signature) + // Add support for old signatures that had the `keyId` instead of the `keyUri` + const inputUri = signature.keyUri || (signature as any).keyId + // Verification fails if the signature key URI is not valid + const { fragment } = parseDidUri(inputUri) + if (!fragment) + throw new SDKErrors.SignatureMalformedError( + `Signature key URI "${signature.keyUri}" invalid` + ) + + const keyId: UriFragment = fragment + const keyUri: DidResourceUri = inputUri - keyId = fragment - keyUri = inputUri - } catch { - return { - verified: false, - reason: `Signature key URI "${signature.keyUri}" invalid`, - } - } const resolutionDetails = await didResolve(keyUri) // Verification fails if the DID does not exist at all. if (!resolutionDetails) { - return { - verified: false, - reason: `No result for provided key URI "${keyUri}"`, - } + throw new SDKErrors.DidError(`No result for provided key URI "${keyUri}"`) } + // Verification also fails if the DID has been deleted. if (resolutionDetails.metadata.deactivated) { - return { - verified: false, - reason: 'DID for provided key is deactivated', - } + throw new SDKErrors.DidError('DID for provided key is deactivated') } // Verification also fails if the signer is a migrated light DID. if (resolutionDetails.metadata.canonicalId) { - return { - verified: false, - reason: 'DID for provided key has been migrated and not usable anymore', - } + throw new SDKErrors.DidError( + 'DID for provided key has been migrated and not usable anymore' + ) } + // Otherwise, the document used is either the migrated full DID document or the light DID document. const did = ( resolutionDetails.metadata.canonicalId !== undefined @@ -149,19 +105,22 @@ export async function verifyDidSignature({ : resolutionDetails.document ) as DidDocument - return verifyDidSignatureFromDetails({ - message, - signature: signature.signature, - keyId, - expectedVerificationMethod, - did, - }) -} - -// Used solely for retro-compatibility with previously-generated DID signatures. -// It is reasonable to think that it will be removed at some point in the future. -type OldDidSignature = Pick & { - keyId: DidSignature['keyUri'] + const key = Did.getKey(did, keyId) + if (!key) { + throw new SDKErrors.DidError( + `No key with ID "${keyId}" for the DID ${did.uri}` + ) + } + // Check whether the provided key ID is within the keys for a given verification relationship, if provided. + if ( + expectedVerificationMethod && + !did[expectedVerificationMethod]?.map((verKey) => verKey.id).includes(keyId) + ) { + throw new SDKErrors.DidError( + `No key with ID "${keyId}" for the verification method "${expectedVerificationMethod}"` + ) + } + Crypto.verify(message, signature.signature, u8aToHex(key.publicKey)) } /** @@ -174,12 +133,8 @@ type OldDidSignature = Pick & { export function isDidSignature( input: unknown ): input is DidSignature | OldDidSignature { - const signature = input as DidSignature | OldDidSignature try { - const keyUri = 'keyUri' in signature ? signature.keyUri : signature.keyId - if (!isHex(signature.signature) || !isKiltDidUri(keyUri, 'ResourceUri')) { - return false - } + verifyDidSignatureDataStructure(input as DidSignature) return true } catch (cause) { return false diff --git a/packages/did/src/Did.utils.ts b/packages/did/src/Did.utils.ts index 4acd74ae4..8940fc57f 100644 --- a/packages/did/src/Did.utils.ts +++ b/packages/did/src/Did.utils.ts @@ -5,7 +5,7 @@ * found in the LICENSE file in the root directory of this source tree. */ -import { blake2AsU8a, checkAddress, encodeAddress } from '@polkadot/util-crypto' +import { blake2AsU8a, encodeAddress } from '@polkadot/util-crypto' import { DidResourceUri, @@ -19,7 +19,7 @@ import { VerificationKeyType, KiltAddress, } from '@kiltprotocol/types' -import { SDKErrors, ss58Format } from '@kiltprotocol/utils' +import { SDKErrors, ss58Format, DataUtils } from '@kiltprotocol/utils' /// The latest version for KILT light DIDs. export const LIGHT_DID_LATEST_VERSION = 1 @@ -45,10 +45,6 @@ const FULL_KILT_DID_REGEX = const LIGHT_KILT_DID_REGEX = /^did:kilt:light:(?[0-9]{2})(?
4[1-9a-km-zA-HJ-NP-Z]{47,48})(:(?.+?))?(?#[^#\n]+)?$/ -function isKiltAddress(input: string): input is KiltAddress { - return checkAddress(input, ss58Format)[0] -} - export type IDidParsingResult = { did: DidUri version: number @@ -198,9 +194,7 @@ export function validateKiltDidUri( break } - if (!isKiltAddress(address)) { - throw new SDKErrors.AddressInvalidError(address, 'DID') - } + DataUtils.verifyKiltAddress(address) } export function isKiltDidUri( @@ -327,7 +321,7 @@ export function getFullDidUri( didOrAddress: DidUri | KiltAddress, version = FULL_DID_LATEST_VERSION ): DidUri { - const address = isKiltAddress(didOrAddress) + const address = DataUtils.isKiltAddress(didOrAddress) ? didOrAddress : parseDidUri(didOrAddress as DidUri).address const versionString = version === 1 ? '' : `v${version}` diff --git a/packages/messaging/package.json b/packages/messaging/package.json index 9e01456aa..612e52023 100644 --- a/packages/messaging/package.json +++ b/packages/messaging/package.json @@ -32,7 +32,7 @@ "devDependencies": { "@kiltprotocol/testing": "workspace:*", "rimraf": "^3.0.2", - "typescript": "^4.5.4" + "typescript": "^4.8.3" }, "dependencies": { "@kiltprotocol/core": "workspace:*", diff --git a/packages/messaging/src/Message.ts b/packages/messaging/src/Message.ts index b8b3fe8b8..3bd280731 100644 --- a/packages/messaging/src/Message.ts +++ b/packages/messaging/src/Message.ts @@ -92,10 +92,7 @@ export function verifyMessageBody(body: MessageBody): void { Credential.verifyDataStructure(credential) ) if (body.content.delegationId) { - DataUtils.validateHash( - body.content.delegationId, - 'Submit terms delegation id hash invalid' - ) + DataUtils.verifyIsHex(body.content.delegationId) } if (body.content.quote) { Quote.validateQuoteSchema(Quote.QuoteSchema, body.content.quote) @@ -108,10 +105,7 @@ export function verifyMessageBody(body: MessageBody): void { case 'reject-terms': { Claim.verifyDataStructure(body.content.claim) if (body.content.delegationId) { - DataUtils.validateHash( - body.content.delegationId, - 'Reject terms delegation id hash' - ) + DataUtils.verifyIsHex(body.content.delegationId) } body.content.legitimations.forEach((val) => Credential.verifyDataStructure(val) @@ -138,10 +132,7 @@ export function verifyMessageBody(body: MessageBody): void { case 'request-credential': { body.content.cTypes.forEach( ({ cTypeHash, trustedAttesters, requiredProperties }): void => { - DataUtils.validateHash( - cTypeHash, - 'request credential cTypeHash invalid' - ) + DataUtils.verifyIsHex(cTypeHash) trustedAttesters?.forEach((did) => Did.Utils.validateKiltDidUri(did, 'Did') ) @@ -165,21 +156,11 @@ export function verifyMessageBody(body: MessageBody): void { break } case 'accept-credential': { - body.content.forEach((cTypeHash) => - DataUtils.validateHash( - cTypeHash, - 'accept credential message ctype hash invalid' - ) - ) + body.content.forEach((cTypeHash) => DataUtils.verifyIsHex(cTypeHash)) break } case 'reject-credential': { - body.content.forEach((cTypeHash) => - DataUtils.validateHash( - cTypeHash, - 'rejected credential ctype hashes invalid' - ) - ) + body.content.forEach((cTypeHash) => DataUtils.verifyIsHex(cTypeHash)) break } case 'request-accept-delegation': { @@ -208,10 +189,7 @@ export function verifyMessageBody(body: MessageBody): void { break } case 'inform-create-delegation': { - DataUtils.validateHash( - body.content.delegationId, - 'inform create delegation message delegation id invalid' - ) + DataUtils.verifyIsHex(body.content.delegationId) break } diff --git a/packages/sdk-js/package.json b/packages/sdk-js/package.json index d96da68e4..9559f00f3 100644 --- a/packages/sdk-js/package.json +++ b/packages/sdk-js/package.json @@ -38,7 +38,7 @@ "rimraf": "^3.0.2", "stream-browserify": "^3.0.0", "terser-webpack-plugin": "^5.1.1", - "typescript": "^4.5.4", + "typescript": "^4.8.3", "url": "^0.11.0", "util": "^0.12.4", "webpack": "^5.70.0", diff --git a/packages/testing/package.json b/packages/testing/package.json index dc709fb5d..312501aa2 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -44,6 +44,6 @@ }, "devDependencies": { "rimraf": "^3.0.2", - "typescript": "^4.5.4" + "typescript": "^4.8.3" } } diff --git a/packages/types/package.json b/packages/types/package.json index c3a4a6531..16afd763f 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -39,6 +39,6 @@ }, "devDependencies": { "rimraf": "^3.0.2", - "typescript": "^4.5.4" + "typescript": "^4.8.3" } } diff --git a/packages/utils/package.json b/packages/utils/package.json index 59e35ac21..c9fc98736 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -31,7 +31,7 @@ "homepage": "https://github.com/KILTprotocol/sdk-js#readme", "devDependencies": { "rimraf": "^3.0.2", - "typescript": "^4.5.4" + "typescript": "^4.8.3" }, "dependencies": { "@kiltprotocol/types": "workspace:*", diff --git a/packages/utils/src/Crypto.ts b/packages/utils/src/Crypto.ts index da59cfae1..38b4b0faf 100644 --- a/packages/utils/src/Crypto.ts +++ b/packages/utils/src/Crypto.ts @@ -32,6 +32,7 @@ import nacl from 'tweetnacl' import { v4 as uuid } from 'uuid' import type { HexString } from '@polkadot/util/types' import jsonabc from './jsonabc.js' +import * as SDKErrors from './SDKErrors.js' export { naclBoxPairFromSecret } from '@polkadot/util-crypto' @@ -105,14 +106,14 @@ export function signStr( * @param message Original signed message to be verified. * @param signature Signature as hex string or byte array. * @param address Substrate address or public key of the signer. - * @returns Whether the signature could be verified. */ export function verify( message: CryptoInput, signature: CryptoInput, address: Address -): boolean { - return signatureVerify(message, signature, address).isValid === true +): void { + if (signatureVerify(message, signature, address).isValid !== true) + throw new SDKErrors.SignatureUnverifiableError() } export type BitLength = 64 | 128 | 256 | 384 | 512 diff --git a/packages/utils/src/DataUtils.spec.ts b/packages/utils/src/DataUtils.spec.ts index 6f4a5bc22..b59457e52 100644 --- a/packages/utils/src/DataUtils.spec.ts +++ b/packages/utils/src/DataUtils.spec.ts @@ -10,122 +10,72 @@ */ import { encodeAddress } from '@polkadot/keyring' -import type { KiltAddress, KiltKeyringPair } from '@kiltprotocol/types' -import { Keyring, SDKErrors, ss58Format } from './index' -import { validateAddress, validateHash, validateSignature } from './DataUtils' +import type { KiltAddress } from '@kiltprotocol/types' +import { SDKErrors, ss58Format } from './index' +import { verifyKiltAddress, verifyIsHex } from './DataUtils' import * as Crypto from './Crypto' const key = Buffer.from([0, 0, 7, 0]) it('validates address with prefix 38', () => { - expect(() => - validateAddress(encodeAddress(key, ss58Format), 'test') - ).not.toThrow() - expect(validateAddress(encodeAddress(key, ss58Format), 'test')).toBe(true) + expect(() => verifyKiltAddress(encodeAddress(key, ss58Format))).not.toThrow() }) it('throws on address with other prefix', () => { expect(() => - validateAddress(encodeAddress(key, 42) as KiltAddress, 'test') - ).toThrow('test') + verifyKiltAddress(encodeAddress(key, 42) as KiltAddress) + ).toThrow() }) it('throws for random strings', () => { - expect(() => validateAddress('' as KiltAddress, 'test')).toThrowError( + expect(() => verifyKiltAddress('' as KiltAddress)).toThrowError( SDKErrors.AddressInvalidError ) - expect(() => validateAddress('0x123' as KiltAddress, 'test')).toThrowError( + expect(() => verifyKiltAddress('0x123' as KiltAddress)).toThrowError( + SDKErrors.AddressInvalidError + ) + expect(() => verifyKiltAddress('bananenbabara' as KiltAddress)).toThrowError( SDKErrors.AddressInvalidError ) expect(() => - validateAddress('bananenbabara' as KiltAddress, 'test') - ).toThrowError(SDKErrors.AddressInvalidError) - expect(() => - validateAddress('ax843zoidsfho38290rdusa' as KiltAddress, 'test') + verifyKiltAddress('ax843zoidsfho38290rdusa' as KiltAddress) ).toThrowError(SDKErrors.AddressInvalidError) }) it('throws if address is no string', () => { - expect(() => - validateAddress(Buffer.from([0, 0, 7]) as any, 'test') - ).toThrowError(SDKErrors.AddressTypeError) + expect(() => verifyKiltAddress(Buffer.from([0, 0, 7]) as any)).toThrowError( + SDKErrors.AddressTypeError + ) }) it('validates hash', () => { ;['wurst', 'a', '1'].forEach((value) => { const hash = Crypto.hashStr(value) - expect(validateHash(hash, 'test')).toBe(true) + expect(() => verifyIsHex(hash)).not.toThrow() }) }) it('throws on broken hashes', () => { const hash = Crypto.hashStr('test') expect(() => { - validateHash(hash.substr(2), 'test') + verifyIsHex(hash.substr(2)) }).toThrowError(SDKErrors.HashMalformedError) expect(() => { - validateHash(hash.substr(0, 60), 'test') + verifyIsHex(hash.substr(0, 60), 256) }).toThrowError(SDKErrors.HashMalformedError) expect(() => { - validateHash(hash.replace('0', 'O'), 'test') + verifyIsHex(hash.replace('0', 'O')) }).toThrowError(SDKErrors.HashMalformedError) expect(() => { - validateHash(`${hash.substr(0, hash.length - 1)}ß`, 'test') + verifyIsHex(`${hash.substr(0, hash.length - 1)}ß`) }).toThrowError(SDKErrors.HashMalformedError) expect(() => { - validateHash(hash.replace(/\w/i, 'P'), 'test') + verifyIsHex(hash.replace(/\w/i, 'P')) }).toThrowError(SDKErrors.HashMalformedError) }) it('throws if hash is no string', () => { - expect(() => - validateHash(Buffer.from([0, 0, 7]) as any, 'test') - ).toThrowError(SDKErrors.HashTypeError) -}) - -describe('validate signature util', () => { - const data = 'data' - const keyring = new Keyring({ - type: 'ed25519', - ss58Format, - }) - const signer = keyring.addFromUri('//Alice') as KiltKeyringPair - const signature = Crypto.signStr('data', signer) - - it('verifies when inputs are strings and signature checks out', () => { - expect(validateSignature(data, signature, signer.address)).toBe(true) - }) - - it('throws when signature does not check out', () => { - expect(() => - validateSignature('dörte', signature, signer.address) - ).toThrowError(SDKErrors.SignatureUnverifiableError) - }) - - it('throws non-sdk error if input is bogus', () => { - expect(() => - validateSignature('dörte', 'signature', 'signer' as KiltAddress) - ).toThrowErrorMatchingInlineSnapshot( - `"Invalid signature length, expected [64..66] bytes, found 9"` - ) - }) - - it('throws when input is incomplete', () => { - expect(() => - validateSignature('data', null as any, 'signer' as KiltAddress) - ).toThrowError(SDKErrors.SignatureMalformedError) - expect(() => - validateSignature('data', 'signature', undefined as any) - ).toThrowError(SDKErrors.SignatureMalformedError) - expect(() => - validateSignature( - { key: ['value'] } as any, - 'signature', - 'signer' as KiltAddress - ) - ).toThrowError(SDKErrors.SignatureMalformedError) - expect(() => (validateSignature as any)()).toThrowError( - SDKErrors.SignatureMalformedError - ) - }) + expect(() => verifyIsHex(Buffer.from([0, 0, 7]) as any)).toThrowError( + SDKErrors.HashMalformedError + ) }) diff --git a/packages/utils/src/DataUtils.ts b/packages/utils/src/DataUtils.ts index 18f3e4daa..514b1b07d 100644 --- a/packages/utils/src/DataUtils.ts +++ b/packages/utils/src/DataUtils.ts @@ -5,69 +5,54 @@ * found in the LICENSE file in the root directory of this source tree. */ +import { isHex } from '@polkadot/util' import type { KiltAddress } from '@kiltprotocol/types' import { checkAddress } from '@polkadot/util-crypto' import * as SDKErrors from './SDKErrors.js' -import { verify } from './Crypto.js' import { ss58Format } from './ss58Format.js' /** - * Validates a given address string against the External Address Format (SS58) with our Prefix of 38. + * Verifies a given address string against the External Address Format (SS58) with our Prefix of 38. * - * @param address Address string to validate for correct Format. - * @param name Contextual name of the address, e.g. "claim owner". - * @returns Boolean whether the given address string checks out against the Format. + * @param input Address string to validate for correct Format. */ -export function validateAddress(address: KiltAddress, name: string): boolean { - if (typeof address !== 'string') { +export function verifyKiltAddress(input: unknown): void { + if (typeof input !== 'string') { throw new SDKErrors.AddressTypeError() } - if (!checkAddress(address, ss58Format)[0]) { - throw new SDKErrors.AddressInvalidError(address, name) + if (!checkAddress(input, ss58Format)[0]) { + throw new SDKErrors.AddressInvalidError(input) } - return true } /** - * Validates the format of the given blake2b hash via regex. + * Type guard to check whether input is an SS58 address with our prefix of 38. * - * @param hash Hash string to validate for correct Format. - * @param name Contextual name of the address, e.g. "claim owner". - * @returns Boolean whether the given hash string checks out against the Format. + * @param input Address string to validate for correct format. + * @returns True if input is a KiltAddress, false otherwise. */ -export function validateHash(hash: string, name: string): boolean { - if (typeof hash !== 'string') { - throw new SDKErrors.HashTypeError() +export function isKiltAddress(input: unknown): input is KiltAddress { + try { + verifyKiltAddress(input) + return true + } catch { + return false } - const blake2bPattern = new RegExp('(0x)[A-F0-9]{64}', 'i') - if (!hash.match(blake2bPattern)) { - throw new SDKErrors.HashMalformedError(hash, name) - } - return true } +// re-exporting isHex +export { isHex } from '@polkadot/util' + /** - * Validates the signature of the given signer address against the signed data. + * Validates the format of a hex string via regex. * - * @param data The signed string of data. - * @param signature The signature of the data to be validated. - * @param signer Address of the signer identity. - * @returns Boolean whether the signature is valid for the given data. + * @param input Hex string to validate for correct format. + * @param bitLength Expected length of hex in bits. */ -export function validateSignature( - data: string, - signature: string, - signer: KiltAddress -): boolean { - if ( - typeof data !== 'string' || - typeof signature !== 'string' || - typeof signer !== 'string' - ) { - throw new SDKErrors.SignatureMalformedError() - } - if (!verify(data, signature, signer)) { - throw new SDKErrors.SignatureUnverifiableError() +export function verifyIsHex(input: unknown, bitLength?: number): void { + if (!isHex(input, bitLength)) { + throw new SDKErrors.HashMalformedError( + typeof input === 'string' ? input : undefined + ) } - return true } diff --git a/packages/vc-export/package.json b/packages/vc-export/package.json index a4767f769..c71bd2b16 100644 --- a/packages/vc-export/package.json +++ b/packages/vc-export/package.json @@ -33,7 +33,7 @@ "@kiltprotocol/testing": "workspace:*", "@types/jsonld": "1.5.1", "rimraf": "^3.0.2", - "typescript": "^4.5.4" + "typescript": "^4.8.3" }, "dependencies": { "@kiltprotocol/augment-api": "workspace:*", diff --git a/tests/bundle-test.ts b/tests/bundle-test.ts index 093ed4369..59003beef 100644 --- a/tests/bundle-test.ts +++ b/tests/bundle-test.ts @@ -268,22 +268,8 @@ async function runAll() { ) await Blockchain.signAndSubmitTx(cTypeStoreTx, payer) - const stored = await CType.verifyStored(DriversLicense) - if (stored) { - console.info('CType successfully stored on chain') - } else { - throw new Error('CType not stored') - } - - const result = await CType.verifyOwner({ - ...DriversLicense, - owner: alice.uri, - }) - if (result) { - console.info('Owner verified') - } else { - throw new Error('CType owner does not match ctype creator DID') - } + await CType.verifyStored(DriversLicense) + console.info('CType successfully stored on chain') // Attestation workflow console.log('Attestation workflow started') @@ -296,9 +282,8 @@ async function runAll() { const credential = Credential.fromClaim(claim) if (!Credential.isICredential(credential)) throw new Error('Not a valid Credential') - if (Credential.verifyDataIntegrity(credential)) - console.info('Credential data verified') - else throw new Error('Credential not verifiable') + Credential.verifyDataIntegrity(credential) + console.info('Credential data verified') if (credential.claim.contents !== content) throw new Error('Claim content inside Credential mismatching') @@ -309,9 +294,8 @@ async function runAll() { }) if (!Credential.isPresentation(presentation)) throw new Error('Not a valid Presentation') - if (await Credential.verifySignature(presentation)) - console.info('Presentation signature verified') - else throw new Error('Credential Signature mismatch') + await Credential.verifySignature(presentation) + console.info('Presentation signature verified') console.log('Test Messaging with encryption + decryption') const message = Message.fromBody( @@ -342,9 +326,8 @@ async function runAll() { } const attestation = Attestation.fromCredentialAndDid(credential, alice.uri) - if (Attestation.verifyAgainstCredential(attestation, credential)) - console.info('Attestation Data verified') - else throw new Error('Attestation Claim data not verifiable') + Attestation.verifyAgainstCredential(attestation, credential) + console.info('Attestation Data verified') const attestationStoreTx = await Did.authorizeExtrinsic( alice, diff --git a/yarn.lock b/yarn.lock index c9b687dec..e26ec2a6e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1240,7 +1240,7 @@ __metadata: glob: ^7.1.1 rimraf: ^3.0.2 ts-node: ^10.4.0 - typescript: ^4.5.4 + typescript: ^4.8.3 websocket: ^1.0.31 yargs: ^16.2.0 languageName: unknown @@ -1259,7 +1259,7 @@ __metadata: "@polkadot/keyring": ^10.0.0 "@polkadot/types": ^9.0.0 rimraf: ^3.0.2 - typescript: ^4.5.4 + typescript: ^4.8.3 languageName: unknown linkType: soft @@ -1271,7 +1271,7 @@ __metadata: "@kiltprotocol/utils": "workspace:*" "@polkadot/api": ^9.0.0 rimraf: ^3.0.2 - typescript: ^4.5.4 + typescript: ^4.8.3 typescript-logging: ^0.6.4 languageName: unknown linkType: soft @@ -1295,7 +1295,7 @@ __metadata: "@types/uuid": ^8.0.0 rimraf: ^3.0.2 testcontainers: ^8.6.1 - typescript: ^4.5.4 + typescript: ^4.8.3 languageName: unknown linkType: soft @@ -1316,7 +1316,7 @@ __metadata: "@polkadot/util-crypto": ^10.0.0 cbor: ^8.0.2 rimraf: ^3.0.2 - typescript: ^4.5.4 + typescript: ^4.8.3 languageName: unknown linkType: soft @@ -1331,7 +1331,7 @@ __metadata: "@kiltprotocol/utils": "workspace:*" "@polkadot/util": ^10.0.0 rimraf: ^3.0.2 - typescript: ^4.5.4 + typescript: ^4.8.3 languageName: unknown linkType: soft @@ -1352,7 +1352,7 @@ __metadata: rimraf: ^3.0.2 stream-browserify: ^3.0.0 terser-webpack-plugin: ^5.1.1 - typescript: ^4.5.4 + typescript: ^4.8.3 url: ^0.11.0 util: ^0.12.4 webpack: ^5.70.0 @@ -1375,7 +1375,7 @@ __metadata: "@polkadot/util": ^10.0.0 "@polkadot/util-crypto": ^10.0.0 rimraf: ^3.0.2 - typescript: ^4.5.4 + typescript: ^4.8.3 languageName: unknown linkType: soft @@ -1390,7 +1390,7 @@ __metadata: "@polkadot/util": ^10.0.0 "@polkadot/util-crypto": ^10.0.0 rimraf: ^3.0.2 - typescript: ^4.5.4 + typescript: ^4.8.3 languageName: unknown linkType: soft @@ -1404,7 +1404,7 @@ __metadata: "@polkadot/util-crypto": ^10.0.0 rimraf: ^3.0.2 tweetnacl: ^1.0.3 - typescript: ^4.5.4 + typescript: ^4.8.3 uuid: ^9.0.0 languageName: unknown linkType: soft @@ -1428,7 +1428,7 @@ __metadata: jsonld: ^2.0.2 jsonld-signatures: ^5.0.0 rimraf: ^3.0.2 - typescript: ^4.5.4 + typescript: ^4.8.3 vc-js: ^0.6.4 languageName: unknown linkType: soft @@ -8719,7 +8719,7 @@ fsevents@^2.3.2: ts-jest: ^27.1.2 ts-jest-resolver: ^2.0.0 typedoc: ^0.22.15 - typescript: ^4.5.4 + typescript: ^4.8.3 languageName: unknown linkType: soft @@ -9870,23 +9870,23 @@ fsevents@^2.3.2: languageName: node linkType: hard -typescript@^4.5.4: - version: 4.6.2 - resolution: "typescript@npm:4.6.2" +typescript@^4.8.3: + version: 4.8.3 + resolution: "typescript@npm:4.8.3" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 8a44ed7e6f6c4cb1ebe8cf236ecda2fb119d84dcf0fbd77e707b2dfea1bbcfc4e366493a143513ce7f57203c75da9d4e20af6fe46de89749366351046be7577c + checksum: 8286a5edcaf3d68e65c451aa1e7150ad1cf53ee0813c07ec35b7abdfdb10f355ecaa13c6a226a694ae7a67785fd7eeebf89f845da0b4f7e4a35561ddc459aba0 languageName: node linkType: hard -"typescript@patch:typescript@^4.5.4#~builtin": - version: 4.6.2 - resolution: "typescript@patch:typescript@npm%3A4.6.2#~builtin::version=4.6.2&hash=32657b" +"typescript@patch:typescript@^4.8.3#~builtin": + version: 4.8.3 + resolution: "typescript@patch:typescript@npm%3A4.8.3#~builtin::version=4.8.3&hash=32657b" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 4b15830bdbd391a66f9f3bcc2dc81fdcaa8143adbf3f9e47dc67ab2d971646a1caf19b89c677afea066e22d3d111f3c1b7b137e3d9a7e8663a6bf9497d428041 + checksum: 57acee3231cdd759173b2e2783ba06da7a730437c7962db89ae8b6d7149adc6d36eb35225d082600b592982e245f7bdf861a745ba5aa1cecc1c9718945cdd6e1 languageName: node linkType: hard From 2b246ee2261289ac3aa85639392178d4aa016a34 Mon Sep 17 00:00:00 2001 From: Github Action Date: Tue, 20 Sep 2022 13:55:44 +0000 Subject: [PATCH 20/36] [CI Skip] ci: publish prerelease --- package.json | 2 +- packages/augment-api/package.json | 2 +- packages/chain-helpers/package.json | 2 +- packages/config/package.json | 2 +- packages/core/package.json | 2 +- packages/did/package.json | 2 +- packages/messaging/package.json | 2 +- packages/sdk-js/package.json | 2 +- packages/testing/package.json | 2 +- packages/types/package.json | 2 +- packages/utils/package.json | 2 +- packages/vc-export/package.json | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index c800caea1..2da00f560 100644 --- a/package.json +++ b/package.json @@ -68,6 +68,6 @@ "typedoc": "^0.22.15", "typescript": "^4.8.3" }, - "version": "0.30.0-9", + "version": "0.30.0-10", "packageManager": "yarn@3.0.2" } diff --git a/packages/augment-api/package.json b/packages/augment-api/package.json index 6d2eff884..b1ac48474 100644 --- a/packages/augment-api/package.json +++ b/packages/augment-api/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/augment-api", - "version": "0.30.0-9", + "version": "0.30.0-10", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/chain-helpers/package.json b/packages/chain-helpers/package.json index 31a274e50..1b1f29217 100644 --- a/packages/chain-helpers/package.json +++ b/packages/chain-helpers/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/chain-helpers", - "version": "0.30.0-9", + "version": "0.30.0-10", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/config/package.json b/packages/config/package.json index 76ae95aa9..a3462fd26 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/config", - "version": "0.30.0-9", + "version": "0.30.0-10", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/core/package.json b/packages/core/package.json index a27bbe93a..d48dc16fa 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/core", - "version": "0.30.0-9", + "version": "0.30.0-10", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/did/package.json b/packages/did/package.json index 183b148af..b298e71d7 100644 --- a/packages/did/package.json +++ b/packages/did/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/did", - "version": "0.30.0-9", + "version": "0.30.0-10", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/messaging/package.json b/packages/messaging/package.json index 612e52023..1adc2c829 100644 --- a/packages/messaging/package.json +++ b/packages/messaging/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/messaging", - "version": "0.30.0-9", + "version": "0.30.0-10", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/sdk-js/package.json b/packages/sdk-js/package.json index 9559f00f3..3b12da3c3 100644 --- a/packages/sdk-js/package.json +++ b/packages/sdk-js/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/sdk-js", - "version": "0.30.0-9", + "version": "0.30.0-10", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/testing/package.json b/packages/testing/package.json index 312501aa2..c44495a5d 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -1,7 +1,7 @@ { "name": "@kiltprotocol/testing", "private": true, - "version": "0.30.0-9", + "version": "0.30.0-10", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/types/package.json b/packages/types/package.json index 16afd763f..6a9f580a1 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/types", - "version": "0.30.0-9", + "version": "0.30.0-10", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/utils/package.json b/packages/utils/package.json index c9fc98736..1033ad5bc 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/utils", - "version": "0.30.0-9", + "version": "0.30.0-10", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/vc-export/package.json b/packages/vc-export/package.json index c71bd2b16..95f9449bf 100644 --- a/packages/vc-export/package.json +++ b/packages/vc-export/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/vc-export", - "version": "0.30.0-9", + "version": "0.30.0-10", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", From a52eb1d6eb3b5f37cecf91f42a03deee046ce9c2 Mon Sep 17 00:00:00 2001 From: Timo Welde Date: Tue, 20 Sep 2022 17:28:59 +0200 Subject: [PATCH 21/36] feat: simplify sign and encrypt callbacks (#624) * feat: simplify sign and encrypt callbacks * feat: more radical approach * feat: select keyRelationship, instead of keyId * feat: combine signcallback and signextrinsiccallback & cleanup callback file * feat: reintroduce did as hint for the callbacks * test: fix unit tests * test: fix integration tests * test: fix bundle tests * test: fix w3n integration tests * feat: inline signWithoutDid * feat: consistent naming * feat: change createPresentation param order * test: no need to export StoreDidCallback * feat: pr feedback * feat: optional keyRelationship param for singPayload * refactor: rename testutils sign callbacks * refactor: same for bundle tests --- .../AccountLinking.spec.ts | 28 ++-- .../__integrationtests__/Attestation.spec.ts | 79 +++++---- .../src/__integrationtests__/Ctypes.spec.ts | 18 +-- .../__integrationtests__/Delegation.spec.ts | 63 ++++---- .../src/__integrationtests__/Deposit.spec.ts | 71 +++++--- .../core/src/__integrationtests__/Did.spec.ts | 147 +++++++++-------- .../__integrationtests__/ErrorHandler.spec.ts | 4 +- .../__integrationtests__/Web3Names.spec.ts | 24 +-- .../core/src/credential/Credential.spec.ts | 42 ++--- packages/core/src/credential/Credential.ts | 17 +- .../core/src/delegation/DelegationNode.ts | 20 ++- packages/core/src/quote/Quote.spec.ts | 16 +- packages/core/src/quote/Quote.ts | 29 +--- packages/did/src/Did.chain.ts | 52 +++--- packages/did/src/Did.signature.spec.ts | 92 +++-------- packages/did/src/DidDetails/DidDetails.ts | 34 ++-- .../did/src/DidDetails/FullDidDetails.spec.ts | 36 +---- packages/did/src/DidDetails/FullDidDetails.ts | 45 ++---- packages/messaging/src/Message.spec.ts | 75 ++++----- packages/messaging/src/Message.ts | 30 +--- packages/testing/src/TestUtils.ts | 99 ++++++++---- packages/types/src/CryptoCallbacks.ts | 153 +++++++++++------- tests/bundle-test.ts | 102 +++++++----- 23 files changed, 634 insertions(+), 642 deletions(-) diff --git a/packages/core/src/__integrationtests__/AccountLinking.spec.ts b/packages/core/src/__integrationtests__/AccountLinking.spec.ts index 84754a436..5325b5298 100644 --- a/packages/core/src/__integrationtests__/AccountLinking.spec.ts +++ b/packages/core/src/__integrationtests__/AccountLinking.spec.ts @@ -83,9 +83,9 @@ describe('When there is an on-chain DID', () => { const associateSenderTx = api.tx.didLookup.associateSender() const signedTx = await Did.authorizeExtrinsic( - did, + did.uri, associateSenderTx, - didKey.sign, + didKey.getSignCallback(did), paymentAccount.address ) const balanceBefore = ( @@ -126,9 +126,9 @@ describe('When there is an on-chain DID', () => { it('should be possible to associate the tx sender to a new DID', async () => { const associateSenderTx = api.tx.didLookup.associateSender() const signedTx = await Did.authorizeExtrinsic( - newDid, + newDid.uri, associateSenderTx, - newDidKey.sign, + newDidKey.getSignCallback(newDid), paymentAccount.address ) const balanceBefore = ( @@ -241,9 +241,9 @@ describe('When there is an on-chain DID', () => { sign ) const signedTx = await Did.authorizeExtrinsic( - did, + did.uri, api.tx.didLookup.associateAccount(...args), - didKey.sign, + didKey.getSignCallback(did), paymentAccount.address ) const balanceBefore = ( @@ -296,9 +296,9 @@ describe('When there is an on-chain DID', () => { sign ) const signedTx = await Did.authorizeExtrinsic( - newDid, + newDid.uri, api.tx.didLookup.associateAccount(...args), - newDidKey.sign, + newDidKey.getSignCallback(newDid), paymentAccount.address ) const balanceBefore = ( @@ -364,9 +364,9 @@ describe('When there is an on-chain DID', () => { const removeLinkTx = api.tx.didLookup.removeAccountAssociation(keypairChain) const signedTx = await Did.authorizeExtrinsic( - newDid, + newDid.uri, removeLinkTx, - newDidKey.sign, + newDidKey.getSignCallback(newDid), paymentAccount.address ) const balanceBefore = ( @@ -435,9 +435,9 @@ describe('When there is an on-chain DID', () => { sign ) const signedTx = await Did.authorizeExtrinsic( - did, + did.uri, api.tx.didLookup.associateAccount(...args), - didKey.sign, + didKey.getSignCallback(did), paymentAccount.address ) const balanceBefore = ( @@ -490,9 +490,9 @@ describe('When there is an on-chain DID', () => { it('should be possible to add a Web3 name for the linked DID and retrieve it starting from the linked account', async () => { const web3NameClaimTx = api.tx.web3Names.claim('test-name') const signedTx = await Did.authorizeExtrinsic( - did, + did.uri, web3NameClaimTx, - didKey.sign, + didKey.getSignCallback(did), paymentAccount.address ) await submitExtrinsic(signedTx, paymentAccount) diff --git a/packages/core/src/__integrationtests__/Attestation.spec.ts b/packages/core/src/__integrationtests__/Attestation.spec.ts index 9368793d1..36fa05911 100644 --- a/packages/core/src/__integrationtests__/Attestation.spec.ts +++ b/packages/core/src/__integrationtests__/Attestation.spec.ts @@ -82,9 +82,9 @@ describe('handling attestations that do not exist', () => { it('Attestation.getRevokeTx', async () => { const draft = api.tx.attestation.revoke(claimHash, null) const authorized = await Did.authorizeExtrinsic( - attester, + attester.uri, draft, - attesterKey.sign, + attesterKey.getSignCallback(attester), tokenHolder.address ) await expect( @@ -98,9 +98,9 @@ describe('handling attestations that do not exist', () => { it('Attestation.getRemoveTx', async () => { const draft = api.tx.attestation.remove(claimHash, null) const authorized = await Did.authorizeExtrinsic( - attester, + attester.uri, draft, - attesterKey.sign, + attesterKey.getSignCallback(attester), tokenHolder.address ) await expect( @@ -117,9 +117,9 @@ describe('When there is an attester, claimer and ctype drivers license', () => { const ctypeExists = await isCtypeOnChain(driversLicenseCType) if (ctypeExists) return const tx = await Did.authorizeExtrinsic( - attester, + attester.uri, api.tx.ctype.add(CType.toChain(driversLicenseCType)), - attesterKey.sign, + attesterKey.getSignCallback(attester), tokenHolder.address ) await submitExtrinsic(tx, tokenHolder) @@ -135,8 +135,7 @@ describe('When there is an attester, claimer and ctype drivers license', () => { const credential = Credential.fromClaim(claim) const presentation = await Credential.createPresentation({ credential, - signCallback: claimerKey.sign, - claimerDid: claimer, + signCallback: claimerKey.getSignCallback(claimer), }) expect(() => Credential.verifyDataIntegrity(presentation)).not.toThrow() await expect( @@ -158,8 +157,7 @@ describe('When there is an attester, claimer and ctype drivers license', () => { const presentation = await Credential.createPresentation({ credential, - signCallback: claimerKey.sign, - claimerDid: claimer, + signCallback: claimerKey.getSignCallback(claimer), }) await expect( Credential.verifySignature(presentation) @@ -176,9 +174,9 @@ describe('When there is an attester, claimer and ctype drivers license', () => { null ) const authorizedStoreTx = await Did.authorizeExtrinsic( - attester, + attester.uri, storeTx, - attesterKey.sign, + attesterKey.getSignCallback(attester), tokenHolder.address ) await submitExtrinsic(authorizedStoreTx, tokenHolder) @@ -212,8 +210,7 @@ describe('When there is an attester, claimer and ctype drivers license', () => { const presentation = await Credential.createPresentation({ credential, - signCallback: claimerKey.sign, - claimerDid: claimer, + signCallback: claimerKey.getSignCallback(claimer), }) await expect( Credential.verifySignature(presentation) @@ -223,7 +220,7 @@ describe('When there is an attester, claimer and ctype drivers license', () => { presentation, attester.uri ) - const { keypair, sign } = makeSigningKeyTool() + const { keypair, getSignCallback } = makeSigningKeyTool() const storeTx = api.tx.attestation.add( attestation.claimHash, @@ -231,9 +228,9 @@ describe('When there is an attester, claimer and ctype drivers license', () => { null ) const authorizedStoreTx = await Did.authorizeExtrinsic( - attester, + attester.uri, storeTx, - sign, + getSignCallback(attester), keypair.address ) await expect( @@ -280,9 +277,9 @@ describe('When there is an attester, claimer and ctype drivers license', () => { null ) const authorizedStoreTx = await Did.authorizeExtrinsic( - attester, + attester.uri, storeTx, - attesterKey.sign, + attesterKey.getSignCallback(attester), tokenHolder.address ) @@ -305,8 +302,7 @@ describe('When there is an attester, claimer and ctype drivers license', () => { credential = Credential.fromClaim(claim) const presentation = await Credential.createPresentation({ credential, - signCallback: claimerKey.sign, - claimerDid: claimer, + signCallback: claimerKey.getSignCallback(claimer), }) attestation = Attestation.fromCredentialAndDid(credential, attester.uri) const storeTx = api.tx.attestation.add( @@ -315,9 +311,9 @@ describe('When there is an attester, claimer and ctype drivers license', () => { null ) const authorizedStoreTx = await Did.authorizeExtrinsic( - attester, + attester.uri, storeTx, - attesterKey.sign, + attesterKey.getSignCallback(attester), tokenHolder.address ) await submitExtrinsic(authorizedStoreTx, tokenHolder) @@ -338,9 +334,9 @@ describe('When there is an attester, claimer and ctype drivers license', () => { null ) const authorizedStoreTx = await Did.authorizeExtrinsic( - attester, + attester.uri, storeTx, - attesterKey.sign, + attesterKey.getSignCallback(attester), tokenHolder.address ) @@ -362,8 +358,7 @@ describe('When there is an attester, claimer and ctype drivers license', () => { const fakeCredential = Credential.fromClaim(claim) await Credential.createPresentation({ credential, - signCallback: claimerKey.sign, - claimerDid: claimer, + signCallback: claimerKey.getSignCallback(claimer), }) expect(() => @@ -374,9 +369,9 @@ describe('When there is an attester, claimer and ctype drivers license', () => { it('should not be possible for the claimer to revoke an attestation', async () => { const revokeTx = api.tx.attestation.revoke(attestation.claimHash, null) const authorizedRevokeTx = await Did.authorizeExtrinsic( - claimer, + claimer.uri, revokeTx, - claimerKey.sign, + claimerKey.getSignCallback(claimer), tokenHolder.address ) @@ -401,9 +396,9 @@ describe('When there is an attester, claimer and ctype drivers license', () => { const revokeTx = api.tx.attestation.revoke(attestation.claimHash, null) const authorizedRevokeTx = await Did.authorizeExtrinsic( - attester, + attester.uri, revokeTx, - attesterKey.sign, + attesterKey.getSignCallback(attester), tokenHolder.address ) await submitExtrinsic(authorizedRevokeTx, tokenHolder) @@ -419,9 +414,9 @@ describe('When there is an attester, claimer and ctype drivers license', () => { it('should be possible for the deposit payer to remove an attestation', async () => { const removeTx = api.tx.attestation.remove(attestation.claimHash, null) const authorizedRemoveTx = await Did.authorizeExtrinsic( - attester, + attester.uri, removeTx, - attesterKey.sign, + attesterKey.getSignCallback(attester), tokenHolder.address ) await submitExtrinsic(authorizedRemoveTx, tokenHolder) @@ -450,9 +445,9 @@ describe('When there is an attester, claimer and ctype drivers license', () => { CType.toChain(officialLicenseAuthorityCType) ) const authorizedStoreTx = await Did.authorizeExtrinsic( - attester, + attester.uri, storeTx, - attesterKey.sign, + attesterKey.getSignCallback(attester), tokenHolder.address ) await submitExtrinsic(authorizedStoreTx, tokenHolder) @@ -473,8 +468,7 @@ describe('When there is an attester, claimer and ctype drivers license', () => { const credential1 = Credential.fromClaim(licenseAuthorization) await Credential.createPresentation({ credential: credential1, - signCallback: claimerKey.sign, - claimerDid: claimer, + signCallback: claimerKey.getSignCallback(claimer), }) const licenseAuthorizationGranted = Attestation.fromCredentialAndDid( credential1, @@ -486,9 +480,9 @@ describe('When there is an attester, claimer and ctype drivers license', () => { null ) const authorizedStoreTx = await Did.authorizeExtrinsic( - anotherAttester, + anotherAttester.uri, storeTx, - anotherAttesterKey.sign, + anotherAttesterKey.getSignCallback(anotherAttester), tokenHolder.address ) await submitExtrinsic(authorizedStoreTx, tokenHolder) @@ -504,8 +498,7 @@ describe('When there is an attester, claimer and ctype drivers license', () => { }) await Credential.createPresentation({ credential: credential2, - signCallback: claimerKey.sign, - claimerDid: claimer, + signCallback: claimerKey.getSignCallback(claimer), }) const licenseGranted = Attestation.fromCredentialAndDid( credential2, @@ -517,9 +510,9 @@ describe('When there is an attester, claimer and ctype drivers license', () => { null ) const authorizedStoreTx2 = await Did.authorizeExtrinsic( - attester, + attester.uri, storeTx2, - attesterKey.sign, + attesterKey.getSignCallback(attester), tokenHolder.address ) await submitExtrinsic(authorizedStoreTx2, tokenHolder) diff --git a/packages/core/src/__integrationtests__/Ctypes.spec.ts b/packages/core/src/__integrationtests__/Ctypes.spec.ts index eee37c7f7..17f1c9410 100644 --- a/packages/core/src/__integrationtests__/Ctypes.spec.ts +++ b/packages/core/src/__integrationtests__/Ctypes.spec.ts @@ -58,12 +58,12 @@ describe('When there is an CtypeCreator and a verifier', () => { it('should not be possible to create a claim type w/o tokens', async () => { const ctype = makeCType() - const { keypair, sign } = makeSigningKeyTool() + const { keypair, getSignCallback } = makeSigningKeyTool() const storeTx = api.tx.ctype.add(CType.toChain(ctype)) const authorizedStoreTx = await Did.authorizeExtrinsic( - ctypeCreator, + ctypeCreator.uri, storeTx, - sign, + getSignCallback(ctypeCreator), keypair.address ) await expect( @@ -76,9 +76,9 @@ describe('When there is an CtypeCreator and a verifier', () => { const ctype = makeCType() const storeTx = api.tx.ctype.add(CType.toChain(ctype)) const authorizedStoreTx = await Did.authorizeExtrinsic( - ctypeCreator, + ctypeCreator.uri, storeTx, - key.sign, + key.getSignCallback(ctypeCreator), paymentAccount.address ) await submitExtrinsic(authorizedStoreTx, paymentAccount) @@ -96,18 +96,18 @@ describe('When there is an CtypeCreator and a verifier', () => { const ctype = makeCType() const storeTx = api.tx.ctype.add(CType.toChain(ctype)) const authorizedStoreTx = await Did.authorizeExtrinsic( - ctypeCreator, + ctypeCreator.uri, storeTx, - key.sign, + key.getSignCallback(ctypeCreator), paymentAccount.address ) await submitExtrinsic(authorizedStoreTx, paymentAccount) const storeTx2 = api.tx.ctype.add(CType.toChain(ctype)) const authorizedStoreTx2 = await Did.authorizeExtrinsic( - ctypeCreator, + ctypeCreator.uri, storeTx2, - key.sign, + key.getSignCallback(ctypeCreator), paymentAccount.address ) await expect( diff --git a/packages/core/src/__integrationtests__/Delegation.spec.ts b/packages/core/src/__integrationtests__/Delegation.spec.ts index 58bfdd7fc..c7e772a94 100644 --- a/packages/core/src/__integrationtests__/Delegation.spec.ts +++ b/packages/core/src/__integrationtests__/Delegation.spec.ts @@ -66,7 +66,7 @@ async function writeHierarchy( const storeTx = await rootNode.getStoreTx() const authorizedStoreTx = await Did.authorizeExtrinsic( - delegator, + delegator.uri, storeTx, sign, paymentAccount.address @@ -94,7 +94,7 @@ async function addDelegation( const signature = await delegationNode.delegateSign(delegate, delegateSign) const storeTx = await delegationNode.getStoreTx(signature) const authorizedStoreTx = await Did.authorizeExtrinsic( - delegator, + delegator.uri, storeTx, delegatorSign, paymentAccount.address @@ -120,9 +120,9 @@ beforeAll(async () => { const storeTx = api.tx.ctype.add(CType.toChain(driversLicenseCType)) const authorizedStoreTx = await Did.authorizeExtrinsic( - attester, + attester.uri, storeTx, - attesterKey.sign, + attesterKey.getSignCallback(attester), paymentAccount.address ) await submitExtrinsic(authorizedStoreTx, paymentAccount) @@ -137,15 +137,15 @@ it('should be possible to delegate attestation rights', async () => { const rootNode = await writeHierarchy( root, driversLicenseCType.hash, - rootKey.sign + rootKey.getSignCallback(root) ) const delegatedNode = await addDelegation( rootNode.id, rootNode.id, root, attester, - rootKey.sign, - attesterKey.sign + rootKey.getSignCallback(root), + attesterKey.getSignCallback(attester) ) await expect(rootNode.verify()).resolves.not.toThrow() await expect(delegatedNode.verify()).resolves.not.toThrow() @@ -159,15 +159,15 @@ describe('and attestation rights have been delegated', () => { rootNode = await writeHierarchy( root, driversLicenseCType.hash, - rootKey.sign + rootKey.getSignCallback(root) ) delegatedNode = await addDelegation( rootNode.id, rootNode.id, root, attester, - rootKey.sign, - attesterKey.sign + rootKey.getSignCallback(root), + attesterKey.getSignCallback(attester) ) await expect(rootNode.verify()).resolves.not.toThrow() @@ -189,8 +189,7 @@ describe('and attestation rights have been delegated', () => { }) const presentation = await Credential.createPresentation({ credential, - signCallback: claimerKey.sign, - claimerDid: claimer, + signCallback: claimerKey.getSignCallback(claimer), }) expect(() => Credential.verifyDataIntegrity(credential)).not.toThrow() await expect( @@ -208,9 +207,9 @@ describe('and attestation rights have been delegated', () => { { Delegation: { subjectNodeId: delegatedNode.id } } ) const authorizedStoreTx = await Did.authorizeExtrinsic( - attester, + attester.uri, storeTx, - attesterKey.sign, + attesterKey.getSignCallback(attester), paymentAccount.address ) await submitExtrinsic(authorizedStoreTx, paymentAccount) @@ -227,9 +226,9 @@ describe('and attestation rights have been delegated', () => { Delegation: { maxChecks: 1 }, }) const authorizedStoreTx2 = await Did.authorizeExtrinsic( - root, + root.uri, revokeTx, - rootKey.sign, + rootKey.getSignCallback(root), paymentAccount.address ) await submitExtrinsic(authorizedStoreTx2, paymentAccount) @@ -253,11 +252,11 @@ describe('revocation', () => { beforeAll(() => { delegator = root - delegatorSign = rootKey.sign + delegatorSign = rootKey.getSignCallback(root) firstDelegate = attester - firstDelegateSign = attesterKey.sign + firstDelegateSign = attesterKey.getSignCallback(attester) secondDelegate = claimer - secondDelegateSign = claimerKey.sign + secondDelegateSign = claimerKey.getSignCallback(claimer) }) it('delegator can revoke but not remove delegation', async () => { @@ -278,7 +277,7 @@ describe('revocation', () => { // Test revocation const revokeTx = await delegationA.getRevokeTx(delegator.uri) const authorizedRevokeTx = await Did.authorizeExtrinsic( - delegator, + delegator.uri, revokeTx, delegatorSign, paymentAccount.address @@ -291,7 +290,7 @@ describe('revocation', () => { // Change introduced in https://github.com/KILTprotocol/mashnet-node/pull/304 const removeTx = await delegationA.getRemoveTx() const authorizedRemoveTx = await Did.authorizeExtrinsic( - delegator, + delegator.uri, removeTx, delegatorSign, paymentAccount.address @@ -324,7 +323,7 @@ describe('revocation', () => { ) const revokeTx = api.tx.delegation.revokeDelegation(delegationRoot.id, 1, 1) const authorizedRevokeTx = await Did.authorizeExtrinsic( - firstDelegate, + firstDelegate.uri, revokeTx, firstDelegateSign, paymentAccount.address @@ -339,7 +338,7 @@ describe('revocation', () => { const revokeTx2 = await delegationA.getRevokeTx(firstDelegate.uri) const authorizedRevokeTx2 = await Did.authorizeExtrinsic( - firstDelegate, + firstDelegate.uri, revokeTx2, firstDelegateSign, paymentAccount.address @@ -373,7 +372,7 @@ describe('revocation', () => { delegationRoot = await delegationRoot.getLatestState() const revokeTx = await delegationRoot.getRevokeTx(delegator.uri) const authorizedRevokeTx = await Did.authorizeExtrinsic( - delegator, + delegator.uri, revokeTx, delegatorSign, paymentAccount.address @@ -392,23 +391,23 @@ describe('Deposit claiming', () => { const rootNode = await writeHierarchy( root, driversLicenseCType.hash, - rootKey.sign + rootKey.getSignCallback(root) ) const delegatedNode = await addDelegation( rootNode.id, rootNode.id, root, root, - rootKey.sign, - rootKey.sign + rootKey.getSignCallback(root), + rootKey.getSignCallback(root) ) const subDelegatedNode = await addDelegation( rootNode.id, delegatedNode.id, root, root, - rootKey.sign, - rootKey.sign + rootKey.getSignCallback(root), + rootKey.getSignCallback(root) ) expect(await DelegationNode.query(delegatedNode.id)).not.toBeNull() @@ -447,15 +446,15 @@ describe('hierarchyDetails', () => { const rootNode = await writeHierarchy( root, driversLicenseCType.hash, - rootKey.sign + rootKey.getSignCallback(root) ) const delegatedNode = await addDelegation( rootNode.id, rootNode.id, root, attester, - rootKey.sign, - attesterKey.sign + rootKey.getSignCallback(root), + attesterKey.getSignCallback(attester) ) const details = await delegatedNode.getHierarchyDetails() diff --git a/packages/core/src/__integrationtests__/Deposit.spec.ts b/packages/core/src/__integrationtests__/Deposit.spec.ts index eeaedb477..6ac7ed5b4 100644 --- a/packages/core/src/__integrationtests__/Deposit.spec.ts +++ b/packages/core/src/__integrationtests__/Deposit.spec.ts @@ -58,7 +58,12 @@ async function checkDeleteFullDid( ) const deleteDid = api.tx.did.delete(storedEndpointsCount) - tx = await Did.authorizeExtrinsic(fullDid, deleteDid, sign, identity.address) + tx = await Did.authorizeExtrinsic( + fullDid.uri, + deleteDid, + sign, + identity.address + ) const balanceBeforeDeleting = ( await api.query.system.account(identity.address) @@ -126,7 +131,7 @@ async function checkRemoveFullDidAttestation( null ) authorizedTx = await Did.authorizeExtrinsic( - fullDid, + fullDid.uri, tx, sign, identity.address @@ -148,7 +153,7 @@ async function checkRemoveFullDidAttestation( tx = api.tx.attestation.remove(attestation.claimHash, null) authorizedTx = await Did.authorizeExtrinsic( - fullDid, + fullDid.uri, tx, sign, identity.address @@ -179,7 +184,7 @@ async function checkReclaimFullDidAttestation( null ) authorizedTx = await Did.authorizeExtrinsic( - fullDid, + fullDid.uri, tx, sign, identity.address @@ -226,7 +231,7 @@ async function checkDeletedDidReclaimAttestation( null ) authorizedTx = await Did.authorizeExtrinsic( - fullDid, + fullDid.uri, tx, sign, identity.address @@ -241,7 +246,12 @@ async function checkDeletedDidReclaimAttestation( attestation = Attestation.fromCredentialAndDid(credential, fullDid.uri) const deleteDid = api.tx.did.delete(storedEndpointsCount) - tx = await Did.authorizeExtrinsic(fullDid, deleteDid, sign, identity.address) + tx = await Did.authorizeExtrinsic( + fullDid.uri, + deleteDid, + sign, + identity.address + ) await submitExtrinsic(tx, identity) @@ -263,7 +273,7 @@ async function checkWeb3Deposit( const depositAmount = api.consts.web3Names.deposit.toBn() const claimTx = api.tx.web3Names.claim(web3Name) let didAuthorizedTx = await Did.authorizeExtrinsic( - fullDid, + fullDid.uri, claimTx, sign, identity.address @@ -282,7 +292,7 @@ async function checkWeb3Deposit( const releaseTx = api.tx.web3Names.releaseByOwner() didAuthorizedTx = await Did.authorizeExtrinsic( - fullDid, + fullDid.uri, releaseTx, sign, identity.address @@ -324,9 +334,9 @@ beforeAll(async () => { const ctypeExists = await isCtypeOnChain(driversLicenseCType) if (!ctypeExists) { const extrinsic = await Did.authorizeExtrinsic( - attester, + attester.uri, api.tx.ctype.add(CType.toChain(driversLicenseCType)), - attesterKey.sign, + attesterKey.getSignCallback(attester), devFaucet.address ) await submitExtrinsic(extrinsic, devFaucet) @@ -346,8 +356,7 @@ beforeAll(async () => { credential = Credential.fromClaim(claim) await Credential.createPresentation({ credential, - signCallback: claimer.sign, - claimerDid: claimerLightDid, + signCallback: claimer.getSignCallback(claimerLightDid), }) }, 120_000) @@ -389,27 +398,27 @@ describe('Different deposits scenarios', () => { testFullDidFive = await createFullDidFromLightDid( keys[4].keypair, testDidFive, - keys[4].sign + keys[4].storeDidCallback ) testFullDidSix = await createFullDidFromLightDid( keys[5].keypair, testDidSix, - keys[5].sign + keys[5].storeDidCallback ) testFullDidSeven = await createFullDidFromLightDid( keys[6].keypair, testDidSeven, - keys[6].sign + keys[6].storeDidCallback ) testFullDidEight = await createFullDidFromLightDid( keys[7].keypair, testDidEight, - keys[7].sign + keys[7].storeDidCallback ) testFullDidNine = await createFullDidFromLightDid( keys[8].keypair, testDidNine, - keys[8].sign + keys[8].storeDidCallback ) testFullDidTen = await createFullDidFromSeed( keys[9].keypair, @@ -419,7 +428,11 @@ describe('Different deposits scenarios', () => { it('Check if deleting full DID returns deposit', async () => { expect( - await checkDeleteFullDid(keys[0].keypair, testFullDidOne, keys[0].sign) + await checkDeleteFullDid( + keys[0].keypair, + testFullDidOne, + keys[0].getSignCallback(testFullDidOne) + ) ).toBe(true) }, 45_000) it('Check if reclaiming full DID returns deposit', async () => { @@ -432,7 +445,7 @@ describe('Different deposits scenarios', () => { await checkRemoveFullDidAttestation( keys[2].keypair, testFullDidThree, - keys[2].sign, + keys[2].getSignCallback(testFullDidThree), credential ) ).toBe(true) @@ -442,14 +455,18 @@ describe('Different deposits scenarios', () => { await checkReclaimFullDidAttestation( keys[3].keypair, testFullDidFour, - keys[3].sign, + keys[3].getSignCallback(testFullDidFour), credential ) ).toBe(true) }, 90_000) it('Check if deleting from a migrated light DID to a full DID returns deposit', async () => { expect( - await checkDeleteFullDid(keys[4].keypair, testFullDidFive, keys[4].sign) + await checkDeleteFullDid( + keys[4].keypair, + testFullDidFive, + keys[4].getSignCallback(testFullDidFive) + ) ).toBe(true) }, 90_000) it('Check if reclaiming from a migrated light DID to a full DID returns deposit', async () => { @@ -462,7 +479,7 @@ describe('Different deposits scenarios', () => { await checkRemoveFullDidAttestation( keys[6].keypair, testFullDidSeven, - keys[6].sign, + keys[6].getSignCallback(testFullDidSeven), credential ) ).toBe(true) @@ -472,7 +489,7 @@ describe('Different deposits scenarios', () => { await checkReclaimFullDidAttestation( keys[7].keypair, testFullDidEight, - keys[7].sign, + keys[7].getSignCallback(testFullDidEight), credential ) ).toBe(true) @@ -481,13 +498,17 @@ describe('Different deposits scenarios', () => { await checkDeletedDidReclaimAttestation( keys[8].keypair, testFullDidNine, - keys[8].sign, + keys[8].getSignCallback(testFullDidNine), credential ) }, 120_000) it('Check if claiming and releasing a web3 name correctly handles deposits', async () => { expect( - await checkWeb3Deposit(keys[9].keypair, testFullDidTen, keys[9].sign) + await checkWeb3Deposit( + keys[9].keypair, + testFullDidTen, + keys[9].getSignCallback(testFullDidTen) + ) ).toBe(true) }, 120_000) }) diff --git a/packages/core/src/__integrationtests__/Did.spec.ts b/packages/core/src/__integrationtests__/Did.spec.ts index 8467887d3..cb50f10ec 100644 --- a/packages/core/src/__integrationtests__/Did.spec.ts +++ b/packages/core/src/__integrationtests__/Did.spec.ts @@ -30,6 +30,7 @@ import { NewDidVerificationKey, NewLightDidVerificationKey, Permission, + SignCallback, } from '@kiltprotocol/types' import { UUID } from '@kiltprotocol/utils' @@ -62,15 +63,21 @@ it('fetches the correct deposit amount', async () => { describe('write and didDeleteTx', () => { let did: DidDocument let key: KeyTool + let signCallback: SignCallback beforeAll(async () => { key = makeSigningKeyTool() did = await createMinimalLightDidFromKeypair(key.keypair) + signCallback = key.getSignCallback(did) }) it('fails to create a new DID on chain with a different submitter than the one in the creation operation', async () => { const otherAccount = devBob - const tx = await Did.Chain.getStoreTx(did, otherAccount.address, key.sign) + const tx = await Did.Chain.getStoreTx( + did, + otherAccount.address, + key.storeDidCallback + ) await expect(submitExtrinsic(tx, paymentAccount)).rejects.toMatchObject({ isBadOrigin: true, @@ -97,7 +104,7 @@ describe('write and didDeleteTx', () => { const tx = await Did.Chain.getStoreTx( newDid, paymentAccount.address, - key.sign + key.storeDidCallback ) await submitExtrinsic(tx, paymentAccount) @@ -162,9 +169,9 @@ describe('write and didDeleteTx', () => { let call = api.tx.did.delete(new BN(10)) let submittable = await Did.authorizeExtrinsic( - fullDid, + fullDid.uri, call, - key.sign, + signCallback, // Use a different account than the submitter one otherAccount.address ) @@ -177,9 +184,9 @@ describe('write and didDeleteTx', () => { call = api.tx.did.delete(new BN(1)) submittable = await Did.authorizeExtrinsic( - fullDid, + fullDid.uri, call, - key.sign, + signCallback, paymentAccount.address ) @@ -206,9 +213,9 @@ describe('write and didDeleteTx', () => { const call = api.tx.did.delete(storedEndpointsCount) const submittable = await Did.authorizeExtrinsic( - fullDid, + fullDid.uri, call, - key.sign, + signCallback, paymentAccount.address ) @@ -225,10 +232,14 @@ describe('write and didDeleteTx', () => { }) it('creates and updates DID, and then reclaims the deposit back', async () => { - const { keypair, sign } = makeSigningKeyTool() + const { keypair, getSignCallback, storeDidCallback } = makeSigningKeyTool() const newDid = await createMinimalLightDidFromKeypair(keypair) - const tx = await Did.Chain.getStoreTx(newDid, paymentAccount.address, sign) + const tx = await Did.Chain.getStoreTx( + newDid, + paymentAccount.address, + storeDidCallback + ) await submitExtrinsic(tx, paymentAccount) @@ -243,9 +254,9 @@ it('creates and updates DID, and then reclaims the deposit back', async () => { Did.Chain.publicKeyToChain(newKey.authentication[0]) ) const tx2 = await Did.authorizeExtrinsic( - fullDid, + fullDid.uri, updateAuthenticationKeyCall, - sign, + getSignCallback(fullDid), paymentAccount.address ) await submitExtrinsic(tx2, paymentAccount) @@ -267,9 +278,9 @@ it('creates and updates DID, and then reclaims the deposit back', async () => { ) const tx3 = await Did.authorizeExtrinsic( - fullDid, + fullDid.uri, updateEndpointCall, - newKey.sign, + newKey.getSignCallback(fullDid), paymentAccount.address ) await submitExtrinsic(tx3, paymentAccount) @@ -286,9 +297,9 @@ it('creates and updates DID, and then reclaims the deposit back', async () => { Did.Chain.resourceIdToChain(newEndpoint.id) ) const tx4 = await Did.authorizeExtrinsic( - fullDid, + fullDid.uri, removeEndpointCall, - newKey.sign, + newKey.getSignCallback(fullDid), paymentAccount.address ) await submitExtrinsic(tx4, paymentAccount) @@ -318,7 +329,7 @@ it('creates and updates DID, and then reclaims the deposit back', async () => { describe('DID migration', () => { it('migrates light DID with ed25519 auth key and encryption key', async () => { - const { sign, authentication } = makeSigningKeyTool('ed25519') + const { storeDidCallback, authentication } = makeSigningKeyTool('ed25519') const { keyAgreement } = makeEncryptionKeyTool( '0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' ) @@ -330,7 +341,7 @@ describe('DID migration', () => { const storeTx = await Did.Chain.getStoreTx( lightDid, paymentAccount.address, - sign + storeDidCallback ) await submitExtrinsic(storeTx, paymentAccount) @@ -366,7 +377,7 @@ describe('DID migration', () => { }) it('migrates light DID with sr25519 auth key', async () => { - const { authentication, sign } = makeSigningKeyTool() + const { authentication, storeDidCallback } = makeSigningKeyTool() const lightDid = Did.createLightDidDocument({ authentication, }) @@ -374,7 +385,7 @@ describe('DID migration', () => { const storeTx = await Did.Chain.getStoreTx( lightDid, paymentAccount.address, - sign + storeDidCallback ) await submitExtrinsic(storeTx, paymentAccount) @@ -404,7 +415,7 @@ describe('DID migration', () => { }) it('migrates light DID with ed25519 auth key, encryption key, and service endpoints', async () => { - const { sign, authentication } = makeSigningKeyTool('ed25519') + const { storeDidCallback, authentication } = makeSigningKeyTool('ed25519') const { keyAgreement } = makeEncryptionKeyTool( '0xcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc' ) @@ -424,7 +435,7 @@ describe('DID migration', () => { const storeTx = await Did.Chain.getStoreTx( lightDid, paymentAccount.address, - sign + storeDidCallback ) await submitExtrinsic(storeTx, paymentAccount) @@ -484,7 +495,8 @@ describe('DID migration', () => { describe('DID authorization', () => { // Light DIDs cannot authorize extrinsics let did: DidDocument - const { sign, authentication } = makeSigningKeyTool('ed25519') + const { getSignCallback, storeDidCallback, authentication } = + makeSigningKeyTool('ed25519') beforeAll(async () => { const createTx = await Did.Chain.getStoreTx( @@ -494,7 +506,7 @@ describe('DID authorization', () => { capabilityDelegation: authentication, }, paymentAccount.address, - sign + storeDidCallback ) await submitExtrinsic(createTx, paymentAccount) const optional = await Did.query( @@ -513,9 +525,9 @@ describe('DID authorization', () => { }) const call = api.tx.ctype.add(CType.toChain(ctype)) const tx = await Did.authorizeExtrinsic( - did, + did.uri, call, - sign, + getSignCallback(did), paymentAccount.address ) await submitExtrinsic(tx, paymentAccount) @@ -529,9 +541,9 @@ describe('DID authorization', () => { ) const deleteCall = api.tx.did.delete(storedEndpointsCount) const tx = await Did.authorizeExtrinsic( - did, + did.uri, deleteCall, - sign, + getSignCallback(did), paymentAccount.address ) await submitExtrinsic(tx, paymentAccount) @@ -544,9 +556,9 @@ describe('DID authorization', () => { }) const call = api.tx.ctype.add(CType.toChain(ctype)) const tx2 = await Did.authorizeExtrinsic( - did, + did.uri, call, - sign, + getSignCallback(did), paymentAccount.address ) await expect(submitExtrinsic(tx2, paymentAccount)).rejects.toMatchObject({ @@ -561,7 +573,7 @@ describe('DID authorization', () => { describe('DID management batching', () => { describe('FullDidCreationBuilder', () => { it('Build a complete full DID', async () => { - const { keypair, sign, authentication } = makeSigningKeyTool() + const { keypair, storeDidCallback, authentication } = makeSigningKeyTool() const extrinsic = await Did.Chain.getStoreTx( { authentication, @@ -610,7 +622,7 @@ describe('DID management batching', () => { ], }, paymentAccount.address, - sign + storeDidCallback ) await submitExtrinsic(extrinsic, paymentAccount) @@ -675,7 +687,8 @@ describe('DID management batching', () => { }) it('Build a minimal full DID with an Ecdsa key', async () => { - const { keypair, sign } = makeSigningKeyTool('ecdsa-secp256k1') + const { keypair, storeDidCallback } = + makeSigningKeyTool('ecdsa-secp256k1') const didAuthKey: NewDidVerificationKey = { publicKey: keypair.publicKey, type: 'ecdsa', @@ -684,7 +697,7 @@ describe('DID management batching', () => { const extrinsic = await Did.Chain.getStoreTx( { authentication: [didAuthKey] }, paymentAccount.address, - sign + storeDidCallback ) await submitExtrinsic(extrinsic, paymentAccount) @@ -704,7 +717,8 @@ describe('DID management batching', () => { describe('FullDidUpdateBuilder', () => { it('Build from a complete full DID and remove everything but the authentication key', async () => { - const { keypair, sign, authentication } = makeSigningKeyTool() + const { keypair, getSignCallback, storeDidCallback, authentication } = + makeSigningKeyTool() const createTx = await Did.Chain.getStoreTx( { @@ -745,7 +759,7 @@ describe('DID management batching', () => { ], }, paymentAccount.address, - sign + storeDidCallback ) await submitExtrinsic(createTx, paymentAccount) @@ -759,7 +773,7 @@ describe('DID management batching', () => { const extrinsic = await Did.authorizeBatch({ batchFunction: api.tx.utility.batchAll, - did: initialFullDid, + did: initialFullDid.uri, extrinsics: [ api.tx.did.removeKeyAgreementKey( Did.Utils.stripFragment(encryptionKeys[0].id) @@ -772,7 +786,7 @@ describe('DID management batching', () => { api.tx.did.removeServiceEndpoint('id-1'), api.tx.did.removeServiceEndpoint('id-2'), ], - sign, + sign: getSignCallback(initialFullDid), submitter: paymentAccount.address, }) await submitExtrinsic(extrinsic, paymentAccount) @@ -795,7 +809,8 @@ describe('DID management batching', () => { }, 40_000) it('Correctly handles rotation of the authentication key', async () => { - const { authentication, sign } = makeSigningKeyTool() + const { authentication, getSignCallback, storeDidCallback } = + makeSigningKeyTool() const { authentication: [newAuthKey], } = makeSigningKeyTool('ed25519') @@ -803,7 +818,7 @@ describe('DID management batching', () => { const createTx = await Did.Chain.getStoreTx( { authentication }, paymentAccount.address, - sign + storeDidCallback ) await submitExtrinsic(createTx, paymentAccount) @@ -814,7 +829,7 @@ describe('DID management batching', () => { const extrinsic = await Did.authorizeBatch({ batchFunction: api.tx.utility.batchAll, - did: initialFullDid, + did: initialFullDid.uri, extrinsics: [ api.tx.did.addServiceEndpoint( Did.Chain.serviceToChain({ @@ -834,7 +849,7 @@ describe('DID management batching', () => { }) ), ], - sign, + sign: getSignCallback(initialFullDid), submitter: paymentAccount.address, }) @@ -853,7 +868,8 @@ describe('DID management batching', () => { }, 40_000) it('simple `batch` succeeds despite failures of some extrinsics', async () => { - const { authentication, sign } = makeSigningKeyTool() + const { authentication, getSignCallback, storeDidCallback } = + makeSigningKeyTool() const tx = await Did.Chain.getStoreTx( { authentication, @@ -866,7 +882,7 @@ describe('DID management batching', () => { ], }, paymentAccount.address, - sign + storeDidCallback ) // Create the full DID with a service endpoint await submitExtrinsic(tx, paymentAccount) @@ -880,7 +896,7 @@ describe('DID management batching', () => { // Try to set a new attestation key and a duplicate service endpoint const updateTx = await Did.authorizeBatch({ batchFunction: api.tx.utility.batch, - did: fullDid, + did: fullDid.uri, extrinsics: [ api.tx.did.setAttestationKey( Did.Chain.publicKeyToChain(authentication[0]) @@ -893,7 +909,7 @@ describe('DID management batching', () => { }) ), ], - sign, + sign: getSignCallback(fullDid), submitter: paymentAccount.address, }) // Now the second operation fails but the batch succeeds @@ -915,7 +931,8 @@ describe('DID management batching', () => { }, 60_000) it('batchAll fails if any extrinsics fails', async () => { - const { authentication, sign } = makeSigningKeyTool() + const { authentication, getSignCallback, storeDidCallback } = + makeSigningKeyTool() const createTx = await Did.Chain.getStoreTx( { authentication, @@ -928,7 +945,7 @@ describe('DID management batching', () => { ], }, paymentAccount.address, - sign + storeDidCallback ) await submitExtrinsic(createTx, paymentAccount) const fullDid = await Did.query( @@ -941,7 +958,7 @@ describe('DID management batching', () => { // Use batchAll to set a new attestation key and a duplicate service endpoint const updateTx = await Did.authorizeBatch({ batchFunction: api.tx.utility.batchAll, - did: fullDid, + did: fullDid.uri, extrinsics: [ api.tx.did.setAttestationKey( Did.Chain.publicKeyToChain(authentication[0]) @@ -954,7 +971,7 @@ describe('DID management batching', () => { }) ), ], - sign, + sign: getSignCallback(fullDid), submitter: paymentAccount.address, }) @@ -1008,14 +1025,14 @@ describe('DID extrinsics batching', () => { const delegationRevocationTx = await rootNode.getRevokeTx(fullDid.uri) const tx = await Did.authorizeBatch({ batchFunction: api.tx.utility.batch, - did: fullDid, + did: fullDid.uri, extrinsics: [ ctypeStoreTx, // Will fail since the delegation cannot be revoked before it is added delegationRevocationTx, delegationStoreTx, ], - sign: key.sign, + sign: key.getSignCallback(fullDid), submitter: paymentAccount.address, }) @@ -1043,14 +1060,14 @@ describe('DID extrinsics batching', () => { const delegationRevocationTx = await rootNode.getRevokeTx(fullDid.uri) const tx = await Did.authorizeBatch({ batchFunction: api.tx.utility.batchAll, - did: fullDid, + did: fullDid.uri, extrinsics: [ ctypeStoreTx, // Will fail since the delegation cannot be revoked before it is added delegationRevocationTx, delegationStoreTx, ], - sign: key.sign, + sign: key.getSignCallback(fullDid), submitter: paymentAccount.address, }) @@ -1067,9 +1084,9 @@ describe('DID extrinsics batching', () => { it('can batch extrinsics for the same required key type', async () => { const web3NameClaimTx = api.tx.web3Names.claim('test-1') const authorizedTx = await Did.authorizeExtrinsic( - fullDid, + fullDid.uri, web3NameClaimTx, - key.sign, + key.getSignCallback(fullDid), paymentAccount.address ) await submitExtrinsic(authorizedTx, paymentAccount) @@ -1078,9 +1095,9 @@ describe('DID extrinsics batching', () => { const web3Name2ClaimExt = api.tx.web3Names.claim('test-2') const tx = await Did.authorizeBatch({ batchFunction: api.tx.utility.batch, - did: fullDid, + did: fullDid.uri, extrinsics: [web3Name1ReleaseExt, web3Name2ClaimExt], - sign: key.sign, + sign: key.getSignCallback(fullDid), submitter: paymentAccount.address, }) await submitExtrinsic(tx, paymentAccount) @@ -1129,7 +1146,7 @@ describe('DID extrinsics batching', () => { const batchedExtrinsics = await Did.authorizeBatch({ batchFunction: api.tx.utility.batchAll, - did: fullDid, + did: fullDid.uri, extrinsics: [ web3NameReleaseExt, ctype1Creation, @@ -1138,7 +1155,7 @@ describe('DID extrinsics batching', () => { ctype2Creation, delegationHierarchyRemoval, ], - sign: key.sign, + sign: key.getSignCallback(fullDid), submitter: paymentAccount.address, }) @@ -1165,7 +1182,7 @@ describe('DID extrinsics batching', () => { describe('Runtime constraints', () => { let testAuthKey: NewDidVerificationKey - const { keypair, sign } = makeSigningKeyTool('ed25519') + const { keypair, storeDidCallback } = makeSigningKeyTool('ed25519') beforeAll(async () => { testAuthKey = { @@ -1188,7 +1205,7 @@ describe('Runtime constraints', () => { keyAgreement: newKeyAgreementKeys, }, paymentAccount.address, - sign + storeDidCallback ) // One more than the maximum newKeyAgreementKeys.push({ @@ -1203,7 +1220,7 @@ describe('Runtime constraints', () => { }, paymentAccount.address, - sign + storeDidCallback ) ).rejects.toThrowErrorMatchingInlineSnapshot( `"The number of key agreement keys in the creation operation is greater than the maximum allowed, which is 10"` @@ -1225,7 +1242,7 @@ describe('Runtime constraints', () => { service: newServiceEndpoints, }, paymentAccount.address, - sign + storeDidCallback ) // One more than the maximum newServiceEndpoints.push({ @@ -1241,7 +1258,7 @@ describe('Runtime constraints', () => { }, paymentAccount.address, - sign + storeDidCallback ) ).rejects.toThrowErrorMatchingInlineSnapshot( `"Cannot store more than 25 service endpoints per DID"` diff --git a/packages/core/src/__integrationtests__/ErrorHandler.spec.ts b/packages/core/src/__integrationtests__/ErrorHandler.spec.ts index 88d7bc9b5..a8549f400 100644 --- a/packages/core/src/__integrationtests__/ErrorHandler.spec.ts +++ b/packages/core/src/__integrationtests__/ErrorHandler.spec.ts @@ -68,9 +68,9 @@ it('records an extrinsic error when ctype does not exist', async () => { null ) const tx = await Did.authorizeExtrinsic( - someDid, + someDid.uri, storeTx, - key.sign, + key.getSignCallback(someDid), paymentAccount.address ) await expect(submitExtrinsic(tx, paymentAccount)).rejects.toMatchObject({ diff --git a/packages/core/src/__integrationtests__/Web3Names.spec.ts b/packages/core/src/__integrationtests__/Web3Names.spec.ts index 0ed2157a2..948213f05 100644 --- a/packages/core/src/__integrationtests__/Web3Names.spec.ts +++ b/packages/core/src/__integrationtests__/Web3Names.spec.ts @@ -76,9 +76,9 @@ describe('When there is an Web3NameCreator and a payer', () => { const tx = api.tx.web3Names.claim(nick) const bobbyBroke = makeSigningKeyTool().keypair const authorizedTx = await Did.authorizeExtrinsic( - w3nCreator, + w3nCreator.uri, tx, - w3nCreatorKey.sign, + w3nCreatorKey.getSignCallback(w3nCreator), bobbyBroke.address ) @@ -90,9 +90,9 @@ describe('When there is an Web3NameCreator and a payer', () => { it('should be possible to create a w3n name with enough tokens', async () => { const tx = api.tx.web3Names.claim(nick) const authorizedTx = await Did.authorizeExtrinsic( - w3nCreator, + w3nCreator.uri, tx, - w3nCreatorKey.sign, + w3nCreatorKey.getSignCallback(w3nCreator), paymentAccount.address ) @@ -116,9 +116,9 @@ describe('When there is an Web3NameCreator and a payer', () => { it('should not be possible to create the same w3n twice', async () => { const tx = api.tx.web3Names.claim(nick) const authorizedTx = await Did.authorizeExtrinsic( - otherWeb3NameCreator, + otherWeb3NameCreator.uri, tx, - otherW3NCreatorKey.sign, + otherW3NCreatorKey.getSignCallback(otherWeb3NameCreator), paymentAccount.address ) @@ -133,9 +133,9 @@ describe('When there is an Web3NameCreator and a payer', () => { it('should not be possible to create a second w3n for the same did', async () => { const tx = api.tx.web3Names.claim('nick2') const authorizedTx = await Did.authorizeExtrinsic( - w3nCreator, + w3nCreator.uri, tx, - w3nCreatorKey.sign, + w3nCreatorKey.getSignCallback(w3nCreator), paymentAccount.address ) @@ -165,18 +165,18 @@ describe('When there is an Web3NameCreator and a payer', () => { // prepare the w3n on chain const prepareTx = api.tx.web3Names.claim(differentNick) const prepareAuthorizedTx = await Did.authorizeExtrinsic( - w3nCreator, + w3nCreator.uri, prepareTx, - w3nCreatorKey.sign, + w3nCreatorKey.getSignCallback(w3nCreator), paymentAccount.address ) await submitExtrinsic(prepareAuthorizedTx, paymentAccount) const tx = api.tx.web3Names.releaseByOwner() const authorizedTx = await Did.authorizeExtrinsic( - w3nCreator, + w3nCreator.uri, tx, - w3nCreatorKey.sign, + w3nCreatorKey.getSignCallback(w3nCreator), paymentAccount.address ) await submitExtrinsic(authorizedTx, paymentAccount) diff --git a/packages/core/src/credential/Credential.spec.ts b/packages/core/src/credential/Credential.spec.ts index 685560d2f..7b834d25d 100644 --- a/packages/core/src/credential/Credential.spec.ts +++ b/packages/core/src/credential/Credential.spec.ts @@ -382,7 +382,6 @@ describe('Credential', () => { const presentation = await Credential.createPresentation({ credential, signCallback: sign, - claimerDid: claimer, }) // build attestation const testAttestation = Attestation.fromCredentialAndDid( @@ -408,7 +407,7 @@ describe('Credential', () => { identityBob.uri, {}, [], - keyAlice.sign + keyAlice.getSignCallback(identityAlice) ) }) @@ -422,7 +421,7 @@ describe('Credential', () => { c: 'c', }, [legitimation], - keyCharlie.sign + keyCharlie.getSignCallback(identityCharlie) ) // check proof on complete data @@ -432,7 +431,7 @@ describe('Credential', () => { }) }) it('verify credentials signed by a light DID', async () => { - const { sign, authentication } = makeSigningKeyTool('ed25519') + const { getSignCallback, authentication } = makeSigningKeyTool('ed25519') identityDave = await Did.createLightDidDocument({ authentication, }) @@ -446,7 +445,7 @@ describe('Credential', () => { c: 'c', }, [legitimation], - sign + getSignCallback(identityDave) ) // check proof on complete data @@ -494,7 +493,7 @@ describe('Credential', () => { c: 'c', }, [legitimation], - migratedAndDeleted.sign + migratedAndDeleted.getSignCallback(migratedAndDeletedLightDid) ) // check proof on complete data @@ -512,7 +511,7 @@ describe('Credential', () => { identityBob.uri, {}, [], - keyAlice.sign + keyAlice.getSignCallback(identityAlice) ) expect(Credential.isICredential(presentation)).toBe(true) delete (presentation as Partial).claimHashes @@ -525,7 +524,7 @@ describe('Credential', () => { identityBob.uri, {}, [], - keyAlice.sign + keyAlice.getSignCallback(identityAlice) ) expect(() => Attestation.verifyAgainstCredential(attestation, credential) @@ -547,7 +546,7 @@ describe('Credential', () => { identityBob.uri, {}, [], - keyAlice.sign + keyAlice.getSignCallback(identityAlice) ) expect(Credential.getHash(credential)).toEqual(attestation.claimHash) }) @@ -673,8 +672,9 @@ describe('create presentation', () => { const presentation = await Credential.createPresentation({ credential, selectedAttributes: ['name'], - signCallback: newKeyForMigratedClaimerDid.sign, - claimerDid: migratedClaimerFullDid, + signCallback: newKeyForMigratedClaimerDid.getSignCallback( + migratedClaimerFullDid + ), challenge, }) await Credential.verifyPresentation(presentation, { @@ -701,8 +701,9 @@ describe('create presentation', () => { const presentation = await Credential.createPresentation({ credential, selectedAttributes: ['name'], - signCallback: unmigratedClaimerKey.sign, - claimerDid: unmigratedClaimerLightDid, + signCallback: unmigratedClaimerKey.getSignCallback( + unmigratedClaimerLightDid + ), challenge, }) await Credential.verifyPresentation(presentation, { @@ -730,9 +731,10 @@ describe('create presentation', () => { const presentation = await Credential.createPresentation({ credential, selectedAttributes: ['name'], - signCallback: newKeyForMigratedClaimerDid.sign, // Use of full DID to sign the presentation. - claimerDid: migratedClaimerFullDid, + signCallback: newKeyForMigratedClaimerDid.getSignCallback( + migratedClaimerFullDid + ), challenge, }) await Credential.verifyPresentation(presentation, { @@ -761,9 +763,10 @@ describe('create presentation', () => { const att = await Credential.createPresentation({ credential, selectedAttributes: ['name'], - signCallback: newKeyForMigratedClaimerDid.sign, // Still using the light DID, which should fail since it has been migrated - claimerDid: migratedClaimerLightDid, + signCallback: newKeyForMigratedClaimerDid.getSignCallback( + migratedClaimerLightDid + ), challenge, }) await expect( @@ -793,9 +796,10 @@ describe('create presentation', () => { const presentation = await Credential.createPresentation({ credential, selectedAttributes: ['name'], - signCallback: migratedThenDeletedKey.sign, // Still using the light DID, which should fail since it has been migrated and then deleted - claimerDid: migratedThenDeletedClaimerLightDid, + signCallback: migratedThenDeletedKey.getSignCallback( + migratedThenDeletedClaimerLightDid + ), challenge, }) await expect( diff --git a/packages/core/src/credential/Credential.ts b/packages/core/src/credential/Credential.ts index f959cbb04..f603e3024 100644 --- a/packages/core/src/credential/Credential.ts +++ b/packages/core/src/credential/Credential.ts @@ -24,7 +24,6 @@ import { signPayload, } from '@kiltprotocol/did' import type { - DidDocument, DidResolve, Hash, IAttestation, @@ -387,24 +386,21 @@ function getAttributes(credential: ICredential): Set { * @param presentationOptions The additional options to use upon presentation generation. * @param presentationOptions.credential The credential to create the presentation for. * @param presentationOptions.signCallback The callback to sign the presentation. - * @param presentationOptions.claimerDid The DID document of the presenter. - * @param presentationOptions.challenge Challenge which will be part of the presentation signature. * @param presentationOptions.selectedAttributes All properties of the claim which have been requested by the verifier and therefore must be publicly presented. + * @param presentationOptions.challenge Challenge which will be part of the presentation signature. * If not specified, all attributes are shown. If set to an empty array, we hide all attributes inside the claim for the presentation. * @returns A deep copy of the Credential with all but `publicAttributes` removed. */ export async function createPresentation({ credential, - selectedAttributes, signCallback, + selectedAttributes, challenge, - claimerDid, }: { credential: ICredential - selectedAttributes?: string[] signCallback: SignCallback + selectedAttributes?: string[] challenge?: string - claimerDid: DidDocument }): Promise { // filter attributes that are not in public attributes const excludedClaimProperties = selectedAttributes @@ -419,13 +415,10 @@ export async function createPresentation({ excludedClaimProperties ) - const selectedKeyId = claimerDid.authentication[0].id - const { signature, keyUri } = await signPayload( - claimerDid, + credential.claim.owner, makeSigningData(presentation, challenge), - signCallback, - selectedKeyId + signCallback ) return { ...credential, claimerSignature: { signature, keyUri, challenge } } diff --git a/packages/core/src/delegation/DelegationNode.ts b/packages/core/src/delegation/DelegationNode.ts index bca5cbe72..8a1e779ae 100644 --- a/packages/core/src/delegation/DelegationNode.ts +++ b/packages/core/src/delegation/DelegationNode.ts @@ -8,6 +8,7 @@ import type { DidDocument, DidUri, + DidVerificationKey, IAttestation, ICType, IDelegationHierarchyDetails, @@ -267,13 +268,24 @@ export class DelegationNode implements IDelegationNode { sign: SignCallback ): Promise { const delegateSignature = await Did.signPayload( - delegateDid, + delegateDid.uri, this.generateHash(), - sign, - delegateDid.authentication[0].id + sign ) + const { fragment } = Did.Utils.parseDidUri(delegateSignature.keyUri) + if (!fragment) { + throw new SDKErrors.DidError( + `DID key uri "${delegateSignature.keyUri}" couldn't be parsed` + ) + } + const key = Did.getKey(delegateDid, fragment) + if (!key) { + throw new SDKErrors.DidError( + `Key with fragment "${fragment}" was not found on DID: "${delegateDid.uri}"` + ) + } return Did.Chain.didSignatureToChain( - delegateDid.authentication[0], + key as DidVerificationKey, delegateSignature ) } diff --git a/packages/core/src/quote/Quote.spec.ts b/packages/core/src/quote/Quote.spec.ts index a89ff80d0..6f7e56b7e 100644 --- a/packages/core/src/quote/Quote.spec.ts +++ b/packages/core/src/quote/Quote.spec.ts @@ -136,15 +136,13 @@ describe('Quote', () => { } validAttesterSignedQuote = await Quote.createAttesterSignedQuote( validQuoteData, - attesterIdentity, - attester.sign + attester.getSignCallback(attesterIdentity) ) quoteBothAgreed = await Quote.createQuoteAgreement( validAttesterSignedQuote, credential.rootHash, - attesterIdentity.uri, - claimerIdentity, - claimer.sign, + claimer.getSignCallback(claimerIdentity), + claimerIdentity.uri, { didResolve: mockResolve, } @@ -157,10 +155,9 @@ describe('Quote', () => { expect(validQuoteData.attesterDid).toEqual(attesterIdentity.uri) expect( await Did.signPayload( - claimerIdentity, + claimerIdentity.uri, Crypto.hashObjectAsStr(validAttesterSignedQuote), - claimer.sign, - claimerIdentity.authentication[0].id + claimer.getSignCallback(claimerIdentity) ) ).toEqual(quoteBothAgreed.claimerSignature) @@ -191,8 +188,7 @@ describe('Quote', () => { expect( await Quote.createAttesterSignedQuote( validQuoteData, - attesterIdentity, - attester.sign + attester.getSignCallback(attesterIdentity) ) ).toEqual(validAttesterSignedQuote) }) diff --git a/packages/core/src/quote/Quote.ts b/packages/core/src/quote/Quote.ts index 56562727f..98842e5ed 100644 --- a/packages/core/src/quote/Quote.ts +++ b/packages/core/src/quote/Quote.ts @@ -16,14 +16,13 @@ */ import type { - DidDocument, - DidUri, IQuote, IQuoteAgreement, IQuoteAttesterSigned, ICredential, SignCallback, DidResolve, + DidUri, } from '@kiltprotocol/types' import { Crypto, JsonSchema, SDKErrors } from '@kiltprotocol/utils' import { resolve, verifyDidSignature } from '@kiltprotocol/did' @@ -69,24 +68,21 @@ export function validateQuoteSchema( */ export async function createAttesterSignedQuote( quoteInput: IQuote, - attesterIdentity: DidDocument, sign: SignCallback ): Promise { if (!validateQuoteSchema(QuoteSchema, quoteInput)) { throw new SDKErrors.QuoteUnverifiableError() } - const authenticationKeyId = attesterIdentity.authentication[0].id const signature = await Did.signPayload( - attesterIdentity, + quoteInput.attesterDid, Crypto.hashObjectAsStr(quoteInput), - sign, - authenticationKeyId + sign ) return { ...quoteInput, attesterSignature: { - keyUri: `${attesterIdentity.uri}${authenticationKeyId}`, + keyUri: signature.keyUri, signature: signature.signature, }, } @@ -126,9 +122,8 @@ export async function verifyAttesterSignedQuote( * * @param attesterSignedQuote A [[Quote]] object signed by an Attester. * @param credentialRootHash A root hash of the entire object. - * @param attesterIdentity The uri of the Attester DID. - * @param claimerIdentity The DID of the Claimer in order to sign. * @param sign The callback to sign with the private key. + * @param claimerDid The DID of the Claimer, who has to sign. * @param options Optional settings. * @param options.didResolve Resolve function used in the process of verifying the attester signature. * @returns A [[Quote]] agreement signed by both the Attester and Claimer. @@ -136,9 +131,8 @@ export async function verifyAttesterSignedQuote( export async function createQuoteAgreement( attesterSignedQuote: IQuoteAttesterSigned, credentialRootHash: ICredential['rootHash'], - attesterIdentity: DidUri, - claimerIdentity: DidDocument, sign: SignCallback, + claimerDid: DidUri, { didResolve = resolve, }: { @@ -147,12 +141,6 @@ export async function createQuoteAgreement( ): Promise { const { attesterSignature, ...basicQuote } = attesterSignedQuote - if (attesterIdentity !== attesterSignedQuote.attesterDid) - throw new SDKErrors.DidSubjectMismatchError( - attesterIdentity, - attesterSignedQuote.attesterDid - ) - await verifyDidSignature({ signature: attesterSignature, message: Crypto.hashObjectAsStr(basicQuote), @@ -161,10 +149,9 @@ export async function createQuoteAgreement( }) const signature = await Did.signPayload( - claimerIdentity, + claimerDid, Crypto.hashObjectAsStr(attesterSignedQuote), - sign, - claimerIdentity.authentication[0].id + sign ) return { diff --git a/packages/did/src/Did.chain.ts b/packages/did/src/Did.chain.ts index 86e820c49..ac00bb2c8 100644 --- a/packages/did/src/Did.chain.ts +++ b/packages/did/src/Did.chain.ts @@ -23,9 +23,11 @@ import type { NewDidEncryptionKey, NewDidVerificationKey, SignCallback, - SigningOptions, + SignRequestData, + SignResponseData, SubmittableExtrinsic, UriFragment, + VerificationKeyRelationship, } from '@kiltprotocol/types' import { verificationKeyTypes } from '@kiltprotocol/types' import { Crypto, SDKErrors, ss58Format } from '@kiltprotocol/utils' @@ -47,9 +49,7 @@ import { EncodedVerificationKey, getAddressByKey, getFullDidUri, - keyTypeForSignatureAlg, parseDidUri, - signatureAlgForKeyType, stripFragment, } from './Did.utils.js' @@ -233,6 +233,10 @@ interface GetStoreTxInput { service?: DidServiceEndpoint[] } +type GetStoreTxSignCallback = ( + signData: Omit +) => Promise> + /** * Create a DID creation operation which includes the information provided. * @@ -246,14 +250,14 @@ interface GetStoreTxInput { * * @param input The DID keys and services to store, also accepts DidDocument, so you can store a light DID for example. * @param submitter The KILT address authorized to submit the creation operation. - * @param sign The sign callback. + * @param sign The sign callback. The authentication key has to be used. * * @returns The SubmittableExtrinsic for the DID creation operation. */ export async function getStoreTx( input: GetStoreTxInput | DidDocument, submitter: KiltAddress, - sign: SignCallback + sign: GetStoreTxSignCallback ): Promise { const api = ConfigService.get('api') @@ -329,25 +333,28 @@ export async function getStoreTx( .createType(api.tx.did.create.meta.args[0].type.toString(), apiInput) .toU8a() - const { publicKey, type } = authenticationKey const signature = await sign({ data: encoded, - meta: {}, - publicKey, - alg: signatureAlgForKeyType[type], + keyRelationship: 'authentication', }) - const encodedSignature = { [type]: signature.data } as EncodedSignature + const encodedSignature = { + [signature.keyType]: signature.data, + } as EncodedSignature return api.tx.did.create(encoded, encodedSignature) } +export interface SigningOptions { + sign: SignCallback + keyRelationship: VerificationKeyRelationship +} + /** * DID related operations on the KILT blockchain require authorization by a full DID. This is realized by requiring that relevant extrinsics are signed with a key featured by a full DID as a verification method. * Such extrinsics can be produced using this function. * * @param params Object wrapping all input to the function. * @param params.did Full DID. - * @param params.signingPublicKey Public key of the keypair to be used for authorization as hex string or Uint8Array. - * @param params.alg The cryptographic signing algorithm to be used. + * @param params.keyRelationship DID key relationship to be used for authorization. * @param params.sign The callback to interface with the key store managing the private key to be used. * @param params.call The call or extrinsic to be authorized. * @param params.txCounter The nonce or txCounter value for this extrinsic, which must be on larger than the current txCounter value of the authorizing full DID. @@ -357,8 +364,7 @@ export async function getStoreTx( */ export async function generateDidAuthenticatedTx({ did, - signingPublicKey, - alg, + keyRelationship, sign, call, txCounter, @@ -379,20 +385,12 @@ export async function generateDidAuthenticatedTx({ ) const signature = await sign({ data: signableCall.toU8a(), - publicKey: Crypto.coToUInt8(signingPublicKey), - alg, - meta: { - method: call.method.toHex(), - version: call.version, - specVersion: api.runtimeVersion.specVersion.toString(), - transactionVersion: api.runtimeVersion.transactionVersion.toString(), - genesisHash: api.genesisHash.toHex(), - nonce: signableCall.txCounter.toHex(), - address: Crypto.encodeAddress(signableCall.did, ss58Format), - }, + keyRelationship, + did, }) - const keyType = keyTypeForSignatureAlg[signature.alg] - const encodedSignature = { [keyType]: signature.data } as EncodedSignature + const encodedSignature = { + [signature.keyType]: signature.data, + } as EncodedSignature return api.tx.did.submitDidCall(signableCall, encodedSignature) } diff --git a/packages/did/src/Did.signature.spec.ts b/packages/did/src/Did.signature.spec.ts index 5d2fb6573..3c7c605ba 100644 --- a/packages/did/src/Did.signature.spec.ts +++ b/packages/did/src/Did.signature.spec.ts @@ -38,10 +38,10 @@ describe('light DID', () => { beforeAll(() => { const keyTool = makeSigningKeyTool() keypair = keyTool.keypair - sign = keyTool.sign did = Did.createLightDidDocument({ authentication: keyTool.authentication, }) + sign = keyTool.getSignCallback(did) }) beforeEach(() => { @@ -62,12 +62,7 @@ describe('light DID', () => { it('verifies did signature over string', async () => { const SIGNED_STRING = 'signed string' - const signature = await Did.signPayload( - did, - SIGNED_STRING, - sign, - did.authentication[0].id - ) + const signature = await Did.signPayload(did.uri, SIGNED_STRING, sign) await expect( verifyDidSignature({ message: SIGNED_STRING, @@ -79,12 +74,7 @@ describe('light DID', () => { it('verifies old did signature (with `keyId` property) over string', async () => { const SIGNED_STRING = 'signed string' - const signature = await Did.signPayload( - did, - SIGNED_STRING, - sign, - did.authentication[0].id - ) + const signature = await Did.signPayload(did.uri, SIGNED_STRING, sign) const oldSignature: any = { ...signature, keyId: signature.keyUri, @@ -107,12 +97,7 @@ describe('light DID', () => { it('verifies did signature over bytes', async () => { const SIGNED_BYTES = Uint8Array.from([1, 2, 3, 4, 5]) - const signature = await Did.signPayload( - did, - SIGNED_BYTES, - sign, - did.authentication[0].id - ) + const signature = await Did.signPayload(did.uri, SIGNED_BYTES, sign) await expect( verifyDidSignature({ message: SIGNED_BYTES, @@ -124,12 +109,7 @@ describe('light DID', () => { it('fails if relationship does not match', async () => { const SIGNED_STRING = 'signed string' - const signature = await Did.signPayload( - did, - SIGNED_STRING, - sign, - did.authentication[0].id - ) + const signature = await Did.signPayload(did.uri, SIGNED_STRING, sign) await expect(() => verifyDidSignature({ message: SIGNED_STRING, @@ -141,12 +121,7 @@ describe('light DID', () => { it('fails if key id does not match', async () => { const SIGNED_STRING = 'signed string' - const signature = await Did.signPayload( - did, - SIGNED_STRING, - sign, - did.authentication[0].id - ) + const signature = await Did.signPayload(did.uri, SIGNED_STRING, sign) signature.keyUri += '1a' await expect(() => verifyDidSignature({ @@ -159,12 +134,7 @@ describe('light DID', () => { it('fails if signature does not match', async () => { const SIGNED_STRING = 'signed string' - const signature = await Did.signPayload( - did, - SIGNED_STRING, - sign, - did.authentication[0].id - ) + const signature = await Did.signPayload(did.uri, SIGNED_STRING, sign) await expect(() => verifyDidSignature({ message: SIGNED_STRING.substring(1), @@ -176,12 +146,7 @@ describe('light DID', () => { it('fails if key id malformed', async () => { const SIGNED_STRING = 'signed string' - const signature = await Did.signPayload( - did, - SIGNED_STRING, - sign, - did.authentication[0].id - ) + const signature = await Did.signPayload(did.uri, SIGNED_STRING, sign) // @ts-expect-error signature.keyUri = signature.keyUri.replace('#', '?') await expect(() => @@ -202,12 +167,7 @@ describe('light DID', () => { }, }) const SIGNED_STRING = 'signed string' - const signature = await Did.signPayload( - did, - SIGNED_STRING, - sign, - did.authentication[0].id - ) + const signature = await Did.signPayload(did.uri, SIGNED_STRING, sign) await expect(() => verifyDidSignature({ message: SIGNED_STRING, @@ -244,7 +204,11 @@ describe('full DID', () => { }, ], } - sign = async ({ data, alg }) => ({ data: keypair.sign(data), alg }) + sign = async ({ data }) => ({ + data: keypair.sign(data), + keyUri: `${did.uri}#0x12345`, + keyType: 'sr25519', + }) }) beforeEach(() => { @@ -265,12 +229,7 @@ describe('full DID', () => { it('verifies did signature over string', async () => { const SIGNED_STRING = 'signed string' - const signature = await Did.signPayload( - did, - SIGNED_STRING, - sign, - did.authentication[0].id - ) + const signature = await Did.signPayload(did.uri, SIGNED_STRING, sign) await expect( verifyDidSignature({ message: SIGNED_STRING, @@ -282,12 +241,7 @@ describe('full DID', () => { it('verifies did signature over bytes', async () => { const SIGNED_BYTES = Uint8Array.from([1, 2, 3, 4, 5]) - const signature = await Did.signPayload( - did, - SIGNED_BYTES, - sign, - did.authentication[0].id - ) + const signature = await Did.signPayload(did.uri, SIGNED_BYTES, sign) await expect( verifyDidSignature({ message: SIGNED_BYTES, @@ -305,12 +259,7 @@ describe('full DID', () => { }, }) const SIGNED_STRING = 'signed string' - const signature = await Did.signPayload( - did, - SIGNED_STRING, - sign, - did.authentication[0].id - ) + const signature = await Did.signPayload(did.uri, SIGNED_STRING, sign) await expect(() => verifyDidSignature({ message: SIGNED_STRING, @@ -323,12 +272,7 @@ describe('full DID', () => { it('does not verify if not on chain', async () => { jest.mocked(resolve).mockResolvedValue(null) const SIGNED_STRING = 'signed string' - const signature = await Did.signPayload( - did, - SIGNED_STRING, - sign, - did.authentication[0].id - ) + const signature = await Did.signPayload(did.uri, SIGNED_STRING, sign) await expect(() => verifyDidSignature({ message: SIGNED_STRING, diff --git a/packages/did/src/DidDetails/DidDetails.ts b/packages/did/src/DidDetails/DidDetails.ts index 7b537f6c6..5168dbf4b 100644 --- a/packages/did/src/DidDetails/DidDetails.ts +++ b/packages/did/src/DidDetails/DidDetails.ts @@ -10,17 +10,13 @@ import { u8aToHex } from '@polkadot/util' import type { DidDocument, DidKey, - DidResourceUri, DidServiceEndpoint, DidSignature, - DidVerificationKey, + DidUri, SignCallback, - VerificationKeyType, + VerificationKeyRelationship, } from '@kiltprotocol/types' -import { verificationKeyTypes } from '@kiltprotocol/types' -import { Crypto, SDKErrors } from '@kiltprotocol/utils' - -import { signatureAlgForKeyType } from '../Did.utils.js' +import { Crypto } from '@kiltprotocol/utils' /** * Gets all public keys associated with this DID. @@ -70,33 +66,27 @@ export function getEndpoint( /** * Generate a signature over the provided input payload, either as a byte array or as a HEX-encoded string. * - * @param did The DID data. + * @param did The DID to be used. * @param payload The byte array or HEX-encoded payload to sign. * @param sign The sign callback to use for the signing operation. - * @param keyId The key ID to use to generate the signature. + * @param keyRelationship (optional) The key relationship, that should be used. Defaults to 'authentication'. * * @returns The resulting [[DidSignature]]. */ export async function signPayload( - did: Partial & Pick, + did: DidUri, payload: Uint8Array | string, sign: SignCallback, - keyId: DidVerificationKey['id'] + keyRelationship: VerificationKeyRelationship = 'authentication' ): Promise { - const key = getKey(did, keyId) - if (!key || !verificationKeyTypes.includes(key.type)) { - throw new SDKErrors.DidError( - `Failed to find verification key with ID "${keyId}" on DID "${did.uri}"` - ) - } - const alg = signatureAlgForKeyType[key.type as VerificationKeyType] - const { data: signature } = await sign({ - publicKey: key.publicKey, - alg, + const { data: signature, keyUri } = await sign({ data: Crypto.coToUInt8(payload), + keyRelationship, + did, }) + return { - keyUri: `${did.uri}${key.id}` as DidResourceUri, + keyUri, signature: u8aToHex(signature), } } diff --git a/packages/did/src/DidDetails/FullDidDetails.spec.ts b/packages/did/src/DidDetails/FullDidDetails.spec.ts index 98c323447..654632d49 100644 --- a/packages/did/src/DidDetails/FullDidDetails.spec.ts +++ b/packages/did/src/DidDetails/FullDidDetails.spec.ts @@ -210,8 +210,10 @@ describe('When creating an instance from the chain', () => { let fullDid: DidDocument beforeAll(async () => { - ;({ keypair, sign } = makeSigningKeyTool()) - fullDid = await createLocalDemoFullDidFromKeypair(keypair) + const keyTool = makeSigningKeyTool() + keypair = keyTool.keypair + fullDid = await createLocalDemoFullDidFromKeypair(keyTool.keypair) + sign = keyTool.getSignCallback(fullDid) }) describe('.addSingleExtrinsic()', () => { @@ -219,7 +221,7 @@ describe('When creating an instance from the chain', () => { const extrinsic = augmentedApi.tx.indices.claim(1) await expect(async () => Did.authorizeBatch({ - did: fullDid, + did: fullDid.uri, batchFunction: augmentedApi.tx.utility.batchAll, extrinsics: [extrinsic, extrinsic], sign, @@ -237,7 +239,7 @@ describe('When creating an instance from the chain', () => { const batchFunction = jest.fn() as unknown as typeof mockedApi.tx.utility.batchAll await Did.authorizeBatch({ - did: fullDid, + did: fullDid.uri, batchFunction, extrinsics: [extrinsic, extrinsic], sign, @@ -247,28 +249,6 @@ describe('When creating an instance from the chain', () => { expect(batchFunction).toHaveBeenCalledWith([extrinsic, extrinsic]) }) - it('fails if the DID does not have any key required to sign the batch', async () => { - // Full DID with only an authentication key. - const newFullDid: DidDocument = { - uri: fullDid.uri, - authentication: [fullDid.authentication[0]], - } - const extrinsic = await augmentedApi.tx.ctype.add('test-ctype') - - await expect(async () => - Did.authorizeBatch({ - did: newFullDid, - batchFunction: augmentedApi.tx.utility.batchAll, - extrinsics: [extrinsic, extrinsic], - nonce: new BN(0), - sign, - submitter: keypair.address, - }) - ).rejects.toMatchInlineSnapshot( - '[DidBuilderError: Found no key for relationship "assertionMethod"]' - ) - }) - it('adds different batches requiring different keys', async () => { const ctype1Extrinsic = await augmentedApi.tx.ctype.add(randomAsHex(32)) const ctype2Extrinsic = await augmentedApi.tx.ctype.add(randomAsHex(32)) @@ -296,7 +276,7 @@ describe('When creating an instance from the chain', () => { ctype4Extrinsic, ] await Did.authorizeBatch({ - did: fullDid, + did: fullDid.uri, batchFunction, extrinsics, nonce: new BN(0), @@ -324,7 +304,7 @@ describe('When creating an instance from the chain', () => { it('throws if batch is empty', async () => { await expect(async () => Did.authorizeBatch({ - did: fullDid, + did: fullDid.uri, batchFunction: augmentedApi.tx.utility.batchAll, extrinsics: [], sign, diff --git a/packages/did/src/DidDetails/FullDidDetails.ts b/packages/did/src/DidDetails/FullDidDetails.ts index 214d2d58f..0d90b0ca1 100644 --- a/packages/did/src/DidDetails/FullDidDetails.ts +++ b/packages/did/src/DidDetails/FullDidDetails.ts @@ -28,7 +28,7 @@ import { generateDidAuthenticatedTx, servicesFromChain, } from '../Did.chain.js' -import { parseDidUri, signatureAlgForKeyType } from '../Did.utils.js' +import { parseDidUri } from '../Did.utils.js' import { getKeyRelationshipForExtrinsic, @@ -101,9 +101,9 @@ export function getKeysForExtrinsic( * @param did The DID data. * @returns The next valid nonce, i.e., the nonce currently stored on the blockchain + 1, wrapping around the max value when reached. */ -export async function getNextNonce(did: DidDocument): Promise { +export async function getNextNonce(did: DidUri): Promise { const api = ConfigService.get('api') - const queried = await api.query.did.did(didToChain(did.uri)) + const queried = await api.query.did.did(didToChain(did)) const currentNonce = queried.isSome ? didFromChain(queried).lastTxCounter : new BN(0) @@ -122,7 +122,7 @@ export async function getNextNonce(did: DidDocument): Promise { * @returns The DID-signed submittable extrinsic. */ export async function authorizeExtrinsic( - did: DidDocument, + did: DidUri, extrinsic: Extrinsic, sign: SignCallback, submitterAccount: KiltAddress, @@ -132,23 +132,20 @@ export async function authorizeExtrinsic( txCounter?: BN } = {} ): Promise { - const { uri } = did - if (parseDidUri(uri).type === 'light') { + if (parseDidUri(did).type === 'light') { throw new SDKErrors.DidError( - `An extrinsic can only be authorized with a full DID, not with "${uri}"` + `An extrinsic can only be authorized with a full DID, not with "${did}"` ) } - const [signingKey] = getKeysForExtrinsic(did, extrinsic) - if (signingKey === undefined) { - throw new SDKErrors.DidError( - `The details for DID "${uri}" do not contain the required keys for this operation` - ) + const keyRelationship = getKeyRelationshipForExtrinsic(extrinsic) + if (keyRelationship === undefined) { + throw new SDKErrors.SDKError('No key relationship found for extrinsic') } + return generateDidAuthenticatedTx({ - did: did.uri, - signingPublicKey: signingKey.publicKey, - alg: signatureAlgForKeyType[signingKey.type], + did, + keyRelationship, sign, call: extrinsic, txCounter: txCounter || (await getNextNonce(did)), @@ -218,7 +215,7 @@ export async function authorizeBatch({ submitter, }: { batchFunction: SubmittableExtrinsicFunction<'promise'> - did: DidDocument + did: DidUri extrinsics: Extrinsic[] nonce?: BN sign: SignCallback @@ -230,10 +227,9 @@ export async function authorizeBatch({ ) } - const { uri } = did - if (parseDidUri(uri).type === 'light') { + if (parseDidUri(did).type === 'light') { throw new SDKErrors.DidError( - `An extrinsic can only be authorized with a full DID, not with "${uri}"` + `An extrinsic can only be authorized with a full DID, not with "${did}"` ) } @@ -252,17 +248,10 @@ export async function authorizeBatch({ const txCounter = increaseNonce(firstNonce, batchIndex) const { keyRelationship } = group - const [signingKey] = did[keyRelationship] || [] - if (!signingKey) { - throw new SDKErrors.DidBuilderError( - `Found no key for relationship "${keyRelationship}"` - ) - } return generateDidAuthenticatedTx({ - did: did.uri, - signingPublicKey: signingKey.publicKey, - alg: signatureAlgForKeyType[signingKey.type], + did, + keyRelationship, sign, call, txCounter, diff --git a/packages/messaging/src/Message.spec.ts b/packages/messaging/src/Message.spec.ts index 65b5089be..fd08eda0e 100644 --- a/packages/messaging/src/Message.spec.ts +++ b/packages/messaging/src/Message.spec.ts @@ -21,7 +21,6 @@ import type { ISubmitAttestation, ISubmitCredential, ResolvedDidKey, - SignCallback, IAcceptCredential, IAttestation, IClaim, @@ -66,6 +65,7 @@ import { makeSigningKeyTool, createLocalDemoFullDidFromKeypair, KeyTool, + KeyToolSignCallback, } from '@kiltprotocol/testing' import { u8aToHex } from '@polkadot/util' import { Crypto, SDKErrors } from '@kiltprotocol/utils' @@ -76,13 +76,13 @@ describe('Messaging', () => { let aliceLightDid: DidDocument let aliceLightDidWithDetails: DidDocument let aliceFullDid: DidDocument - let aliceSign: SignCallback + let aliceSign: KeyToolSignCallback const aliceEncKey = makeEncryptionKeyTool('Alice//enc') let bobLightDid: DidDocument let bobLightDidWithDetails: DidDocument let bobFullDid: DidDocument - let bobSign: SignCallback + let bobSign: KeyToolSignCallback const bobEncKey = makeEncryptionKeyTool('Bob//enc') async function didResolve(did: DidUri): Promise { @@ -141,7 +141,7 @@ describe('Messaging', () => { beforeAll(async () => { const aliceAuthKey = makeSigningKeyTool('ed25519') - aliceSign = aliceAuthKey.sign + aliceSign = aliceAuthKey.getSignCallback aliceLightDid = Did.createLightDidDocument({ authentication: aliceAuthKey.authentication, keyAgreement: aliceEncKey.keyAgreement, @@ -156,7 +156,7 @@ describe('Messaging', () => { aliceFullDid = await createLocalDemoFullDidFromLightDid(aliceLightDid) const bobAuthKey = makeSigningKeyTool('ed25519') - bobSign = bobAuthKey.sign + bobSign = bobAuthKey.getSignCallback bobLightDid = Did.createLightDidDocument({ authentication: bobAuthKey.authentication, keyAgreement: bobEncKey.keyAgreement, @@ -183,9 +183,7 @@ describe('Messaging', () => { ) const encryptedMessage = await Message.encrypt( message, - '#encryption', - aliceLightDid, - aliceEncKey.encrypt, + aliceEncKey.encrypt(aliceLightDid), `${bobLightDid.uri}#encryption`, { resolveKey } ) @@ -220,11 +218,10 @@ describe('Messaging', () => { ) ).rejects.toThrowError(SDKErrors.DecodingMessageError) - const encryptedWrongBody = await aliceEncKey.encrypt({ - alg: 'x25519-xsalsa20-poly1305', + const encryptedWrongBody = await aliceEncKey.encrypt(aliceLightDid)({ data: Crypto.coToUInt8('{ wrong JSON'), - publicKey: aliceLightDid.keyAgreement![0].publicKey, peerPublicKey: bobLightDid.keyAgreement![0].publicKey, + did: aliceLightDid.uri, }) const encryptedMessageWrongBody: IEncryptedMessage = { ciphertext: u8aToHex(encryptedWrongBody.data), @@ -251,8 +248,7 @@ describe('Messaging', () => { const presentation = await Credential.createPresentation({ credential, - signCallback: aliceSign, - claimerDid: aliceFullDid, + signCallback: aliceSign(aliceFullDid), }) const date = new Date(2019, 11, 10).toISOString() @@ -271,15 +267,13 @@ describe('Messaging', () => { } const quoteAttesterSigned = await Quote.createAttesterSignedQuote( quoteData, - bobFullDid, - bobSign + bobSign(bobFullDid) ) const bothSigned = await Quote.createQuoteAgreement( quoteAttesterSigned, credential.rootHash, - bobFullDid.uri, - aliceFullDid, - aliceSign, + aliceSign(aliceFullDid), + aliceFullDid.uri, { didResolve } ) const requestAttestationBody: IRequestAttestation = { @@ -423,8 +417,7 @@ describe('Messaging', () => { const presentation = await Credential.createPresentation({ credential, - signCallback: aliceSign, - claimerDid: aliceLightDid, + signCallback: aliceSign(aliceLightDid), }) const date = new Date(2019, 11, 10).toISOString() @@ -442,15 +435,13 @@ describe('Messaging', () => { } const quoteAttesterSigned = await Quote.createAttesterSignedQuote( quoteData, - bobLightDid, - bobSign + bobSign(bobLightDid) ) const bothSigned = await Quote.createQuoteAgreement( quoteAttesterSigned, credential.rootHash, - bobLightDid.uri, - aliceLightDid, - aliceSign, + aliceSign(aliceLightDid), + aliceLightDid.uri, { didResolve } ) const requestAttestationBody: IRequestAttestation = { @@ -468,8 +459,7 @@ describe('Messaging', () => { owner: aliceLightDidWithDetails.uri, contents: {}, }), - signCallback: aliceSign, - claimerDid: aliceLightDidWithDetails, + signCallback: aliceSign(aliceLightDidWithDetails), }) const quoteDataEncodedDetails: IQuote = { @@ -487,15 +477,13 @@ describe('Messaging', () => { const quoteAttesterSignedEncodedDetails = await Quote.createAttesterSignedQuote( quoteDataEncodedDetails, - bobLightDidWithDetails, - bobSign + bobSign(bobLightDidWithDetails) ) const bothSignedEncodedDetails = await Quote.createQuoteAgreement( quoteAttesterSignedEncodedDetails, credential.rootHash, - bobLightDidWithDetails.uri, - aliceLightDidWithDetails, - aliceSign, + aliceSign(aliceLightDidWithDetails), + aliceLightDidWithDetails.uri, { didResolve } ) const requestAttestationBodyWithEncodedDetails: IRequestAttestation = { @@ -903,16 +891,14 @@ describe('Error checking / Verification', () => { // Quote signed by attester quoteAttesterSigned = await Quote.createAttesterSignedQuote( quoteData, - identityAlice, - keyAlice.sign + keyAlice.getSignCallback(identityAlice) ) // Quote agreement bothSigned = await Quote.createQuoteAgreement( quoteAttesterSigned, legitimation.rootHash, - identityAlice.uri, - identityBob, - keyBob.sign, + keyBob.getSignCallback(identityBob), + identityBob.uri, { didResolve } ) // Request Terms content @@ -987,10 +973,9 @@ describe('Error checking / Verification', () => { metaData: {}, signatures: { inviter: await Did.signPayload( - identityAlice, + identityAlice.uri, 'signature', - keyAlice.sign, - identityAlice.authentication[0].id + keyAlice.getSignCallback(identityAlice) ), }, } @@ -1005,16 +990,14 @@ describe('Error checking / Verification', () => { }, signatures: { inviter: await Did.signPayload( - identityAlice, + identityAlice.uri, 'signature', - keyAlice.sign, - identityAlice.authentication[0].id + keyAlice.getSignCallback(identityAlice) ), invitee: await Did.signPayload( - identityBob, + identityBob.uri, 'signature', - keyBob.sign, - identityBob.authentication[0].id + keyBob.getSignCallback(identityBob) ), }, } diff --git a/packages/messaging/src/Message.ts b/packages/messaging/src/Message.ts index 3bd280731..db4296a5b 100644 --- a/packages/messaging/src/Message.ts +++ b/packages/messaging/src/Message.ts @@ -8,7 +8,6 @@ import type { DecryptCallback, DidDocument, - DidEncryptionKey, DidResolveKey, DidResourceUri, EncryptCallback, @@ -349,11 +348,10 @@ export async function decrypt( try { data = ( await decryptCallback({ - publicKey: receiverKeyDetails.publicKey, - alg: receiverKeyAlgType, peerPublicKey: senderKeyDetails.publicKey, data: hexToU8a(ciphertext), nonce: hexToU8a(nonce), + keyUri: receiverKeyUri, }) ).data } catch (cause) { @@ -430,8 +428,6 @@ export function fromBody( * Encrypts the [[Message]] as a string. This can be reversed with [[Message.decrypt]]. * * @param message The message to encrypt. - * @param senderKeyId The sender's encryption key ID, without the DID prefix and '#' symbol. - * @param senderDid The sender's DID to use to fetch the right encryption key. * @param encryptCallback The callback to encrypt with the secret key. * @param receiverKeyUri The key URI of the receiver. * @param encryptionOptions Options to perform the encryption operation. @@ -441,8 +437,6 @@ export function fromBody( */ export async function encrypt( message: IMessage, - senderKeyId: DidEncryptionKey['id'], - senderDid: DidDocument, encryptCallback: EncryptCallback, receiverKeyUri: DidResourceUri, { @@ -458,22 +452,6 @@ export async function encrypt( if (message.receiver !== receiverKey.controller) { throw new SDKErrors.IdentityMismatchError('receiver public key', 'receiver') } - if (message.sender !== senderDid.uri) { - throw new SDKErrors.IdentityMismatchError('sender public key', 'sender') - } - const senderKey = Did.getKey(senderDid, senderKeyId) - if (!senderKey || !encryptionKeyTypes.includes(senderKey.type)) { - throw new SDKErrors.DidError( - `Cannot find key with ID "${senderKeyId}" for the sender DID` - ) - } - const senderKeyAlgType = - Did.Utils.encryptionAlgForKeyType[senderKey.type as EncryptionKeyType] - if (senderKeyAlgType !== 'x25519-xsalsa20-poly1305') { - throw new SDKErrors.EncryptionError( - 'Only the "x25519-xsalsa20-poly1305" encryption algorithm currently supported' - ) - } const toEncrypt: IEncryptedMessageContents = { body: message.body, @@ -488,11 +466,11 @@ export async function encrypt( const serialized = stringToU8a(JSON.stringify(toEncrypt)) const encrypted = await encryptCallback({ - alg: senderKeyAlgType, + did: message.sender, data: serialized, - publicKey: senderKey.publicKey, peerPublicKey: receiverKey.publicKey, }) + const ciphertext = u8aToHex(encrypted.data) const nonce = u8aToHex(encrypted.nonce) @@ -500,7 +478,7 @@ export async function encrypt( receivedAt: message.receivedAt, ciphertext, nonce, - senderKeyUri: `${senderDid.uri}${senderKey.id}`, + senderKeyUri: encrypted.keyUri, receiverKeyUri: receiverKey.id, } } diff --git a/packages/testing/src/TestUtils.ts b/packages/testing/src/TestUtils.ts index 24349d3ee..8e4f06293 100644 --- a/packages/testing/src/TestUtils.ts +++ b/packages/testing/src/TestUtils.ts @@ -27,37 +27,47 @@ import { KiltKeyringPair, LightDidSupportedVerificationKeyType, NewLightDidVerificationKey, - ResponseData, SignCallback, SigningAlgorithms, - SigningData, } from '@kiltprotocol/types' import { Crypto, ss58Format } from '@kiltprotocol/utils' import * as Did from '@kiltprotocol/did' import { Blockchain } from '@kiltprotocol/chain-helpers' +export type EncryptionKeyToolCallback = ( + didDocument: DidDocument +) => EncryptCallback + /** * Generates a callback that can be used for encryption. * * @param secretKey The options parameter. * @param secretKey.secretKey The key to use for encryption. - * @param secretKey.type The X25519 type, only this one is supported. * @returns The callback. */ export function makeEncryptCallback({ secretKey, }: { secretKey: Uint8Array - type: 'x25519' -}): EncryptCallback { - return async function encryptCallback({ data, peerPublicKey, alg }) { - const { box, nonce } = Crypto.encryptAsymmetric( - data, - peerPublicKey, - secretKey - ) - return { alg, nonce, data: box } +}): EncryptionKeyToolCallback { + return (didDocument) => { + return async function encryptCallback({ data, peerPublicKey }) { + const keyId = didDocument.keyAgreement?.[0].id + if (!keyId) { + throw new Error(`Encryption key not found in did "${didDocument.uri}"`) + } + const { box, nonce } = Crypto.encryptAsymmetric( + data, + peerPublicKey, + secretKey + ) + return { + nonce, + data: box, + keyUri: `${didDocument.uri}${keyId}`, + } + } } } @@ -75,14 +85,14 @@ export function makeDecryptCallback({ secretKey: Uint8Array type: 'x25519' }): DecryptCallback { - return async function decryptCallback({ data, nonce, peerPublicKey, alg }) { + return async function decryptCallback({ data, nonce, peerPublicKey }) { const decrypted = Crypto.decryptAsymmetric( { box: data, nonce }, peerPublicKey, secretKey ) if (decrypted === false) throw new Error('Decryption failed') - return { data: decrypted, alg } + return { data: decrypted } } } @@ -94,7 +104,7 @@ export interface EncryptionKeyTool { type: EncryptionKeyType } ] - encrypt: EncryptCallback + encrypt: EncryptionKeyToolCallback decrypt: DecryptCallback } @@ -122,19 +132,51 @@ export function makeEncryptionKeyTool(seed: string): EncryptionKeyTool { } } +export type KeyToolSignCallback = (didDocument: DidDocument) => SignCallback + /** * Generates a callback that can be used for signing. * * @param keypair The keypair to use for signing. * @returns The callback. */ -export function makeSignCallback(keypair: KeyringPair): SignCallback { - return async function sign({ - alg, - data, - }: SigningData): Promise> { +export function makeSignCallback(keypair: KeyringPair): KeyToolSignCallback { + return (didDocument) => + async function sign({ data, keyRelationship }) { + const keyId = didDocument[keyRelationship]?.[0].id + const keyType = didDocument[keyRelationship]?.[0].type + if (keyId === undefined || keyType === undefined) { + throw new Error( + `Key for purpose "${keyRelationship}" not found in did "${didDocument.uri}"` + ) + } + const signature = keypair.sign(data, { withType: false }) + + return { + data: signature, + keyUri: `${didDocument.uri}${keyId}`, + keyType, + } + } +} + +type StoreDidCallback = Parameters['2'] + +/** + * Generates a callback that can be used for signing. + * + * @param keypair The keypair to use for signing. + * @returns The callback. + */ +export function makeStoreDidCallback( + keypair: KiltKeyringPair +): StoreDidCallback { + return async function sign({ data }) { const signature = keypair.sign(data, { withType: false }) - return { alg, data: signature } + return { + data: signature, + keyType: keypair.type, + } } } @@ -146,7 +188,8 @@ const keypairTypeForAlg: Record = { export interface KeyTool { keypair: KiltKeyringPair - sign: SignCallback + getSignCallback: KeyToolSignCallback + storeDidCallback: StoreDidCallback authentication: [NewLightDidVerificationKey] } @@ -166,7 +209,8 @@ export function makeSigningKeyTool( {}, type ) as KiltKeyringPair - const sign = makeSignCallback(keypair) + const getSignCallback = makeSignCallback(keypair) + const storeDidCallback = makeStoreDidCallback(keypair) const authenticationKey = { publicKey: keypair.publicKey, @@ -175,7 +219,8 @@ export function makeSigningKeyTool( return { keypair, - sign, + getSignCallback, + storeDidCallback, authentication: [authenticationKey], } } @@ -292,7 +337,7 @@ export async function createLocalDemoFullDidFromLightDid( export async function createFullDidFromLightDid( payer: KiltKeyringPair, lightDidForId: DidDocument, - sign: SignCallback + sign: StoreDidCallback ): Promise { const { authentication, uri } = lightDidForId const tx = await Did.Chain.getStoreTx( @@ -314,9 +359,9 @@ export async function createFullDidFromLightDid( export async function createFullDidFromSeed( payer: KiltKeyringPair, - keypair: KeyringPair + keypair: KiltKeyringPair ): Promise { const lightDid = await createMinimalLightDidFromKeypair(keypair) - const sign = makeSignCallback(keypair) + const sign = makeStoreDidCallback(keypair) return createFullDidFromLightDid(payer, lightDid, sign) } diff --git a/packages/types/src/CryptoCallbacks.ts b/packages/types/src/CryptoCallbacks.ts index a7b141425..a6c8e54f6 100644 --- a/packages/types/src/CryptoCallbacks.ts +++ b/packages/types/src/CryptoCallbacks.ts @@ -5,108 +5,143 @@ * found in the LICENSE file in the root directory of this source tree. */ -import type { SignerPayloadJSON } from '@polkadot/types/types' +import type { + DidResourceUri, + DidUri, + DidVerificationKey, + VerificationKeyRelationship, +} from './DidDocument.js' -export type SigningAlgorithms = 'ed25519' | 'sr25519' | 'ecdsa-secp256k1' +const signingAlgorithmsC = ['ed25519', 'sr25519', 'ecdsa-secp256k1'] as const +export const signingAlgorithms = signingAlgorithmsC as unknown as string[] +export type SigningAlgorithms = typeof signingAlgorithmsC[number] export type EncryptionAlgorithms = 'x25519-xsalsa20-poly1305' /** - * Base interface for all {en/de}cryption & signing requests. + * Base interface for all signing requests. */ -export interface RequestData< - A extends SigningAlgorithms | EncryptionAlgorithms -> { +export interface SignRequestData { /** - * Identifier for the encryption/signing algorithm to use. + * Data to be signed. */ - alg: A + data: Uint8Array + /** - * Public key as u8a identifying the keypair to use (in combination with the alg). + * The did key relationship to be used. */ - publicKey: Uint8Array + keyRelationship: VerificationKeyRelationship + /** - * Data to be {en/de}crypted or signed. + * The DID to be used for signing. */ - data: Uint8Array - - [x: string]: unknown + did: DidUri } /** - * Base interface for responses to {en/de}cryption & signing requests. + * Base interface for responses to signing requests. */ -export interface ResponseData< - A extends SigningAlgorithms | EncryptionAlgorithms -> { +export interface SignResponseData { /** - * Identifier for the encryption/signing algorithm used. + * Result of the signing. */ - alg: A + data: Uint8Array /** - * Result of the {en/de}cryption or signing. + * The did key uri used for signing. */ - data: Uint8Array - - [x: string]: unknown + keyUri: DidResourceUri + /** + * The did key type used for signing. + */ + keyType: DidVerificationKey['type'] } /** - * Extends [[RequestData]] with optional metadata for providing info on the data to be signed, especially in case of signing extrinsics. + * A callback function to sign data. */ -export interface SigningData - extends RequestData { +export type SignCallback = ( + signData: SignRequestData +) => Promise + +/** + * Base interface for encryption requests. + */ +export interface EncryptRequestData { + /** + * Data to be encrypted. + */ + data: Uint8Array /** - * Info for extensions to display to user. + * The other party's public key to be used for x25519 Diffie-Hellman key agreement. */ - meta?: Partial + peerPublicKey: Uint8Array + /** + * The DID to be used for encryption. + */ + did: DidUri } /** - * A callback function to sign with a given signature algorithm. + * Base interface for responses to encryption requests. */ -export type SignCallback = ( - signData: SigningData -) => Promise> - -export interface SigningOptions { - sign: SignCallback - signingPublicKey: string | Uint8Array - alg: A +export interface EncryptResponseData { + /** + * Result of the encryption. + */ + data: Uint8Array + /** + * A random nonce generated in the encryption process. + */ + nonce: Uint8Array + /** + * The did key uri used for the encryption. + */ + keyUri: DidResourceUri } /** * Uses stored key material to encrypt a message encoded as u8a. * - * @param requestData Slightly extended [[RequestData]] containing both our and their public keys, the data to be encrypted, and `alg: 'x25519-xsalsa20-poly1305'`. - * @param requestData.peerPublicKey The other party's public key to be used for x25519 Diffie-Hellman key agreement. - * @returns [[ResponseData]] which additionally contains a `nonce` randomly generated in the encryption process (required for decryption). + * @param requestData The data to be encrypted, the peers public key and `alg: 'x25519-xsalsa20-poly1305'`. + * @returns [[EncryptionResponseData]] which additionally to the data contains a `nonce` randomly generated in the encryption process (required for decryption). */ -export interface EncryptCallback< - A extends 'x25519-xsalsa20-poly1305' = 'x25519-xsalsa20-poly1305' -> { - ( - requestData: RequestData & { - peerPublicKey: Uint8Array - } - ): Promise & { nonce: Uint8Array }> +export interface EncryptCallback { + (requestData: EncryptRequestData): Promise +} + +export interface DecryptRequestData { + /** + * Data to be encrypted. + */ + data: Uint8Array + /** + * The other party's public key to be used for x25519 Diffie-Hellman key agreement. + */ + peerPublicKey: Uint8Array + /** + * The random nonce generated during encryption as u8a. + */ + nonce: Uint8Array + /** + * The did key uri, which should be used for decryption. + */ + keyUri: DidResourceUri +} + +export interface DecryptResponseData { + /** + * Result of the decryption. + */ + data: Uint8Array } /** * Uses stored key material to decrypt a message encoded as u8a. * * @param requestData Slightly extended [[RequestData]] containing both our and their public keys, the nonce used for encryption, the data to be decrypted, and `alg: 'x25519-xsalsa20-poly1305'`. - * @param requestData.peerPublicKey The other party's public key to be used for x25519 Diffie-Hellman key agreement. * @param requestData.nonce The random nonce generated during encryption as u8a. * @returns A Promise resolving to [[ResponseData]] containing the decrypted message or rejecting if key or algorithm is unknown or if they do not match. */ -export interface DecryptCallback< - A extends 'x25519-xsalsa20-poly1305' = 'x25519-xsalsa20-poly1305' -> { - ( - requestData: RequestData & { - peerPublicKey: Uint8Array - nonce: Uint8Array - } - ): Promise> +export interface DecryptCallback { + (requestData: DecryptRequestData): Promise } diff --git a/tests/bundle-test.ts b/tests/bundle-test.ts index 59003beef..4125f6289 100644 --- a/tests/bundle-test.ts +++ b/tests/bundle-test.ts @@ -11,15 +11,14 @@ import type { KeypairType } from '@polkadot/util-crypto/types' import type { DecryptCallback, + DidDocument, EncryptCallback, EncryptionKeyType, KeyringPair, KiltKeyringPair, NewDidEncryptionKey, - ResponseData, SignCallback, SigningAlgorithms, - SigningData, } from '@kiltprotocol/types' const { kilt } = window @@ -38,13 +37,32 @@ const { kilt.config({ submitTxResolveOn: Blockchain.IS_IN_BLOCK }) -function makeSignCallback(keypair: KeyringPair): SignCallback { - return async function sign({ - alg, - data, - }: SigningData): Promise> { +function makeSignCallback( + keypair: KeyringPair +): (didDocument: DidDocument) => SignCallback { + return (didDocument) => { + return async function sign({ data, keyRelationship }) { + const keyId = didDocument[keyRelationship]?.[0].id + const keyType = didDocument[keyRelationship]?.[0].type + if (keyId === undefined || keyType === undefined) { + throw new Error( + `Key for purpose "${keyRelationship}" not found in did "${didDocument.uri}"` + ) + } + const signature = keypair.sign(data, { withType: false }) + return { data: signature, keyUri: `${didDocument.uri}${keyId}`, keyType } + } + } +} +type StoreDidCallback = Parameters['2'] + +function makeStoreDidCallback(keypair: KiltKeyringPair): StoreDidCallback { + return async function sign({ data }) { const signature = keypair.sign(data, { withType: false }) - return { alg, data: signature } + return { + data: signature, + keyType: keypair.type, + } } } @@ -53,7 +71,8 @@ function makeSigningKeypair( alg: SigningAlgorithms = 'sr25519' ): { keypair: KiltKeyringPair - sign: SignCallback + getSignCallback: (didDocument: DidDocument) => SignCallback + storeDidCallback: StoreDidCallback } { const keypairTypeForAlg: Record = { ed25519: 'ed25519', @@ -66,11 +85,13 @@ function makeSigningKeypair( {}, type ) as KiltKeyringPair - const sign = makeSignCallback(keypair) + const getSignCallback = makeSignCallback(keypair) + const storeDidCallback = makeStoreDidCallback(keypair) return { keypair, - sign, + getSignCallback, + storeDidCallback, } } @@ -94,14 +115,20 @@ function makeEncryptCallback({ }: { secretKey: Uint8Array type: EncryptionKeyType -}): EncryptCallback { - return async function encryptCallback({ data, peerPublicKey, alg }) { - const { box, nonce } = Crypto.encryptAsymmetric( - data, - peerPublicKey, - secretKey - ) - return { alg, nonce, data: box } +}): (didDocument: DidDocument) => EncryptCallback { + return (didDocument) => { + return async function encryptCallback({ data, peerPublicKey }) { + const keyId = didDocument.keyAgreement?.[0].id + if (!keyId) { + throw new Error(`Encryption key not found in did "${didDocument.uri}"`) + } + const { box, nonce } = Crypto.encryptAsymmetric( + data, + peerPublicKey, + secretKey + ) + return { nonce, data: box, keyUri: `${didDocument.uri}${keyId}` } + } } } @@ -111,14 +138,14 @@ function makeDecryptCallback({ secretKey: Uint8Array type: EncryptionKeyType }): DecryptCallback { - return async function decryptCallback({ data, nonce, peerPublicKey, alg }) { + return async function decryptCallback({ data, nonce, peerPublicKey }) { const decrypted = Crypto.decryptAsymmetric( { box: data, nonce }, peerPublicKey, secretKey ) if (decrypted === false) throw new Error('Decryption failed') - return { data: decrypted, alg } + return { data: decrypted } } } @@ -127,7 +154,7 @@ async function createFullDidFromKeypair( keypair: KiltKeyringPair, encryptionKey: NewDidEncryptionKey ) { - const sign = makeSignCallback(keypair) + const sign = makeStoreDidCallback(keypair) const storeTx = await Did.Chain.getStoreTx( { @@ -158,7 +185,7 @@ async function runAll() { FaucetSeed ) as KiltKeyringPair - const { keypair: aliceKeypair, sign: aliceSign } = + const { keypair: aliceKeypair, getSignCallback: aliceSign } = makeSigningKeypair('//Alice') const aliceEncryptionKey = makeEncryptionKeypair('//Alice//enc') const aliceDecryptCallback = makeDecryptCallback(aliceEncryptionKey) @@ -171,7 +198,8 @@ async function runAll() { throw new Error('Impossible: alice has no encryptionKey') console.log('alice setup done') - const { keypair: bobKeypair, sign: bobSign } = makeSigningKeypair('//Bob') + const { keypair: bobKeypair, getSignCallback: bobSign } = + makeSigningKeypair('//Bob') const bobEncryptionKey = makeEncryptionKeypair('//Bob//enc') const bobEncryptCallback = makeEncryptCallback(bobEncryptionKey) const bob = await createFullDidFromKeypair( @@ -204,12 +232,15 @@ async function runAll() { // Chain DID workflow -> creation & deletion console.log('DID workflow started') - const { keypair, sign } = makeSigningKeypair('//Foo', 'ed25519') + const { keypair, getSignCallback, storeDidCallback } = makeSigningKeypair( + '//Foo', + 'ed25519' + ) const didStoreTx = await Did.Chain.getStoreTx( { authentication: [keypair] }, payer.address, - sign + storeDidCallback ) await Blockchain.signAndSubmitTx(didStoreTx, payer) @@ -229,9 +260,9 @@ async function runAll() { } const deleteTx = await Did.authorizeExtrinsic( - fullDid, + fullDid.uri, api.tx.did.delete(BalanceUtils.toFemtoKilt(0)), - sign, + getSignCallback(fullDid), payer.address ) await Blockchain.signAndSubmitTx(deleteTx, payer) @@ -261,9 +292,9 @@ async function runAll() { }) const cTypeStoreTx = await Did.authorizeExtrinsic( - alice, + alice.uri, api.tx.ctype.add(CType.toChain(DriversLicense)), - aliceSign, + aliceSign(alice), payer.address ) await Blockchain.signAndSubmitTx(cTypeStoreTx, payer) @@ -289,8 +320,7 @@ async function runAll() { const presentation = await Credential.createPresentation({ credential, - signCallback: bobSign, - claimerDid: bob, + signCallback: bobSign(bob), }) if (!Credential.isPresentation(presentation)) throw new Error('Not a valid Presentation') @@ -310,9 +340,7 @@ async function runAll() { ) const encryptedMessage = await Message.encrypt( message, - bob.keyAgreement[0].id, - bob, - bobEncryptCallback, + bobEncryptCallback(bob), `${alice.uri}${alice.keyAgreement[0].id}` ) @@ -330,9 +358,9 @@ async function runAll() { console.info('Attestation Data verified') const attestationStoreTx = await Did.authorizeExtrinsic( - alice, + alice.uri, api.tx.attestation.add(attestation.claimHash, attestation.cTypeHash, null), - aliceSign, + aliceSign(alice), payer.address ) await Blockchain.signAndSubmitTx(attestationStoreTx, payer) From f1f42517dca4c10138add2e71759f8491fe5de60 Mon Sep 17 00:00:00 2001 From: Github Action Date: Tue, 20 Sep 2022 15:33:35 +0000 Subject: [PATCH 22/36] [CI Skip] ci: publish prerelease --- package.json | 2 +- packages/augment-api/package.json | 2 +- packages/chain-helpers/package.json | 2 +- packages/config/package.json | 2 +- packages/core/package.json | 2 +- packages/did/package.json | 2 +- packages/messaging/package.json | 2 +- packages/sdk-js/package.json | 2 +- packages/testing/package.json | 2 +- packages/types/package.json | 2 +- packages/utils/package.json | 2 +- packages/vc-export/package.json | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index 2da00f560..85f0ac494 100644 --- a/package.json +++ b/package.json @@ -68,6 +68,6 @@ "typedoc": "^0.22.15", "typescript": "^4.8.3" }, - "version": "0.30.0-10", + "version": "0.30.0-11", "packageManager": "yarn@3.0.2" } diff --git a/packages/augment-api/package.json b/packages/augment-api/package.json index b1ac48474..6eacebb30 100644 --- a/packages/augment-api/package.json +++ b/packages/augment-api/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/augment-api", - "version": "0.30.0-10", + "version": "0.30.0-11", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/chain-helpers/package.json b/packages/chain-helpers/package.json index 1b1f29217..13e9263bb 100644 --- a/packages/chain-helpers/package.json +++ b/packages/chain-helpers/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/chain-helpers", - "version": "0.30.0-10", + "version": "0.30.0-11", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/config/package.json b/packages/config/package.json index a3462fd26..2469781d9 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/config", - "version": "0.30.0-10", + "version": "0.30.0-11", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/core/package.json b/packages/core/package.json index d48dc16fa..b27c67a4e 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/core", - "version": "0.30.0-10", + "version": "0.30.0-11", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/did/package.json b/packages/did/package.json index b298e71d7..976e220d5 100644 --- a/packages/did/package.json +++ b/packages/did/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/did", - "version": "0.30.0-10", + "version": "0.30.0-11", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/messaging/package.json b/packages/messaging/package.json index 1adc2c829..7156131fe 100644 --- a/packages/messaging/package.json +++ b/packages/messaging/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/messaging", - "version": "0.30.0-10", + "version": "0.30.0-11", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/sdk-js/package.json b/packages/sdk-js/package.json index 3b12da3c3..dfd9bdfa8 100644 --- a/packages/sdk-js/package.json +++ b/packages/sdk-js/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/sdk-js", - "version": "0.30.0-10", + "version": "0.30.0-11", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/testing/package.json b/packages/testing/package.json index c44495a5d..3c9e0219b 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -1,7 +1,7 @@ { "name": "@kiltprotocol/testing", "private": true, - "version": "0.30.0-10", + "version": "0.30.0-11", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/types/package.json b/packages/types/package.json index 6a9f580a1..e7816b6c5 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/types", - "version": "0.30.0-10", + "version": "0.30.0-11", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/utils/package.json b/packages/utils/package.json index 1033ad5bc..34acc46f5 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/utils", - "version": "0.30.0-10", + "version": "0.30.0-11", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/vc-export/package.json b/packages/vc-export/package.json index 95f9449bf..fea45e379 100644 --- a/packages/vc-export/package.json +++ b/packages/vc-export/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/vc-export", - "version": "0.30.0-10", + "version": "0.30.0-11", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", From 92f2496fe20fe16088257d95691e3895dfb5392f Mon Sep 17 00:00:00 2001 From: Antonio Date: Wed, 21 Sep 2022 08:28:15 +0200 Subject: [PATCH 23/36] feat: add DID RPC decorations (#637) * wip * Final tweaks * Fix lint issue * New defs with minor pinning to type definitions * Update 9.x polkadot dependencies --- docs/package.json | 4 +- packages/augment-api/metadata/spiritnet.json | 2 +- packages/augment-api/package.json | 7 +- packages/augment-api/src/index.ts | 6 +- .../src/interfaces/augment-api-errors.ts | 21 + .../src/interfaces/augment-api-events.ts | 46 +- .../src/interfaces/augment-api-query.ts | 125 +-- .../src/interfaces/augment-api-rpc.ts | 19 +- .../src/interfaces/augment-api-runtime.ts | 22 +- .../src/interfaces/augment-api-tx.ts | 44 +- .../src/interfaces/augment-types.ts | 25 +- .../augment-api/src/interfaces/definitions.ts | 1 + .../src/interfaces/did/definitions.ts | 9 + .../augment-api/src/interfaces/did/index.ts | 4 + .../augment-api/src/interfaces/did/types.ts | 4 + .../src/interfaces/extraDefs/definitions.ts | 8 +- .../src/interfaces/extraDefs/types.ts | 101 +++ packages/augment-api/src/interfaces/lookup.ts | 588 ++++++++------ .../augment-api/src/interfaces/registry.ts | 11 +- .../src/interfaces/types-lookup.ts | 589 ++++++++------ packages/augment-api/src/interfaces/types.ts | 1 + packages/augment-api/tsconfig.build.json | 15 +- packages/chain-helpers/package.json | 4 +- packages/config/package.json | 2 +- packages/core/package.json | 5 +- packages/core/src/kilt/Kilt.ts | 4 + packages/did/package.json | 6 +- packages/testing/package.json | 4 +- packages/types/package.json | 4 +- packages/vc-export/package.json | 4 +- yarn.lock | 745 +++++++++--------- 31 files changed, 1483 insertions(+), 947 deletions(-) create mode 100644 packages/augment-api/src/interfaces/did/definitions.ts create mode 100644 packages/augment-api/src/interfaces/did/index.ts create mode 100644 packages/augment-api/src/interfaces/did/types.ts diff --git a/docs/package.json b/docs/package.json index cec638d94..72918fa5b 100644 --- a/docs/package.json +++ b/docs/package.json @@ -18,10 +18,10 @@ "dependencies": { "@kiltprotocol/sdk-js": "workspace:*", "@polkadot/keyring": "^10.0.0", - "@polkadot/types": "^9.0.0", + "@polkadot/types": "^9.4.1", "@polkadot/util": "^10.0.0", "typescript-logging": "^0.6.4", "@polkadot/util-crypto": "^10.0.0", "testcontainers": "^8.6.1" } -} +} \ No newline at end of file diff --git a/packages/augment-api/metadata/spiritnet.json b/packages/augment-api/metadata/spiritnet.json index 220393a0f..b0359fabb 100644 --- a/packages/augment-api/metadata/spiritnet.json +++ b/packages/augment-api/metadata/spiritnet.json @@ -1 +1 @@ -{"result":"0x6d6574610ec906000c1c73705f636f72651863727970746f2c4163636f756e7449643332000004000401205b75383b2033325d0000040000032000000008000800000503000c08306672616d655f73797374656d2c4163636f756e74496e666f0814496e64657801102c4163636f756e74446174610114001401146e6f6e6365100114496e646578000124636f6e73756d6572731c0120526566436f756e7400012470726f7669646572731c0120526566436f756e7400012c73756666696369656e74731c0120526566436f756e740001106461746114012c4163636f756e7444617461000010000005060014083c70616c6c65745f62616c616e6365732c4163636f756e7444617461041c42616c616e63650118001001106672656518011c42616c616e6365000120726573657276656418011c42616c616e636500012c6d6973635f66726f7a656e18011c42616c616e63650001286665655f66726f7a656e18011c42616c616e636500001800000507001c0000050500200c346672616d655f737570706f72741c77656967687473405065724469737061746368436c6173730404540110000c01186e6f726d616c1001045400012c6f7065726174696f6e616c100104540001246d616e6461746f727910010454000024083c7072696d69746976655f74797065731048323536000004000401205b75383b2033325d00002800000208002c102873705f72756e74696d651c67656e65726963186469676573741844696765737400000401106c6f677330013c5665633c4469676573744974656d3e000030000002340034102873705f72756e74696d651c67656e6572696318646967657374284469676573744974656d0001142850726552756e74696d650800380144436f6e73656e737573456e67696e654964000028011c5665633c75383e00060024436f6e73656e7375730800380144436f6e73656e737573456e67696e654964000028011c5665633c75383e000400105365616c0800380144436f6e73656e737573456e67696e654964000028011c5665633c75383e000500144f74686572040028011c5665633c75383e0000006452756e74696d65456e7669726f6e6d656e745570646174656400080000380000030400000008003c00000240004008306672616d655f73797374656d2c4576656e745265636f7264080445014404540124000c01147068617365c901011450686173650001146576656e7444010445000118746f70696373cd0101185665633c543e00004408447370697269746e65745f72756e74696d65144576656e740001701853797374656d04004801706672616d655f73797374656d3a3a4576656e743c52756e74696d653e0000001c496e646963657304006c017870616c6c65745f696e64696365733a3a4576656e743c52756e74696d653e0005002042616c616e636573040070017c70616c6c65745f62616c616e6365733a3a4576656e743c52756e74696d653e0006004050617261636861696e5374616b696e67040078018470617261636861696e5f7374616b696e673a3a4576656e743c52756e74696d653e0015001c53657373696f6e040080015470616c6c65745f73657373696f6e3a3a4576656e740016002444656d6f6372616379040084018070616c6c65745f64656d6f63726163793a3a4576656e743c52756e74696d653e001e001c436f756e63696c0400a001fc70616c6c65745f636f6c6c6563746976653a3a4576656e743c52756e74696d652c2070616c6c65745f636f6c6c6563746976653a3a496e7374616e6365313e001f0048546563686e6963616c436f6d6d69747465650400a801fc70616c6c65745f636f6c6c6563746976653a3a4576656e743c52756e74696d652c2070616c6c65745f636f6c6c6563746976653a3a496e7374616e6365323e0020004c546563686e6963616c4d656d626572736869700400ac01fc70616c6c65745f6d656d626572736869703a3a4576656e743c52756e74696d652c2070616c6c65745f6d656d626572736869703a3a496e7374616e6365313e0022002054726561737572790400b0017c70616c6c65745f74726561737572793a3a4576656e743c52756e74696d653e0023001c5574696c6974790400b4015470616c6c65745f7574696c6974793a3a4576656e740028001c56657374696e670400b8017870616c6c65745f76657374696e673a3a4576656e743c52756e74696d653e002900245363686564756c65720400bc018070616c6c65745f7363686564756c65723a3a4576656e743c52756e74696d653e002a001450726f78790400cc017070616c6c65745f70726f78793a3a4576656e743c52756e74696d653e002b0020507265696d6167650400d8017c70616c6c65745f707265696d6167653a3a4576656e743c52756e74696d653e002c0038546970734d656d626572736869700400dc01fc70616c6c65745f6d656d626572736869703a3a4576656e743c52756e74696d652c2070616c6c65745f6d656d626572736869703a3a496e7374616e6365323e002d0010546970730400e0016c70616c6c65745f746970733a3a4576656e743c52756e74696d653e002e001443747970650400e4015463747970653a3a4576656e743c52756e74696d653e003d002c4174746573746174696f6e0400e8016c6174746573746174696f6e3a3a4576656e743c52756e74696d653e003e002844656c65676174696f6e0400f4016864656c65676174696f6e3a3a4576656e743c52756e74696d653e003f000c4469640400fc014c6469643a3a4576656e743c52756e74696d653e004000244469644c6f6f6b757004000101018470616c6c65745f6469645f6c6f6f6b75703a3a4576656e743c52756e74696d653e00430024576562334e616d657304000501018470616c6c65745f776562335f6e616d65733a3a4576656e743c52756e74696d653e0044003c50617261636861696e53797374656d0400110101bc63756d756c75735f70616c6c65745f70617261636861696e5f73797374656d3a3a4576656e743c52756e74696d653e0050002458636d7051756575650400150101a463756d756c75735f70616c6c65745f78636d705f71756575653a3a4576656e743c52756e74696d653e0052002c506f6c6b61646f7458636d04002501016870616c6c65745f78636d3a3a4576656e743c52756e74696d653e0053002843756d756c757358636d0400c101018863756d756c75735f70616c6c65745f78636d3a3a4576656e743c52756e74696d653e00540020446d7051756575650400c50101a063756d756c75735f70616c6c65745f646d705f71756575653a3a4576656e743c52756e74696d653e00550000480c306672616d655f73797374656d1870616c6c6574144576656e740404540001184045787472696e7369635375636365737304013464697370617463685f696e666f4c01304469737061746368496e666f00000490416e2065787472696e73696320636f6d706c65746564207375636365737366756c6c792e3c45787472696e7369634661696c656408013864697370617463685f6572726f7258013444697370617463684572726f7200013464697370617463685f696e666f4c01304469737061746368496e666f00010450416e2065787472696e736963206661696c65642e2c436f64655570646174656400020450603a636f6465602077617320757064617465642e284e65774163636f756e7404011c6163636f756e74000130543a3a4163636f756e7449640003046841206e6577206163636f756e742077617320637265617465642e344b696c6c65644163636f756e7404011c6163636f756e74000130543a3a4163636f756e74496400040458416e206163636f756e7420776173207265617065642e2052656d61726b656408011873656e646572000130543a3a4163636f756e7449640001106861736824011c543a3a48617368000504704f6e206f6e2d636861696e2072656d61726b2068617070656e65642e04704576656e7420666f72207468652053797374656d2070616c6c65742e4c0c346672616d655f737570706f72741c77656967687473304469737061746368496e666f00000c0118776569676874100118576569676874000114636c6173735001344469737061746368436c617373000120706179735f666565540110506179730000500c346672616d655f737570706f72741c77656967687473344469737061746368436c61737300010c184e6f726d616c0000002c4f7065726174696f6e616c000100244d616e6461746f727900020000540c346672616d655f737570706f72741c7765696768747310506179730001080c596573000000084e6f0001000058082873705f72756e74696d653444697370617463684572726f72000128144f746865720000003043616e6e6f744c6f6f6b7570000100244261644f726967696e000200184d6f64756c6504005c012c4d6f64756c654572726f7200030044436f6e73756d657252656d61696e696e670004002c4e6f50726f76696465727300050040546f6f4d616e79436f6e73756d65727300060014546f6b656e0400600128546f6b656e4572726f720007002841726974686d65746963040064013c41726974686d657469634572726f72000800345472616e73616374696f6e616c04006801485472616e73616374696f6e616c4572726f72000900005c082873705f72756e74696d652c4d6f64756c654572726f720000080114696e64657808010875380001146572726f7238018c5b75383b204d41585f4d4f44554c455f4552524f525f454e434f4445445f53495a455d000060082873705f72756e74696d6528546f6b656e4572726f7200011c1c4e6f46756e647300000020576f756c644469650001003042656c6f774d696e696d756d0002003043616e6e6f7443726561746500030030556e6b6e6f776e41737365740004001846726f7a656e0005002c556e737570706f727465640006000064082873705f72756e74696d653c41726974686d657469634572726f7200010c24556e646572666c6f77000000204f766572666c6f77000100384469766973696f6e42795a65726f0002000068082873705f72756e74696d65485472616e73616374696f6e616c4572726f72000108304c696d6974526561636865640000001c4e6f4c61796572000100006c0c3870616c6c65745f696e64696365731870616c6c6574144576656e7404045400010c34496e64657841737369676e656408010c77686f000130543a3a4163636f756e744964000114696e64657810013c543a3a4163636f756e74496e6465780000047441206163636f756e7420696e646578207761732061737369676e65642e28496e6465784672656564040114696e64657810013c543a3a4163636f756e74496e646578000104bc41206163636f756e7420696e64657820686173206265656e2066726565642075702028756e61737369676e6564292e2c496e64657846726f7a656e080114696e64657810013c543a3a4163636f756e74496e64657800010c77686f000130543a3a4163636f756e744964000204e841206163636f756e7420696e64657820686173206265656e2066726f7a656e20746f206974732063757272656e74206163636f756e742049442e0499010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f72732920656d69747465640a090909627920746869732070616c6c65742e0a090909700c3c70616c6c65745f62616c616e6365731870616c6c6574144576656e740804540004490001281c456e646f77656408011c6163636f756e74000130543a3a4163636f756e744964000130667265655f62616c616e6365180128543a3a42616c616e6365000004b8416e206163636f756e74207761732063726561746564207769746820736f6d6520667265652062616c616e63652e20447573744c6f737408011c6163636f756e74000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e63650001083d01416e206163636f756e74207761732072656d6f7665642077686f73652062616c616e636520776173206e6f6e2d7a65726f206275742062656c6f77204578697374656e7469616c4465706f7369742c78726573756c74696e6720696e20616e206f75747269676874206c6f73732e205472616e736665720c011066726f6d000130543a3a4163636f756e744964000108746f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e63650002044c5472616e73666572207375636365656465642e2842616c616e63655365740c010c77686f000130543a3a4163636f756e74496400011066726565180128543a3a42616c616e63650001207265736572766564180128543a3a42616c616e636500030468412062616c616e6365207761732073657420627920726f6f742e20526573657276656408010c77686f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e6365000404e0536f6d652062616c616e63652077617320726573657276656420286d6f7665642066726f6d206672656520746f207265736572766564292e28556e726573657276656408010c77686f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e6365000504e8536f6d652062616c616e63652077617320756e726573657276656420286d6f7665642066726f6d20726573657276656420746f2066726565292e4852657365727665526570617472696174656410011066726f6d000130543a3a4163636f756e744964000108746f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e636500014864657374696e6174696f6e5f7374617475737401185374617475730006084d01536f6d652062616c616e636520776173206d6f7665642066726f6d207468652072657365727665206f6620746865206669727374206163636f756e7420746f20746865207365636f6e64206163636f756e742ed846696e616c20617267756d656e7420696e64696361746573207468652064657374696e6174696f6e2062616c616e636520747970652e1c4465706f73697408010c77686f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e6365000704d8536f6d6520616d6f756e7420776173206465706f73697465642028652e672e20666f72207472616e73616374696f6e2066656573292e20576974686472617708010c77686f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e63650008041d01536f6d6520616d6f756e74207761732077697468647261776e2066726f6d20746865206163636f756e742028652e672e20666f72207472616e73616374696f6e2066656573292e1c536c617368656408010c77686f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e63650009040101536f6d6520616d6f756e74207761732072656d6f7665642066726f6d20746865206163636f756e742028652e672e20666f72206d69736265686176696f72292e0499010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f72732920656d69747465640a090909627920746869732070616c6c65742e0a0909097414346672616d655f737570706f72741874726169747318746f6b656e73106d6973633442616c616e6365537461747573000108104672656500000020526573657276656400010000780c4470617261636861696e5f7374616b696e671870616c6c6574144576656e74040454000154204e6577526f756e640800100138543a3a426c6f636b4e756d62657200001c013053657373696f6e496e6465780000088041206e6577207374616b696e6720726f756e642068617320737461727465642e785c5b626c6f636b206e756d6265722c20726f756e64206e756d6265725c5d50456e7465726564546f7043616e646964617465730400000130543a3a4163636f756e744964000108cc41206e6577206163636f756e7420686173206a6f696e65642074686520736574206f6620746f702063616e646964617465732e2c5c5b6163636f756e745c5d444c656674546f7043616e646964617465730400000130543a3a4163636f756e744964000208d8416e206163636f756e74207761732072656d6f7665642066726f6d2074686520736574206f6620746f702063616e646964617465732e2c5c5b6163636f756e745c5d604a6f696e6564436f6c6c61746f7243616e646964617465730800000130543a3a4163636f756e744964000018013042616c616e63654f663c543e000308e041206e6577206163636f756e7420686173206a6f696e65642074686520736574206f6620636f6c6c61746f722063616e646964617465732ebc5c5b6163636f756e742c20616d6f756e74207374616b656420627920746865206e65772063616e6469646174655c5d48436f6c6c61746f725374616b65644d6f72650c00000130543a3a4163636f756e744964000018013042616c616e63654f663c543e000018013042616c616e63654f663c543e00040801014120636f6c6c61746f722063616e6469646174652068617320696e637265617365642074686520616d6f756e74206f662066756e6473206174207374616b652ec45c5b636f6c6c61746f722773206163636f756e742c2070726576696f7573207374616b652c206e6577207374616b655c5d48436f6c6c61746f725374616b65644c6573730c00000130543a3a4163636f756e744964000018013042616c616e63654f663c543e000018013042616c616e63654f663c543e00050801014120636f6c6c61746f722063616e64696461746520686173206465637265617365642074686520616d6f756e74206f662066756e6473206174207374616b652ec45c5b636f6c6c61746f722773206163636f756e742c2070726576696f7573207374616b652c206e6577207374616b655c5d54436f6c6c61746f725363686564756c6564457869740c001c013053657373696f6e496e6465780000000130543a3a4163636f756e74496400001c013053657373696f6e496e64657800061001014120636f6c6c61746f722063616e646964617465206861732073746172746564207468652070726f6365737320746f206c656176652074686520736574206f66050163616e646964617465732e205c5b726f756e64206e756d6265722c20636f6c6c61746f722773206163636f756e742c20726f756e64206e756d626572207768656ee074686520636f6c6c61746f722077696c6c206265206566666563746976656c792072656d6f7665642066726f6d2074686520736574206f663063616e646964617465735c5d50436f6c6c61746f7243616e63656c6564457869740400000130543a3a4163636f756e74496400070c05014120636f6c6c61746f722063616e646964617465206861732063616e63656c6564207468652070726f6365737320746f206c656176652074686520736574206f66050163616e6469646174657320616e6420776173206164646564206261636b20746f207468652063616e64696461746520706f6f6c2e205c5b636f6c6c61746f722773246163636f756e745c5d3443616e6469646174654c6566740800000130543a3a4163636f756e744964000018013042616c616e63654f663c543e000808cc416e206163636f756e7420686173206c6566742074686520736574206f6620636f6c6c61746f722063616e646964617465732e985c5b6163636f756e742c20616d6f756e74206f662066756e647320756e2d7374616b65645c5d3c436f6c6c61746f7252656d6f7665640800000130543a3a4163636f756e744964000018013042616c616e63654f663c543e000908e4416e206163636f756e742077617320666f726365646c792072656d6f7665642066726f6d207468652020736574206f6620636f6c6c61746f72c863616e646964617465732e205c5b6163636f756e742c20616d6f756e74206f662066756e647320756e2d7374616b65645c5d604d617843616e6469646174655374616b654368616e676564040018013042616c616e63654f663c543e000a08b4546865206d6178696d756d2063616e646964617465207374616b6520686173206265656e206368616e6765642e485c5b6e6577206d617820616d6f756e745c5d4c44656c656761746f725374616b65644d6f72651000000130543a3a4163636f756e7449640000000130543a3a4163636f756e744964000018013042616c616e63654f663c543e000018013042616c616e63654f663c543e000b0cf0412064656c656761746f722068617320696e637265617365642074686520616d6f756e74206f662066756e6473206174207374616b6520666f722061f4636f6c6c61746f722e205c5b64656c656761746f722773206163636f756e742c20636f6c6c61746f722773206163636f756e742c2070726576696f7573a064656c65676174696f6e207374616b652c206e65772064656c65676174696f6e207374616b655c5d4c44656c656761746f725374616b65644c6573731000000130543a3a4163636f756e7449640000000130543a3a4163636f756e744964000018013042616c616e63654f663c543e000018013042616c616e63654f663c543e000c0cf0412064656c656761746f7220686173206465637265617365642074686520616d6f756e74206f662066756e6473206174207374616b6520666f722061f4636f6c6c61746f722e205c5b64656c656761746f722773206163636f756e742c20636f6c6c61746f722773206163636f756e742c2070726576696f7573a064656c65676174696f6e207374616b652c206e65772064656c65676174696f6e207374616b655c5d3444656c656761746f724c6566740800000130543a3a4163636f756e744964000018013042616c616e63654f663c543e000d08a8416e206163636f756e7420686173206c6566742074686520736574206f662064656c656761746f72732e985c5b6163636f756e742c20616d6f756e74206f662066756e647320756e2d7374616b65645c5d2844656c65676174696f6e1000000130543a3a4163636f756e744964000018013042616c616e63654f663c543e0000000130543a3a4163636f756e744964000018013042616c616e63654f663c543e000e0cc8416e206163636f756e74206861732064656c6567617465642061206e657720636f6c6c61746f722063616e6469646174652e11015c5b6163636f756e742c20616d6f756e74206f662066756e6473207374616b65642c20746f74616c20616d6f756e74206f662064656c656761746f7273272066756e64738c7374616b656420666f722074686520636f6c6c61746f722063616e6469646174655c5d4844656c65676174696f6e5265706c616365641800000130543a3a4163636f756e744964000018013042616c616e63654f663c543e0000000130543a3a4163636f756e744964000018013042616c616e63654f663c543e0000000130543a3a4163636f756e744964000018013042616c616e63654f663c543e000f180d0141206e65772064656c65676174696f6e20686173207265706c6163656420616e206578697374696e67206f6e6520696e2074686520736574206f66206f6e676f696e67010164656c65676174696f6e7320666f72206120636f6c6c61746f722063616e6469646174652e205c5b6e65772064656c656761746f722773206163636f756e742c0901616d6f756e74206f662066756e6473207374616b656420696e20746865206e65772064656c65676174696f6e2c207265706c616365642064656c656761746f7227730d016163636f756e742c20616d6f756e74206f662066756e6473207374616b656420696e20746865207265706c6163652064656c65676174696f6e2c20636f6c6c61746f72050163616e6469646174652773206163636f756e742c206e657720746f74616c20616d6f756e74206f662064656c656761746f7273272066756e6473207374616b656470666f722074686520636f6c6c61746f722063616e6469646174655c5d5444656c656761746f724c656674436f6c6c61746f721000000130543a3a4163636f756e7449640000000130543a3a4163636f756e744964000018013042616c616e63654f663c543e000018013042616c616e63654f663c543e00100cdc416e206163636f756e74206861732073746f707065642064656c65676174696e67206120636f6c6c61746f722063616e6469646174652e09015c5b6163636f756e742c20636f6c6c61746f722063616e6469646174652773206163636f756e742c206f6c6420616d6f756e74206f662064656c656761746f727327d866756e6473207374616b65642c206e657720616d6f756e74206f662064656c656761746f7273272066756e6473207374616b65645c5d2052657761726465640800000130543a3a4163636f756e744964000018013042616c616e63654f663c543e001108c04120636f6c6c61746f72206f7220612064656c656761746f72206861732072656365697665642061207265776172642e745c5b6163636f756e742c20616d6f756e74206f66207265776172645c5d44526f756e64496e666c6174696f6e53657410007c012c5065727175696e74696c6c00007c012c5065727175696e74696c6c00007c012c5065727175696e74696c6c00007c012c5065727175696e74696c6c00120c0501496e666c6174696f6e20636f6e66696775726174696f6e20666f72206675747572652076616c69646174696f6e20726f756e647320686173206368616e6765642e09015c5b6d6178696d756d20636f6c6c61746f722773207374616b696e6720726174652c206d6178696d756d20636f6c6c61746f7227732072657761726420726174652c0d016d6178696d756d2064656c656761746f722773207374616b696e6720726174652c206d6178696d756d2064656c656761746f7227732072657761726420726174655c5d604d617853656c656374656443616e6469646174657353657408001c010c75333200001c010c753332001308f0546865206d6178696d756d206e756d626572206f6620636f6c6c61746f722063616e646964617465732073656c656374656420696e20667574757265dc76616c69646174696f6e20726f756e647320686173206368616e6765642e205c5b6f6c642076616c75652c206e65772076616c75655c5d44426c6f636b73506572526f756e6453657410001c013053657373696f6e496e6465780000100138543a3a426c6f636b4e756d6265720000100138543a3a426c6f636b4e756d6265720000100138543a3a426c6f636b4e756d62657200140cf8546865206c656e67746820696e20626c6f636b7320666f72206675747572652076616c69646174696f6e20726f756e647320686173206368616e6765642e01015c5b726f756e64206e756d6265722c20666972737420626c6f636b20696e207468652063757272656e7420726f756e642c206f6c642076616c75652c206e65771c76616c75655c5d0499010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f72732920656d69747465640a090909627920746869732070616c6c65742e0a0909097c0c3473705f61726974686d65746963287065725f7468696e67732c5065727175696e74696c6c0000040010010c7536340000800c3870616c6c65745f73657373696f6e1870616c6c6574144576656e74000104284e657753657373696f6e04013473657373696f6e5f696e6465781c013053657373696f6e496e64657800000839014e65772073657373696f6e206861732068617070656e65642e204e6f746520746861742074686520617267756d656e74206973207468652073657373696f6e20696e6465782c206e6f74207468659c626c6f636b206e756d626572206173207468652074797065206d6967687420737567676573742e0499010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f72732920656d69747465640a090909627920746869732070616c6c65742e0a090909840c4070616c6c65745f64656d6f63726163791870616c6c6574144576656e7404045400014c2050726f706f73656408013870726f706f73616c5f696e6465781c012450726f70496e64657800011c6465706f73697418013042616c616e63654f663c543e000004bc41206d6f74696f6e20686173206265656e2070726f706f7365642062792061207075626c6963206163636f756e742e185461626c65640c013870726f706f73616c5f696e6465781c012450726f70496e64657800011c6465706f73697418013042616c616e63654f663c543e0001286465706f7369746f72738801445665633c543a3a4163636f756e7449643e000104d841207075626c69632070726f706f73616c20686173206265656e207461626c656420666f72207265666572656e64756d20766f74652e3845787465726e616c5461626c656400020494416e2065787465726e616c2070726f706f73616c20686173206265656e207461626c65642e1c537461727465640801247265665f696e6465781c013c5265666572656e64756d496e6465780001247468726573686f6c648c0134566f74655468726573686f6c640003045c41207265666572656e64756d2068617320626567756e2e185061737365640401247265665f696e6465781c013c5265666572656e64756d496e646578000404ac412070726f706f73616c20686173206265656e20617070726f766564206279207265666572656e64756d2e244e6f745061737365640401247265665f696e6465781c013c5265666572656e64756d496e646578000504ac412070726f706f73616c20686173206265656e2072656a6563746564206279207265666572656e64756d2e2443616e63656c6c65640401247265665f696e6465781c013c5265666572656e64756d496e6465780006048041207265666572656e64756d20686173206265656e2063616e63656c6c65642e2045786563757465640801247265665f696e6465781c013c5265666572656e64756d496e646578000118726573756c749001384469737061746368526573756c7400070470412070726f706f73616c20686173206265656e20656e61637465642e2444656c65676174656408010c77686f000130543a3a4163636f756e744964000118746172676574000130543a3a4163636f756e744964000804dc416e206163636f756e74206861732064656c65676174656420746865697220766f746520746f20616e6f74686572206163636f756e742e2c556e64656c65676174656404011c6163636f756e74000130543a3a4163636f756e744964000904e4416e206163636f756e74206861732063616e63656c6c656420612070726576696f75732064656c65676174696f6e206f7065726174696f6e2e185665746f65640c010c77686f000130543a3a4163636f756e74496400013470726f706f73616c5f6861736824011c543a3a48617368000114756e74696c100138543a3a426c6f636b4e756d626572000a0494416e2065787465726e616c2070726f706f73616c20686173206265656e207665746f65642e34507265696d6167654e6f7465640c013470726f706f73616c5f6861736824011c543a3a4861736800010c77686f000130543a3a4163636f756e74496400011c6465706f73697418013042616c616e63654f663c543e000b04dc412070726f706f73616c277320707265696d61676520776173206e6f7465642c20616e6420746865206465706f7369742074616b656e2e30507265696d616765557365640c013470726f706f73616c5f6861736824011c543a3a4861736800012070726f7669646572000130543a3a4163636f756e74496400011c6465706f73697418013042616c616e63654f663c543e000c041101412070726f706f73616c20707265696d616765207761732072656d6f76656420616e6420757365642028746865206465706f736974207761732072657475726e6564292e3c507265696d616765496e76616c696408013470726f706f73616c5f6861736824011c543a3a486173680001247265665f696e6465781c013c5265666572656e64756d496e646578000d040901412070726f706f73616c20636f756c64206e6f7420626520657865637574656420626563617573652069747320707265696d6167652077617320696e76616c69642e3c507265696d6167654d697373696e6708013470726f706f73616c5f6861736824011c543a3a486173680001247265665f696e6465781c013c5265666572656e64756d496e646578000e040901412070726f706f73616c20636f756c64206e6f7420626520657865637574656420626563617573652069747320707265696d61676520776173206d697373696e672e38507265696d61676552656170656410013470726f706f73616c5f6861736824011c543a3a4861736800012070726f7669646572000130543a3a4163636f756e74496400011c6465706f73697418013042616c616e63654f663c543e000118726561706572000130543a3a4163636f756e744964000f04290141207265676973746572656420707265696d616765207761732072656d6f76656420616e6420746865206465706f73697420636f6c6c656374656420627920746865207265617065722e2c426c61636b6c697374656404013470726f706f73616c5f6861736824011c543a3a48617368001004c4412070726f706f73616c5f6861736820686173206265656e20626c61636b6c6973746564207065726d616e656e746c792e14566f7465640c0114766f746572000130543a3a4163636f756e7449640001247265665f696e6465781c013c5265666572656e64756d496e646578000110766f74659801644163636f756e74566f74653c42616c616e63654f663c543e3e00110490416e206163636f756e742068617320766f74656420696e2061207265666572656e64756d205365636f6e6465640801207365636f6e646572000130543a3a4163636f756e74496400012870726f705f696e6465781c012450726f70496e6465780012048c416e206163636f756e742068617320736563636f6e64656420612070726f706f73616c0499010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f72732920656d69747465640a090909627920746869732070616c6c65742e0a0909098800000200008c0c4070616c6c65745f64656d6f637261637938766f74655f7468726573686f6c6434566f74655468726573686f6c6400010c5053757065724d616a6f72697479417070726f76650000005053757065724d616a6f72697479416761696e73740001003853696d706c654d616a6f7269747900020000900418526573756c740804540194044501580108084f6b040094000000000c4572720400580000010000940000040000980c4070616c6c65745f64656d6f637261637910766f74652c4163636f756e74566f7465041c42616c616e636501180108205374616e64617264080110766f74659c0110566f746500011c62616c616e636518011c42616c616e63650000001453706c697408010c61796518011c42616c616e636500010c6e617918011c42616c616e6365000100009c0c4070616c6c65745f64656d6f637261637910766f746510566f74650000040008000000a00c4470616c6c65745f636f6c6c6563746976651870616c6c6574144576656e7408045400044900011c2050726f706f73656410011c6163636f756e74000130543a3a4163636f756e74496400013870726f706f73616c5f696e6465781c013450726f706f73616c496e64657800013470726f706f73616c5f6861736824011c543a3a486173680001247468726573686f6c641c012c4d656d626572436f756e74000008490141206d6f74696f6e2028676976656e20686173682920686173206265656e2070726f706f7365642028627920676976656e206163636f756e742920776974682061207468726573686f6c642028676976656e3c604d656d626572436f756e7460292e14566f74656414011c6163636f756e74000130543a3a4163636f756e74496400013470726f706f73616c5f6861736824011c543a3a48617368000114766f746564a40110626f6f6c00010c7965731c012c4d656d626572436f756e740001086e6f1c012c4d656d626572436f756e74000108050141206d6f74696f6e2028676976656e20686173682920686173206265656e20766f746564206f6e20627920676976656e206163636f756e742c206c656176696e671501612074616c6c79202879657320766f74657320616e64206e6f20766f74657320676976656e20726573706563746976656c7920617320604d656d626572436f756e7460292e20417070726f76656404013470726f706f73616c5f6861736824011c543a3a48617368000204c041206d6f74696f6e2077617320617070726f76656420627920746865207265717569726564207468726573686f6c642e2c446973617070726f76656404013470726f706f73616c5f6861736824011c543a3a48617368000304d041206d6f74696f6e20776173206e6f7420617070726f76656420627920746865207265717569726564207468726573686f6c642e20457865637574656408013470726f706f73616c5f6861736824011c543a3a48617368000118726573756c749001384469737061746368526573756c74000404210141206d6f74696f6e207761732065786563757465643b20726573756c742077696c6c20626520604f6b602069662069742072657475726e656420776974686f7574206572726f722e384d656d626572457865637574656408013470726f706f73616c5f6861736824011c543a3a48617368000118726573756c749001384469737061746368526573756c740005044901412073696e676c65206d656d6265722064696420736f6d6520616374696f6e3b20726573756c742077696c6c20626520604f6b602069662069742072657475726e656420776974686f7574206572726f722e18436c6f7365640c013470726f706f73616c5f6861736824011c543a3a4861736800010c7965731c012c4d656d626572436f756e740001086e6f1c012c4d656d626572436f756e740006045501412070726f706f73616c2077617320636c6f736564206265636175736520697473207468726573686f6c64207761732072656163686564206f7220616674657220697473206475726174696f6e207761732075702e0499010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f72732920656d69747465640a090909627920746869732070616c6c65742e0a090909a40000050000a80c4470616c6c65745f636f6c6c6563746976651870616c6c6574144576656e7408045400044900011c2050726f706f73656410011c6163636f756e74000130543a3a4163636f756e74496400013870726f706f73616c5f696e6465781c013450726f706f73616c496e64657800013470726f706f73616c5f6861736824011c543a3a486173680001247468726573686f6c641c012c4d656d626572436f756e74000008490141206d6f74696f6e2028676976656e20686173682920686173206265656e2070726f706f7365642028627920676976656e206163636f756e742920776974682061207468726573686f6c642028676976656e3c604d656d626572436f756e7460292e14566f74656414011c6163636f756e74000130543a3a4163636f756e74496400013470726f706f73616c5f6861736824011c543a3a48617368000114766f746564a40110626f6f6c00010c7965731c012c4d656d626572436f756e740001086e6f1c012c4d656d626572436f756e74000108050141206d6f74696f6e2028676976656e20686173682920686173206265656e20766f746564206f6e20627920676976656e206163636f756e742c206c656176696e671501612074616c6c79202879657320766f74657320616e64206e6f20766f74657320676976656e20726573706563746976656c7920617320604d656d626572436f756e7460292e20417070726f76656404013470726f706f73616c5f6861736824011c543a3a48617368000204c041206d6f74696f6e2077617320617070726f76656420627920746865207265717569726564207468726573686f6c642e2c446973617070726f76656404013470726f706f73616c5f6861736824011c543a3a48617368000304d041206d6f74696f6e20776173206e6f7420617070726f76656420627920746865207265717569726564207468726573686f6c642e20457865637574656408013470726f706f73616c5f6861736824011c543a3a48617368000118726573756c749001384469737061746368526573756c74000404210141206d6f74696f6e207761732065786563757465643b20726573756c742077696c6c20626520604f6b602069662069742072657475726e656420776974686f7574206572726f722e384d656d626572457865637574656408013470726f706f73616c5f6861736824011c543a3a48617368000118726573756c749001384469737061746368526573756c740005044901412073696e676c65206d656d6265722064696420736f6d6520616374696f6e3b20726573756c742077696c6c20626520604f6b602069662069742072657475726e656420776974686f7574206572726f722e18436c6f7365640c013470726f706f73616c5f6861736824011c543a3a4861736800010c7965731c012c4d656d626572436f756e740001086e6f1c012c4d656d626572436f756e740006045501412070726f706f73616c2077617320636c6f736564206265636175736520697473207468726573686f6c64207761732072656163686564206f7220616674657220697473206475726174696f6e207761732075702e0499010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f72732920656d69747465640a090909627920746869732070616c6c65742e0a090909ac0c4470616c6c65745f6d656d626572736869701870616c6c6574144576656e740804540004490001182c4d656d6265724164646564000004e054686520676976656e206d656d626572207761732061646465643b2073656520746865207472616e73616374696f6e20666f722077686f2e344d656d62657252656d6f766564000104e854686520676976656e206d656d626572207761732072656d6f7665643b2073656520746865207472616e73616374696f6e20666f722077686f2e384d656d6265727353776170706564000204d854776f206d656d62657273207765726520737761707065643b2073656520746865207472616e73616374696f6e20666f722077686f2e304d656d6265727352657365740003041501546865206d656d62657273686970207761732072657365743b2073656520746865207472616e73616374696f6e20666f722077686f20746865206e6577207365742069732e284b65794368616e676564000404844f6e65206f6620746865206d656d6265727327206b657973206368616e6765642e1444756d6d790005046c5068616e746f6d206d656d6265722c206e6576657220757365642e0499010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f72732920656d69747465640a090909627920746869732070616c6c65742e0a090909b00c3c70616c6c65745f74726561737572791870616c6c6574144576656e7408045400044900011c2050726f706f73656404013870726f706f73616c5f696e6465781c013450726f706f73616c496e646578000004344e65772070726f706f73616c2e205370656e64696e670401406275646765745f72656d61696e696e6718013c42616c616e63654f663c542c20493e000104e45765206861766520656e6465642061207370656e6420706572696f6420616e642077696c6c206e6f7720616c6c6f636174652066756e64732e1c417761726465640c013870726f706f73616c5f696e6465781c013450726f706f73616c496e646578000114617761726418013c42616c616e63654f663c542c20493e00011c6163636f756e74000130543a3a4163636f756e7449640002047c536f6d652066756e64732068617665206265656e20616c6c6f63617465642e2052656a656374656408013870726f706f73616c5f696e6465781c013450726f706f73616c496e64657800011c736c617368656418013c42616c616e63654f663c542c20493e000304b0412070726f706f73616c207761732072656a65637465643b2066756e6473207765726520736c61736865642e144275726e7404012c6275726e745f66756e647318013c42616c616e63654f663c542c20493e00040488536f6d65206f66206f75722066756e64732068617665206265656e206275726e742e20526f6c6c6f766572040140726f6c6c6f7665725f62616c616e636518013c42616c616e63654f663c542c20493e0005042d015370656e64696e67206861732066696e69736865643b20746869732069732074686520616d6f756e74207468617420726f6c6c73206f76657220756e74696c206e657874207370656e642e1c4465706f73697404011476616c756518013c42616c616e63654f663c542c20493e0006047c536f6d652066756e64732068617665206265656e206465706f73697465642e0499010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f72732920656d69747465640a090909627920746869732070616c6c65742e0a090909b40c3870616c6c65745f7574696c6974791870616c6c6574144576656e74000118404261746368496e746572727570746564080114696e6465781c010c7533320001146572726f7258013444697370617463684572726f7200000855014261746368206f66206469737061746368657320646964206e6f7420636f6d706c6574652066756c6c792e20496e646578206f66206669727374206661696c696e6720646973706174636820676976656e2c2061734877656c6c20617320746865206572726f722e384261746368436f6d706c65746564000104c84261746368206f66206469737061746368657320636f6d706c657465642066756c6c792077697468206e6f206572726f722e604261746368436f6d706c65746564576974684572726f7273000204b44261746368206f66206469737061746368657320636f6d706c657465642062757420686173206572726f72732e344974656d436f6d706c657465640003041d01412073696e676c65206974656d2077697468696e2061204261746368206f6620646973706174636865732068617320636f6d706c657465642077697468206e6f206572726f722e284974656d4661696c65640401146572726f7258013444697370617463684572726f720004041101412073696e676c65206974656d2077697468696e2061204261746368206f6620646973706174636865732068617320636f6d706c657465642077697468206572726f722e30446973706174636865644173040118726573756c749001384469737061746368526573756c7400050458412063616c6c2077617320646973706174636865642e0499010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f72732920656d69747465640a090909627920746869732070616c6c65742e0a090909b80c3870616c6c65745f76657374696e671870616c6c6574144576656e740404540001083856657374696e675570646174656408011c6163636f756e74000130543a3a4163636f756e744964000120756e76657374656418013042616c616e63654f663c543e000008510154686520616d6f756e742076657374656420686173206265656e20757064617465642e205468697320636f756c6420696e6469636174652061206368616e676520696e2066756e647320617661696c61626c652e25015468652062616c616e636520676976656e2069732074686520616d6f756e74207768696368206973206c65667420756e7665737465642028616e642074687573206c6f636b6564292e4056657374696e67436f6d706c6574656404011c6163636f756e74000130543a3a4163636f756e7449640001049c416e205c5b6163636f756e745c5d20686173206265636f6d652066756c6c79207665737465642e0499010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f72732920656d69747465640a090909627920746869732070616c6c65742e0a090909bc0c4070616c6c65745f7363686564756c65721870616c6c6574144576656e74040454000110245363686564756c65640801107768656e100138543a3a426c6f636b4e756d626572000114696e6465781c010c753332000004505363686564756c656420736f6d65207461736b2e2043616e63656c65640801107768656e100138543a3a426c6f636b4e756d626572000114696e6465781c010c7533320001044c43616e63656c656420736f6d65207461736b2e28446973706174636865640c01107461736bc0016c5461736b416464726573733c543a3a426c6f636b4e756d6265723e0001086964c4013c4f7074696f6e3c5665633c75383e3e000118726573756c749001384469737061746368526573756c74000204544469737061746368656420736f6d65207461736b2e4043616c6c4c6f6f6b75704661696c65640c01107461736bc0016c5461736b416464726573733c543a3a426c6f636b4e756d6265723e0001086964c4013c4f7074696f6e3c5665633c75383e3e0001146572726f72c8012c4c6f6f6b75704572726f7200030429015468652063616c6c20666f72207468652070726f7669646564206861736820776173206e6f7420666f756e6420736f20746865207461736b20686173206265656e2061626f727465642e04304576656e747320747970652ec000000408101c00c404184f7074696f6e04045401280108104e6f6e6500000010536f6d650400280000010000c810346672616d655f737570706f727418747261697473207363686564756c652c4c6f6f6b75704572726f720001081c556e6b6e6f776e00000024426164466f726d617400010000cc0c3070616c6c65745f70726f78791870616c6c6574144576656e740404540001143450726f78794578656375746564040118726573756c749001384469737061746368526573756c74000004bc412070726f78792077617320657865637574656420636f72726563746c792c20776974682074686520676976656e2e40416e6f6e796d6f757343726561746564100124616e6f6e796d6f7573000130543a3a4163636f756e74496400010c77686f000130543a3a4163636f756e74496400012870726f78795f74797065d00130543a3a50726f787954797065000150646973616d626967756174696f6e5f696e646578d4010c753136000108e8416e6f6e796d6f7573206163636f756e7420686173206265656e2063726561746564206279206e65772070726f7879207769746820676976656e90646973616d626967756174696f6e20696e64657820616e642070726f787920747970652e24416e6e6f756e6365640c01107265616c000130543a3a4163636f756e74496400011470726f7879000130543a3a4163636f756e74496400012463616c6c5f6861736824013443616c6c486173684f663c543e000204e0416e20616e6e6f756e63656d656e742077617320706c6163656420746f206d616b6520612063616c6c20696e20746865206675747572652e2850726f7879416464656410012464656c656761746f72000130543a3a4163636f756e74496400012464656c656761746565000130543a3a4163636f756e74496400012870726f78795f74797065d00130543a3a50726f78795479706500011464656c6179100138543a3a426c6f636b4e756d62657200030448412070726f7879207761732061646465642e3050726f787952656d6f76656410012464656c656761746f72000130543a3a4163636f756e74496400012464656c656761746565000130543a3a4163636f756e74496400012870726f78795f74797065d00130543a3a50726f78795479706500011464656c6179100138543a3a426c6f636b4e756d62657200040450412070726f7879207761732072656d6f7665642e0499010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f72732920656d69747465640a090909627920746869732070616c6c65742e0a090909d008447370697269746e65745f72756e74696d652450726f7879547970650001180c416e790000002c4e6f6e5472616e7366657200010028476f7665726e616e63650002004050617261636861696e5374616b696e670003002c43616e63656c50726f7879000400484e6f6e4465706f736974436c61696d696e6700050000d40000050400d80c3c70616c6c65745f707265696d6167651870616c6c6574144576656e7404045400010c144e6f7465640401106861736824011c543a3a48617368000004684120707265696d61676520686173206265656e206e6f7465642e245265717565737465640401106861736824011c543a3a48617368000104784120707265696d61676520686173206265656e207265717565737465642e1c436c65617265640401106861736824011c543a3a486173680002046c4120707265696d616765206861732062656e20636c65617265642e0499010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f72732920656d69747465640a090909627920746869732070616c6c65742e0a090909dc0c4470616c6c65745f6d656d626572736869701870616c6c6574144576656e740804540004490001182c4d656d6265724164646564000004e054686520676976656e206d656d626572207761732061646465643b2073656520746865207472616e73616374696f6e20666f722077686f2e344d656d62657252656d6f766564000104e854686520676976656e206d656d626572207761732072656d6f7665643b2073656520746865207472616e73616374696f6e20666f722077686f2e384d656d6265727353776170706564000204d854776f206d656d62657273207765726520737761707065643b2073656520746865207472616e73616374696f6e20666f722077686f2e304d656d6265727352657365740003041501546865206d656d62657273686970207761732072657365743b2073656520746865207472616e73616374696f6e20666f722077686f20746865206e6577207365742069732e284b65794368616e676564000404844f6e65206f6620746865206d656d6265727327206b657973206368616e6765642e1444756d6d790005046c5068616e746f6d206d656d6265722c206e6576657220757365642e0499010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f72732920656d69747465640a090909627920746869732070616c6c65742e0a090909e00c2c70616c6c65745f746970731870616c6c6574144576656e74040454000114184e65775469700401207469705f6861736824011c543a3a486173680000049441206e6577207469702073756767657374696f6e20686173206265656e206f70656e65642e28546970436c6f73696e670401207469705f6861736824011c543a3a48617368000104d841207469702073756767657374696f6e206861732072656163686564207468726573686f6c6420616e6420697320636c6f73696e672e24546970436c6f7365640c01207469705f6861736824011c543a3a4861736800010c77686f000130543a3a4163636f756e7449640001187061796f757418013042616c616e63654f663c543e0002048441207469702073756767657374696f6e20686173206265656e20636c6f7365642e305469705265747261637465640401207469705f6861736824011c543a3a486173680003049041207469702073756767657374696f6e20686173206265656e207265747261637465642e28546970536c61736865640c01207469705f6861736824011c543a3a4861736800011866696e646572000130543a3a4163636f756e74496400011c6465706f73697418013042616c616e63654f663c543e0004048841207469702073756767657374696f6e20686173206265656e20736c61736865642e0499010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f72732920656d69747465640a090909627920746869732070616c6c65742e0a090909e40c1463747970651870616c6c6574144576656e74040454000104304354797065437265617465640800000144437479706543726561746f724f663c543e00002401384374797065486173684f663c543e0000087441206e657720435479706520686173206265656e20637265617465642e885c5b63726561746f72206964656e7469666965722c20435479706520686173685c5d0499010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f72732920656d69747465640a090909627920746869732070616c6c65742e0a090909e80c2c6174746573746174696f6e1870616c6c6574144576656e74040454000110484174746573746174696f6e43726561746564100000013441747465737465724f663c543e0000240138436c61696d486173684f663c543e00002401384374797065486173684f663c543e0000ec01704f7074696f6e3c417574686f72697a6174696f6e49644f663c543e3e0000088c41206e6577206174746573746174696f6e20686173206265656e20637265617465642e05015c5b61747465737465722049442c20636c61696d20686173682c20435479706520686173682c20286f7074696f6e616c292064656c65676174696f6e2049445c5d484174746573746174696f6e5265766f6b6564080000013441747465737465724f663c543e0000240138436c61696d486173684f663c543e00010880416e206174746573746174696f6e20686173206265656e207265766f6b65642e685c5b6163636f756e742069642c20636c61696d20686173685c5d484174746573746174696f6e52656d6f766564080000013441747465737465724f663c543e0000240138436c61696d486173684f663c543e00020880416e206174746573746174696f6e20686173206265656e2072656d6f7665642e685c5b6163636f756e742069642c20636c61696d20686173685c5d404465706f7369745265636c61696d656408000001384163636f756e7449644f663c543e0000240138436c61696d486173684f663c543e0003080501546865206465706f736974206f776e6572207265636c61696d65642061206465706f7369742062792072656d6f76696e6720616e206174746573746174696f6e2e685c5b6163636f756e742069642c20636c61696d20686173685c5d0499010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f72732920656d69747465640a090909627920746869732070616c6c65742e0a090909ec04184f7074696f6e04045401f00108104e6f6e6500000010536f6d650400f00000010000f00c3872756e74696d655f636f6d6d6f6e34617574686f72697a6174696f6e3c417574686f72697a6174696f6e4964043044656c65676174696f6e4964012401042844656c65676174696f6e040024013044656c65676174696f6e496400000000f40c2864656c65676174696f6e1870616c6c6574144576656e7404045400011c40486965726172636879437265617465640c0000014044656c656761746f7249644f663c543e000024015444656c65676174696f6e4e6f646549644f663c543e00002401384374797065486173684f663c543e0000088441206e65772068696572617263687920686173206265656e20637265617465642ea05c5b63726561746f722049442c20726f6f74206e6f64652049442c20435459504520686173685c5d404869657261726368795265766f6b6564080000014044656c656761746f7249644f663c543e000024015444656c65676174696f6e4e6f646549644f663c543e00010874412068696572617263687920686173206265656e207265766f6b65642e705c5b7265766f6b65722049442c20726f6f74206e6f64652049445c5d4048696572617263687952656d6f766564080000014044656c656761746f7249644f663c543e000024015444656c65676174696f6e4e6f646549644f663c543e000208dc412068696572617263687920686173206265656e2072656d6f7665642066726f6d207468652073746f72616765206f6e20636861696e2e705c5b72656d6f7665722049442c20726f6f74206e6f64652049445c5d4444656c65676174696f6e43726561746564180000014044656c656761746f7249644f663c543e000024015444656c65676174696f6e4e6f646549644f663c543e000024015444656c65676174696f6e4e6f646549644f663c543e000024015444656c65676174696f6e4e6f646549644f663c543e000000014044656c656761746f7249644f663c543e0000f8012c5065726d697373696f6e7300030c8841206e65772064656c65676174696f6e20686173206265656e20637265617465642efc5c5b63726561746f722049442c20726f6f74206e6f64652049442c2064656c65676174696f6e206e6f64652049442c20706172656e74206e6f64652049442c6864656c65676174652049442c207065726d697373696f6e735c5d4444656c65676174696f6e5265766f6b6564080000014044656c656761746f7249644f663c543e000024015444656c65676174696f6e4e6f646549644f663c543e00040878412064656c65676174696f6e20686173206265656e207265766f6b65642e885c5b7265766f6b65722049442c2064656c65676174696f6e206e6f64652049445c5d4444656c65676174696f6e52656d6f76656408000001384163636f756e7449644f663c543e000024015444656c65676174696f6e4e6f646549644f663c543e00050878412064656c65676174696f6e20686173206265656e2072656d6f7665642e885c5b72656d6f7665722049442c2064656c65676174696f6e206e6f64652049445c5d404465706f7369745265636c61696d656408000001384163636f756e7449644f663c543e000024015444656c65676174696f6e4e6f646549644f663c543e000608f8546865206465706f736974206f776e6572207265636c61696d65642061206465706f7369742062792072656d6f76696e6720612064656c65676174696f6eac737562747265652e205c5b7265766f6b65722049442c2064656c65676174696f6e206e6f64652049445c5d0499010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f72732920656d69747465640a090909627920746869732070616c6c65742e0a090909f80c2864656c65676174696f6e5064656c65676174696f6e5f6869657261726368792c5065726d697373696f6e730000040110626974731c010c7533320000fc0c0c6469641870616c6c6574144576656e74040454000110284469644372656174656408000001384163636f756e7449644f663c543e00000001484469644964656e7469666965724f663c543e0000086c41206e65772044494420686173206265656e20637265617465642e985c5b7472616e73616374696f6e207369676e65722c20444944206964656e7469666965725c5d284469645570646174656404000001484469644964656e7469666965724f663c543e0001085c412044494420686173206265656e20757064617465642e485c5b444944206964656e7469666965725c5d2844696444656c6574656404000001484469644964656e7469666965724f663c543e0002085c412044494420686173206265656e2064656c657465642e485c5b444944206964656e7469666965725c5d4444696443616c6c4469737061746368656408000001484469644964656e7469666965724f663c543e00009001384469737061746368526573756c74000308a041204449442d617574686f72697365642063616c6c20686173206265656e2065786563757465642e7c5c5b4449442063616c6c65722c20646973706174636820726573756c745c5d0499010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f72732920656d69747465640a090909627920746869732070616c6c65742e0a09090901010c4470616c6c65745f6469645f6c6f6f6b75701870616c6c6574144576656e74040454000108584173736f63696174696f6e45737461626c697368656408000001384163636f756e7449644f663c543e00000001484469644964656e7469666965724f663c543e000004f841206e6577206173736f63696174696f6e206265747765656e20612044494420616e6420616e206163636f756e742049442077617320637265617465642e484173736f63696174696f6e52656d6f76656408000001384163636f756e7449644f663c543e00000001484469644964656e7469666965724f663c543e000104ec416e206173736f63696174696f6e206265747765656e20612044494420616e6420616e206163636f756e74204944207761732072656d6f7665642e0499010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f72732920656d69747465640a090909627920746869732070616c6c65742e0a09090905010c4470616c6c65745f776562335f6e616d65731870616c6c6574144576656e740404540001103c576562334e616d65436c61696d65640801146f776e6572000148576562334e616d654f776e65724f663c543e0001106e616d6509010134576562334e616d654f663c543e0000047041206e6577206e616d6520686173206265656e20636c61696d65642e40576562334e616d6552656c65617365640801146f776e6572000148576562334e616d654f776e65724f663c543e0001106e616d6509010134576562334e616d654f663c543e0001046441206e616d6520686173206265656e2072656c65617365642e38576562334e616d6542616e6e65640401106e616d6509010134576562334e616d654f663c543e0002045c41206e616d6520686173206265656e2062616e6e65642e40576562334e616d65556e62616e6e65640401106e616d6509010134576562334e616d654f663c543e0003046441206e616d6520686173206265656e20756e62616e6e65642e0499010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f72732920656d69747465640a090909627920746869732070616c6c65742e0a09090909010c4470616c6c65745f776562335f6e616d657324776562335f6e616d65344173636969576562334e616d65040454000004000d010180426f756e6465645665633c75382c20543a3a4d61784e616d654c656e6774683e00000d0110346672616d655f737570706f72741c73746f726167652c626f756e6465645f76656328426f756e64656456656308045401080453000004002801185665633c543e000011010c7c63756d756c75735f70616c6c65745f70617261636861696e5f73797374656d1870616c6c6574144576656e740404540001186056616c69646174696f6e46756e6374696f6e53746f726564000004d05468652076616c69646174696f6e2066756e6374696f6e20686173206265656e207363686564756c656420746f206170706c792e6456616c69646174696f6e46756e6374696f6e4170706c69656404015472656c61795f636861696e5f626c6f636b5f6e756d1c015452656c6179436861696e426c6f636b4e756d62657200010445015468652076616c69646174696f6e2066756e6374696f6e20776173206170706c696564206173206f662074686520636f6e7461696e65642072656c617920636861696e20626c6f636b206e756d6265722e6c56616c69646174696f6e46756e6374696f6e446973636172646564000204b05468652072656c61792d636861696e2061626f727465642074686520757067726164652070726f636573732e4455706772616465417574686f72697a6564040124636f64655f6861736824011c543a3a486173680003047c416e207570677261646520686173206265656e20617574686f72697a65642e60446f776e776172644d657373616765735265636569766564040114636f756e741c010c7533320004040101536f6d6520646f776e77617264206d657373616765732068617665206265656e20726563656976656420616e642077696c6c2062652070726f6365737365642e64446f776e776172644d6573736167657350726f63657373656408012c7765696768745f75736564100118576569676874000120646d715f6865616424014472656c61795f636861696e3a3a48617368000504e0446f776e77617264206d6573736167657320776572652070726f636573736564207573696e672074686520676976656e207765696768742e0499010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f72732920656d69747465640a090909627920746869732070616c6c65742e0a09090915010c6463756d756c75735f70616c6c65745f78636d705f71756575651870616c6c6574144576656e740404540001201c5375636365737304001901013c4f7074696f6e3c543a3a486173683e00000464536f6d652058434d20776173206578656375746564206f6b2e104661696c08001901013c4f7074696f6e3c543a3a486173683e00001d01012058636d4572726f7200010440536f6d652058434d206661696c65642e2842616456657273696f6e04001901013c4f7074696f6e3c543a3a486173683e000204544261642058434d2076657273696f6e20757365642e24426164466f726d617404001901013c4f7074696f6e3c543a3a486173683e000304504261642058434d20666f726d617420757365642e445570776172644d65737361676553656e7404001901013c4f7074696f6e3c543a3a486173683e000404b8416e20757077617264206d657373616765207761732073656e7420746f207468652072656c617920636861696e2e3c58636d704d65737361676553656e7404001901013c4f7074696f6e3c543a3a486173683e000504c0416e2048524d50206d657373616765207761732073656e7420746f2061207369626c696e672070617261636861696e2e484f766572776569676874456e71756575656410002101011850617261496400001c014052656c6179426c6f636b4e756d626572000010013c4f766572776569676874496e6465780000100118576569676874000604d4416e2058434d2065786365656465642074686520696e646976696475616c206d65737361676520776569676874206275646765742e484f7665727765696768745365727669636564080010013c4f766572776569676874496e64657800001001185765696768740007044101416e2058434d2066726f6d20746865206f7665727765696768742071756575652077617320657865637574656420776974682074686520676976656e2061637475616c2077656967687420757365642e0499010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f72732920656d69747465640a090909627920746869732070616c6c65742e0a090909190104184f7074696f6e04045401240108104e6f6e6500000010536f6d6504002400000100001d01100c78636d08763218747261697473144572726f72000168204f766572666c6f7700000034556e696d706c656d656e74656400010060556e74727573746564526573657276654c6f636174696f6e00020064556e7472757374656454656c65706f72744c6f636174696f6e000300444d756c74694c6f636174696f6e46756c6c000400684d756c74694c6f636174696f6e4e6f74496e7665727469626c65000500244261644f726967696e0006003c496e76616c69644c6f636174696f6e0007003441737365744e6f74466f756e64000800544661696c6564546f5472616e7361637441737365740009003c4e6f74576974686472617761626c65000a00484c6f636174696f6e43616e6e6f74486f6c64000b0054457863656564734d61784d65737361676553697a65000c005844657374696e6174696f6e556e737570706f72746564000d00245472616e73706f7274000e0028556e726f757461626c65000f0030556e6b6e6f776e436c61696d001000384661696c6564546f4465636f6465001100404d6178576569676874496e76616c6964001200384e6f74486f6c64696e674665657300130030546f6f457870656e736976650014001054726170040010010c7536340015004c556e68616e646c656458636d56657273696f6e001600485765696768744c696d69745265616368656404001001185765696768740017001c426172726965720018004c5765696768744e6f74436f6d70757461626c650019000021010c48706f6c6b61646f745f70617261636861696e287072696d697469766573084964000004001c010c753332000025010c2870616c6c65745f78636d1870616c6c6574144576656e7404045400014024417474656d7074656404002901015078636d3a3a6c61746573743a3a4f7574636f6d6500000ca8457865637574696f6e206f6620616e2058434d206d6573736167652077617320617474656d707465642e00345c5b206f7574636f6d65205c5d1053656e740c002d0101344d756c74694c6f636174696f6e00002d0101344d756c74694c6f636174696f6e00005501011c58636d3c28293e00010c5c412058434d206d657373616765207761732073656e742e00885c5b206f726967696e2c2064657374696e6174696f6e2c206d657373616765205c5d48556e6578706563746564526573706f6e736508002d0101344d756c74694c6f636174696f6e000010011c517565727949640002145901517565727920726573706f6e736520726563656976656420776869636820646f6573206e6f74206d61746368206120726567697374657265642071756572792e2054686973206d61792062652062656361757365206155016d61746368696e6720717565727920776173206e6576657220726567697374657265642c206974206d617920626520626563617573652069742069732061206475706c696361746520726573706f6e73652c206f727062656361757365207468652071756572792074696d6564206f75742e00645c5b206f726967696e206c6f636174696f6e2c206964205c5d34526573706f6e73655265616479080010011c51756572794964000081010120526573706f6e73650003105d01517565727920726573706f6e736520686173206265656e20726563656976656420616e6420697320726561647920666f722074616b696e672077697468206074616b655f726573706f6e7365602e205468657265206973806e6f2072656769737465726564206e6f74696669636174696f6e2063616c6c2e00485c5b2069642c20726573706f6e7365205c5d204e6f7469666965640c0010011c5175657279496400000801087538000008010875380004105901517565727920726573706f6e736520686173206265656e20726563656976656420616e642071756572792069732072656d6f7665642e205468652072656769737465726564206e6f74696669636174696f6e20686173a86265656e206469737061746368656420616e64206578656375746564207375636365737366756c6c792e00885c5b2069642c2070616c6c657420696e6465782c2063616c6c20696e646578205c5d404e6f746966794f766572776569676874140010011c517565727949640000080108753800000801087538000010011857656967687400001001185765696768740005146101517565727920726573706f6e736520686173206265656e20726563656976656420616e642071756572792069732072656d6f7665642e205468652072656769737465726564206e6f74696669636174696f6e20636f756c6441016e6f742062652064697370617463686564206265636175736520746865206469737061746368207765696768742069732067726561746572207468616e20746865206d6178696d756d20776569676874e46f726967696e616c6c7920627564676574656420627920746869732072756e74696d6520666f722074686520717565727920726573756c742e0019015c5b2069642c2070616c6c657420696e6465782c2063616c6c20696e6465782c2061637475616c207765696768742c206d617820627564676574656420776569676874205c5d4c4e6f7469667944697370617463684572726f720c0010011c5175657279496400000801087538000008010875380006105501517565727920726573706f6e736520686173206265656e20726563656976656420616e642071756572792069732072656d6f7665642e2054686572652077617320612067656e6572616c206572726f722077697468886469737061746368696e6720746865206e6f74696669636174696f6e2063616c6c2e00885c5b2069642c2070616c6c657420696e6465782c2063616c6c20696e646578205c5d484e6f746966794465636f64654661696c65640c0010011c5175657279496400000801087538000008010875380007145101517565727920726573706f6e736520686173206265656e20726563656976656420616e642071756572792069732072656d6f7665642e205468652064697370617463682077617320756e61626c6520746f20626559016465636f64656420696e746f2061206043616c6c603b2074686973206d696768742062652064756520746f2064697370617463682066756e6374696f6e20686176696e672061207369676e6174757265207768696368946973206e6f742060286f726967696e2c20517565727949642c20526573706f6e736529602e00885c5b2069642c2070616c6c657420696e6465782c2063616c6c20696e646578205c5d40496e76616c6964526573706f6e6465720c002d0101344d756c74694c6f636174696f6e000010011c517565727949640000a50101544f7074696f6e3c4d756c74694c6f636174696f6e3e0008145901457870656374656420717565727920726573706f6e736520686173206265656e2072656365697665642062757420746865206f726967696e206c6f636174696f6e206f662074686520726573706f6e736520646f657355016e6f74206d6174636820746861742065787065637465642e205468652071756572792072656d61696e73207265676973746572656420666f722061206c617465722c2076616c69642c20726573706f6e736520746f6c626520726563656976656420616e642061637465642075706f6e2e00b05c5b206f726967696e206c6f636174696f6e2c2069642c206578706563746564206c6f636174696f6e205c5d5c496e76616c6964526573706f6e64657256657273696f6e08002d0101344d756c74694c6f636174696f6e000010011c517565727949640009245101457870656374656420717565727920726573706f6e736520686173206265656e2072656365697665642062757420746865206578706563746564206f726967696e206c6f636174696f6e20706c6163656420696e4d0173746f7261676520627920746869732072756e74696d652070726576696f75736c792063616e6e6f74206265206465636f6465642e205468652071756572792072656d61696e7320726567697374657265642e0041015468697320697320756e6578706563746564202873696e63652061206c6f636174696f6e20706c6163656420696e2073746f7261676520696e20612070726576696f75736c7920657865637574696e674d0172756e74696d652073686f756c64206265207265616461626c65207072696f7220746f2071756572792074696d656f75742920616e642064616e6765726f75732073696e63652074686520706f737369626c79590176616c696420726573706f6e73652077696c6c2062652064726f707065642e204d616e75616c20676f7665726e616e636520696e74657276656e74696f6e2069732070726f6261626c7920676f696e6720746f2062651c6e65656465642e00645c5b206f726967696e206c6f636174696f6e2c206964205c5d34526573706f6e736554616b656e040010011c51756572794964000a0cc8526563656976656420717565727920726573706f6e736520686173206265656e207265616420616e642072656d6f7665642e00205c5b206964205c5d34417373657473547261707065640c002401104832353600002d0101344d756c74694c6f636174696f6e0000a901015056657273696f6e65644d756c7469417373657473000b0cb8536f6d65206173736574732068617665206265656e20706c6163656420696e20616e20617373657420747261702e00685c5b20686173682c206f726967696e2c20617373657473205c5d5456657273696f6e4368616e67654e6f74696669656408002d0101344d756c74694c6f636174696f6e00001c012858636d56657273696f6e000c0c2501416e2058434d2076657273696f6e206368616e6765206e6f74696669636174696f6e206d65737361676520686173206265656e20617474656d7074656420746f2062652073656e742e00645c5b2064657374696e6174696f6e2c20726573756c74205c5d5c537570706f7274656456657273696f6e4368616e67656408002d0101344d756c74694c6f636174696f6e00001c012858636d56657273696f6e000d10390154686520737570706f727465642076657273696f6e206f662061206c6f636174696f6e20686173206265656e206368616e6765642e2054686973206d69676874206265207468726f75676820616ec06175746f6d61746963206e6f74696669636174696f6e206f722061206d616e75616c20696e74657276656e74696f6e2e006c5c5b206c6f636174696f6e2c2058434d2076657273696f6e205c5d504e6f7469667954617267657453656e644661696c0c002d0101344d756c74694c6f636174696f6e000010011c5175657279496400001d01012058636d4572726f72000e1059014120676976656e206c6f636174696f6e2077686963682068616420612076657273696f6e206368616e676520737562736372697074696f6e207761732064726f70706564206f77696e6720746f20616e206572726f727c73656e64696e6720746865206e6f74696669636174696f6e20746f2069742e007c5c5b206c6f636174696f6e2c2071756572792049442c206572726f72205c5d644e6f746966795461726765744d6967726174696f6e4661696c0800bd01015856657273696f6e65644d756c74694c6f636174696f6e000010011c51756572794964000f1059014120676976656e206c6f636174696f6e2077686963682068616420612076657273696f6e206368616e676520737562736372697074696f6e207761732064726f70706564206f77696e6720746f20616e206572726f72b46d6967726174696e6720746865206c6f636174696f6e20746f206f7572206e65772058434d20666f726d61742e00605c5b206c6f636174696f6e2c207175657279204944205c5d0499010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f72732920656d69747465640a090909627920746869732070616c6c65742e0a0909092901100c78636d087632187472616974731c4f7574636f6d6500010c20436f6d706c657465040010011857656967687400000028496e636f6d706c657465080010011857656967687400001d0101144572726f72000100144572726f7204001d0101144572726f72000200002d01100c78636d087631346d756c74696c6f636174696f6e344d756c74694c6f636174696f6e000008011c706172656e74730801087538000120696e746572696f72310101244a756e6374696f6e7300003101100c78636d087631346d756c74696c6f636174696f6e244a756e6374696f6e7300012410486572650000000858310400350101204a756e6374696f6e0001000858320800350101204a756e6374696f6e0000350101204a756e6374696f6e0002000858330c00350101204a756e6374696f6e0000350101204a756e6374696f6e0000350101204a756e6374696f6e0003000858341000350101204a756e6374696f6e0000350101204a756e6374696f6e0000350101204a756e6374696f6e0000350101204a756e6374696f6e0004000858351400350101204a756e6374696f6e0000350101204a756e6374696f6e0000350101204a756e6374696f6e0000350101204a756e6374696f6e0000350101204a756e6374696f6e0005000858361800350101204a756e6374696f6e0000350101204a756e6374696f6e0000350101204a756e6374696f6e0000350101204a756e6374696f6e0000350101204a756e6374696f6e0000350101204a756e6374696f6e0006000858371c00350101204a756e6374696f6e0000350101204a756e6374696f6e0000350101204a756e6374696f6e0000350101204a756e6374696f6e0000350101204a756e6374696f6e0000350101204a756e6374696f6e0000350101204a756e6374696f6e0007000858382000350101204a756e6374696f6e0000350101204a756e6374696f6e0000350101204a756e6374696f6e0000350101204a756e6374696f6e0000350101204a756e6374696f6e0000350101204a756e6374696f6e0000350101204a756e6374696f6e0000350101204a756e6374696f6e000800003501100c78636d087631206a756e6374696f6e204a756e6374696f6e0001242450617261636861696e04003901010c7533320000002c4163636f756e744964333208011c6e6574776f726b3d0101244e6574776f726b496400010869640401205b75383b2033325d000100384163636f756e74496e646578363408011c6e6574776f726b3d0101244e6574776f726b4964000114696e6465784101010c753634000200304163636f756e744b6579323008011c6e6574776f726b3d0101244e6574776f726b496400010c6b6579450101205b75383b2032305d0003003850616c6c6574496e7374616e6365040008010875380004003047656e6572616c496e646578040049010110753132380005002847656e6572616c4b6579040028011c5665633c75383e000600244f6e6c794368696c6400070024506c7572616c69747908010869644d010118426f647949640001107061727451010120426f6479506172740008000039010000061c003d01100c78636d087630206a756e6374696f6e244e6574776f726b49640001100c416e79000000144e616d6564040028011c5665633c75383e00010020506f6c6b61646f74000200184b7573616d6100030000410100000610004501000003140000000800490100000618004d01100c78636d087630206a756e6374696f6e18426f6479496400011c10556e6974000000144e616d6564040028011c5665633c75383e00010014496e64657804003901010c7533320002002445786563757469766500030024546563686e6963616c0004002c4c656769736c6174697665000500204a7564696369616c000600005101100c78636d087630206a756e6374696f6e20426f64795061727400011414566f6963650000001c4d656d62657273040114636f756e743901010c753332000100204672616374696f6e08010c6e6f6d3901010c75333200011464656e6f6d3901010c7533320002004441744c6561737450726f706f7274696f6e08010c6e6f6d3901010c75333200011464656e6f6d3901010c753332000300484d6f72655468616e50726f706f7274696f6e08010c6e6f6d3901010c75333200011464656e6f6d3901010c7533320004000055010c0c78636d0876320c58636d041043616c6c00000400590101585665633c496e737472756374696f6e3c43616c6c3e3e000059010000025d01005d010c0c78636d0876322c496e737472756374696f6e041043616c6c000170345769746864726177417373657404006101012c4d756c7469417373657473000000545265736572766541737365744465706f736974656404006101012c4d756c7469417373657473000100585265636569766554656c65706f72746564417373657404006101012c4d756c7469417373657473000200345175657279526573706f6e73650c012071756572795f69644101011c51756572794964000120726573706f6e736581010120526573706f6e73650001286d61785f7765696768744101010c753634000300345472616e7366657241737365740801186173736574736101012c4d756c746941737365747300012c62656e65666963696172792d0101344d756c74694c6f636174696f6e000400505472616e736665725265736572766541737365740c01186173736574736101012c4d756c7469417373657473000110646573742d0101344d756c74694c6f636174696f6e00010c78636d5501011c58636d3c28293e000500205472616e736163740c012c6f726967696e5f747970658d0101284f726967696e4b696e64000158726571756972655f7765696768745f61745f6d6f73744101010c75363400011063616c6c9101014c446f75626c65456e636f6465643c43616c6c3e0006006448726d704e65774368616e6e656c4f70656e526571756573740c011873656e6465723901010c7533320001406d61785f6d6573736167655f73697a653901010c7533320001306d61785f63617061636974793901010c7533320007004c48726d704368616e6e656c4163636570746564040124726563697069656e743901010c7533320008004848726d704368616e6e656c436c6f73696e670c0124696e69746961746f723901010c75333200011873656e6465723901010c753332000124726563697069656e743901010c7533320009002c436c6561724f726967696e000a003444657363656e644f726967696e040031010154496e746572696f724d756c74694c6f636174696f6e000b002c5265706f72744572726f720c012071756572795f69644101011c51756572794964000110646573742d0101344d756c74694c6f636174696f6e00014c6d61785f726573706f6e73655f7765696768744101010c753634000c00304465706f73697441737365740c0118617373657473950101404d756c7469417373657446696c7465720001286d61785f6173736574733901010c75333200012c62656e65666963696172792d0101344d756c74694c6f636174696f6e000d004c4465706f736974526573657276654173736574100118617373657473950101404d756c7469417373657446696c7465720001286d61785f6173736574733901010c753332000110646573742d0101344d756c74694c6f636174696f6e00010c78636d5501011c58636d3c28293e000e003445786368616e6765417373657408011067697665950101404d756c7469417373657446696c74657200011c726563656976656101012c4d756c7469417373657473000f005c496e6974696174655265736572766557697468647261770c0118617373657473950101404d756c7469417373657446696c74657200011c726573657276652d0101344d756c74694c6f636174696f6e00010c78636d5501011c58636d3c28293e00100040496e69746961746554656c65706f72740c0118617373657473950101404d756c7469417373657446696c746572000110646573742d0101344d756c74694c6f636174696f6e00010c78636d5501011c58636d3c28293e001100305175657279486f6c64696e6710012071756572795f69644101011c51756572794964000110646573742d0101344d756c74694c6f636174696f6e000118617373657473950101404d756c7469417373657446696c74657200014c6d61785f726573706f6e73655f7765696768744101010c75363400120030427579457865637574696f6e08011066656573690101284d756c746941737365740001307765696768745f6c696d6974a101012c5765696768744c696d697400130034526566756e64537572706c75730014003c5365744572726f7248616e646c657204005501012458636d3c43616c6c3e0015002c536574417070656e64697804005501012458636d3c43616c6c3e00160028436c6561724572726f7200170028436c61696d41737365740801186173736574736101012c4d756c74694173736574730001187469636b65742d0101344d756c74694c6f636174696f6e001800105472617004004101010c7536340019004053756273637269626556657273696f6e08012071756572795f69644101011c5175657279496400014c6d61785f726573706f6e73655f7765696768744101010c753634001a0048556e73756273637269626556657273696f6e001b00006101100c78636d087631286d756c746961737365742c4d756c7469417373657473000004006501013c5665633c4d756c746941737365743e000065010000026901006901100c78636d087631286d756c74696173736574284d756c74694173736574000008010869646d01011c4173736574496400010c66756e7101012c46756e676962696c69747900006d01100c78636d087631286d756c746961737365741c4173736574496400010820436f6e637265746504002d0101344d756c74694c6f636174696f6e000000204162737472616374040028011c5665633c75383e000100007101100c78636d087631286d756c746961737365742c46756e676962696c6974790001082046756e6769626c65040049010110753132380000002c4e6f6e46756e6769626c650400750101344173736574496e7374616e6365000100007501100c78636d087631286d756c74696173736574344173736574496e7374616e636500011c24556e646566696e656400000014496e6465780400490101107531323800010018417272617934040038011c5b75383b20345d0002001841727261793804007901011c5b75383b20385d0003001c4172726179313604007d0101205b75383b2031365d0004001c4172726179333204000401205b75383b2033325d00050010426c6f62040028011c5665633c75383e0006000079010000030800000008007d0100000310000000080081010c0c78636d08763220526573706f6e7365000110104e756c6c0000001841737365747304006101012c4d756c74694173736574730001003c457865637574696f6e526573756c740400850101504f7074696f6e3c287533322c204572726f72293e0002001c56657273696f6e04001c013873757065723a3a56657273696f6e00030000850104184f7074696f6e0404540189010108104e6f6e6500000010536f6d650400890100000100008901000004081c1d01008d010c0c78636d087630284f726967696e4b696e64000110184e617469766500000040536f7665726569676e4163636f756e74000100245375706572757365720002000c58636d0003000091010c0c78636d38646f75626c655f656e636f64656434446f75626c65456e636f646564040454000004011c656e636f64656428011c5665633c75383e00009501100c78636d087631286d756c74696173736574404d756c7469417373657446696c74657200010820446566696e69746504006101012c4d756c74694173736574730000001057696c6404009901013857696c644d756c74694173736574000100009901100c78636d087631286d756c746961737365743857696c644d756c746941737365740001080c416c6c00000014416c6c4f6608010869646d01011c4173736574496400010c66756e9d01013c57696c6446756e676962696c697479000100009d01100c78636d087631286d756c746961737365743c57696c6446756e676962696c6974790001082046756e6769626c650000002c4e6f6e46756e6769626c6500010000a1010c0c78636d0876322c5765696768744c696d697400010824556e6c696d697465640000001c4c696d6974656404004101010c75363400010000a50104184f7074696f6e040454012d010108104e6f6e6500000010536f6d6504002d010000010000a901080c78636d5056657273696f6e65644d756c74694173736574730001080856300400ad01014c5665633c76303a3a4d756c746941737365743e00000008563104006101013c76313a3a4d756c746941737365747300010000ad01000002b10100b101100c78636d0876302c6d756c74695f6173736574284d756c74694173736574000130104e6f6e650000000c416c6c0001002c416c6c46756e6769626c6500020038416c6c4e6f6e46756e6769626c650003004c416c6c416273747261637446756e6769626c65040108696428011c5665633c75383e00040058416c6c41627374726163744e6f6e46756e6769626c65040114636c61737328011c5665633c75383e0005004c416c6c436f6e637265746546756e6769626c650401086964b50101344d756c74694c6f636174696f6e00060058416c6c436f6e63726574654e6f6e46756e6769626c65040114636c617373b50101344d756c74694c6f636174696f6e00070040416273747261637446756e6769626c65080108696428011c5665633c75383e000118616d6f756e7449010110753132380008004c41627374726163744e6f6e46756e6769626c65080114636c61737328011c5665633c75383e000120696e7374616e6365750101344173736574496e7374616e636500090040436f6e637265746546756e6769626c650801086964b50101344d756c74694c6f636174696f6e000118616d6f756e744901011075313238000a004c436f6e63726574654e6f6e46756e6769626c65080114636c617373b50101344d756c74694c6f636174696f6e000120696e7374616e6365750101344173736574496e7374616e6365000b0000b501100c78636d087630386d756c74695f6c6f636174696f6e344d756c74694c6f636174696f6e000124104e756c6c0000000858310400b90101204a756e6374696f6e0001000858320800b90101204a756e6374696f6e0000b90101204a756e6374696f6e0002000858330c00b90101204a756e6374696f6e0000b90101204a756e6374696f6e0000b90101204a756e6374696f6e0003000858341000b90101204a756e6374696f6e0000b90101204a756e6374696f6e0000b90101204a756e6374696f6e0000b90101204a756e6374696f6e0004000858351400b90101204a756e6374696f6e0000b90101204a756e6374696f6e0000b90101204a756e6374696f6e0000b90101204a756e6374696f6e0000b90101204a756e6374696f6e0005000858361800b90101204a756e6374696f6e0000b90101204a756e6374696f6e0000b90101204a756e6374696f6e0000b90101204a756e6374696f6e0000b90101204a756e6374696f6e0000b90101204a756e6374696f6e0006000858371c00b90101204a756e6374696f6e0000b90101204a756e6374696f6e0000b90101204a756e6374696f6e0000b90101204a756e6374696f6e0000b90101204a756e6374696f6e0000b90101204a756e6374696f6e0000b90101204a756e6374696f6e0007000858382000b90101204a756e6374696f6e0000b90101204a756e6374696f6e0000b90101204a756e6374696f6e0000b90101204a756e6374696f6e0000b90101204a756e6374696f6e0000b90101204a756e6374696f6e0000b90101204a756e6374696f6e0000b90101204a756e6374696f6e00080000b901100c78636d087630206a756e6374696f6e204a756e6374696f6e00012818506172656e740000002450617261636861696e04003901010c7533320001002c4163636f756e744964333208011c6e6574776f726b3d0101244e6574776f726b496400010869640401205b75383b2033325d000200384163636f756e74496e646578363408011c6e6574776f726b3d0101244e6574776f726b4964000114696e6465784101010c753634000300304163636f756e744b6579323008011c6e6574776f726b3d0101244e6574776f726b496400010c6b6579450101205b75383b2032305d0004003850616c6c6574496e7374616e6365040008010875380005003047656e6572616c496e646578040049010110753132380006002847656e6572616c4b6579040028011c5665633c75383e000700244f6e6c794368696c6400080024506c7572616c69747908010869644d010118426f647949640001107061727451010120426f64795061727400090000bd01080c78636d5856657273696f6e65644d756c74694c6f636174696f6e0001080856300400b501014476303a3a4d756c74694c6f636174696f6e00000008563104002d01014476313a3a4d756c74694c6f636174696f6e00010000c1010c4863756d756c75735f70616c6c65745f78636d1870616c6c6574144576656e7404045400010c34496e76616c6964466f726d617404007901011c5b75383b20385d00000880446f776e77617264206d65737361676520697320696e76616c69642058434d2e205c5b206964205c5d48556e737570706f7274656456657273696f6e04007901011c5b75383b20385d000108bc446f776e77617264206d65737361676520697320756e737570706f727465642076657273696f6e206f662058434d2e205c5b206964205c5d404578656375746564446f776e7761726408007901011c5b75383b20385d00002901011c4f7574636f6d65000208c4446f776e77617264206d65737361676520657865637574656420776974682074686520676976656e206f7574636f6d652e445c5b2069642c206f7574636f6d65205c5d0499010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f72732920656d69747465640a090909627920746869732070616c6c65742e0a090909c5010c6063756d756c75735f70616c6c65745f646d705f71756575651870616c6c6574144576656e7404045400011834496e76616c6964466f726d61740401286d6573736167655f69640401244d657373616765496400000480446f776e77617264206d65737361676520697320696e76616c69642058434d2e48556e737570706f7274656456657273696f6e0401286d6573736167655f69640401244d6573736167654964000104bc446f776e77617264206d65737361676520697320756e737570706f727465642076657273696f6e206f662058434d2e404578656375746564446f776e776172640801286d6573736167655f69640401244d657373616765496400011c6f7574636f6d652901011c4f7574636f6d65000204c4446f776e77617264206d65737361676520657865637574656420776974682074686520676976656e206f7574636f6d652e3c5765696768744578686175737465640c01286d6573736167655f69640401244d657373616765496400014072656d61696e696e675f77656967687410011857656967687400013c72657175697265645f776569676874100118576569676874000304f054686520776569676874206c696d697420666f722068616e646c696e6720646f776e77617264206d657373616765732077617320726561636865642e484f766572776569676874456e7175657565640c01286d6573736167655f69640401244d65737361676549640001406f7665727765696768745f696e64657810013c4f766572776569676874496e64657800013c72657175697265645f7765696768741001185765696768740004041901446f776e77617264206d657373616765206973206f76657277656967687420616e642077617320706c6163656420696e20746865206f7665727765696768742071756575652e484f76657277656967687453657276696365640801406f7665727765696768745f696e64657810013c4f766572776569676874496e64657800012c7765696768745f75736564100118576569676874000504e0446f776e77617264206d6573736167652066726f6d20746865206f766572776569676874207175657565207761732065786563757465642e0499010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f72732920656d69747465640a090909627920746869732070616c6c65742e0a090909c90108306672616d655f73797374656d14506861736500010c384170706c7945787472696e73696304001c010c7533320000003046696e616c697a6174696f6e00010038496e697469616c697a6174696f6e00020000cd010000022400d101000002c000d50108306672616d655f73797374656d584c61737452756e74696d6555706772616465496e666f0000080130737065635f76657273696f6e3901014c636f6465633a3a436f6d706163743c7533323e000124737065635f6e616d65d901016473705f72756e74696d653a3a52756e74696d65537472696e670000d9010000050200dd010c306672616d655f73797374656d1870616c6c65741043616c6c0404540001242866696c6c5f626c6f636b040114726174696fe101011c50657262696c6c00000405014120646973706174636820746861742077696c6c2066696c6c2074686520626c6f636b2077656967687420757020746f2074686520676976656e20726174696f2e1872656d61726b04011872656d61726b28011c5665633c75383e000114684d616b6520736f6d65206f6e2d636861696e2072656d61726b2e002823203c7765696768743e202d20604f283129602c23203c2f7765696768743e387365745f686561705f7061676573040114706167657310010c753634000204f853657420746865206e756d626572206f6620706167657320696e2074686520576562417373656d626c7920656e7669726f6e6d656e74277320686561702e207365745f636f6465040110636f646528011c5665633c75383e0003306453657420746865206e65772072756e74696d6520636f64652e002823203c7765696768743e31012d20604f2843202b2053296020776865726520604360206c656e677468206f662060636f64656020616e642060536020636f6d706c6578697479206f66206063616e5f7365745f636f64656045012d20312063616c6c20746f206063616e5f7365745f636f6465603a20604f28532960202863616c6c73206073705f696f3a3a6d6973633a3a72756e74696d655f76657273696f6e60207768696368206973342020657870656e73697665292e842d20312073746f726167652077726974652028636f64656320604f28432960292e402d203120646967657374206974656d2e282d2031206576656e742e4d0154686520776569676874206f6620746869732066756e6374696f6e20697320646570656e64656e74206f6e207468652072756e74696d652c206275742067656e6572616c6c7920746869732069732076657279b8657870656e736976652e2057652077696c6c207472656174207468697320617320612066756c6c20626c6f636b2e2c23203c2f7765696768743e5c7365745f636f64655f776974686f75745f636865636b73040110636f646528011c5665633c75383e000424190153657420746865206e65772072756e74696d6520636f646520776974686f757420646f696e6720616e7920636865636b73206f662074686520676976656e2060636f6465602e002823203c7765696768743e8c2d20604f2843296020776865726520604360206c656e677468206f662060636f646560842d20312073746f726167652077726974652028636f64656320604f28432960292e402d203120646967657374206974656d2e282d2031206576656e742e550154686520776569676874206f6620746869732066756e6374696f6e20697320646570656e64656e74206f6e207468652072756e74696d652e2057652077696c6c207472656174207468697320617320612066756c6c48626c6f636b2e2023203c2f7765696768743e2c7365745f73746f726167650401146974656d73e50101345665633c4b657956616c75653e0005046853657420736f6d65206974656d73206f662073746f726167652e306b696c6c5f73746f726167650401106b657973ed0101205665633c4b65793e000604744b696c6c20736f6d65206974656d732066726f6d2073746f726167652e2c6b696c6c5f70726566697808011870726566697828010c4b657900011c7375626b6579731c010c75333200071011014b696c6c20616c6c2073746f72616765206974656d7320776974682061206b657920746861742073746172747320776974682074686520676976656e207072656669782e0039012a2a4e4f54453a2a2a2057652072656c79206f6e2074686520526f6f74206f726967696e20746f2070726f7669646520757320746865206e756d626572206f66207375626b65797320756e6465723d0174686520707265666978207765206172652072656d6f76696e6720746f2061636375726174656c792063616c63756c6174652074686520776569676874206f6620746869732066756e6374696f6e2e4472656d61726b5f776974685f6576656e7404011872656d61726b28011c5665633c75383e000804a44d616b6520736f6d65206f6e2d636861696e2072656d61726b20616e6420656d6974206576656e742e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ee1010c3473705f61726974686d65746963287065725f7468696e67731c50657262696c6c000004001c010c7533320000e501000002e90100e90100000408282800ed010000022800f1010c306672616d655f73797374656d186c696d69747330426c6f636b5765696768747300000c0128626173655f626c6f636b1001185765696768740001246d61785f626c6f636b1001185765696768740001247065725f636c617373f50101845065724469737061746368436c6173733c57656967687473506572436c6173733e0000f5010c346672616d655f737570706f72741c77656967687473405065724469737061746368436c61737304045401f901000c01186e6f726d616cf90101045400012c6f7065726174696f6e616cf9010104540001246d616e6461746f7279f9010104540000f9010c306672616d655f73797374656d186c696d6974733c57656967687473506572436c6173730000100138626173655f65787472696e7369631001185765696768740001346d61785f65787472696e736963fd0101384f7074696f6e3c5765696768743e0001246d61785f746f74616cfd0101384f7074696f6e3c5765696768743e0001207265736572766564fd0101384f7074696f6e3c5765696768743e0000fd0104184f7074696f6e04045401100108104e6f6e6500000010536f6d65040010000001000001020c306672616d655f73797374656d186c696d6974732c426c6f636b4c656e677468000004010c6d6178050201545065724469737061746368436c6173733c7533323e000005020c346672616d655f737570706f72741c77656967687473405065724469737061746368436c617373040454011c000c01186e6f726d616c1c01045400012c6f7065726174696f6e616c1c0104540001246d616e6461746f72791c010454000009020c346672616d655f737570706f72741c776569676874733c52756e74696d654462576569676874000008011072656164100118576569676874000114777269746510011857656967687400000d02082873705f76657273696f6e3852756e74696d6556657273696f6e0000200124737065635f6e616d65d901013452756e74696d65537472696e67000124696d706c5f6e616d65d901013452756e74696d65537472696e67000144617574686f72696e675f76657273696f6e1c010c753332000130737065635f76657273696f6e1c010c753332000130696d706c5f76657273696f6e1c010c753332000110617069731102011c4170697356656300014c7472616e73616374696f6e5f76657273696f6e1c010c75333200013473746174655f76657273696f6e080108753800001102040c436f770404540115020004001502000000150200000219020019020000040879011c001d020c306672616d655f73797374656d1870616c6c6574144572726f720404540001183c496e76616c6964537065634e616d650000081101546865206e616d65206f662073706563696669636174696f6e20646f6573206e6f74206d61746368206265747765656e207468652063757272656e742072756e74696d6550616e6420746865206e65772072756e74696d652e685370656356657273696f6e4e65656473546f496e63726561736500010841015468652073706563696669636174696f6e2076657273696f6e206973206e6f7420616c6c6f77656420746f206465637265617365206265747765656e207468652063757272656e742072756e74696d6550616e6420746865206e65772072756e74696d652e744661696c6564546f4578747261637452756e74696d6556657273696f6e00020cec4661696c656420746f2065787472616374207468652072756e74696d652076657273696f6e2066726f6d20746865206e65772072756e74696d652e0009014569746865722063616c6c696e672060436f72655f76657273696f6e60206f72206465636f64696e67206052756e74696d6556657273696f6e60206661696c65642e4c4e6f6e44656661756c74436f6d706f73697465000304fc537569636964652063616c6c6564207768656e20746865206163636f756e7420686173206e6f6e2d64656661756c7420636f6d706f7369746520646174612e3c4e6f6e5a65726f526566436f756e74000404350154686572652069732061206e6f6e2d7a65726f207265666572656e636520636f756e742070726576656e74696e6720746865206163636f756e742066726f6d206265696e67207075726765642e3043616c6c46696c7465726564000504d0546865206f726967696e2066696c7465722070726576656e74207468652063616c6c20746f20626520646973706174636865642e046c4572726f7220666f72207468652053797374656d2070616c6c6574210210346672616d655f737570706f72741c73746f726167652c626f756e6465645f76656328426f756e6465645665630804540124045300000400cd0101185665633c543e000025020c4070616c6c65745f74696d657374616d701870616c6c65741043616c6c0404540001040c73657404010c6e6f7741010124543a3a4d6f6d656e7400004054536574207468652063757272656e742074696d652e005501546869732063616c6c2073686f756c6420626520696e766f6b65642065786163746c79206f6e63652070657220626c6f636b2e2049742077696c6c2070616e6963206174207468652066696e616c697a6174696f6ed470686173652c20696620746869732063616c6c206861736e2774206265656e20696e766f6b656420627920746861742074696d652e0041015468652074696d657374616d702073686f756c642062652067726561746572207468616e207468652070726576696f7573206f6e652062792074686520616d6f756e742073706563696669656420627940604d696e696d756d506572696f64602e00d4546865206469737061746368206f726967696e20666f7220746869732063616c6c206d7573742062652060496e686572656e74602e002823203c7765696768743e31012d20604f2831296020284e6f7465207468617420696d706c656d656e746174696f6e73206f6620604f6e54696d657374616d7053657460206d75737420616c736f20626520604f283129602961012d20312073746f72616765207265616420616e6420312073746f72616765206d75746174696f6e2028636f64656320604f28312960292e202862656361757365206f6620604469645570646174653a3a74616b656020696e402020606f6e5f66696e616c697a656029d42d2031206576656e742068616e646c657220606f6e5f74696d657374616d705f736574602e204d75737420626520604f283129602e2c23203c2f7765696768743e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e29020000040c0018a4002d020c3870616c6c65745f696e64696365731870616c6c65741043616c6c04045400011414636c61696d040114696e64657810013c543a3a4163636f756e74496e6465780000489841737369676e20616e2070726576696f75736c7920756e61737369676e656420696e6465782e00dc5061796d656e743a20604465706f736974602069732072657365727665642066726f6d207468652073656e646572206163636f756e742e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e00f02d2060696e646578603a2074686520696e64657820746f20626520636c61696d65642e2054686973206d757374206e6f7420626520696e207573652e0090456d6974732060496e64657841737369676e656460206966207375636365737366756c2e002823203c7765696768743e242d20604f283129602e982d204f6e652073746f72616765206d75746174696f6e2028636f64656320604f28312960292e602d204f6e652072657365727665206f7065726174696f6e2e302d204f6e65206576656e742e4c2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d902d204442205765696768743a203120526561642f577269746520284163636f756e7473292c23203c2f7765696768743e207472616e7366657208010c6e6577000130543a3a4163636f756e744964000114696e64657810013c543a3a4163636f756e74496e6465780001505d0141737369676e20616e20696e64657820616c7265616479206f776e6564206279207468652073656e64657220746f20616e6f74686572206163636f756e742e205468652062616c616e6365207265736572766174696f6eb86973206566666563746976656c79207472616e7366657272656420746f20746865206e6577206163636f756e742e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e0025012d2060696e646578603a2074686520696e64657820746f2062652072652d61737369676e65642e2054686973206d757374206265206f776e6564206279207468652073656e6465722e5d012d20606e6577603a20746865206e6577206f776e6572206f662074686520696e6465782e20546869732066756e6374696f6e2069732061206e6f2d6f7020696620697420697320657175616c20746f2073656e6465722e0090456d6974732060496e64657841737369676e656460206966207375636365737366756c2e002823203c7765696768743e242d20604f283129602e982d204f6e652073746f72616765206d75746174696f6e2028636f64656320604f28312960292e642d204f6e65207472616e73666572206f7065726174696f6e2e302d204f6e65206576656e742e4c2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d302d204442205765696768743ae02020202d2052656164733a20496e6469636573204163636f756e74732c2053797374656d204163636f756e742028726563697069656e7429e42020202d205772697465733a20496e6469636573204163636f756e74732c2053797374656d204163636f756e742028726563697069656e74292c23203c2f7765696768743e1066726565040114696e64657810013c543a3a4163636f756e74496e646578000248944672656520757020616e20696e646578206f776e6564206279207468652073656e6465722e005d015061796d656e743a20416e792070726576696f7573206465706f73697420706c6163656420666f722074686520696e64657820697320756e726573657276656420696e207468652073656e646572206163636f756e742e005501546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d757374206f776e2074686520696e6465782e000d012d2060696e646578603a2074686520696e64657820746f2062652066726565642e2054686973206d757374206265206f776e6564206279207468652073656e6465722e0084456d6974732060496e646578467265656460206966207375636365737366756c2e002823203c7765696768743e242d20604f283129602e982d204f6e652073746f72616765206d75746174696f6e2028636f64656320604f28312960292e602d204f6e652072657365727665206f7065726174696f6e2e302d204f6e65206576656e742e4c2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d902d204442205765696768743a203120526561642f577269746520284163636f756e7473292c23203c2f7765696768743e38666f7263655f7472616e736665720c010c6e6577000130543a3a4163636f756e744964000114696e64657810013c543a3a4163636f756e74496e646578000118667265657a65a40110626f6f6c0003545501466f72636520616e20696e64657820746f20616e206163636f756e742e205468697320646f65736e277420726571756972652061206465706f7369742e2049662074686520696e64657820697320616c7265616479e868656c642c207468656e20616e79206465706f736974206973207265696d62757273656420746f206974732063757272656e74206f776e65722e00c4546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f526f6f745f2e00a42d2060696e646578603a2074686520696e64657820746f206265202872652d2961737369676e65642e5d012d20606e6577603a20746865206e6577206f776e6572206f662074686520696e6465782e20546869732066756e6374696f6e2069732061206e6f2d6f7020696620697420697320657175616c20746f2073656e6465722e41012d2060667265657a65603a2069662073657420746f206074727565602c2077696c6c20667265657a652074686520696e64657820736f2069742063616e6e6f74206265207472616e736665727265642e0090456d6974732060496e64657841737369676e656460206966207375636365737366756c2e002823203c7765696768743e242d20604f283129602e982d204f6e652073746f72616765206d75746174696f6e2028636f64656320604f28312960292e782d20557020746f206f6e652072657365727665206f7065726174696f6e2e302d204f6e65206576656e742e4c2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d302d204442205765696768743af42020202d2052656164733a20496e6469636573204163636f756e74732c2053797374656d204163636f756e7420286f726967696e616c206f776e657229f82020202d205772697465733a20496e6469636573204163636f756e74732c2053797374656d204163636f756e7420286f726967696e616c206f776e6572292c23203c2f7765696768743e18667265657a65040114696e64657810013c543a3a4163636f756e74496e6465780004484101467265657a6520616e20696e64657820736f2069742077696c6c20616c7761797320706f696e7420746f207468652073656e646572206163636f756e742e205468697320636f6e73756d657320746865206465706f7369742e005901546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e6420746865207369676e696e67206163636f756e74206d757374206861766520616c6e6f6e2d66726f7a656e206163636f756e742060696e646578602e00ac2d2060696e646578603a2074686520696e64657820746f2062652066726f7a656e20696e20706c6163652e0088456d6974732060496e64657846726f7a656e60206966207375636365737366756c2e002823203c7765696768743e242d20604f283129602e982d204f6e652073746f72616765206d75746174696f6e2028636f64656320604f28312960292e702d20557020746f206f6e6520736c617368206f7065726174696f6e2e302d204f6e65206576656e742e4c2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d902d204442205765696768743a203120526561642f577269746520284163636f756e7473292c23203c2f7765696768743e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e31020c3870616c6c65745f696e64696365731870616c6c6574144572726f720404540001142c4e6f7441737369676e65640000048c54686520696e64657820776173206e6f7420616c72656164792061737369676e65642e204e6f744f776e6572000104a454686520696e6465782069732061737369676e656420746f20616e6f74686572206163636f756e742e14496e5573650002047054686520696e64657820776173206e6f7420617661696c61626c652e2c4e6f745472616e73666572000304c854686520736f7572636520616e642064657374696e6174696f6e206163636f756e747320617265206964656e746963616c2e245065726d616e656e74000404d054686520696e646578206973207065726d616e656e7420616e64206d6179206e6f742062652066726565642f6368616e6765642e04ad010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f7273290a0909096f6620746869732070616c6c65742e0a090909350210346672616d655f737570706f72741c73746f72616765407765616b5f626f756e6465645f766563385765616b426f756e646564566563080454013902045300000400410201185665633c543e00003902083c70616c6c65745f62616c616e6365732c42616c616e63654c6f636b041c42616c616e63650118000c01086964790101384c6f636b4964656e746966696572000118616d6f756e7418011c42616c616e636500011c726561736f6e733d02011c526561736f6e7300003d02083c70616c6c65745f62616c616e6365731c526561736f6e7300010c0c466565000000104d6973630001000c416c6c000200004102000002390200450210346672616d655f737570706f72741c73746f726167652c626f756e6465645f76656328426f756e6465645665630804540149020453000004004d0201185665633c543e00004902083c70616c6c65745f62616c616e6365732c52657365727665446174610844526573657276654964656e7469666965720179011c42616c616e6365011800080108696479010144526573657276654964656e746966696572000118616d6f756e7418011c42616c616e636500004d020000024902005102083c70616c6c65745f62616c616e6365732052656c65617365730001081856315f305f300000001856325f305f300001000055020c3c70616c6c65745f62616c616e6365731870616c6c65741043616c6c080454000449000118207472616e73666572080110646573745902018c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f7572636500011476616c756549010128543a3a42616c616e6365000064d45472616e7366657220736f6d65206c697175696420667265652062616c616e636520746f20616e6f74686572206163636f756e742e000501607472616e73666572602077696c6c207365742074686520604672656542616c616e636560206f66207468652073656e64657220616e642072656365697665722e11014966207468652073656e6465722773206163636f756e742069732062656c6f7720746865206578697374656e7469616c206465706f736974206173206120726573756c74b06f6620746865207472616e736665722c20746865206163636f756e742077696c6c206265207265617065642e001501546865206469737061746368206f726967696e20666f7220746869732063616c6c206d75737420626520605369676e65646020627920746865207472616e736163746f722e002823203c7765696768743e61012d20446570656e64656e74206f6e20617267756d656e747320627574206e6f7420637269746963616c2c20676976656e2070726f70657220696d706c656d656e746174696f6e7320666f7220696e70757420636f6e66696794202074797065732e205365652072656c617465642066756e6374696f6e732062656c6f772e31012d20497420636f6e7461696e732061206c696d69746564206e756d626572206f6620726561647320616e642077726974657320696e7465726e616c6c7920616e64206e6f20636f6d706c6578382020636f6d7075746174696f6e2e004852656c617465642066756e6374696f6e733a004d0120202d2060656e737572655f63616e5f77697468647261776020697320616c776179732063616c6c656420696e7465726e616c6c792062757420686173206120626f756e64656420636f6d706c65786974792e290120202d205472616e7366657272696e672062616c616e63657320746f206163636f756e7473207468617420646964206e6f74206578697374206265666f72652077696c6c206361757365cc2020202060543a3a4f6e4e65774163636f756e743a3a6f6e5f6e65775f6163636f756e746020746f2062652063616c6c65642e5d0120202d2052656d6f76696e6720656e6f7567682066756e64732066726f6d20616e206163636f756e742077696c6c20747269676765722060543a3a4475737452656d6f76616c3a3a6f6e5f756e62616c616e636564602e5d0120202d20607472616e736665725f6b6565705f616c6976656020776f726b73207468652073616d652077617920617320607472616e73666572602c206275742068617320616e206164646974696f6e616c20636865636bdc202020207468617420746865207472616e736665722077696c6c206e6f74206b696c6c20746865206f726967696e206163636f756e742e842d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d11012d204f726967696e206163636f756e7420697320616c726561647920696e206d656d6f72792c20736f206e6f204442206f7065726174696f6e7320666f72207468656d2e2c23203c2f7765696768743e2c7365745f62616c616e63650c010c77686f5902018c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263650001206e65775f6672656549010128543a3a42616c616e63650001306e65775f726573657276656449010128543a3a42616c616e636500012090536574207468652062616c616e636573206f66206120676976656e206163636f756e742e001d01546869732077696c6c20616c74657220604672656542616c616e63656020616e642060526573657276656442616c616e63656020696e2073746f726167652e2069742077696c6c3101616c736f20616c7465722074686520746f74616c2069737375616e6365206f66207468652073797374656d202860546f74616c49737375616e6365602920617070726f7072696174656c792e1501496620746865206e65772066726565206f722072657365727665642062616c616e63652069732062656c6f7720746865206578697374656e7469616c206465706f7369742cfc69742077696c6c20726573657420746865206163636f756e74206e6f6e63652028606672616d655f73797374656d3a3a4163636f756e744e6f6e636560292e00b0546865206469737061746368206f726967696e20666f7220746869732063616c6c2069732060726f6f74602e38666f7263655f7472616e736665720c0118736f757263655902018c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365000110646573745902018c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f7572636500011476616c756549010128543a3a42616c616e63650002184d0145786163746c7920617320607472616e73666572602c2065786365707420746865206f726967696e206d75737420626520726f6f7420616e642074686520736f75726365206163636f756e74206d6179206265287370656369666965642e2823203c7765696768743e4d012d2053616d65206173207472616e736665722c20627574206164646974696f6e616c207265616420616e6420777269746520626563617573652074686520736f75726365206163636f756e74206973206e6f747c2020617373756d656420746f20626520696e20746865206f7665726c61792e2c23203c2f7765696768743e4c7472616e736665725f6b6565705f616c697665080110646573745902018c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f7572636500011476616c756549010128543a3a42616c616e63650003184d0153616d6520617320746865205b607472616e73666572605d2063616c6c2c206275742077697468206120636865636b207468617420746865207472616e736665722077696c6c206e6f74206b696c6c207468653c6f726967696e206163636f756e742e00b8393925206f66207468652074696d6520796f752077616e74205b607472616e73666572605d20696e73746561642e00c05b607472616e73666572605d3a207374727563742e50616c6c65742e68746d6c236d6574686f642e7472616e73666572307472616e736665725f616c6c080110646573745902018c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263650001286b6565705f616c697665a40110626f6f6c00044405015472616e736665722074686520656e74697265207472616e7366657261626c652062616c616e63652066726f6d207468652063616c6c6572206163636f756e742e0059014e4f54453a20546869732066756e6374696f6e206f6e6c7920617474656d70747320746f207472616e73666572205f7472616e7366657261626c655f2062616c616e6365732e2054686973206d65616e7320746861746101616e79206c6f636b65642c2072657365727665642c206f72206578697374656e7469616c206465706f7369747320287768656e20606b6565705f616c6976656020697320607472756560292c2077696c6c206e6f742062655d017472616e7366657272656420627920746869732066756e6374696f6e2e20546f20656e73757265207468617420746869732066756e6374696f6e20726573756c747320696e2061206b696c6c6564206163636f756e742c4501796f75206d69676874206e65656420746f207072657061726520746865206163636f756e742062792072656d6f76696e6720616e79207265666572656e636520636f756e746572732c2073746f72616765406465706f736974732c206574632e2e2e00c0546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205369676e65642e00a02d206064657374603a2054686520726563697069656e74206f6620746865207472616e736665722e59012d20606b6565705f616c697665603a204120626f6f6c65616e20746f2064657465726d696e652069662074686520607472616e736665725f616c6c60206f7065726174696f6e2073686f756c642073656e6420616c6c4d0120206f66207468652066756e647320746865206163636f756e74206861732c2063617573696e67207468652073656e646572206163636f756e7420746f206265206b696c6c6564202866616c7365292c206f72590120207472616e736665722065766572797468696e6720657863657074206174206c6561737420746865206578697374656e7469616c206465706f7369742c2077686963682077696c6c2067756172616e74656520746fc820206b656570207468652073656e646572206163636f756e7420616c697665202874727565292e2023203c7765696768743e39012d204f2831292e204a757374206c696b65207472616e736665722c206275742072656164696e672074686520757365722773207472616e7366657261626c652062616c616e63652066697273742e302020233c2f7765696768743e3c666f7263655f756e7265736572766508010c77686f5902018c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365000118616d6f756e74180128543a3a42616c616e636500050cb0556e7265736572766520736f6d652062616c616e63652066726f6d2061207573657220627920666f7263652e006c43616e206f6e6c792062652063616c6c656420627920524f4f542e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e59020c2873705f72756e74696d65306d756c746961646472657373304d756c74694164647265737308244163636f756e7449640100304163636f756e74496e6465780194011408496404000001244163636f756e74496400000014496e64657804005d0201304163636f756e74496e6465780001000c526177040028011c5665633c75383e0002002441646472657373333204000401205b75383b2033325d000300244164647265737332300400450101205b75383b2032305d000400005d02000006940061020c3c70616c6c65745f62616c616e6365731870616c6c6574144572726f720804540004490001203856657374696e6742616c616e63650000049856657374696e672062616c616e636520746f6f206869676820746f2073656e642076616c7565544c69717569646974795265737472696374696f6e73000104c44163636f756e74206c6971756964697479207265737472696374696f6e732070726576656e74207769746864726177616c4c496e73756666696369656e7442616c616e63650002047442616c616e636520746f6f206c6f7720746f2073656e642076616c7565484578697374656e7469616c4465706f736974000304e856616c756520746f6f206c6f7720746f20637265617465206163636f756e742064756520746f206578697374656e7469616c206465706f736974244b656570416c6976650004048c5472616e736665722f7061796d656e7420776f756c64206b696c6c206163636f756e745c4578697374696e6756657374696e675363686564756c65000504c8412076657374696e67207363686564756c6520616c72656164792065786973747320666f722074686973206163636f756e742c446561644163636f756e740006048842656e6566696369617279206163636f756e74206d757374207072652d65786973743c546f6f4d616e795265736572766573000704ac4e756d626572206f66206e616d656420726573657276657320657863656564204d6178526573657276657304ad010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f7273290a0909096f6620746869732070616c6c65742e0a09090965020c3473705f61726974686d657469632c66697865645f706f696e7424466978656455313238000004001801107531323800006902086870616c6c65745f7472616e73616374696f6e5f7061796d656e742052656c6561736573000108245631416e6369656e74000000085632000100006d020000027102007102084470616c6c65745f617574686f727368697038556e636c65456e7472794974656d0c2c426c6f636b4e756d62657201101048617368012418417574686f72010001083c496e636c7573696f6e486569676874040010012c426c6f636b4e756d62657200000014556e636c650800240110486173680000750201384f7074696f6e3c417574686f723e00010000750204184f7074696f6e04045401000108104e6f6e6500000010536f6d65040000000001000079020c4470616c6c65745f617574686f72736869701870616c6c65741043616c6c040454000104287365745f756e636c65730401286e65775f756e636c65737d0201385665633c543a3a4865616465723e0000046050726f76696465206120736574206f6620756e636c65732e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e7d020000028102008102102873705f72756e74696d651c67656e65726963186865616465721848656164657208184e756d626572011010486173680185020014012c706172656e745f68617368240130486173683a3a4f75747075740001186e756d626572410101184e756d62657200012873746174655f726f6f74240130486173683a3a4f757470757400013c65787472696e736963735f726f6f74240130486173683a3a4f75747075740001186469676573742c0118446967657374000085020c2873705f72756e74696d65187472616974732c426c616b6554776f3235360000000089020c4470616c6c65745f617574686f72736869701870616c6c6574144572726f7204045400011c48496e76616c6964556e636c65506172656e740000048854686520756e636c6520706172656e74206e6f7420696e2074686520636861696e2e40556e636c6573416c726561647953657400010480556e636c657320616c72656164792073657420696e2074686520626c6f636b2e34546f6f4d616e79556e636c657300020440546f6f206d616e7920756e636c65732e3047656e65736973556e636c650003045454686520756e636c652069732067656e657369732e30546f6f48696768556e636c650004047c54686520756e636c6520697320746f6f206869676820696e20636861696e2e50556e636c65416c7265616479496e636c756465640005047854686520756e636c6520697320616c726561647920696e636c756465642e204f6c64556e636c65000604b454686520756e636c652069736e277420726563656e7420656e6f75676820746f20626520696e636c756465642e04ad010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f7273290a0909096f6620746869732070616c6c65742e0a0909098d020c4470617261636861696e5f7374616b696e6714747970657324526f756e64496e666f042c426c6f636b4e756d6265720110000c011c63757272656e741c013053657373696f6e496e646578000114666972737410012c426c6f636b4e756d6265720001186c656e67746810012c426c6f636b4e756d626572000091020c4470617261636861696e5f7374616b696e671474797065734444656c65676174696f6e436f756e7465720000080114726f756e641c013053657373696f6e496e64657800011c636f756e7465721c010c753332000095020c4470617261636861696e5f7374616b696e671474797065732444656c656761746f720c244163636f756e74496401001c42616c616e63650118604d6178436f6c6c61746f727350657244656c656761746f72000008012c64656c65676174696f6e73990201fc4f7264657265645365743c5374616b653c4163636f756e7449642c2042616c616e63653e2c204d6178436f6c6c61746f727350657244656c656761746f723e000114746f74616c18011c42616c616e6365000099020c4470617261636861696e5f7374616b696e670c736574284f726465726564536574080454019d02045300000400a1020140426f756e6465645665633c542c20533e00009d020c4470617261636861696e5f7374616b696e67147479706573145374616b6508244163636f756e74496401001c42616c616e63650118000801146f776e65720001244163636f756e744964000118616d6f756e7418011c42616c616e63650000a10210346672616d655f737570706f72741c73746f726167652c626f756e6465645f76656328426f756e646564566563080454019d02045300000400a50201185665633c543e0000a5020000029d0200a9020c4470617261636861696e5f7374616b696e671474797065732443616e6469646174650c244163636f756e74496401001c42616c616e63650118644d617844656c656761746f727350657243616e646964617465000014010869640001244163636f756e7449640001147374616b6518011c42616c616e636500012864656c656761746f7273ad020101014f7264657265645365743c5374616b653c4163636f756e7449642c2042616c616e63653e2c204d617844656c656761746f727350657243616e6469646174653e000114746f74616c18011c42616c616e6365000118737461747573b502013c43616e6469646174655374617475730000ad020c4470617261636861696e5f7374616b696e670c736574284f726465726564536574080454019d02045300000400b1020140426f756e6465645665633c542c20533e0000b10210346672616d655f737570706f72741c73746f726167652c626f756e6465645f76656328426f756e646564566563080454019d02045300000400a50201185665633c543e0000b5020c4470617261636861696e5f7374616b696e671474797065733c43616e646964617465537461747573000108184163746976650000001c4c656176696e6704001c013053657373696f6e496e64657800010000b9020c4470617261636861696e5f7374616b696e6714747970657328546f74616c5374616b65041c42616c616e6365011800080124636f6c6c61746f727318011c42616c616e636500012864656c656761746f727318011c42616c616e63650000bd020c4470617261636861696e5f7374616b696e670c736574284f726465726564536574080454019d02045300000400c1020140426f756e6465645665633c542c20533e0000c10210346672616d655f737570706f72741c73746f726167652c626f756e6465645f76656328426f756e646564566563080454019d02045300000400a50201185665633c543e0000c5020c4470617261636861696e5f7374616b696e6724696e666c6174696f6e34496e666c6174696f6e496e666f0000080120636f6c6c61746f72c902012c5374616b696e67496e666f00012464656c656761746f72c902012c5374616b696e67496e666f0000c9020c4470617261636861696e5f7374616b696e6724696e666c6174696f6e2c5374616b696e67496e666f00000801206d61785f726174657c012c5065727175696e74696c6c00012c7265776172645f72617465cd020128526577617264526174650000cd020c4470617261636861696e5f7374616b696e6724696e666c6174696f6e28526577617264526174650000080118616e6e75616c7c012c5065727175696e74696c6c0001247065725f626c6f636b7c012c5065727175696e74696c6c0000d10210346672616d655f737570706f72741c73746f7261676544626f756e6465645f62747265655f6d61703c426f756e64656442547265654d61700c044b011004560118045300000400d502013842547265654d61703c4b2c20563e0000d502042042547265654d617008044b011004560118000400d902000000d902000002dd0200dd0200000408101800e1020c4470617261636861696e5f7374616b696e671870616c6c65741043616c6c04045400014c3c666f7263655f6e65775f726f756e64000030d0466f7263657320746865207374617274206f6620746865206e657720726f756e6420696e20746865206e65787420626c6f636b2e00a0546865206e657720726f756e642077696c6c20626520656e666f7263656420766961203c54206173a453686f756c64456e6453657373696f6e3c5f3e3e3a3a73686f756c645f656e645f73657373696f6e2e0084546865206469737061746368206f726967696e206d75737420626520526f6f742e002823203c7765696768743e305765696768743a204f283129642d2052656164733a205b4f726967696e204163636f756e745d5c2d205772697465733a20466f7263654e6577526f756e642c23203c2f7765696768743e347365745f696e666c6174696f6e100170636f6c6c61746f725f6d61785f726174655f70657263656e746167657c012c5065727175696e74696c6c000198636f6c6c61746f725f616e6e75616c5f7265776172645f726174655f70657263656e746167657c012c5065727175696e74696c6c00017464656c656761746f725f6d61785f726174655f70657263656e746167657c012c5065727175696e74696c6c00019c64656c656761746f725f616e6e75616c5f7265776172645f726174655f70657263656e746167657c012c5065727175696e74696c6c000144f05365742074686520616e6e75616c20696e666c6174696f6e207261746520746f20646572697665207065722d726f756e6420696e666c6174696f6e2e00110154686520696e666c6174696f6e2064657461696c732061726520636f6e736964657265642076616c69642069662074686520616e6e75616c207265776172642072617465f0697320617070726f78696d6174656c7920746865207065722d626c6f636b207265776172642072617465206d756c7469706c69656420627920746865ac657374696d617465642a20746f74616c206e756d626572206f6620626c6f636b732070657220796561722e00cc54686520657374696d61746564206176657261676520626c6f636b2074696d65206973207477656c7665207365636f6e64732e0084546865206469737061746368206f726967696e206d75737420626520526f6f742e0068456d6974732060526f756e64496e666c6174696f6e536574602e002823203c7765696768743e305765696768743a204f283129642d2052656164733a205b4f726967696e204163636f756e745d642d205772697465733a20496e666c6174696f6e436f6e6669672c23203c2f7765696768743e6c7365745f6d61785f73656c65637465645f63616e6469646174657304010c6e65771c010c753332000264090153657420746865206d6178696d756d206e756d626572206f6620636f6c6c61746f722063616e6469646174657320746861742063616e2062652073656c6563746564a861742074686520626567696e6e696e67206f6620656163682076616c69646174696f6e20726f756e642e00e84368616e67657320617265206e6f74206170706c69656420756e74696c20746865207374617274206f6620746865206e65787420726f756e642e000d01546865206e65772076616c7565206d75737420626520686967686572207468616e20746865206d696e696d756d20616c6c6f7765642061732073657420696e207468655c70616c6c6574277320636f6e66696775726174696f6e2e0084546865206469737061746368206f726967696e206d75737420626520526f6f742e0084456d69747320604d617853656c656374656443616e64696461746573536574602e00002823203c7765696768743e09012d20546865207472616e73616374696f6e277320636f6d706c6578697479206973206d61696e6c7920646570656e64656e74206f6e207570646174696e6720746865090120206053656c656374656443616e64696461746573602073746f7261676520696e206073656c6563745f746f705f63616e646964617465736020776869636820696ef8202072657475726e20646570656e6473206f6e20746865206e756d626572206f6620604d617853656c656374656443616e646964617465736020284e292edc2d20466f722065616368204e2c2077652072656164206043616e646964617465506f6f6c602066726f6d207468652073746f726167652e242d2d2d2d2d2d2d2d2df85765696768743a204f284e202b204429207768657265204e20697320604d617853656c656374656443616e646964617465736020626f756e646564206279e4604d6178546f7043616e646964617465736020616e64204420697320746865206e756d626572206f662064656c656761746f7273206f662061c063616e64696461746520626f756e64656420627920604d617844656c656761746f7273506572436f6c6c61746f72602e01012d2052656164733a204d617853656c656374656443616e646964617465732c20546f7043616e646964617465732c204e202a2043616e646964617465506f6f6c7c2d205772697465733a204d617853656c656374656443616e646964617465732c23203c2f7765696768743e507365745f626c6f636b735f7065725f726f756e6404010c6e6577100138543a3a426c6f636b4e756d626572000344d453657420746865206e756d626572206f6620626c6f636b7320656163682076616c69646174696f6e20726f756e64206c617374732e000901496620746865206e65772076616c7565206973206c657373207468616e20746865206c656e677468206f66207468652063757272656e7420726f756e642c20746865050173797374656d2077696c6c20696d6d6564696174656c79206d6f766520746f20746865206e65787420726f756e6420696e20746865206e65787420626c6f636b2e000d01546865206e65772076616c7565206d75737420626520686967686572207468616e20746865206d696e696d756d20616c6c6f7765642061732073657420696e207468655c70616c6c6574277320636f6e66696775726174696f6e2e0084546865206469737061746368206f726967696e206d75737420626520526f6f742e0068456d6974732060426c6f636b73506572526f756e64536574602e002823203c7765696768743e305765696768743a204f283129802d2052656164733a205b4f726967696e204163636f756e745d2c20526f756e643c2d205772697465733a20526f756e642c23203c2f7765696768743e5c7365745f6d61785f63616e6469646174655f7374616b6504010c6e657718013042616c616e63654f663c543e000430110153657420746865206d6178696d616c20616d6f756e74206120636f6c6c61746f722063616e207374616b652e204578697374696e67207374616b657320617265206e6f74206368616e6765642e0084546865206469737061746368206f726967696e206d75737420626520526f6f742e0084456d69747320604d617843616e6469646174655374616b654368616e676564602e002823203c7765696768743e305765696768743a204f283129d02d2052656164733a205b4f726967696e204163636f756e745d2c204d6178436f6c6c61746f7243616e6469646174655374616b653c2d205772697465733a20526f756e642c23203c2f7765696768743e58666f7263655f72656d6f76655f63616e646964617465040120636f6c6c61746f725902018c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263650005680101466f726365646c792072656d6f766573206120636f6c6c61746f722063616e6469646174652066726f6d2074686520546f7043616e6469646174657320616e64e4636c6561727320616c6c206173736f6369617465642073746f7261676520666f72207468652063616e64696461746520616e642074686569722c64656c656761746f72732e00fc507265706172657320756e7374616b696e67206f66207468652063616e6469646174657320616e642074686569722064656c656761746f7273207374616b65f077686963682063616e20626520756e6c6f636b6564207669612060756e6c6f636b5f756e7374616b6564602061667465722077616974696e67206174886c6561737420605374616b654475726174696f6e60206d616e7920626c6f636b732e0064456d697473206043616e64696461746552656d6f766564602e002823203c7765696768743e09012d20546865207472616e73616374696f6e277320636f6d706c6578697479206973206d61696e6c7920646570656e64656e74206f6e207570646174696e6720746865090120206053656c656374656443616e64696461746573602073746f7261676520696e206073656c6563745f746f705f63616e646964617465736020776869636820696ef8202072657475726e20646570656e6473206f6e20746865206e756d626572206f6620604d617853656c656374656443616e646964617465736020284e292edc2d20466f722065616368204e2c2077652072656164206043616e646964617465506f6f6c602066726f6d207468652073746f726167652e242d2d2d2d2d2d2d2d2df85765696768743a204f284e202b204429207768657265204e20697320604d617853656c656374656443616e646964617465736020626f756e646564206279ec604d6178546f7043616e646964617465736020616e64204420697320746865206e756d626572206f662064656c656761746f7273206f6620746865e4636f6c6c61746f722063616e64696461746520626f756e64656420627920604d617844656c656761746f7273506572436f6c6c61746f72602ee82d2052656164733a204d6178436f6c6c61746f7243616e6469646174655374616b652c2032202a204e202a2043616e646964617465506f6f6c2cfc2020546f7043616e646964617465732c20426c6f636b4e756d6265722c2044202a2044656c656761746f7253746174652c2044202a20556e7374616b696e67ec2d205772697465733a204d6178436f6c6c61746f7243616e6469646174655374616b652c204e202a2043616e646964617465506f6f6c2c2044202a94202044656c656761746f7253746174652c202844202b203129202a20556e7374616b696e6711012d204b696c6c733a2043616e646964617465506f6f6c2c2044656c656761746f72537461746520666f7220616c6c2064656c656761746f7273207768696368206f6e6c7970202064656c65676174656420746f207468652063616e6469646174652c23203c2f7765696768743e3c6a6f696e5f63616e646964617465730401147374616b6518013042616c616e63654f663c543e00066c904a6f696e2074686520736574206f6620636f6c6c61746f722063616e646964617465732e00f8496e20746865206e65787420626c6f636b732c2069662074686520636f6c6c61746f722063616e6469646174652068617320656e6f7567682066756e6473fc7374616b656420746f20626520696e636c7564656420696e20616e79206f662074686520746f7020604d617853656c656374656443616e64696461746573600d01706f736974696f6e732c2069742077696c6c20626520696e636c7564656420696e2074686520736574206f6620706f74656e7469616c20617574686f72732074686174050177696c6c2062652073656c656374656420627920746865207374616b652d77656967687465642072616e646f6d2073656c656374696f6e2066756e6374696f6e2e00fc546865207374616b65642066756e6473206f6620746865206e657720636f6c6c61746f722063616e6469646174652061726520616464656420746f2074686568746f74616c207374616b65206f66207468652073797374656d2e00110154686520746f74616c20616d6f756e74206f662066756e6473207374616b6564206d7573742062652077697468696e2074686520616c6c6f7765642072616e67652061738873657420696e207468652070616c6c6574277320636f6e66696775726174696f6e2e00f0546865206469737061746368206f726967696e206d757374206e6f7420626520616c72656164792070617274206f662074686520636f6c6c61746f729463616e64696461746573206e6f72206f66207468652064656c656761746f7273207365742e0084456d69747320604a6f696e6564436f6c6c61746f7243616e64696461746573602e002823203c7765696768743ef85765696768743a204f284e202b204429207768657265204e20697320604d617853656c656374656443616e646964617465736020626f756e646564206279f4604d6178546f7043616e646964617465736020616e64204420697320746865206e756d626572206f662064656c656761746f727320666f722074686973c063616e64696461746520626f756e64656420627920604d617844656c656761746f7273506572436f6c6c61746f72602ea82d2052656164733a205b4f726967696e204163636f756e745d2c2044656c656761746f7253746174652cdc20204d6178436f6c6c61746f7243616e6469646174655374616b652c204c6f636b732c20546f74616c436f6c6c61746f725374616b652cd82020546f7043616e646964617465732c204d617853656c656374656443616e646964617465732c2043616e646964617465506f6f6c2c09012d205772697465733a204c6f636b732c20546f74616c436f6c6c61746f725374616b652c2043616e646964617465506f6f6c2c20546f7043616e646964617465732c2c23203c2f7765696768743e54696e69745f6c656176655f63616e64696461746573000794c05265717565737420746f206c656176652074686520736574206f6620636f6c6c61746f722063616e646964617465732e0005014f6e20737563636573732c20746865206163636f756e7420697320696d6d6564696174656c792072656d6f7665642066726f6d207468652063616e6469646174651101706f6f6c20746f2070726576656e742073656c656374696f6e206173206120636f6c6c61746f7220696e206675747572652076616c69646174696f6e20726f756e64732cd862757420756e7374616b696e67206f66207468652066756e6473206973206578656375746564207769746820612064656c6179206f665c605374616b654475726174696f6e6020626c6f636b732e00ac546865206578697420726571756573742063616e2062652072657665727365642062792063616c6c696e67686063616e63656c5f6c656176655f63616e64696461746573602e00f454686973206f7065726174696f6e2061666665637473207468652070616c6c6574277320746f74616c207374616b6520616d6f756e742e204974206973110175706461746564206576656e2074686f756768207468652066756e6473206f66207468652063616e6469646174652077686f207369676e616c656420746f206c65617665fc617265207374696c6c206c6f636b656420666f7220604578697444656c617960202b20605374616b654475726174696f6e60206d6f726520626c6f636b732e0005014e4f54453a2055706f6e207374617274696e672061206e65772073657373696f6e5f6920696e20606e65775f73657373696f6e602c207468652063757272656e741101746f702063616e64696461746573206172652073656c656374656420746f20626520626c6f636b20617574686f727320666f722073657373696f6e5f692b312e20416e7905016368616e67657320746f2074686520746f702063616e64696461746573206166746572776172647320646f206e6f74206566666563742074686520736574206f6660617574686f727320666f722073657373696f6e5f692b312ed8546875732c207765206861766520746f206d616b652073757265206e6f6e65206f6620746865736520636f6c6c61746f72732063616ebc6c65617665206265666f72652073657373696f6e5f692b3120656e64732062792064656c6179696e67207468656972846578697420666f7220604578697444656c617960206d616e7920626c6f636b732e0078456d6974732060436f6c6c61746f725363686564756c656445786974602e002823203c7765696768743e09012d20546865207472616e73616374696f6e277320636f6d706c6578697479206973206d61696e6c7920646570656e64656e74206f6e207570646174696e6720746865090120206053656c656374656443616e64696461746573602073746f7261676520696e206073656c6563745f746f705f63616e646964617465736020776869636820696ef8202072657475726e20646570656e6473206f6e20746865206e756d626572206f6620604d617853656c656374656443616e646964617465736020284e292edc2d20466f722065616368204e2c2077652072656164206043616e646964617465506f6f6c602066726f6d207468652073746f726167652e242d2d2d2d2d2d2d2d2df85765696768743a204f284e202b204429207768657265204e20697320604d617853656c656374656443616e646964617465736020626f756e646564206279f4604d6178546f7043616e646964617465736020616e64204420697320746865206e756d626572206f662064656c656761746f727320666f722074686973c063616e64696461746520626f756e64656420627920604d617844656c656761746f7273506572436f6c6c61746f72602e09012d2052656164733a205b4f726967696e204163636f756e745d2c20546f7043616e646964617465732c20284e202b203129202a2043616e646964617465506f6f6c2c502020546f74616c436f6c6c61746f725374616b65e82d205772697465733a2043616e646964617465506f6f6c2c20546f7043616e646964617465732c20546f74616c436f6c6c61746f725374616b652c23203c2f7765696768743e60657865637574655f6c656176655f63616e64696461746573040120636f6c6c61746f725902018c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f7572636500086005014578656375746520746865206e6574776f726b2065786974206f6620612063616e6469646174652077686f2072657175657374656420746f206c65617665206174f06c65617374206045786974517565756544656c61796020726f756e64732061676f2e20507265706172657320756e7374616b696e67206f6620746865fc63616e6469646174657320616e642074686569722064656c656761746f7273207374616b652077686963682063616e20626520756e6c6f636b656420766961f460756e6c6f636b5f756e7374616b6564602061667465722077616974696e67206174206c6561737420605374616b654475726174696f6e60206d616e791c626c6f636b732e00c05265717569726573207468652063616e64696461746520746f2070726576696f75736c7920686176652063616c6c65646060696e69745f6c656176655f63616e64696461746573602e00ac546865206578697420726571756573742063616e2062652072657665727365642062792063616c6c696e67686063616e63656c5f6c656176655f63616e64696461746573602e0054456d6974732060436f6c6c61746f724c656674602e002823203c7765696768743ef85765696768743a204f284e202b2044202b20552920776865726520207768657265204e20697320604d617853656c656374656443616e64696461746573600101626f756e64656420627920604d6178546f7043616e64696461746573602c204420697320746865206e756d626572206f662064656c656761746f727320666f720501746869732063616e64696461746520626f756e64656420627920604d617844656c656761746f7273506572436f6c6c61746f726020616e6420552069732074686511016e756d626572206f66206c6f636b656420756e7374616b696e6720726571756573747320626f756e64656420627920604d6178556e7374616b655265717565737473602ed02d2052656164733a2043616e646964617465506f6f6c2c20526f756e642c2044202a2044656c656761746f7253746174652c20447820202a20426c6f636b4e756d6265722c2044202a20556e7374616b696e67c82d205772697465733a2044202a20556e7374616b696e672c2044202a2044656c656761746f7253746174652c20546f74616c982d204b696c6c733a2043616e646964617465506f6f6c2c2044656c656761746f7253746174652c23203c2f7765696768743e5c63616e63656c5f6c656176655f63616e646964617465730009440501526576657274207468652070726576696f75736c79207265717565737465642065786974206f6620746865206e6574776f726b206f66206120636f6c6c61746f720d0163616e6469646174652e204f6e20737563636573732c2061646473206261636b207468652063616e64696461746520746f2074686520546f7043616e6469646174657368616e6420757064617465732074686520636f6c6c61746f72732e00c05265717569726573207468652063616e64696461746520746f2070726576696f75736c7920686176652063616c6c65646060696e69745f6c656176655f63616e64696461746573602e0074456d6974732060436f6c6c61746f7243616e63656c656445786974602e002823203c7765696768743ef85765696768743a204f284e202b204429207768657265204e20697320604d617853656c656374656443616e646964617465736020626f756e646564206279f4604d6178546f7043616e646964617465736020616e64204420697320746865206e756d626572206f662064656c656761746f727320666f722074686973c063616e64696461746520626f756e64656420627920604d617844656c656761746f7273506572436f6c6c61746f72602ef42d2052656164733a205b4f726967696e204163636f756e745d2c20546f74616c436f6c6c61746f725374616b652c20546f7043616e646964617465732c3c202043616e646964617465506f6f6ce82d205772697465733a20546f74616c436f6c6c61746f725374616b652c2043616e646964617465506f6f6c2c20546f7043616e646964617465732c23203c2f7765696768743e5063616e6469646174655f7374616b655f6d6f72650401106d6f726518013042616c616e63654f663c543e000a58a85374616b65206d6f72652066756e647320666f72206120636f6c6c61746f722063616e6469646174652e0001014966206e6f7420696e2074686520736574206f662063616e646964617465732c207374616b696e6720656e6f7567682066756e647320616c6c6f77732074686505016163636f756e7420746f20626520616464656420746f2069742e20546865206c617267657220616d6f756e74206f662066756e64732c2074686520686967686572dc6368616e63657320746f2062652073656c65637465642061732074686520617574686f72206f6620746865206e65787420626c6f636b2e00dc54686973206f7065726174696f6e2061666665637473207468652070616c6c6574277320746f74616c207374616b6520616d6f756e742e00f454686520726573756c74696e6720746f74616c20616d6f756e74206f662066756e6473207374616b6564206d7573742062652077697468696e20746865cc616c6c6f7765642072616e67652061732073657420696e207468652070616c6c6574277320636f6e66696775726174696f6e2e006c456d6974732060436f6c6c61746f725374616b65644d6f7265602e002823203c7765696768743ef85765696768743a204f284e202b2044202b20552920776865726520207768657265204e20697320604d617853656c656374656443616e64696461746573600101626f756e64656420627920604d6178546f7043616e64696461746573602c204420697320746865206e756d626572206f662064656c656761746f727320666f720501746869732063616e64696461746520626f756e64656420627920604d617844656c656761746f7273506572436f6c6c61746f726020616e6420552069732074686511016e756d626572206f66206c6f636b656420756e7374616b696e6720726571756573747320626f756e64656420627920604d6178556e7374616b655265717565737473602ed42d2052656164733a205b4f726967696e204163636f756e745d2c204c6f636b732c20546f74616c436f6c6c61746f725374616b652ce420204d6178436f6c6c61746f7243616e6469646174655374616b652c20546f7043616e646964617465732c2043616e646964617465506f6f6c05012d205772697465733a204c6f636b732c20546f74616c436f6c6c61746f725374616b652c2043616e646964617465506f6f6c2c20546f7043616e646964617465732c23203c2f7765696768743e5063616e6469646174655f7374616b655f6c6573730401106c65737318013042616c616e63654f663c543e000b60a85374616b65206c6573732066756e647320666f72206120636f6c6c61746f722063616e6469646174652e000501496620746865206e657720616d6f756e74206f66207374616b65642066756e64206973206e6f74206c6172676520656e6f7567682c20746865206163636f756e74fc636f756c642062652072656d6f7665642066726f6d2074686520736574206f6620636f6c6c61746f722063616e6469646174657320616e64206e6f74206265a4636f6e7369646572656420666f7220617574686f72696e6720746865206e65787420626c6f636b732e00dc54686973206f7065726174696f6e2061666665637473207468652070616c6c6574277320746f74616c207374616b6520616d6f756e742e000d0154686520756e7374616b65642066756e647320617265206e6f742072656c656173656420696d6d6564696174656c7920746f20746865206163636f756e742c20627574d0746865792077696c6c20626520617661696c61626c6520616674657220605374616b654475726174696f6e6020626c6f636b732e00f454686520726573756c74696e6720746f74616c20616d6f756e74206f662066756e6473207374616b6564206d7573742062652077697468696e20746865cc616c6c6f7765642072616e67652061732073657420696e207468652070616c6c6574277320636f6e66696775726174696f6e2e006c456d6974732060436f6c6c61746f725374616b65644c657373602e002823203c7765696768743ef85765696768743a204f284e202b204429207768657265204e20697320604d617853656c656374656443616e646964617465736020626f756e646564206279f4604d6178546f7043616e646964617465736020616e64204420697320746865206e756d626572206f662064656c656761746f727320666f722074686973c063616e64696461746520626f756e64656420627920604d617844656c656761746f7273506572436f6c6c61746f72602ed02d2052656164733a205b4f726967696e204163636f756e745d2c20556e7374616b696e672c20546f7043616e646964617465732c9820204d617853656c656374656443616e646964617465732c2043616e646964617465506f6f6cd82d205772697465733a20556e7374616b696e672c2043616e646964617465506f6f6c2c20546f74616c436f6c6c61746f725374616b652c23203c2f7765696768743e3c6a6f696e5f64656c656761746f7273080120636f6c6c61746f725902018c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365000118616d6f756e7418013042616c616e63654f663c543e000c8005014a6f696e2074686520736574206f662064656c656761746f72732062792064656c65676174696e6720746f206120636f6c6c61746f722063616e6469646174652e000501546865206163636f756e7420746861742077616e747320746f2064656c65676174652063616e6e6f742062652070617274206f662074686520636f6c6c61746f725c63616e64696461746573207365742061732077656c6c2e00dc5468652063616c6c6572206d757374205f6e6f745f20686176652064656c656761746564206265666f72652e204f74686572776973652cb86064656c65676174655f616e6f746865725f63616e646964617465602073686f756c642062652063616c6c65642e00110154686520616d6f756e74207374616b6564206d757374206265206c6172676572207468616e20746865206d696e696d756d20726571756972656420746f206265636f6d65c4612064656c656761746f722061732073657420696e207468652070616c6c6574277320636f6e66696775726174696f6e2e0009014173206f6e6c7920604d617844656c656761746f7273506572436f6c6c61746f72602061726520616c6c6f77656420746f2064656c6567617465206120676976656e0501636f6c6c61746f722c2074686520616d6f756e74207374616b6564206d757374206265206c6172676572207468616e20746865206c6f77657374206f6e6520696e01017468652063757272656e7420736574206f662064656c656761746f7220666f7220746865206f7065726174696f6e20746f206265206d65616e696e6766756c2e00090154686520636f6c6c61746f72277320746f74616c207374616b652061732077656c6c206173207468652070616c6c6574277320746f74616c207374616b652061726558696e63726561736564206163636f7264696e676c792e004c456d697473206044656c65676174696f6e602ebc456d697473206044656c65676174696f6e5265706c6163656460206966207468652063616e64696461746520686173f8604d617844656c656761746f7273506572436f6c6c61746f7260206d616e792064656c65676174696f6e732062757420746869732064656c656761746f72fc7374616b6564206d6f7265207468616e206f6e65206f6620746865206f746865722064656c656761746f7273206f6620746869732063616e6469646174652e002823203c7765696768743ef85765696768743a204f284e202b204429207768657265204e20697320604d617853656c656374656443616e646964617465736020626f756e646564206279f4604d6178546f7043616e646964617465736020616e64204420697320746865206e756d626572206f662064656c656761746f727320666f722074686973c063616e64696461746520626f756e64656420627920604d617844656c656761746f7273506572436f6c6c61746f72602ee42d2052656164733a205b4f726967696e204163636f756e745d2c2044656c656761746f7253746174652c20546f7043616e646964617465732cf420204d617853656c656374656443616e646964617465732c2043616e646964617465506f6f6c2c204c61737444656c65676174696f6e2c20526f756e640d012d205772697465733a204c6f636b732c2043616e646964617465506f6f6c2c2044656c656761746f7253746174652c20546f74616c436f6c6c61746f725374616b652c4020204c61737444656c65676174696f6e2c23203c2f7765696768743e6864656c65676174655f616e6f746865725f63616e646964617465080120636f6c6c61746f725902018c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365000118616d6f756e7418013042616c616e63654f663c543e000da0fc44656c656761746520616e6f7468657220636f6c6c61746f7227732063616e646964617465206279207374616b696e6720736f6d652066756e647320616e64f8696e6372656173696e67207468652070616c6c657427732061732077656c6c2061732074686520636f6c6c61746f72277320746f74616c207374616b652e000501546865206163636f756e7420746861742077616e747320746f2064656c65676174652063616e6e6f742062652070617274206f662074686520636f6c6c61746f725c63616e64696461746573207365742061732077656c6c2e00cc5468652063616c6c6572205f6d7573745f20686176652064656c656761746564206265666f72652e204f74686572776973652c8c606a6f696e5f64656c656761746f7273602073686f756c642062652063616c6c65642e00f04966207468652064656c656761746f722068617320616c72656164792064656c65676174656420746865206d6178696d756d206e756d626572206f66b8636f6c6c61746f722063616e646964617465732c2074686973206f7065726174696f6e2077696c6c206661696c2e00110154686520616d6f756e74207374616b6564206d757374206265206c6172676572207468616e20746865206d696e696d756d20726571756972656420746f206265636f6d65c4612064656c656761746f722061732073657420696e207468652070616c6c6574277320636f6e66696775726174696f6e2e0009014173206f6e6c7920604d617844656c656761746f7273506572436f6c6c61746f72602061726520616c6c6f77656420746f2064656c6567617465206120676976656e0501636f6c6c61746f722c2074686520616d6f756e74207374616b6564206d757374206265206c6172676572207468616e20746865206c6f77657374206f6e6520696e01017468652063757272656e7420736574206f662064656c656761746f7220666f7220746865206f7065726174696f6e20746f206265206d65616e696e6766756c2e00090154686520636f6c6c61746f72277320746f74616c207374616b652061732077656c6c206173207468652070616c6c6574277320746f74616c207374616b652061726558696e63726561736564206163636f7264696e676c792e00f44e4f54453a2054686973207472616e73616374696f6e20697320657870656374656420746f207468726f7720756e74696c20776520696e6372656173650501604d6178436f6c6c61746f727350657244656c656761746f7260206279206174206c65617374206f6e652c2073696e63652069742069732063757272656e746c792c73657420746f206f6e652e004c456d697473206044656c65676174696f6e602ebc456d697473206044656c65676174696f6e5265706c6163656460206966207468652063616e64696461746520686173f8604d617844656c656761746f7273506572436f6c6c61746f7260206d616e792064656c65676174696f6e732062757420746869732064656c656761746f72fc7374616b6564206d6f7265207468616e206f6e65206f6620746865206f746865722064656c656761746f7273206f6620746869732063616e6469646174652e002823203c7765696768743ef85765696768743a204f284e202b204429207768657265204e20697320604d617853656c656374656443616e646964617465736020626f756e646564206279f4604d6178546f7043616e646964617465736020616e64204420697320746865206e756d626572206f662064656c656761746f727320666f722074686973c063616e64696461746520626f756e64656420627920604d617844656c656761746f7273506572436f6c6c61746f72602ee42d2052656164733a205b4f726967696e204163636f756e745d2c2044656c656761746f7253746174652c20546f7043616e646964617465732cf420204d617853656c656374656443616e646964617465732c2043616e646964617465506f6f6c2c204c61737444656c65676174696f6e2c20526f756e640d012d205772697465733a204c6f636b732c2043616e646964617465506f6f6c2c2044656c656761746f7253746174652c20546f74616c436f6c6c61746f725374616b652c4020204c61737444656c65676174696f6e2c23203c2f7765696768743e406c656176655f64656c656761746f7273000e580d014c656176652074686520736574206f662064656c656761746f727320616e642c20627920696d706c69636174696f6e2c207265766f6b6520616c6c206f6e676f696e673064656c65676174696f6e732e001101416c6c207374616b65642066756e647320617265206e6f7420756e6c6f636b656420696d6d6564696174656c792c2062757420746865792061726520616464656420746f0101746865207175657565206f662070656e64696e6720756e7374616b696e672c20616e642077696c6c206566666563746976656c792062652072656c65617365640901616674657220605374616b654475726174696f6e6020626c6f636b732066726f6d20746865206d6f6d656e74207468652064656c656761746f72206c65617665732e000d0154686973206f7065726174696f6e20726564756365732074686520746f74616c207374616b65206f66207468652070616c6c65742061732077656c6c2061732074686509017374616b6573206f6620616c6c20636f6c6c61746f7273207468617420776572652064656c6567617465642c20706f74656e7469616c6c7920616666656374696e6705017468656972206368616e63657320746f20626520696e636c7564656420696e2074686520736574206f662063616e6469646174657320696e20746865206e6578741c726f756e64732e0058456d697473206044656c656761746f724c656674602e002823203c7765696768743e11015765696768743a204f284329207768657265204320697320746865206e756d626572206f662064656c65676174696f6e7320666f7220746869732064656c656761746f72c8776869636820697320626f756e64656420627920627920604d6178436f6c6c61746f727350657244656c656761746f72602e09012d2052656164733a205b4f726967696e204163636f756e745d2c2044656c656761746f7253746174652c20426c6f636b4e756d6265722c20556e7374616b696e672ce82020546f7043616e646964617465732c204d617853656c656374656443616e646964617465732c2043202a2043616e646964617465506f6f6c2cdc2d205772697465733a20556e7374616b696e672c2043616e646964617465506f6f6c2c20546f74616c436f6c6c61746f725374616b652c5c2d204b696c6c733a2044656c656761746f7253746174652c23203c2f7765696768743e447265766f6b655f64656c65676174696f6e040120636f6c6c61746f725902018c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365000f5c01015465726d696e6174657320616e206f6e676f696e672064656c65676174696f6e20666f72206120676976656e20636f6c6c61746f722063616e6469646174652e001101546865207374616b65642066756e647320617265206e6f7420756e6c6f636b656420696d6d6564696174656c792c2062757420746865792061726520616464656420746f0101746865207175657565206f662070656e64696e6720756e7374616b696e672c20616e642077696c6c206566666563746976656c792062652072656c6561736564f8616674657220605374616b654475726174696f6e6020626c6f636b732066726f6d20746865206d6f6d656e74207468652064656c65676174696f6e2069732c7465726d696e617465642e000d0154686973206f7065726174696f6e20726564756365732074686520746f74616c207374616b65206f66207468652070616c6c65742061732077656c6c2061732074686509017374616b6573206f662074686520636f6c6c61746f7220696e766f6c7665642c20706f74656e7469616c6c7920616666656374696e6720697473206368616e636573ec746f20626520696e636c7564656420696e2074686520736574206f662063616e6469646174657320696e20746865206e65787420726f756e64732e0058456d697473206044656c656761746f724c656674602e002823203c7765696768743e11015765696768743a204f284329207768657265204320697320746865206e756d626572206f662064656c65676174696f6e7320666f7220746869732064656c656761746f72c8776869636820697320626f756e64656420627920627920604d6178436f6c6c61746f727350657244656c656761746f72602e09012d2052656164733a205b4f726967696e204163636f756e745d2c2044656c656761746f7253746174652c20426c6f636b4e756d6265722c20556e7374616b696e672cf020204c6f636b732c20546f7043616e646964617465732c2043616e646964617465506f6f6c2c204d617853656c656374656443616e64696461746573e82d205772697465733a20556e7374616b696e672c204c6f636b732c2044656c656761746f7253746174652c2043616e646964617465506f6f6c2c502020546f74616c436f6c6c61746f725374616b65f42d204b696c6c733a2044656c656761746f725374617465206966207468652064656c656761746f7220686173206e6f742064656c65676174656420746f482020616e6f7468657220636f6c6c61746f722c23203c2f7765696768743e5064656c656761746f725f7374616b655f6d6f726508012463616e6469646174655902018c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263650001106d6f726518013042616c616e63654f663c543e001044dc496e63726561736520746865207374616b6520666f722064656c65676174696e67206120636f6c6c61746f722063616e6469646174652e0001014966206e6f7420696e2074686520736574206f662063616e646964617465732c207374616b696e6720656e6f7567682066756e647320616c6c6f77732074686594636f6c6c61746f722063616e64696461746520746f20626520616464656420746f2069742e0070456d697473206044656c656761746f725374616b65644d6f7265602e002823203c7765696768743ef85765696768743a204f284e29202b204f284429207768657265204e20697320604d617853656c656374656443616e646964617465736020626f756e646564f8627920604d6178546f7043616e646964617465736020616e64204420746865206e756d626572206f6620746f74616c2064656c656761746f727320666f72d07468697320636f6c6c61746f7220626f756e64656420627920604d6178436f6c6c61746f727350657244656c656761746f72602e80626f756e64656420627920604d6178556e7374616b655265717565737473602e09012d2052656164733a205b4f726967696e204163636f756e745d2c2044656c656761746f7253746174652c20426c6f636b4e756d6265722c20556e7374616b696e672cf020204c6f636b732c20546f7043616e646964617465732c2043616e646964617465506f6f6c2c204d617853656c656374656443616e64696461746573e82d205772697465733a20556e7374616b696e672c204c6f636b732c2044656c656761746f7253746174652c2043616e646964617465506f6f6c2c502020546f74616c436f6c6c61746f725374616b652c23203c2f7765696768743e5064656c656761746f725f7374616b655f6c65737308012463616e6469646174655902018c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263650001106c65737318013042616c616e63654f663c543e001160d452656475636520746865207374616b6520666f722064656c65676174696e67206120636f6c6c61746f722063616e6469646174652e000901496620746865206e657720616d6f756e74206f66207374616b65642066756e64206973206e6f74206c6172676520656e6f7567682c2074686520636f6c6c61746f72fc636f756c642062652072656d6f7665642066726f6d2074686520736574206f6620636f6c6c61746f722063616e6469646174657320616e64206e6f74206265a4636f6e7369646572656420666f7220617574686f72696e6720746865206e65787420626c6f636b732e00090154686520756e7374616b65642066756e647320617265206e6f742072656c6561736520696d6d6564696174656c7920746f20746865206163636f756e742c20627574d0746865792077696c6c20626520617661696c61626c6520616674657220605374616b654475726174696f6e6020626c6f636b732e0001015468652072656d61696e696e67207374616b65642066756e6473206d757374207374696c6c206265206c6172676572207468616e20746865206d696e696d756df0726571756972656420627920746869732070616c6c657420746f206d61696e7461696e2074686520737461747573206f662064656c656761746f722e00f454686520726573756c74696e6720746f74616c20616d6f756e74206f662066756e6473207374616b6564206d7573742062652077697468696e20746865cc616c6c6f7765642072616e67652061732073657420696e207468652070616c6c6574277320636f6e66696775726174696f6e2e0070456d697473206044656c656761746f725374616b65644c657373602e002823203c7765696768743e305765696768743a204f28312909012d2052656164733a205b4f726967696e204163636f756e745d2c2044656c656761746f7253746174652c20426c6f636b4e756d6265722c20556e7374616b696e672cd42020546f7043616e646964617465732c2043616e646964617465506f6f6c2c204d617853656c656374656443616e64696461746573cc2d205772697465733a20556e7374616b696e672c2044656c656761746f7253746174652c2043616e646964617465506f6f6c2c502020546f74616c436f6c6c61746f725374616b652c23203c2f7765696768743e3c756e6c6f636b5f756e7374616b65640401187461726765745902018c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365001228f4556e6c6f636b20616c6c2070726576696f75736c79207374616b65642066756e6473207468617420617265206e6f7720617661696c61626c6520666f720501756e6c6f636b696e6720627920746865206f726967696e206163636f756e7420616674657220605374616b654475726174696f6e6020626c6f636b73206861766520656c61707365642e00fc5765696768743a204f285529207768657265205520697320746865206e756d626572206f66206c6f636b656420756e7374616b696e6720726571756573747380626f756e64656420627920604d6178556e7374616b655265717565737473602eac2d2052656164733a205b4f726967696e204163636f756e745d2c20556e7374616b696e672c204c6f636b73682d205772697465733a20556e7374616b696e672c204c6f636b73e82d204b696c6c733a20556e7374616b696e672026204c6f636b73206966206e6f2062616c616e6365206973206c6f636b656420616e796d6f72652c23203c2f7765696768743e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ee5020c4470617261636861696e5f7374616b696e671870616c6c6574144572726f720404540001784444656c656761746f724e6f74466f756e64000004b8546865206163636f756e74206973206e6f742070617274206f66207468652064656c656761746f7273207365742e4443616e6469646174654e6f74466f756e64000104dc546865206163636f756e74206973206e6f742070617274206f662074686520636f6c6c61746f722063616e64696461746573207365742e3c44656c656761746f72457869737473000204c8546865206163636f756e7420697320616c72656164792070617274206f66207468652064656c656761746f7273207365742e3c43616e646964617465457869737473000304ec546865206163636f756e7420697320616c72656164792070617274206f662074686520636f6c6c61746f722063616e64696461746573207365742e3056616c5374616b655a65726f000404e4546865206163636f756e7420747269656420746f207374616b65206d6f7265206f72206c657373207769746820616d6f756e74207a65726f2e4056616c5374616b6542656c6f774d696e0005080d01546865206163636f756e7420686173206e6f74207374616b656420656e6f7567682066756e647320746f20626520616464656420746f2074686520636f6c6c61746f723c63616e64696461746573207365742e4056616c5374616b6541626f76654d61780006041101546865206163636f756e742068617320616c7265616479207374616b656420746865206d6178696d756d20616d6f756e74206f662066756e647320706f737369626c652e404e6f6d5374616b6542656c6f774d696e000704f8546865206163636f756e7420686173206e6f74207374616b656420656e6f7567682066756e647320746f206265636f6d6520612064656c656761746f722e4844656c65676174696f6e42656c6f774d696e000808f8546865206163636f756e7420686173206e6f74207374616b656420656e6f7567682066756e647320746f2064656c6567617465206120636f6c6c61746f722863616e6469646174652e38416c72656164794c656176696e670009080d0154686520636f6c6c61746f722063616e6469646174652068617320616c72656164792074726967676572207468652070726f6365737320746f206c65617665207468656c736574206f6620636f6c6c61746f722063616e646964617465732e284e6f744c656176696e67000a08f454686520636f6c6c61746f722063616e6469646174652077616e74656420746f20657865637574652074686520657869742062757420686173206e6f74f472657175657374656420746f206c65617665206265666f72652062792063616c6c696e672060696e69745f6c656176655f63616e64696461746573602e3843616e6e6f744c65617665596574000b08dc54686520636f6c6c61746f7220747269656420746f206c65617665206265666f72652077616974696e67206174206c6561737420666f72746045786974517565756544656c617960206d616e7920726f756e64732e6443616e6e6f744a6f696e4265666f7265556e6c6f636b696e67000c10f8546865206163636f756e742068617320612066756c6c206c697374206f6620756e7374616b696e6720726571756573747320616e64206e6565647320746ffc756e6c6f636b206174206c65617374206f6e65206f66207468657365206265666f7265206265696e672061626c6520746f206a6f696e2028616761696e292edc4e4f54453a2043616e206f6e6c792068617070656e20696620746865206163636f756e742077617320612063616e646964617465206f72f464656c656761746f72206265666f726520616e642065697468657220676f74206b69636b6564206f722065786974656420766f6c756e746172696c792e44416c726561647944656c65676174696e67000d04e4546865206163636f756e7420697320616c72656164792064656c65676174696e672074686520636f6c6c61746f722063616e6469646174652e404e6f7459657444656c65676174696e67000e080901546865206163636f756e7420686173206e6f742064656c65676174656420616e7920636f6c6c61746f722063616e646964617465207965742c2068656e6365206974806973206e6f7420696e2074686520736574206f662064656c656761746f72732e6c44656c65676174696f6e73506572526f756e644578636565646564000f1811015468652064656c656761746f722068617320657863656564656420746865206e756d626572206f662064656c65676174696f6e732070657220726f756e6420776869636894697320657175616c20746f204d617844656c656761746f7273506572436f6c6c61746f722e000901546869732070726f746563747320616761696e73742061747461636b7320696e20776869636820612064656c656761746f722063616e2072652d64656c6567617465010166726f6d206120636f6c6c61746f722077686f2068617320616c726561647920617574686f726564206120626c6f636b2c20746f20616e6f74686572206f6e6570776869636820686173206e6f7420696e207468697320726f756e642e44546f6f4d616e7944656c656761746f7273001014010154686520636f6c6c61746f722063616e6469646174652068617320616c7265616479207265616368656420746865206d6178696d756d206e756d626572206f662c64656c656761746f72732e00050154686973206572726f722069732067656e65726174656420696e20636173652061206e65772064656c65676174696f6e207265717565737420646f6573206e6f74f47374616b6520656e6f7567682066756e647320746f207265706c61636520736f6d65206f74686572206578697374696e672064656c65676174696f6e2e60546f6f466577436f6c6c61746f7243616e64696461746573001108110154686520736574206f6620636f6c6c61746f722063616e6469646174657320776f756c642066616c6c2062656c6f7720746865207265717569726564206d696e696d756d5469662074686520636f6c6c61746f72206c6566742e5043616e6e6f745374616b6549664c656176696e67001208f854686520636f6c6c61746f722063616e64696461746520697320696e207468652070726f63657373206f66206c656176696e672074686520736574206f66010163616e6469646174657320616e642063616e6e6f7420706572666f726d20616e79206f7468657220616374696f6e7320696e20746865206d65616e74696d652e5c43616e6e6f7444656c656761746549664c656176696e67001308f854686520636f6c6c61746f722063616e64696461746520697320696e207468652070726f63657373206f66206c656176696e672074686520736574206f66ac63616e6469646174657320616e6420746875732063616e6e6f742062652064656c65676174656420746f2e804d6178436f6c6c61746f727350657244656c656761746f72457863656564656400140811015468652064656c656761746f722068617320616c72656164792064656c65676174656420746865206d6178696d756d206e756d626572206f662063616e6469646174657320616c6c6f7765642e60416c726561647944656c656761746564436f6c6c61746f72001508ec5468652064656c656761746f722068617320616c72656164792070726576696f75736c792064656c6567617465642074686520636f6c6c61746f722863616e6469646174652e4844656c65676174696f6e4e6f74466f756e64001604f854686520676976656e2064656c65676174696f6e20646f6573206e6f7420657869737420696e2074686520736574206f662064656c65676174696f6e732e24556e646572666c6f77001708050154686520636f6c6c61746f722064656c6567617465206f72207468652064656c656761746f7220697320747279696e6720746f20756e2d7374616b65206d6f72658066756e64732074686174206172652063757272656e746c79207374616b65642e4443616e6e6f7453657441626f76654d6178001808d8546865206e756d626572206f662073656c65637465642063616e6469646174657320706572207374616b696e6720726f756e642069738061626f766520746865206d6178696d756d2076616c756520616c6c6f7765642e4443616e6e6f7453657442656c6f774d696e001908d8546865206e756d626572206f662073656c65637465642063616e6469646174657320706572207374616b696e6720726f756e642069738062656c6f7720746865206d696e696d756d2076616c756520616c6c6f7765642e3c496e76616c69645363686564756c65001a04dc416e20696e76616c696420696e666c6174696f6e20636f6e66696775726174696f6e20697320747279696e6720746f206265207365742e3c4e6f4d6f7265556e7374616b696e67001b08c4546865207374616b696e6720726577617264206265696e6720756e6c6f636b656420646f6573206e6f742065786973742e7c4d617820756e6c6f636b696e6720726571756573747320726561636865642e345374616b654e6f74466f756e64001c04d850726f7669646564207374616b65642076616c7565206973207a65726f2e2053686f756c64206e65766572206265207468726f776e2e40556e7374616b696e674973456d707479001d049443616e6e6f7420756e6c6f636b207768656e20556e7374616b656420697320656d7074792e04ad010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f7273290a0909096f6620746869732070616c6c65742e0a090909e902000002ed0200ed020000040800f10200f10208447370697269746e65745f72756e74696d652c53657373696f6e4b657973000004011061757261f50201c43c41757261206173202463726174653a3a426f756e64546f52756e74696d654170705075626c69633e3a3a5075626c69630000f502104473705f636f6e73656e7375735f617572611c737232353531392c6170705f73723235353139185075626c696300000400f902013c737232353531393a3a5075626c69630000f9020c1c73705f636f72651c73723235353139185075626c6963000004000401205b75383b2033325d0000fd020000021c000103000004080503280005030c1c73705f636f72651863727970746f244b65795479706549640000040038011c5b75383b20345d000009030c3870616c6c65745f73657373696f6e1870616c6c65741043616c6c040454000108207365745f6b6579730801106b657973f102011c543a3a4b65797300011470726f6f6628011c5665633c75383e000038e453657473207468652073657373696f6e206b6579287329206f66207468652066756e6374696f6e2063616c6c657220746f20606b657973602e1d01416c6c6f777320616e206163636f756e7420746f20736574206974732073657373696f6e206b6579207072696f7220746f206265636f6d696e6720612076616c696461746f722ec05468697320646f65736e27742074616b652065666665637420756e74696c20746865206e6578742073657373696f6e2e00d0546865206469737061746368206f726967696e206f6620746869732066756e6374696f6e206d757374206265207369676e65642e002823203c7765696768743e11012d20436f6d706c65786974793a20604f283129602e2041637475616c20636f737420646570656e6473206f6e20746865206e756d626572206f66206c656e677468206f6698202060543a3a4b6579733a3a6b65795f6964732829602077686963682069732066697865642eec2d20446252656164733a20606f726967696e206163636f756e74602c2060543a3a56616c696461746f7249644f66602c20604e6578744b65797360a02d2044625772697465733a20606f726967696e206163636f756e74602c20604e6578744b65797360802d204462526561647320706572206b65792069643a20604b65794f776e657260842d20446257726974657320706572206b65792069643a20604b65794f776e6572602c23203c2f7765696768743e2870757267655f6b657973000140c852656d6f76657320616e792073657373696f6e206b6579287329206f66207468652066756e6374696f6e2063616c6c65722e00c05468697320646f65736e27742074616b652065666665637420756e74696c20746865206e6578742073657373696f6e2e005501546865206469737061746368206f726967696e206f6620746869732066756e6374696f6e206d757374206265205369676e656420616e6420746865206163636f756e74206d757374206265206569746865722062655d01636f6e7665727469626c6520746f20612076616c696461746f72204944207573696e672074686520636861696e2773207479706963616c2061646472657373696e672073797374656d20287468697320757375616c6c7951016d65616e73206265696e67206120636f6e74726f6c6c6572206163636f756e7429206f72206469726563746c7920636f6e7665727469626c6520696e746f20612076616c696461746f722049442028776869636894757375616c6c79206d65616e73206265696e672061207374617368206163636f756e74292e002823203c7765696768743e61012d20436f6d706c65786974793a20604f2831296020696e206e756d626572206f66206b65792074797065732e2041637475616c20636f737420646570656e6473206f6e20746865206e756d626572206f66206c656e677468a420206f662060543a3a4b6579733a3a6b65795f6964732829602077686963682069732066697865642eec2d20446252656164733a2060543a3a56616c696461746f7249644f66602c20604e6578744b657973602c20606f726967696e206163636f756e7460a02d2044625772697465733a20604e6578744b657973602c20606f726967696e206163636f756e7460842d20446257726974657320706572206b65792069643a20604b65794f776e6572602c23203c2f7765696768743e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e0d030c3870616c6c65745f73657373696f6e1870616c6c6574144572726f7204045400011430496e76616c696450726f6f6600000460496e76616c6964206f776e6572736869702070726f6f662e5c4e6f4173736f63696174656456616c696461746f7249640001049c4e6f206173736f6369617465642076616c696461746f7220494420666f72206163636f756e742e344475706c6963617465644b65790002046452656769737465726564206475706c6963617465206b65792e184e6f4b657973000304a44e6f206b65797320617265206173736f63696174656420776974682074686973206163636f756e742e244e6f4163636f756e7400040419014b65792073657474696e67206163636f756e74206973206e6f74206c6976652c20736f206974277320696d706f737369626c6520746f206173736f6369617465206b6579732e04744572726f7220666f72207468652073657373696f6e2070616c6c65742e110310346672616d655f737570706f72741c73746f72616765407765616b5f626f756e6465645f766563385765616b426f756e64656456656308045401f502045300000400150301185665633c543e00001503000002f502001903084873705f636f6e73656e7375735f736c6f747310536c6f740000040010010c75363400001d030c5c63756d756c75735f70616c6c65745f617572615f6578741870616c6c65741043616c6c040454000100042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e210300000225030025030000040c1c2400002903000004088818002d03084070616c6c65745f64656d6f637261637938507265696d6167655374617475730c244163636f756e74496401001c42616c616e636501182c426c6f636b4e756d626572011001081c4d697373696e67040010012c426c6f636b4e756d62657200000024417661696c61626c651401106461746128011c5665633c75383e00012070726f76696465720001244163636f756e74496400011c6465706f73697418011c42616c616e636500011473696e636510012c426c6f636b4e756d626572000118657870697279fd01014c4f7074696f6e3c426c6f636b4e756d6265723e0001000031030c4070616c6c65745f64656d6f6372616379147479706573385265666572656e64756d496e666f0c2c426c6f636b4e756d6265720110104861736801241c42616c616e6365011801081c4f6e676f696e670400350301b05265666572656e64756d5374617475733c426c6f636b4e756d6265722c20486173682c2042616c616e63653e0000002046696e6973686564080120617070726f766564a40110626f6f6c00010c656e6410012c426c6f636b4e756d6265720001000035030c4070616c6c65745f64656d6f6372616379147479706573405265666572656e64756d5374617475730c2c426c6f636b4e756d6265720110104861736801241c42616c616e636501180014010c656e6410012c426c6f636b4e756d62657200013470726f706f73616c5f68617368240110486173680001247468726573686f6c648c0134566f74655468726573686f6c6400011464656c617910012c426c6f636b4e756d62657200011474616c6c793903013854616c6c793c42616c616e63653e000039030c4070616c6c65745f64656d6f63726163791474797065731454616c6c79041c42616c616e63650118000c01106179657318011c42616c616e63650001106e61797318011c42616c616e636500011c7475726e6f757418011c42616c616e636500003d030c4070616c6c65745f64656d6f637261637910766f746518566f74696e670c1c42616c616e63650118244163636f756e74496401002c426c6f636b4e756d62657201100108184469726563740c0114766f746573410301b05665633c285265666572656e64756d496e6465782c204163636f756e74566f74653c42616c616e63653e293e00012c64656c65676174696f6e734903015044656c65676174696f6e733c42616c616e63653e0001147072696f724d03017c5072696f724c6f636b3c426c6f636b4e756d6265722c2042616c616e63653e0000002844656c65676174696e6714011c62616c616e636518011c42616c616e63650001187461726765740001244163636f756e744964000128636f6e76696374696f6e51030128436f6e76696374696f6e00012c64656c65676174696f6e734903015044656c65676174696f6e733c42616c616e63653e0001147072696f724d03017c5072696f724c6f636b3c426c6f636b4e756d6265722c2042616c616e63653e0001000041030000024503004503000004081c980049030c4070616c6c65745f64656d6f63726163791474797065732c44656c65676174696f6e73041c42616c616e6365011800080114766f74657318011c42616c616e636500011c6361706974616c18011c42616c616e636500004d030c4070616c6c65745f64656d6f637261637910766f7465245072696f724c6f636b082c426c6f636b4e756d62657201101c42616c616e6365011800080010012c426c6f636b4e756d626572000018011c42616c616e6365000051030c4070616c6c65745f64656d6f637261637928636f6e76696374696f6e28436f6e76696374696f6e00011c104e6f6e65000000204c6f636b65643178000100204c6f636b65643278000200204c6f636b65643378000300204c6f636b65643478000400204c6f636b65643578000500204c6f636b6564367800060000550300000408248c005903000004081088005d03084070616c6c65745f64656d6f63726163792052656c65617365730001040856310000000061030c4070616c6c65745f64656d6f63726163791870616c6c65741043616c6c0404540001641c70726f706f736508013470726f706f73616c5f6861736824011c543a3a4861736800011476616c75654901013042616c616e63654f663c543e00002c9c50726f706f736520612073656e73697469766520616374696f6e20746f2062652074616b656e2e001501546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737480686176652066756e647320746f20636f76657220746865206465706f7369742e00d42d206070726f706f73616c5f68617368603a205468652068617368206f66207468652070726f706f73616c20707265696d6167652e15012d206076616c7565603a2054686520616d6f756e74206f66206465706f73697420286d757374206265206174206c6561737420604d696e696d756d4465706f73697460292e0044456d697473206050726f706f736564602e00385765696768743a20604f28702960187365636f6e6408012070726f706f73616c3901012450726f70496e64657800014c7365636f6e64735f75707065725f626f756e643901010c753332000128b45369676e616c732061677265656d656e742077697468206120706172746963756c61722070726f706f73616c2e000101546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e64657211016d75737420686176652066756e647320746f20636f76657220746865206465706f7369742c20657175616c20746f20746865206f726967696e616c206465706f7369742e00c82d206070726f706f73616c603a2054686520696e646578206f66207468652070726f706f73616c20746f207365636f6e642e41012d20607365636f6e64735f75707065725f626f756e64603a20616e20757070657220626f756e64206f6e207468652063757272656e74206e756d626572206f66207365636f6e6473206f6e20746869732501202070726f706f73616c2e2045787472696e736963206973207765696768746564206163636f7264696e6720746f20746869732076616c75652077697468206e6f20726566756e642e001d015765696768743a20604f28532960207768657265205320697320746865206e756d626572206f66207365636f6e647320612070726f706f73616c20616c7265616479206861732e10766f74650801247265665f696e6465783901013c5265666572656e64756d496e646578000110766f74659801644163636f756e74566f74653c42616c616e63654f663c543e3e0002243101566f746520696e2061207265666572656e64756d2e2049662060766f74652e69735f6179652829602c2074686520766f746520697320746f20656e616374207468652070726f706f73616c3bb86f7468657277697365206974206973206120766f746520746f206b65657020746865207374617475732071756f2e00c8546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2e00dc2d20607265665f696e646578603a2054686520696e646578206f6620746865207265666572656e64756d20746f20766f746520666f722e842d2060766f7465603a2054686520766f746520636f6e66696775726174696f6e2e002d015765696768743a20604f28522960207768657265205220697320746865206e756d626572206f66207265666572656e64756d732074686520766f7465722068617320766f746564206f6e2e40656d657267656e63795f63616e63656c0401247265665f696e6465781c013c5265666572656e64756d496e6465780003204d015363686564756c6520616e20656d657267656e63792063616e63656c6c6174696f6e206f662061207265666572656e64756d2e2043616e6e6f742068617070656e20747769636520746f207468652073616d652c7265666572656e64756d2e00f8546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265206043616e63656c6c6174696f6e4f726967696e602e00d02d607265665f696e646578603a2054686520696e646578206f6620746865207265666572656e64756d20746f2063616e63656c2e003c5765696768743a20604f283129602e4065787465726e616c5f70726f706f736504013470726f706f73616c5f6861736824011c543a3a486173680004242d015363686564756c652061207265666572656e64756d20746f206265207461626c6564206f6e6365206974206973206c6567616c20746f207363686564756c6520616e2065787465726e616c2c7265666572656e64756d2e00e8546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265206045787465726e616c4f726967696e602e00d42d206070726f706f73616c5f68617368603a2054686520707265696d6167652068617368206f66207468652070726f706f73616c2e0015015765696768743a20604f2856296020776974682056206e756d626572206f66207665746f65727320696e2074686520626c61636b6c697374206f662070726f706f73616c2eb820204465636f64696e6720766563206f66206c656e67746820562e2043686172676564206173206d6178696d756d6465787465726e616c5f70726f706f73655f6d616a6f7269747904013470726f706f73616c5f6861736824011c543a3a4861736800052c55015363686564756c652061206d616a6f726974792d63617272696573207265666572656e64756d20746f206265207461626c6564206e657874206f6e6365206974206973206c6567616c20746f207363686564756c655c616e2065787465726e616c207265666572656e64756d2e00ec546865206469737061746368206f6620746869732063616c6c206d757374206265206045787465726e616c4d616a6f726974794f726967696e602e00d42d206070726f706f73616c5f68617368603a2054686520707265696d6167652068617368206f66207468652070726f706f73616c2e004901556e6c696b65206065787465726e616c5f70726f706f7365602c20626c61636b6c697374696e6720686173206e6f20656666656374206f6e207468697320616e64206974206d6179207265706c6163652061987072652d7363686564756c6564206065787465726e616c5f70726f706f7365602063616c6c2e00385765696768743a20604f283129606065787465726e616c5f70726f706f73655f64656661756c7404013470726f706f73616c5f6861736824011c543a3a4861736800062c45015363686564756c652061206e656761746976652d7475726e6f75742d62696173207265666572656e64756d20746f206265207461626c6564206e657874206f6e6365206974206973206c6567616c20746f807363686564756c6520616e2065787465726e616c207265666572656e64756d2e00e8546865206469737061746368206f6620746869732063616c6c206d757374206265206045787465726e616c44656661756c744f726967696e602e00d42d206070726f706f73616c5f68617368603a2054686520707265696d6167652068617368206f66207468652070726f706f73616c2e004901556e6c696b65206065787465726e616c5f70726f706f7365602c20626c61636b6c697374696e6720686173206e6f20656666656374206f6e207468697320616e64206974206d6179207265706c6163652061987072652d7363686564756c6564206065787465726e616c5f70726f706f7365602063616c6c2e00385765696768743a20604f2831296028666173745f747261636b0c013470726f706f73616c5f6861736824011c543a3a48617368000134766f74696e675f706572696f64100138543a3a426c6f636b4e756d62657200011464656c6179100138543a3a426c6f636b4e756d62657200073c4d015363686564756c65207468652063757272656e746c792065787465726e616c6c792d70726f706f736564206d616a6f726974792d63617272696573207265666572656e64756d20746f206265207461626c65646101696d6d6564696174656c792e204966207468657265206973206e6f2065787465726e616c6c792d70726f706f736564207265666572656e64756d2063757272656e746c792c206f72206966207468657265206973206f6e65e8627574206974206973206e6f742061206d616a6f726974792d63617272696573207265666572656e64756d207468656e206974206661696c732e00d0546865206469737061746368206f6620746869732063616c6c206d757374206265206046617374547261636b4f726967696e602e00f42d206070726f706f73616c5f68617368603a205468652068617368206f66207468652063757272656e742065787465726e616c2070726f706f73616c2e5d012d2060766f74696e675f706572696f64603a2054686520706572696f64207468617420697320616c6c6f77656420666f7220766f74696e67206f6e20746869732070726f706f73616c2e20496e6372656173656420746f9420206046617374547261636b566f74696e67506572696f646020696620746f6f206c6f772e51012d206064656c6179603a20546865206e756d626572206f6620626c6f636b20616674657220766f74696e672068617320656e64656420696e20617070726f76616c20616e6420746869732073686f756c64206265b82020656e61637465642e205468697320646f65736e277420686176652061206d696e696d756d20616d6f756e742e0040456d697473206053746172746564602e00385765696768743a20604f28312960347665746f5f65787465726e616c04013470726f706f73616c5f6861736824011c543a3a48617368000824b85665746f20616e6420626c61636b6c697374207468652065787465726e616c2070726f706f73616c20686173682e00d8546865206469737061746368206f726967696e206f6620746869732063616c6c206d75737420626520605665746f4f726967696e602e002d012d206070726f706f73616c5f68617368603a2054686520707265696d6167652068617368206f66207468652070726f706f73616c20746f207665746f20616e6420626c61636b6c6973742e003c456d69747320605665746f6564602e00fc5765696768743a20604f2856202b206c6f6728562929602077686572652056206973206e756d626572206f6620606578697374696e67207665746f657273604463616e63656c5f7265666572656e64756d0401247265665f696e6465783901013c5265666572656e64756d496e64657800091c5052656d6f76652061207265666572656e64756d2e00c0546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f526f6f745f2e00d42d20607265665f696e646578603a2054686520696e646578206f6620746865207265666572656e64756d20746f2063616e63656c2e004423205765696768743a20604f283129602e3463616e63656c5f71756575656404011477686963681c013c5265666572656e64756d496e646578000a1c9c43616e63656c20612070726f706f73616c2071756575656420666f7220656e6163746d656e742e00c0546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f526f6f745f2e00c42d20607768696368603a2054686520696e646578206f6620746865207265666572656e64756d20746f2063616e63656c2e0049015765696768743a20604f284429602077686572652060446020697320746865206974656d7320696e207468652064697370617463682071756575652e205765696768746564206173206044203d203130602e2064656c65676174650c0108746f000130543a3a4163636f756e744964000128636f6e76696374696f6e51030128436f6e76696374696f6e00011c62616c616e636518013042616c616e63654f663c543e000b50390144656c65676174652074686520766f74696e6720706f77657220287769746820736f6d6520676976656e20636f6e76696374696f6e29206f66207468652073656e64696e67206163636f756e742e0055015468652062616c616e63652064656c656761746564206973206c6f636b656420666f72206173206c6f6e6720617320697427732064656c6567617465642c20616e64207468657265616674657220666f7220746865c874696d6520617070726f70726961746520666f722074686520636f6e76696374696f6e2773206c6f636b20706572696f642e005d01546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2c20616e6420746865207369676e696e67206163636f756e74206d757374206569746865723a7420202d2062652064656c65676174696e6720616c72656164793b206f72590120202d2068617665206e6f20766f74696e67206163746976697479202869662074686572652069732c207468656e2069742077696c6c206e65656420746f2062652072656d6f7665642f636f6e736f6c69646174656494202020207468726f7567682060726561705f766f746560206f722060756e766f746560292e0045012d2060746f603a20546865206163636f756e742077686f736520766f74696e6720746865206074617267657460206163636f756e74277320766f74696e6720706f7765722077696c6c20666f6c6c6f772e55012d2060636f6e76696374696f6e603a2054686520636f6e76696374696f6e20746861742077696c6c20626520617474616368656420746f207468652064656c65676174656420766f7465732e205768656e20746865410120206163636f756e7420697320756e64656c6567617465642c207468652066756e64732077696c6c206265206c6f636b656420666f722074686520636f72726573706f6e64696e6720706572696f642e61012d206062616c616e6365603a2054686520616d6f756e74206f6620746865206163636f756e7427732062616c616e636520746f206265207573656420696e2064656c65676174696e672e2054686973206d757374206e6f74b420206265206d6f7265207468616e20746865206163636f756e7427732063757272656e742062616c616e63652e0048456d697473206044656c656761746564602e003d015765696768743a20604f28522960207768657265205220697320746865206e756d626572206f66207265666572656e64756d732074686520766f7465722064656c65676174696e6720746f20686173c82020766f746564206f6e2e205765696768742069732063686172676564206173206966206d6178696d756d20766f7465732e28756e64656c6567617465000c30cc556e64656c65676174652074686520766f74696e6720706f776572206f66207468652073656e64696e67206163636f756e742e005d01546f6b656e73206d617920626520756e6c6f636b656420666f6c6c6f77696e67206f6e636520616e20616d6f756e74206f662074696d6520636f6e73697374656e74207769746820746865206c6f636b20706572696f64dc6f662074686520636f6e76696374696f6e2077697468207768696368207468652064656c65676174696f6e20776173206973737565642e004501546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f20616e6420746865207369676e696e67206163636f756e74206d7573742062655463757272656e746c792064656c65676174696e672e0050456d6974732060556e64656c656761746564602e003d015765696768743a20604f28522960207768657265205220697320746865206e756d626572206f66207265666572656e64756d732074686520766f7465722064656c65676174696e6720746f20686173c82020766f746564206f6e2e205765696768742069732063686172676564206173206966206d6178696d756d20766f7465732e58636c6561725f7075626c69635f70726f706f73616c73000d1470436c6561727320616c6c207075626c69632070726f706f73616c732e00c0546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f526f6f745f2e003c5765696768743a20604f283129602e346e6f74655f707265696d616765040140656e636f6465645f70726f706f73616c28011c5665633c75383e000e285d0152656769737465722074686520707265696d61676520666f7220616e207570636f6d696e672070726f706f73616c2e205468697320646f65736e27742072657175697265207468652070726f706f73616c20746f2062652101696e207468652064697370617463682071756575652062757420646f657320726571756972652061206465706f7369742c2072657475726e6564206f6e636520656e61637465642e00c8546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2e00c42d2060656e636f6465645f70726f706f73616c603a2054686520707265696d616765206f6620612070726f706f73616c2e0058456d6974732060507265696d6167654e6f746564602e004d015765696768743a20604f28452960207769746820452073697a65206f662060656e636f6465645f70726f706f73616c60202870726f7465637465642062792061207265717569726564206465706f736974292e646e6f74655f707265696d6167655f6f7065726174696f6e616c040140656e636f6465645f70726f706f73616c28011c5665633c75383e000f04090153616d6520617320606e6f74655f707265696d6167656020627574206f726967696e20697320604f7065726174696f6e616c507265696d6167654f726967696e602e586e6f74655f696d6d696e656e745f707265696d616765040140656e636f6465645f70726f706f73616c28011c5665633c75383e001030410152656769737465722074686520707265696d61676520666f7220616e207570636f6d696e672070726f706f73616c2e2054686973207265717569726573207468652070726f706f73616c20746f2062653d01696e207468652064697370617463682071756575652e204e6f206465706f736974206973206e65656465642e205768656e20746869732063616c6c206973207375636365737366756c2c20692e652e350174686520707265696d61676520686173206e6f74206265656e2075706c6f61646564206265666f726520616e64206d61746368657320736f6d6520696d6d696e656e742070726f706f73616c2c3c6e6f2066656520697320706169642e00c8546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2e00c42d2060656e636f6465645f70726f706f73616c603a2054686520707265696d616765206f6620612070726f706f73616c2e0058456d6974732060507265696d6167654e6f746564602e004d015765696768743a20604f28452960207769746820452073697a65206f662060656e636f6465645f70726f706f73616c60202870726f7465637465642062792061207265717569726564206465706f736974292e886e6f74655f696d6d696e656e745f707265696d6167655f6f7065726174696f6e616c040140656e636f6465645f70726f706f73616c28011c5665633c75383e0011042d0153616d6520617320606e6f74655f696d6d696e656e745f707265696d6167656020627574206f726967696e20697320604f7065726174696f6e616c507265696d6167654f726967696e602e34726561705f707265696d61676508013470726f706f73616c5f6861736824011c543a3a4861736800016070726f706f73616c5f6c656e5f75707065725f626f756e643901010c75333200123cf052656d6f766520616e20657870697265642070726f706f73616c20707265696d61676520616e6420636f6c6c65637420746865206465706f7369742e00c8546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2e00cc2d206070726f706f73616c5f68617368603a2054686520707265696d6167652068617368206f6620612070726f706f73616c2e5d012d206070726f706f73616c5f6c656e6774685f75707065725f626f756e64603a20616e20757070657220626f756e64206f6e206c656e677468206f66207468652070726f706f73616c2e2045787472696e736963206973c820207765696768746564206163636f7264696e6720746f20746869732076616c75652077697468206e6f20726566756e642e004d01546869732077696c6c206f6e6c7920776f726b2061667465722060566f74696e67506572696f646020626c6f636b732066726f6d207468652074696d6520746861742074686520707265696d6167652077617359016e6f7465642c2069662069742773207468652073616d65206163636f756e7420646f696e672069742e2049662069742773206120646966666572656e74206163636f756e742c207468656e206974276c6c206f6e6c79ac776f726b20616e206164646974696f6e616c2060456e6163746d656e74506572696f6460206c617465722e005c456d6974732060507265696d616765526561706564602e00b45765696768743a20604f284429602077686572652044206973206c656e677468206f662070726f706f73616c2e18756e6c6f636b040118746172676574000130543a3a4163636f756e74496400131ca0556e6c6f636b20746f6b656e732074686174206861766520616e2065787069726564206c6f636b2e00c8546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2e00b82d2060746172676574603a20546865206163636f756e7420746f2072656d6f766520746865206c6f636b206f6e2e00bc5765696768743a20604f2852296020776974682052206e756d626572206f6620766f7465206f66207461726765742e2c72656d6f76655f766f7465040114696e6465781c013c5265666572656e64756d496e64657800146c7c52656d6f7665206120766f746520666f722061207265666572656e64756d2e000c49663a882d20746865207265666572656e64756d207761732063616e63656c6c65642c206f727c2d20746865207265666572656e64756d206973206f6e676f696e672c206f72902d20746865207265666572656e64756d2068617320656e64656420737563682074686174fc20202d2074686520766f7465206f6620746865206163636f756e742077617320696e206f70706f736974696f6e20746f2074686520726573756c743b206f72d420202d20746865726520776173206e6f20636f6e76696374696f6e20746f20746865206163636f756e74277320766f74653b206f728420202d20746865206163636f756e74206d61646520612073706c697420766f74655d012e2e2e7468656e2074686520766f74652069732072656d6f76656420636c65616e6c7920616e64206120666f6c6c6f77696e672063616c6c20746f2060756e6c6f636b60206d617920726573756c7420696e206d6f72655866756e6473206265696e6720617661696c61626c652e00a849662c20686f77657665722c20746865207265666572656e64756d2068617320656e64656420616e643aec2d2069742066696e697368656420636f72726573706f6e64696e6720746f2074686520766f7465206f6620746865206163636f756e742c20616e64dc2d20746865206163636f756e74206d6164652061207374616e6461726420766f7465207769746820636f6e76696374696f6e2c20616e64bc2d20746865206c6f636b20706572696f64206f662074686520636f6e76696374696f6e206973206e6f74206f76657259012e2e2e7468656e20746865206c6f636b2077696c6c206265206167677265676174656420696e746f20746865206f766572616c6c206163636f756e742773206c6f636b2c207768696368206d617920696e766f6c766559012a6f7665726c6f636b696e672a20287768657265207468652074776f206c6f636b732061726520636f6d62696e656420696e746f20612073696e676c65206c6f636b207468617420697320746865206d6178696d756de46f6620626f74682074686520616d6f756e74206c6f636b656420616e64207468652074696d65206973206974206c6f636b656420666f72292e004901546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2c20616e6420746865207369676e6572206d7573742068617665206120766f7465887265676973746572656420666f72207265666572656e64756d2060696e646578602e00f42d2060696e646578603a2054686520696e646578206f66207265666572656e64756d206f662074686520766f746520746f2062652072656d6f7665642e0055015765696768743a20604f2852202b206c6f6720522960207768657265205220697320746865206e756d626572206f66207265666572656e646120746861742060746172676574602068617320766f746564206f6e2ed820205765696768742069732063616c63756c6174656420666f7220746865206d6178696d756d206e756d626572206f6620766f74652e4472656d6f76655f6f746865725f766f7465080118746172676574000130543a3a4163636f756e744964000114696e6465781c013c5265666572656e64756d496e64657800153c7c52656d6f7665206120766f746520666f722061207265666572656e64756d2e004d0149662074686520607461726765746020697320657175616c20746f20746865207369676e65722c207468656e20746869732066756e6374696f6e2069732065786163746c79206571756976616c656e7420746f2d016072656d6f76655f766f7465602e204966206e6f7420657175616c20746f20746865207369676e65722c207468656e2074686520766f7465206d757374206861766520657870697265642c5501656974686572206265636175736520746865207265666572656e64756d207761732063616e63656c6c65642c20626563617573652074686520766f746572206c6f737420746865207265666572656e64756d206f7298626563617573652074686520636f6e76696374696f6e20706572696f64206973206f7665722e00c8546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2e004d012d2060746172676574603a20546865206163636f756e74206f662074686520766f746520746f2062652072656d6f7665643b2074686973206163636f756e74206d757374206861766520766f74656420666f725420207265666572656e64756d2060696e646578602ef42d2060696e646578603a2054686520696e646578206f66207265666572656e64756d206f662074686520766f746520746f2062652072656d6f7665642e0055015765696768743a20604f2852202b206c6f6720522960207768657265205220697320746865206e756d626572206f66207265666572656e646120746861742060746172676574602068617320766f746564206f6e2ed820205765696768742069732063616c63756c6174656420666f7220746865206d6178696d756d206e756d626572206f6620766f74652e38656e6163745f70726f706f73616c08013470726f706f73616c5f6861736824011c543a3a48617368000114696e6465781c013c5265666572656e64756d496e6465780016044d01456e61637420612070726f706f73616c2066726f6d2061207265666572656e64756d2e20466f72206e6f77207765206a757374206d616b65207468652077656967687420626520746865206d6178696d756d2e24626c61636b6c69737408013470726f706f73616c5f6861736824011c543a3a4861736800013c6d617962655f7265665f696e6465786503015c4f7074696f6e3c5265666572656e64756d496e6465783e00173c45015065726d616e656e746c7920706c61636520612070726f706f73616c20696e746f2074686520626c61636b6c6973742e20546869732070726576656e74732069742066726f6d2065766572206265696e673c70726f706f73656420616761696e2e00510149662063616c6c6564206f6e206120717565756564207075626c6963206f722065787465726e616c2070726f706f73616c2c207468656e20746869732077696c6c20726573756c7420696e206974206265696e67510172656d6f7665642e2049662074686520607265665f696e6465786020737570706c69656420697320616e20616374697665207265666572656e64756d2077697468207468652070726f706f73616c20686173682c687468656e2069742077696c6c2062652063616e63656c6c65642e00ec546865206469737061746368206f726967696e206f6620746869732063616c6c206d7573742062652060426c61636b6c6973744f726967696e602e00f82d206070726f706f73616c5f68617368603a205468652070726f706f73616c206861736820746f20626c61636b6c697374207065726d616e656e746c792e45012d20607265665f696e646578603a20416e206f6e676f696e67207265666572656e64756d2077686f73652068617368206973206070726f706f73616c5f68617368602c2077686963682077696c6c2062652863616e63656c6c65642e0041015765696768743a20604f28702960202874686f756768206173207468697320697320616e20686967682d70726976696c6567652064697370617463682c20776520617373756d65206974206861732061502020726561736f6e61626c652076616c7565292e3c63616e63656c5f70726f706f73616c04012870726f705f696e6465783901012450726f70496e64657800181c4852656d6f766520612070726f706f73616c2e000101546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265206043616e63656c50726f706f73616c4f726967696e602e00d02d206070726f705f696e646578603a2054686520696e646578206f66207468652070726f706f73616c20746f2063616e63656c2e00e45765696768743a20604f28702960207768657265206070203d205075626c696350726f70733a3a3c543e3a3a6465636f64655f6c656e282960042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e650304184f7074696f6e040454011c0108104e6f6e6500000010536f6d6504001c000001000069030c4070616c6c65745f64656d6f63726163791870616c6c6574144572726f720404540001702056616c75654c6f770000043456616c756520746f6f206c6f773c50726f706f73616c4d697373696e670001045c50726f706f73616c20646f6573206e6f742065786973743c416c726561647943616e63656c65640002049443616e6e6f742063616e63656c207468652073616d652070726f706f73616c207477696365444475706c696361746550726f706f73616c0003045450726f706f73616c20616c7265616479206d6164654c50726f706f73616c426c61636b6c69737465640004046850726f706f73616c207374696c6c20626c61636b6c6973746564444e6f7453696d706c654d616a6f72697479000504a84e6578742065787465726e616c2070726f706f73616c206e6f742073696d706c65206d616a6f726974792c496e76616c69644861736800060430496e76616c69642068617368284e6f50726f706f73616c000704504e6f2065787465726e616c2070726f706f73616c34416c72656164795665746f6564000804984964656e74697479206d6179206e6f74207665746f20612070726f706f73616c207477696365444475706c6963617465507265696d61676500090458507265696d61676520616c7265616479206e6f7465642c4e6f74496d6d696e656e74000a04304e6f7420696d6d696e656e7420546f6f4561726c79000b0424546f6f206561726c7920496d6d696e656e74000c0420496d6d696e656e743c507265696d6167654d697373696e67000d0448507265696d616765206e6f7420666f756e64445265666572656e64756d496e76616c6964000e0484566f746520676976656e20666f7220696e76616c6964207265666572656e64756d3c507265696d616765496e76616c6964000f0440496e76616c696420707265696d6167652c4e6f6e6557616974696e67001004504e6f2070726f706f73616c732077616974696e67204e6f74566f746572001104c454686520676976656e206163636f756e7420646964206e6f7420766f7465206f6e20746865207265666572656e64756d2e304e6f5065726d697373696f6e001204c8546865206163746f7220686173206e6f207065726d697373696f6e20746f20636f6e647563742074686520616374696f6e2e44416c726561647944656c65676174696e6700130488546865206163636f756e7420697320616c72656164792064656c65676174696e672e44496e73756666696369656e7446756e6473001404fc546f6f206869676820612062616c616e6365207761732070726f7669646564207468617420746865206163636f756e742063616e6e6f74206166666f72642e344e6f7444656c65676174696e67001504a0546865206163636f756e74206973206e6f742063757272656e746c792064656c65676174696e672e28566f74657345786973740016085501546865206163636f756e742063757272656e746c792068617320766f74657320617474616368656420746f20697420616e6420746865206f7065726174696f6e2063616e6e6f74207375636365656420756e74696ce87468657365206172652072656d6f7665642c20656974686572207468726f7567682060756e766f746560206f722060726561705f766f7465602e44496e7374616e744e6f74416c6c6f776564001704d854686520696e7374616e74207265666572656e64756d206f726967696e2069732063757272656e746c7920646973616c6c6f7765642e204e6f6e73656e73650018049444656c65676174696f6e20746f206f6e6573656c66206d616b6573206e6f2073656e73652e3c57726f6e675570706572426f756e6400190450496e76616c696420757070657220626f756e642e3c4d6178566f74657352656163686564001a04804d6178696d756d206e756d626572206f6620766f74657320726561636865642e40546f6f4d616e7950726f706f73616c73001b04904d6178696d756d206e756d626572206f662070726f706f73616c7320726561636865642e04ad010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f7273290a0909096f6620746869732070616c6c65742e0a0909096d0310346672616d655f737570706f72741c73746f726167652c626f756e6465645f76656328426f756e6465645665630804540124045300000400cd0101185665633c543e0000710308447370697269746e65745f72756e74696d651043616c6c0001781853797374656d0400dd0101ad0173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c53797374656d2c2052756e74696d653e0000002454696d657374616d700400250201b90173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c54696d657374616d702c2052756e74696d653e0002001c496e646963657304002d0201b10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c496e64696365732c2052756e74696d653e0005002042616c616e6365730400550201b50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c42616c616e6365732c2052756e74696d653e00060028417574686f72736869700400790201bd0173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c417574686f72736869702c2052756e74696d653e0014004050617261636861696e5374616b696e670400e10201d50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c50617261636861696e5374616b696e672c2052756e74696d653e0015001c53657373696f6e0400090301b10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c53657373696f6e2c2052756e74696d653e0016001c4175726145787404001d0301b10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c417572614578742c2052756e74696d653e0018002444656d6f63726163790400610301b90173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c44656d6f63726163792c2052756e74696d653e001e001c436f756e63696c0400750301b10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c436f756e63696c2c2052756e74696d653e001f0048546563686e6963616c436f6d6d69747465650400790301dd0173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c546563686e6963616c436f6d6d69747465652c2052756e74696d653e0020004c546563686e6963616c4d656d6265727368697004007d0301e10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c546563686e6963616c4d656d626572736869702c2052756e74696d653e0022002054726561737572790400810301b50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c54726561737572792c2052756e74696d653e0023001c5574696c6974790400850301b10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c5574696c6974792c2052756e74696d653e0028001c56657374696e670400ad0301b10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c56657374696e672c2052756e74696d653e002900245363686564756c65720400b50301b90173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c5363686564756c65722c2052756e74696d653e002a001450726f78790400c10301a90173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c50726f78792c2052756e74696d653e002b0020507265696d6167650400c90301b50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c507265696d6167652c2052756e74696d653e002c0038546970734d656d626572736869700400cd0301cd0173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c546970734d656d626572736869702c2052756e74696d653e002d0010546970730400d10301a50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c546970732c2052756e74696d653e002e001443747970650400d50301a90173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c43747970652c2052756e74696d653e003d002c4174746573746174696f6e0400d90301c10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c4174746573746174696f6e2c2052756e74696d653e003e002844656c65676174696f6e0400ed0301bd0173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c44656c65676174696f6e2c2052756e74696d653e003f000c4469640400090401a10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c4469642c2052756e74696d653e004000244469644c6f6f6b757004005d0401b90173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c4469644c6f6f6b75702c2052756e74696d653e00430024576562334e616d65730400650401b90173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c576562334e616d65732c2052756e74696d653e0044003c50617261636861696e53797374656d0400690401d10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c50617261636861696e53797374656d2c2052756e74696d653e0050002458636d70517565756504009d0401b90173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c58636d7051756575652c2052756e74696d653e0052002c506f6c6b61646f7458636d0400a10401c10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c506f6c6b61646f7458636d2c2052756e74696d653e00530020446d7051756575650400050501b50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c446d7051756575652c2052756e74696d653e0055000075030c4470616c6c65745f636f6c6c6563746976651870616c6c65741043616c6c0804540004490001182c7365745f6d656d626572730c012c6e65775f6d656d626572738801445665633c543a3a4163636f756e7449643e0001147072696d65750201504f7074696f6e3c543a3a4163636f756e7449643e0001246f6c645f636f756e741c012c4d656d626572436f756e74000080805365742074686520636f6c6c6563746976652773206d656d626572736869702e0045012d20606e65775f6d656d62657273603a20546865206e6577206d656d626572206c6973742e204265206e69636520746f2074686520636861696e20616e642070726f7669646520697420736f727465642ee02d20607072696d65603a20546865207072696d65206d656d6265722077686f736520766f74652073657473207468652064656661756c742e59012d20606f6c645f636f756e74603a2054686520757070657220626f756e6420666f72207468652070726576696f7573206e756d626572206f66206d656d6265727320696e2073746f726167652e205573656420666f7250202077656967687420657374696d6174696f6e2e0054526571756972657320726f6f74206f726967696e2e0051014e4f54453a20446f6573206e6f7420656e666f7263652074686520657870656374656420604d61784d656d6265727360206c696d6974206f6e2074686520616d6f756e74206f66206d656d626572732c2062757421012020202020207468652077656967687420657374696d6174696f6e732072656c79206f6e20697420746f20657374696d61746520646973706174636861626c65207765696768742e002823205741524e494e473a005901546865206070616c6c65742d636f6c6c656374697665602063616e20616c736f206265206d616e61676564206279206c6f676963206f757473696465206f66207468652070616c6c6574207468726f75676820746865b8696d706c656d656e746174696f6e206f6620746865207472616974205b604368616e67654d656d62657273605d2e5501416e792063616c6c20746f20607365745f6d656d6265727360206d757374206265206361726566756c207468617420746865206d656d6265722073657420646f65736e277420676574206f7574206f662073796e63a477697468206f74686572206c6f676963206d616e6167696e6720746865206d656d626572207365742e002823203c7765696768743e24232320576569676874502d20604f284d50202b204e29602077686572653ae020202d20604d60206f6c642d6d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e64656429e020202d20604e60206e65772d6d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e646564299820202d206050602070726f706f73616c732d636f756e742028636f64652d626f756e64656429142d2044423a510120202d20312073746f72616765206d75746174696f6e2028636f64656320604f284d296020726561642c20604f284e29602077726974652920666f722072656164696e6720616e642077726974696e67207468652c202020206d656d62657273ec20202d20312073746f7261676520726561642028636f64656320604f285029602920666f722072656164696e67207468652070726f706f73616c73450120202d206050602073746f72616765206d75746174696f6e732028636f64656320604f284d29602920666f72207570646174696e672074686520766f74657320666f7220656163682070726f706f73616c5d0120202d20312073746f726167652077726974652028636f64656320604f283129602920666f722064656c6574696e6720746865206f6c6420607072696d656020616e642073657474696e6720746865206e6577206f6e652c23203c2f7765696768743e1c6578656375746508012070726f706f73616c7103017c426f783c3c5420617320436f6e6669673c493e3e3a3a50726f706f73616c3e0001306c656e6774685f626f756e643901010c75333200012cf0446973706174636820612070726f706f73616c2066726f6d2061206d656d626572207573696e672074686520604d656d62657260206f726967696e2e00a84f726967696e206d7573742062652061206d656d626572206f662074686520636f6c6c6563746976652e002823203c7765696768743e2423232057656967687455012d20604f284d202b2050296020776865726520604d60206d656d626572732d636f756e742028636f64652d626f756e6465642920616e642060506020636f6d706c6578697479206f66206469737061746368696e673020206070726f706f73616c60d42d2044423a203120726561642028636f64656320604f284d296029202b20444220616363657373206f66206070726f706f73616c60242d2031206576656e742c23203c2f7765696768743e1c70726f706f73650c01247468726573686f6c643901012c4d656d626572436f756e7400012070726f706f73616c7103017c426f783c3c5420617320436f6e6669673c493e3e3a3a50726f706f73616c3e0001306c656e6774685f626f756e643901010c75333200026cf84164642061206e65772070726f706f73616c20746f2065697468657220626520766f746564206f6e206f72206578656375746564206469726563746c792e00845265717569726573207468652073656e64657220746f206265206d656d6265722e004101607468726573686f6c64602064657465726d696e65732077686574686572206070726f706f73616c60206973206578656375746564206469726563746c792028607468726573686f6c64203c20326029546f722070757420757020666f7220766f74696e672e002823203c7765696768743e24232320576569676874ac2d20604f2842202b204d202b2050312960206f7220604f2842202b204d202b20503229602077686572653ae020202d20604260206973206070726f706f73616c602073697a6520696e20627974657320286c656e6774682d6665652d626f756e64656429dc20202d20604d60206973206d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e64656429c420202d206272616e6368696e6720697320696e666c75656e63656420627920607468726573686f6c64602077686572653af4202020202d20605031602069732070726f706f73616c20657865637574696f6e20636f6d706c65786974792028607468726573686f6c64203c20326029fc202020202d20605032602069732070726f706f73616c732d636f756e742028636f64652d626f756e646564292028607468726573686f6c64203e3d20326029142d2044423ab420202d20312073746f726167652072656164206069735f6d656d626572602028636f64656320604f284d296029f020202d20312073746f726167652072656164206050726f706f73616c4f663a3a636f6e7461696e735f6b6579602028636f64656320604f2831296029a820202d20444220616363657373657320696e666c75656e63656420627920607468726573686f6c64603a0901202020202d204549544845522073746f7261676520616363657373657320646f6e65206279206070726f706f73616c602028607468726573686f6c64203c20326029b8202020202d204f522070726f706f73616c20696e73657274696f6e2028607468726573686f6c64203c3d20326029d82020202020202d20312073746f72616765206d75746174696f6e206050726f706f73616c73602028636f64656320604f285032296029e42020202020202d20312073746f72616765206d75746174696f6e206050726f706f73616c436f756e74602028636f64656320604f2831296029cc2020202020202d20312073746f72616765207772697465206050726f706f73616c4f66602028636f64656320604f2842296029bc2020202020202d20312073746f726167652077726974652060566f74696e67602028636f64656320604f284d2960292c20202d2031206576656e742c23203c2f7765696768743e10766f74650c012070726f706f73616c24011c543a3a48617368000114696e6465783901013450726f706f73616c496e64657800011c617070726f7665a40110626f6f6c00033cf041646420616e20617965206f72206e617920766f746520666f72207468652073656e64657220746f2074686520676976656e2070726f706f73616c2e008c5265717569726573207468652073656e64657220746f2062652061206d656d6265722e0049015472616e73616374696f6e20666565732077696c6c2062652077616976656420696620746865206d656d62657220697320766f74696e67206f6e20616e7920706172746963756c61722070726f706f73616c5101666f72207468652066697273742074696d6520616e64207468652063616c6c206973207375636365737366756c2e2053756273657175656e7420766f7465206368616e6765732077696c6c206368617267652061106665652e2823203c7765696768743e2423232057656967687409012d20604f284d296020776865726520604d60206973206d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e64656429142d2044423aac20202d20312073746f72616765207265616420604d656d62657273602028636f64656320604f284d296029b820202d20312073746f72616765206d75746174696f6e2060566f74696e67602028636f64656320604f284d296029242d2031206576656e742c23203c2f7765696768743e14636c6f736510013470726f706f73616c5f6861736824011c543a3a48617368000114696e6465783901013450726f706f73616c496e64657800015470726f706f73616c5f7765696768745f626f756e64410101185765696768740001306c656e6774685f626f756e643901010c7533320004804d01436c6f7365206120766f746520746861742069732065697468657220617070726f7665642c20646973617070726f766564206f722077686f736520766f74696e6720706572696f642068617320656e6465642e0055014d61792062652063616c6c656420627920616e79207369676e6564206163636f756e7420696e206f7264657220746f2066696e69736820766f74696e6720616e6420636c6f7365207468652070726f706f73616c2e00490149662063616c6c6564206265666f72652074686520656e64206f662074686520766f74696e6720706572696f642069742077696c6c206f6e6c7920636c6f73652074686520766f7465206966206974206973bc68617320656e6f75676820766f74657320746f20626520617070726f766564206f7220646973617070726f7665642e00490149662063616c6c65642061667465722074686520656e64206f662074686520766f74696e6720706572696f642061627374656e74696f6e732061726520636f756e7465642061732072656a656374696f6e732501756e6c6573732074686572652069732061207072696d65206d656d6265722073657420616e6420746865207072696d65206d656d626572206361737420616e20617070726f76616c2e00610149662074686520636c6f7365206f7065726174696f6e20636f6d706c65746573207375636365737366756c6c79207769746820646973617070726f76616c2c20746865207472616e73616374696f6e206665652077696c6c5d016265207761697665642e204f746865727769736520657865637574696f6e206f662074686520617070726f766564206f7065726174696f6e2077696c6c206265206368617267656420746f207468652063616c6c65722e0061012b206070726f706f73616c5f7765696768745f626f756e64603a20546865206d6178696d756d20616d6f756e74206f662077656967687420636f6e73756d656420627920657865637574696e672074686520636c6f7365642470726f706f73616c2e61012b20606c656e6774685f626f756e64603a2054686520757070657220626f756e6420666f7220746865206c656e677468206f66207468652070726f706f73616c20696e2073746f726167652e20436865636b65642076696135016073746f726167653a3a726561646020736f206974206973206073697a655f6f663a3a3c7533323e2829203d3d203460206c6172676572207468616e207468652070757265206c656e6774682e002823203c7765696768743e24232320576569676874742d20604f2842202b204d202b205031202b20503229602077686572653ae020202d20604260206973206070726f706f73616c602073697a6520696e20627974657320286c656e6774682d6665652d626f756e64656429dc20202d20604d60206973206d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e64656429c820202d20605031602069732074686520636f6d706c6578697479206f66206070726f706f73616c6020707265696d6167652ea420202d20605032602069732070726f706f73616c2d636f756e742028636f64652d626f756e64656429142d2044423a0d01202d20322073746f726167652072656164732028604d656d62657273603a20636f64656320604f284d29602c20605072696d65603a20636f64656320604f28312960295901202d2033206d75746174696f6e73202860566f74696e67603a20636f64656320604f284d29602c206050726f706f73616c4f66603a20636f64656320604f284229602c206050726f706f73616c73603a20636f6465632c202020604f285032296029dc202d20616e79206d75746174696f6e7320646f6e65207768696c6520657865637574696e67206070726f706f73616c6020286050316029402d20757020746f2033206576656e74732c23203c2f7765696768743e4c646973617070726f76655f70726f706f73616c04013470726f706f73616c5f6861736824011c543a3a486173680005385901446973617070726f766520612070726f706f73616c2c20636c6f73652c20616e642072656d6f76652069742066726f6d207468652073797374656d2c207265676172646c657373206f66206974732063757272656e741873746174652e00884d7573742062652063616c6c65642062792074686520526f6f74206f726967696e2e002c506172616d65746572733a1d012a206070726f706f73616c5f68617368603a205468652068617368206f66207468652070726f706f73616c20746861742073686f756c6420626520646973617070726f7665642e002823203c7765696768743edc436f6d706c65786974793a204f285029207768657265205020697320746865206e756d626572206f66206d61782070726f706f73616c73284442205765696768743a482a2052656164733a2050726f706f73616c739c2a205772697465733a20566f74696e672c2050726f706f73616c732c2050726f706f73616c4f662c23203c2f7765696768743e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e79030c4470616c6c65745f636f6c6c6563746976651870616c6c65741043616c6c0804540004490001182c7365745f6d656d626572730c012c6e65775f6d656d626572738801445665633c543a3a4163636f756e7449643e0001147072696d65750201504f7074696f6e3c543a3a4163636f756e7449643e0001246f6c645f636f756e741c012c4d656d626572436f756e74000080805365742074686520636f6c6c6563746976652773206d656d626572736869702e0045012d20606e65775f6d656d62657273603a20546865206e6577206d656d626572206c6973742e204265206e69636520746f2074686520636861696e20616e642070726f7669646520697420736f727465642ee02d20607072696d65603a20546865207072696d65206d656d6265722077686f736520766f74652073657473207468652064656661756c742e59012d20606f6c645f636f756e74603a2054686520757070657220626f756e6420666f72207468652070726576696f7573206e756d626572206f66206d656d6265727320696e2073746f726167652e205573656420666f7250202077656967687420657374696d6174696f6e2e0054526571756972657320726f6f74206f726967696e2e0051014e4f54453a20446f6573206e6f7420656e666f7263652074686520657870656374656420604d61784d656d6265727360206c696d6974206f6e2074686520616d6f756e74206f66206d656d626572732c2062757421012020202020207468652077656967687420657374696d6174696f6e732072656c79206f6e20697420746f20657374696d61746520646973706174636861626c65207765696768742e002823205741524e494e473a005901546865206070616c6c65742d636f6c6c656374697665602063616e20616c736f206265206d616e61676564206279206c6f676963206f757473696465206f66207468652070616c6c6574207468726f75676820746865b8696d706c656d656e746174696f6e206f6620746865207472616974205b604368616e67654d656d62657273605d2e5501416e792063616c6c20746f20607365745f6d656d6265727360206d757374206265206361726566756c207468617420746865206d656d6265722073657420646f65736e277420676574206f7574206f662073796e63a477697468206f74686572206c6f676963206d616e6167696e6720746865206d656d626572207365742e002823203c7765696768743e24232320576569676874502d20604f284d50202b204e29602077686572653ae020202d20604d60206f6c642d6d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e64656429e020202d20604e60206e65772d6d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e646564299820202d206050602070726f706f73616c732d636f756e742028636f64652d626f756e64656429142d2044423a510120202d20312073746f72616765206d75746174696f6e2028636f64656320604f284d296020726561642c20604f284e29602077726974652920666f722072656164696e6720616e642077726974696e67207468652c202020206d656d62657273ec20202d20312073746f7261676520726561642028636f64656320604f285029602920666f722072656164696e67207468652070726f706f73616c73450120202d206050602073746f72616765206d75746174696f6e732028636f64656320604f284d29602920666f72207570646174696e672074686520766f74657320666f7220656163682070726f706f73616c5d0120202d20312073746f726167652077726974652028636f64656320604f283129602920666f722064656c6574696e6720746865206f6c6420607072696d656020616e642073657474696e6720746865206e6577206f6e652c23203c2f7765696768743e1c6578656375746508012070726f706f73616c7103017c426f783c3c5420617320436f6e6669673c493e3e3a3a50726f706f73616c3e0001306c656e6774685f626f756e643901010c75333200012cf0446973706174636820612070726f706f73616c2066726f6d2061206d656d626572207573696e672074686520604d656d62657260206f726967696e2e00a84f726967696e206d7573742062652061206d656d626572206f662074686520636f6c6c6563746976652e002823203c7765696768743e2423232057656967687455012d20604f284d202b2050296020776865726520604d60206d656d626572732d636f756e742028636f64652d626f756e6465642920616e642060506020636f6d706c6578697479206f66206469737061746368696e673020206070726f706f73616c60d42d2044423a203120726561642028636f64656320604f284d296029202b20444220616363657373206f66206070726f706f73616c60242d2031206576656e742c23203c2f7765696768743e1c70726f706f73650c01247468726573686f6c643901012c4d656d626572436f756e7400012070726f706f73616c7103017c426f783c3c5420617320436f6e6669673c493e3e3a3a50726f706f73616c3e0001306c656e6774685f626f756e643901010c75333200026cf84164642061206e65772070726f706f73616c20746f2065697468657220626520766f746564206f6e206f72206578656375746564206469726563746c792e00845265717569726573207468652073656e64657220746f206265206d656d6265722e004101607468726573686f6c64602064657465726d696e65732077686574686572206070726f706f73616c60206973206578656375746564206469726563746c792028607468726573686f6c64203c20326029546f722070757420757020666f7220766f74696e672e002823203c7765696768743e24232320576569676874ac2d20604f2842202b204d202b2050312960206f7220604f2842202b204d202b20503229602077686572653ae020202d20604260206973206070726f706f73616c602073697a6520696e20627974657320286c656e6774682d6665652d626f756e64656429dc20202d20604d60206973206d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e64656429c420202d206272616e6368696e6720697320696e666c75656e63656420627920607468726573686f6c64602077686572653af4202020202d20605031602069732070726f706f73616c20657865637574696f6e20636f6d706c65786974792028607468726573686f6c64203c20326029fc202020202d20605032602069732070726f706f73616c732d636f756e742028636f64652d626f756e646564292028607468726573686f6c64203e3d20326029142d2044423ab420202d20312073746f726167652072656164206069735f6d656d626572602028636f64656320604f284d296029f020202d20312073746f726167652072656164206050726f706f73616c4f663a3a636f6e7461696e735f6b6579602028636f64656320604f2831296029a820202d20444220616363657373657320696e666c75656e63656420627920607468726573686f6c64603a0901202020202d204549544845522073746f7261676520616363657373657320646f6e65206279206070726f706f73616c602028607468726573686f6c64203c20326029b8202020202d204f522070726f706f73616c20696e73657274696f6e2028607468726573686f6c64203c3d20326029d82020202020202d20312073746f72616765206d75746174696f6e206050726f706f73616c73602028636f64656320604f285032296029e42020202020202d20312073746f72616765206d75746174696f6e206050726f706f73616c436f756e74602028636f64656320604f2831296029cc2020202020202d20312073746f72616765207772697465206050726f706f73616c4f66602028636f64656320604f2842296029bc2020202020202d20312073746f726167652077726974652060566f74696e67602028636f64656320604f284d2960292c20202d2031206576656e742c23203c2f7765696768743e10766f74650c012070726f706f73616c24011c543a3a48617368000114696e6465783901013450726f706f73616c496e64657800011c617070726f7665a40110626f6f6c00033cf041646420616e20617965206f72206e617920766f746520666f72207468652073656e64657220746f2074686520676976656e2070726f706f73616c2e008c5265717569726573207468652073656e64657220746f2062652061206d656d6265722e0049015472616e73616374696f6e20666565732077696c6c2062652077616976656420696620746865206d656d62657220697320766f74696e67206f6e20616e7920706172746963756c61722070726f706f73616c5101666f72207468652066697273742074696d6520616e64207468652063616c6c206973207375636365737366756c2e2053756273657175656e7420766f7465206368616e6765732077696c6c206368617267652061106665652e2823203c7765696768743e2423232057656967687409012d20604f284d296020776865726520604d60206973206d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e64656429142d2044423aac20202d20312073746f72616765207265616420604d656d62657273602028636f64656320604f284d296029b820202d20312073746f72616765206d75746174696f6e2060566f74696e67602028636f64656320604f284d296029242d2031206576656e742c23203c2f7765696768743e14636c6f736510013470726f706f73616c5f6861736824011c543a3a48617368000114696e6465783901013450726f706f73616c496e64657800015470726f706f73616c5f7765696768745f626f756e64410101185765696768740001306c656e6774685f626f756e643901010c7533320004804d01436c6f7365206120766f746520746861742069732065697468657220617070726f7665642c20646973617070726f766564206f722077686f736520766f74696e6720706572696f642068617320656e6465642e0055014d61792062652063616c6c656420627920616e79207369676e6564206163636f756e7420696e206f7264657220746f2066696e69736820766f74696e6720616e6420636c6f7365207468652070726f706f73616c2e00490149662063616c6c6564206265666f72652074686520656e64206f662074686520766f74696e6720706572696f642069742077696c6c206f6e6c7920636c6f73652074686520766f7465206966206974206973bc68617320656e6f75676820766f74657320746f20626520617070726f766564206f7220646973617070726f7665642e00490149662063616c6c65642061667465722074686520656e64206f662074686520766f74696e6720706572696f642061627374656e74696f6e732061726520636f756e7465642061732072656a656374696f6e732501756e6c6573732074686572652069732061207072696d65206d656d6265722073657420616e6420746865207072696d65206d656d626572206361737420616e20617070726f76616c2e00610149662074686520636c6f7365206f7065726174696f6e20636f6d706c65746573207375636365737366756c6c79207769746820646973617070726f76616c2c20746865207472616e73616374696f6e206665652077696c6c5d016265207761697665642e204f746865727769736520657865637574696f6e206f662074686520617070726f766564206f7065726174696f6e2077696c6c206265206368617267656420746f207468652063616c6c65722e0061012b206070726f706f73616c5f7765696768745f626f756e64603a20546865206d6178696d756d20616d6f756e74206f662077656967687420636f6e73756d656420627920657865637574696e672074686520636c6f7365642470726f706f73616c2e61012b20606c656e6774685f626f756e64603a2054686520757070657220626f756e6420666f7220746865206c656e677468206f66207468652070726f706f73616c20696e2073746f726167652e20436865636b65642076696135016073746f726167653a3a726561646020736f206974206973206073697a655f6f663a3a3c7533323e2829203d3d203460206c6172676572207468616e207468652070757265206c656e6774682e002823203c7765696768743e24232320576569676874742d20604f2842202b204d202b205031202b20503229602077686572653ae020202d20604260206973206070726f706f73616c602073697a6520696e20627974657320286c656e6774682d6665652d626f756e64656429dc20202d20604d60206973206d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e64656429c820202d20605031602069732074686520636f6d706c6578697479206f66206070726f706f73616c6020707265696d6167652ea420202d20605032602069732070726f706f73616c2d636f756e742028636f64652d626f756e64656429142d2044423a0d01202d20322073746f726167652072656164732028604d656d62657273603a20636f64656320604f284d29602c20605072696d65603a20636f64656320604f28312960295901202d2033206d75746174696f6e73202860566f74696e67603a20636f64656320604f284d29602c206050726f706f73616c4f66603a20636f64656320604f284229602c206050726f706f73616c73603a20636f6465632c202020604f285032296029dc202d20616e79206d75746174696f6e7320646f6e65207768696c6520657865637574696e67206070726f706f73616c6020286050316029402d20757020746f2033206576656e74732c23203c2f7765696768743e4c646973617070726f76655f70726f706f73616c04013470726f706f73616c5f6861736824011c543a3a486173680005385901446973617070726f766520612070726f706f73616c2c20636c6f73652c20616e642072656d6f76652069742066726f6d207468652073797374656d2c207265676172646c657373206f66206974732063757272656e741873746174652e00884d7573742062652063616c6c65642062792074686520526f6f74206f726967696e2e002c506172616d65746572733a1d012a206070726f706f73616c5f68617368603a205468652068617368206f66207468652070726f706f73616c20746861742073686f756c6420626520646973617070726f7665642e002823203c7765696768743edc436f6d706c65786974793a204f285029207768657265205020697320746865206e756d626572206f66206d61782070726f706f73616c73284442205765696768743a482a2052656164733a2050726f706f73616c739c2a205772697465733a20566f74696e672c2050726f706f73616c732c2050726f706f73616c4f662c23203c2f7765696768743e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e7d030c4470616c6c65745f6d656d626572736869701870616c6c65741043616c6c08045400044900011c286164645f6d656d62657204010c77686f000130543a3a4163636f756e74496400000c784164642061206d656d626572206077686f6020746f20746865207365742e009c4d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a4164644f726967696e602e3472656d6f76655f6d656d62657204010c77686f000130543a3a4163636f756e74496400010c8c52656d6f76652061206d656d626572206077686f602066726f6d20746865207365742e00a84d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a52656d6f76654f726967696e602e2c737761705f6d656d62657208011872656d6f7665000130543a3a4163636f756e74496400010c616464000130543a3a4163636f756e744964000214bc53776170206f7574206f6e65206d656d626572206072656d6f76656020666f7220616e6f746865722060616464602e00a04d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a537761704f726967696e602e000d015072696d65206d656d62657273686970206973202a6e6f742a207061737365642066726f6d206072656d6f76656020746f2060616464602c20696620657874616e742e3472657365745f6d656d6265727304011c6d656d626572738801445665633c543a3a4163636f756e7449643e00031055014368616e676520746865206d656d6265727368697020746f2061206e6577207365742c20646973726567617264696e6720746865206578697374696e67206d656d626572736869702e204265206e69636520616e64687061737320606d656d6265727360207072652d736f727465642e00a44d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a52657365744f726967696e602e286368616e67655f6b657904010c6e6577000130543a3a4163636f756e744964000414d453776170206f7574207468652073656e64696e67206d656d62657220666f7220736f6d65206f74686572206b657920606e6577602e00f04d6179206f6e6c792062652063616c6c65642066726f6d20605369676e656460206f726967696e206f6620612063757272656e74206d656d6265722e001d015072696d65206d656d62657273686970206973207061737365642066726f6d20746865206f726967696e206163636f756e7420746f20606e6577602c20696620657874616e742e247365745f7072696d6504010c77686f000130543a3a4163636f756e74496400050cbc53657420746865207072696d65206d656d6265722e204d75737420626520612063757272656e74206d656d6265722e00a44d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a5072696d654f726967696e602e2c636c6561725f7072696d6500060c9452656d6f766520746865207072696d65206d656d626572206966206974206578697374732e00a44d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a5072696d654f726967696e602e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e81030c3c70616c6c65745f74726561737572791870616c6c65741043616c6c0804540004490001103470726f706f73655f7370656e6408011476616c75654901013c42616c616e63654f663c542c20493e00012c62656e65666963696172795902018c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365000024290150757420666f727761726420612073756767657374696f6e20666f72207370656e64696e672e2041206465706f7369742070726f706f7274696f6e616c20746f207468652076616c75653101697320726573657276656420616e6420736c6173686564206966207468652070726f706f73616c2069732072656a65637465642e2049742069732072657475726e6564206f6e6365207468655070726f706f73616c20697320617761726465642e002823203c7765696768743e482d20436f6d706c65786974793a204f283129b02d20446252656164733a206050726f706f73616c436f756e74602c20606f726967696e206163636f756e7460e82d2044625772697465733a206050726f706f73616c436f756e74602c206050726f706f73616c73602c20606f726967696e206163636f756e74602c23203c2f7765696768743e3c72656a6563745f70726f706f73616c04012c70726f706f73616c5f69643901013450726f706f73616c496e646578000124f852656a65637420612070726f706f736564207370656e642e20546865206f726967696e616c206465706f7369742077696c6c20626520736c61736865642e00a84d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a52656a6563744f726967696e602e002823203c7765696768743e482d20436f6d706c65786974793a204f283129cc2d20446252656164733a206050726f706f73616c73602c206072656a65637465642070726f706f736572206163636f756e7460d02d2044625772697465733a206050726f706f73616c73602c206072656a65637465642070726f706f736572206163636f756e74602c23203c2f7765696768743e40617070726f76655f70726f706f73616c04012c70726f706f73616c5f69643901013450726f706f73616c496e6465780002285901417070726f766520612070726f706f73616c2e2041742061206c617465722074696d652c207468652070726f706f73616c2077696c6c20626520616c6c6f636174656420746f207468652062656e6566696369617279a8616e6420746865206f726967696e616c206465706f7369742077696c6c2062652072657475726e65642e00ac4d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a417070726f76654f726967696e602e002823203c7765696768743e4c2d20436f6d706c65786974793a204f2831292e8c2d20446252656164733a206050726f706f73616c73602c2060417070726f76616c7360582d20446257726974653a2060417070726f76616c73602c23203c2f7765696768743e3c72656d6f76655f617070726f76616c04012c70726f706f73616c5f69643901013450726f706f73616c496e64657800033c2d01466f72636520612070726576696f75736c7920617070726f7665642070726f706f73616c20746f2062652072656d6f7665642066726f6d2074686520617070726f76616c2071756575652ec0546865206f726967696e616c206465706f7369742077696c6c206e6f206c6f6e6765722062652072657475726e65642e00a84d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a52656a6563744f726967696e602ea02d206070726f706f73616c5f6964603a2054686520696e646578206f6620612070726f706f73616c002823203c7765696768743edc2d20436f6d706c65786974793a204f2841292077686572652060416020697320746865206e756d626572206f6620617070726f76616c73882d20446220726561647320616e64207772697465733a2060417070726f76616c73602c23203c2f7765696768743e001c4572726f72733a61012d206050726f706f73616c4e6f74417070726f766564603a20546865206070726f706f73616c5f69646020737570706c69656420776173206e6f7420666f756e6420696e2074686520617070726f76616c2071756575652c5101692e652e2c207468652070726f706f73616c20686173206e6f74206265656e20617070726f7665642e205468697320636f756c6420616c736f206d65616e207468652070726f706f73616c20646f6573206e6f745901657869737420616c746f6765746865722c2074687573207468657265206973206e6f2077617920697420776f756c642068617665206265656e20617070726f76656420696e2074686520666972737420706c6163652e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e85030c3870616c6c65745f7574696c6974791870616c6c65741043616c6c04045400011414626174636804011463616c6c73890301605665633c3c5420617320436f6e6669673e3a3a43616c6c3e00004c7c53656e642061206261746368206f662064697370617463682063616c6c732e00784d61792062652063616c6c65642066726f6d20616e79206f726967696e2e005d012d206063616c6c73603a205468652063616c6c7320746f20626520646973706174636865642066726f6d207468652073616d65206f726967696e2e20546865206e756d626572206f662063616c6c206d757374206e6f74390120206578636565642074686520636f6e7374616e743a2060626174636865645f63616c6c735f6c696d6974602028617661696c61626c6520696e20636f6e7374616e74206d65746164617461292e005d014966206f726967696e20697320726f6f74207468656e2063616c6c2061726520646973706174636820776974686f757420636865636b696e67206f726967696e2066696c7465722e20285468697320696e636c75646573c8627970617373696e6720606672616d655f73797374656d3a3a436f6e6669673a3a4261736543616c6c46696c74657260292e002823203c7765696768743e01012d20436f6d706c65786974793a204f284329207768657265204320697320746865206e756d626572206f662063616c6c7320746f20626520626174636865642e2c23203c2f7765696768743e005501546869732077696c6c2072657475726e20604f6b6020696e20616c6c2063697263756d7374616e6365732e20546f2064657465726d696e65207468652073756363657373206f66207468652062617463682c20616e31016576656e74206973206465706f73697465642e20496620612063616c6c206661696c656420616e64207468652062617463682077617320696e7465727275707465642c207468656e207468655501604261746368496e74657272757074656460206576656e74206973206465706f73697465642c20616c6f6e67207769746820746865206e756d626572206f66207375636365737366756c2063616c6c73206d6164654d01616e6420746865206572726f72206f6620746865206661696c65642063616c6c2e20496620616c6c2077657265207375636365737366756c2c207468656e2074686520604261746368436f6d706c65746564604c6576656e74206973206465706f73697465642e3461735f64657269766174697665080114696e646578d4010c75313600011063616c6c71030160426f783c3c5420617320436f6e6669673e3a3a43616c6c3e000134dc53656e6420612063616c6c207468726f75676820616e20696e64657865642070736575646f6e796d206f66207468652073656e6465722e00550146696c7465722066726f6d206f726967696e206172652070617373656420616c6f6e672e205468652063616c6c2077696c6c2062652064697370617463686564207769746820616e206f726967696e207768696368bc757365207468652073616d652066696c74657220617320746865206f726967696e206f6620746869732063616c6c2e0045014e4f54453a20496620796f75206e65656420746f20656e73757265207468617420616e79206163636f756e742d62617365642066696c746572696e67206973206e6f7420686f6e6f7265642028692e652e61016265636175736520796f7520657870656374206070726f78796020746f2068617665206265656e2075736564207072696f7220696e207468652063616c6c20737461636b20616e6420796f7520646f206e6f742077616e7451017468652063616c6c207265737472696374696f6e7320746f206170706c7920746f20616e79207375622d6163636f756e7473292c207468656e20757365206061735f6d756c74695f7468726573686f6c645f31607c696e20746865204d756c74697369672070616c6c657420696e73746561642e00f44e4f54453a205072696f7220746f2076657273696f6e202a31322c2074686973207761732063616c6c6564206061735f6c696d697465645f737562602e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e2462617463685f616c6c04011463616c6c73890301605665633c3c5420617320436f6e6669673e3a3a43616c6c3e000238ec53656e642061206261746368206f662064697370617463682063616c6c7320616e642061746f6d6963616c6c792065786563757465207468656d2e21015468652077686f6c65207472616e73616374696f6e2077696c6c20726f6c6c6261636b20616e64206661696c20696620616e79206f66207468652063616c6c73206661696c65642e00784d61792062652063616c6c65642066726f6d20616e79206f726967696e2e005d012d206063616c6c73603a205468652063616c6c7320746f20626520646973706174636865642066726f6d207468652073616d65206f726967696e2e20546865206e756d626572206f662063616c6c206d757374206e6f74390120206578636565642074686520636f6e7374616e743a2060626174636865645f63616c6c735f6c696d6974602028617661696c61626c6520696e20636f6e7374616e74206d65746164617461292e005d014966206f726967696e20697320726f6f74207468656e2063616c6c2061726520646973706174636820776974686f757420636865636b696e67206f726967696e2066696c7465722e20285468697320696e636c75646573c8627970617373696e6720606672616d655f73797374656d3a3a436f6e6669673a3a4261736543616c6c46696c74657260292e002823203c7765696768743e01012d20436f6d706c65786974793a204f284329207768657265204320697320746865206e756d626572206f662063616c6c7320746f20626520626174636865642e2c23203c2f7765696768743e2c64697370617463685f617308012461735f6f726967696e8d030154426f783c543a3a50616c6c6574734f726967696e3e00011063616c6c71030160426f783c3c5420617320436f6e6669673e3a3a43616c6c3e000328c84469737061746368657320612066756e6374696f6e2063616c6c207769746820612070726f7669646564206f726967696e2e00c4546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f526f6f745f2e002823203c7765696768743e1c2d204f2831292e602d204c696d697465642073746f726167652072656164732e5c2d204f6e6520444220777269746520286576656e74292e1d012d20576569676874206f662064657269766174697665206063616c6c6020657865637574696f6e202b20543a3a576569676874496e666f3a3a64697370617463685f617328292e2c23203c2f7765696768743e2c666f7263655f626174636804011463616c6c73890301605665633c3c5420617320436f6e6669673e3a3a43616c6c3e0004387c53656e642061206261746368206f662064697370617463682063616c6c732ed4556e6c696b6520606261746368602c20697420616c6c6f7773206572726f727320616e6420776f6e277420696e746572727570742e00784d61792062652063616c6c65642066726f6d20616e79206f726967696e2e005d012d206063616c6c73603a205468652063616c6c7320746f20626520646973706174636865642066726f6d207468652073616d65206f726967696e2e20546865206e756d626572206f662063616c6c206d757374206e6f74390120206578636565642074686520636f6e7374616e743a2060626174636865645f63616c6c735f6c696d6974602028617661696c61626c6520696e20636f6e7374616e74206d65746164617461292e005d014966206f726967696e20697320726f6f74207468656e2063616c6c2061726520646973706174636820776974686f757420636865636b696e67206f726967696e2066696c7465722e20285468697320696e636c75646573c8627970617373696e6720606672616d655f73797374656d3a3a436f6e6669673a3a4261736543616c6c46696c74657260292e002823203c7765696768743e01012d20436f6d706c65786974793a204f284329207768657265204320697320746865206e756d626572206f662063616c6c7320746f20626520626174636865642e2c23203c2f7765696768743e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e89030000027103008d0308447370697269746e65745f72756e74696d65304f726967696e43616c6c657200011c1873797374656d0400910301746672616d655f73797374656d3a3a4f726967696e3c52756e74696d653e0000001c436f756e63696c0400950301010170616c6c65745f636f6c6c6563746976653a3a4f726967696e3c52756e74696d652c2070616c6c65745f636f6c6c6563746976653a3a496e7374616e6365313e001f0048546563686e6963616c436f6d6d69747465650400990301010170616c6c65745f636f6c6c6563746976653a3a4f726967696e3c52756e74696d652c2070616c6c65745f636f6c6c6563746976653a3a496e7374616e6365323e0020000c44696404009d0301506469643a3a4f726967696e3c52756e74696d653e0040002c506f6c6b61646f7458636d0400a103014870616c6c65745f78636d3a3a4f726967696e0053002843756d756c757358636d0400a503016863756d756c75735f70616c6c65745f78636d3a3a4f726967696e00540010566f69640400a90301110173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a566f69640006000091030c346672616d655f737570706f7274206469737061746368245261774f726967696e04244163636f756e7449640100010c10526f6f74000000185369676e656404000001244163636f756e744964000100104e6f6e65000200009503084470616c6c65745f636f6c6c656374697665245261774f726967696e08244163636f756e7449640100044900010c1c4d656d6265727308001c012c4d656d626572436f756e7400001c012c4d656d626572436f756e74000000184d656d62657204000001244163636f756e744964000100205f5068616e746f6d000200009903084470616c6c65745f636f6c6c656374697665245261774f726967696e08244163636f756e7449640100044900010c1c4d656d6265727308001c012c4d656d626572436f756e7400001c012c4d656d626572436f756e74000000184d656d62657204000001244163636f756e744964000100205f5068616e746f6d000200009d030c0c646964186f726967696e304469645261774f726967696e08344469644964656e7469666965720100244163636f756e74496401000008010869640001344469644964656e7469666965720001247375626d69747465720001244163636f756e7449640000a1030c2870616c6c65745f78636d1870616c6c6574184f726967696e0001080c58636d04002d0101344d756c74694c6f636174696f6e00000020526573706f6e736504002d0101344d756c74694c6f636174696f6e00010000a5030c4863756d756c75735f70616c6c65745f78636d1870616c6c6574184f726967696e0001081452656c6179000000405369626c696e6750617261636861696e04002101011850617261496400010000a903081c73705f636f726510566f696400010000ad030c3870616c6c65745f76657374696e671870616c6c65741043616c6c0404540001141076657374000034b8556e6c6f636b20616e79207665737465642066756e6473206f66207468652073656e646572206163636f756e742e005d01546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420686176652066756e6473207374696c6c646c6f636b656420756e64657220746869732070616c6c65742e00d0456d69747320656974686572206056657374696e67436f6d706c6574656460206f72206056657374696e6755706461746564602e002823203c7765696768743e242d20604f283129602e742d2044625765696768743a20322052656164732c203220577269746573f8202020202d2052656164733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c205b53656e646572204163636f756e745dfc202020202d205772697465733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c205b53656e646572204163636f756e745d2c23203c2f7765696768743e28766573745f6f746865720401187461726765745902018c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f7572636500013cb8556e6c6f636b20616e79207665737465642066756e6473206f662061206074617267657460206163636f756e742e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e0051012d2060746172676574603a20546865206163636f756e742077686f7365207665737465642066756e64732073686f756c6420626520756e6c6f636b65642e204d75737420686176652066756e6473207374696c6c646c6f636b656420756e64657220746869732070616c6c65742e00d0456d69747320656974686572206056657374696e67436f6d706c6574656460206f72206056657374696e6755706461746564602e002823203c7765696768743e242d20604f283129602e742d2044625765696768743a20332052656164732c203320577269746573f0202020202d2052656164733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c20546172676574204163636f756e74f4202020202d205772697465733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c20546172676574204163636f756e742c23203c2f7765696768743e3c7665737465645f7472616e736665720801187461726765745902018c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263650001207363686564756c65b10301a456657374696e67496e666f3c42616c616e63654f663c543e2c20543a3a426c6f636b4e756d6265723e00024464437265617465206120766573746564207472616e736665722e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e00cc2d2060746172676574603a20546865206163636f756e7420726563656976696e6720746865207665737465642066756e64732ef02d20607363686564756c65603a205468652076657374696e67207363686564756c6520617474616368656420746f20746865207472616e736665722e005c456d697473206056657374696e6743726561746564602e00fc4e4f54453a20546869732077696c6c20756e6c6f636b20616c6c207363686564756c6573207468726f756768207468652063757272656e7420626c6f636b2e002823203c7765696768743e242d20604f283129602e742d2044625765696768743a20332052656164732c2033205772697465733901202020202d2052656164733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c20546172676574204163636f756e742c205b53656e646572204163636f756e745d3d01202020202d205772697465733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c20546172676574204163636f756e742c205b53656e646572204163636f756e745d2c23203c2f7765696768743e54666f7263655f7665737465645f7472616e736665720c0118736f757263655902018c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263650001187461726765745902018c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263650001207363686564756c65b10301a456657374696e67496e666f3c42616c616e63654f663c543e2c20543a3a426c6f636b4e756d6265723e00034860466f726365206120766573746564207472616e736665722e00c4546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f526f6f745f2e00e82d2060736f75726365603a20546865206163636f756e742077686f73652066756e64732073686f756c64206265207472616e736665727265642e11012d2060746172676574603a20546865206163636f756e7420746861742073686f756c64206265207472616e7366657272656420746865207665737465642066756e64732ef02d20607363686564756c65603a205468652076657374696e67207363686564756c6520617474616368656420746f20746865207472616e736665722e005c456d697473206056657374696e6743726561746564602e00fc4e4f54453a20546869732077696c6c20756e6c6f636b20616c6c207363686564756c6573207468726f756768207468652063757272656e7420626c6f636b2e002823203c7765696768743e242d20604f283129602e742d2044625765696768743a20342052656164732c2034205772697465733101202020202d2052656164733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c20546172676574204163636f756e742c20536f75726365204163636f756e743501202020202d205772697465733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c20546172676574204163636f756e742c20536f75726365204163636f756e742c23203c2f7765696768743e3c6d657267655f7363686564756c657308013c7363686564756c65315f696e6465781c010c75333200013c7363686564756c65325f696e6465781c010c7533320004545d014d657267652074776f2076657374696e67207363686564756c657320746f6765746865722c206372656174696e672061206e65772076657374696e67207363686564756c65207468617420756e6c6f636b73206f7665725501746865206869676865737420706f737369626c6520737461727420616e6420656e6420626c6f636b732e20496620626f7468207363686564756c6573206861766520616c7265616479207374617274656420746865590163757272656e7420626c6f636b2077696c6c206265207573656420617320746865207363686564756c652073746172743b207769746820746865206361766561742074686174206966206f6e65207363686564756c655d0169732066696e6973686564206279207468652063757272656e7420626c6f636b2c20746865206f746865722077696c6c206265207472656174656420617320746865206e6577206d6572676564207363686564756c652c2c756e6d6f6469666965642e00f84e4f54453a20496620607363686564756c65315f696e646578203d3d207363686564756c65325f696e6465786020746869732069732061206e6f2d6f702e41014e4f54453a20546869732077696c6c20756e6c6f636b20616c6c207363686564756c6573207468726f756768207468652063757272656e7420626c6f636b207072696f7220746f206d657267696e672e61014e4f54453a20496620626f7468207363686564756c6573206861766520656e646564206279207468652063757272656e7420626c6f636b2c206e6f206e6577207363686564756c652077696c6c206265206372656174656464616e6420626f74682077696c6c2062652072656d6f7665642e006c4d6572676564207363686564756c6520617474726962757465733a35012d20607374617274696e675f626c6f636b603a20604d4158287363686564756c65312e7374617274696e675f626c6f636b2c207363686564756c6564322e7374617274696e675f626c6f636b2c48202063757272656e745f626c6f636b29602e21012d2060656e64696e675f626c6f636b603a20604d4158287363686564756c65312e656e64696e675f626c6f636b2c207363686564756c65322e656e64696e675f626c6f636b29602e59012d20606c6f636b6564603a20607363686564756c65312e6c6f636b65645f61742863757272656e745f626c6f636b29202b207363686564756c65322e6c6f636b65645f61742863757272656e745f626c6f636b29602e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e00e82d20607363686564756c65315f696e646578603a20696e646578206f6620746865206669727374207363686564756c6520746f206d657267652eec2d20607363686564756c65325f696e646578603a20696e646578206f6620746865207365636f6e64207363686564756c6520746f206d657267652e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632eb1030c3870616c6c65745f76657374696e673076657374696e675f696e666f2c56657374696e67496e666f081c42616c616e636501182c426c6f636b4e756d6265720110000c01186c6f636b656418011c42616c616e63650001247065725f626c6f636b18011c42616c616e63650001387374617274696e675f626c6f636b10012c426c6f636b4e756d6265720000b5030c4070616c6c65745f7363686564756c65721870616c6c65741043616c6c040454000118207363686564756c651001107768656e100138543a3a426c6f636b4e756d6265720001386d617962655f706572696f646963b90301a04f7074696f6e3c7363686564756c653a3a506572696f643c543a3a426c6f636b4e756d6265723e3e0001207072696f726974790801487363686564756c653a3a5072696f7269747900011063616c6cbd030150426f783c43616c6c4f72486173684f663c543e3e00000470416e6f6e796d6f75736c79207363686564756c652061207461736b2e1863616e63656c0801107768656e100138543a3a426c6f636b4e756d626572000114696e6465781c010c7533320001049443616e63656c20616e20616e6f6e796d6f75736c79207363686564756c6564207461736b2e387363686564756c655f6e616d6564140108696428011c5665633c75383e0001107768656e100138543a3a426c6f636b4e756d6265720001386d617962655f706572696f646963b90301a04f7074696f6e3c7363686564756c653a3a506572696f643c543a3a426c6f636b4e756d6265723e3e0001207072696f726974790801487363686564756c653a3a5072696f7269747900011063616c6cbd030150426f783c43616c6c4f72486173684f663c543e3e000204585363686564756c652061206e616d6564207461736b2e3063616e63656c5f6e616d6564040108696428011c5665633c75383e0003047843616e63656c2061206e616d6564207363686564756c6564207461736b2e387363686564756c655f61667465721001146166746572100138543a3a426c6f636b4e756d6265720001386d617962655f706572696f646963b90301a04f7074696f6e3c7363686564756c653a3a506572696f643c543a3a426c6f636b4e756d6265723e3e0001207072696f726974790801487363686564756c653a3a5072696f7269747900011063616c6cbd030150426f783c43616c6c4f72486173684f663c543e3e000414a8416e6f6e796d6f75736c79207363686564756c652061207461736b20616674657220612064656c61792e002823203c7765696768743e5453616d65206173205b607363686564756c65605d2e2c23203c2f7765696768743e507363686564756c655f6e616d65645f6166746572140108696428011c5665633c75383e0001146166746572100138543a3a426c6f636b4e756d6265720001386d617962655f706572696f646963b90301a04f7074696f6e3c7363686564756c653a3a506572696f643c543a3a426c6f636b4e756d6265723e3e0001207072696f726974790801487363686564756c653a3a5072696f7269747900011063616c6cbd030150426f783c43616c6c4f72486173684f663c543e3e000514905363686564756c652061206e616d6564207461736b20616674657220612064656c61792e002823203c7765696768743ec453616d65206173205b607363686564756c655f6e616d6564605d2853656c663a3a7363686564756c655f6e616d6564292e2c23203c2f7765696768743e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632eb90304184f7074696f6e04045401c00108104e6f6e6500000010536f6d650400c00000010000bd0310346672616d655f737570706f727418747261697473207363686564756c652c4d617962654861736865640804540171031048617368012401081456616c756504007103010454000000104861736804002401104861736800010000c1030c3070616c6c65745f70726f78791870616c6c65741043616c6c0404540001281470726f78790c01107265616c000130543a3a4163636f756e744964000140666f7263655f70726f78795f74797065c50301504f7074696f6e3c543a3a50726f7879547970653e00011063616c6c71030160426f783c3c5420617320436f6e6669673e3a3a43616c6c3e00003c4d0144697370617463682074686520676976656e206063616c6c602066726f6d20616e206163636f756e742074686174207468652073656e64657220697320617574686f726973656420666f72207468726f75676830606164645f70726f7879602e00a852656d6f76657320616e7920636f72726573706f6e64696e6720616e6e6f756e63656d656e742873292e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e002c506172616d65746572733a0d012d20607265616c603a20546865206163636f756e742074686174207468652070726f78792077696c6c206d616b6520612063616c6c206f6e20626568616c66206f662e61012d2060666f7263655f70726f78795f74797065603a2053706563696679207468652065786163742070726f7879207479706520746f206265207573656420616e6420636865636b656420666f7220746869732063616c6c2ed02d206063616c6c603a205468652063616c6c20746f206265206d6164652062792074686520607265616c60206163636f756e742e002823203c7765696768743efc57656967687420697320612066756e6374696f6e206f6620746865206e756d626572206f662070726f7869657320746865207573657220686173202850292e2c23203c2f7765696768743e246164645f70726f78790c012064656c6567617465000130543a3a4163636f756e74496400012870726f78795f74797065d00130543a3a50726f78795479706500011464656c6179100138543a3a426c6f636b4e756d6265720001344501526567697374657220612070726f7879206163636f756e7420666f72207468652073656e64657220746861742069732061626c6520746f206d616b652063616c6c73206f6e2069747320626568616c662e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e002c506172616d65746572733a11012d206070726f7879603a20546865206163636f756e74207468617420746865206063616c6c65726020776f756c64206c696b6520746f206d616b6520612070726f78792efc2d206070726f78795f74797065603a20546865207065726d697373696f6e7320616c6c6f77656420666f7220746869732070726f7879206163636f756e742e4d012d206064656c6179603a2054686520616e6e6f756e63656d656e7420706572696f64207265717569726564206f662074686520696e697469616c2070726f78792e2057696c6c2067656e6572616c6c79206265147a65726f2e002823203c7765696768743efc57656967687420697320612066756e6374696f6e206f6620746865206e756d626572206f662070726f7869657320746865207573657220686173202850292e2c23203c2f7765696768743e3072656d6f76655f70726f78790c012064656c6567617465000130543a3a4163636f756e74496400012870726f78795f74797065d00130543a3a50726f78795479706500011464656c6179100138543a3a426c6f636b4e756d62657200022ca8556e726567697374657220612070726f7879206163636f756e7420666f72207468652073656e6465722e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e002c506172616d65746572733a25012d206070726f7879603a20546865206163636f756e74207468617420746865206063616c6c65726020776f756c64206c696b6520746f2072656d6f766520617320612070726f78792e41012d206070726f78795f74797065603a20546865207065726d697373696f6e732063757272656e746c7920656e61626c656420666f72207468652072656d6f7665642070726f7879206163636f756e742e002823203c7765696768743efc57656967687420697320612066756e6374696f6e206f6620746865206e756d626572206f662070726f7869657320746865207573657220686173202850292e2c23203c2f7765696768743e3872656d6f76655f70726f78696573000328b4556e726567697374657220616c6c2070726f7879206163636f756e747320666f72207468652073656e6465722e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e0055015741524e494e473a2054686973206d61792062652063616c6c6564206f6e206163636f756e747320637265617465642062792060616e6f6e796d6f7573602c20686f776576657220696620646f6e652c207468656e590174686520756e726573657276656420666565732077696c6c20626520696e61636365737369626c652e202a2a416c6c2061636365737320746f2074686973206163636f756e742077696c6c206265206c6f73742e2a2a002823203c7765696768743efc57656967687420697320612066756e6374696f6e206f6620746865206e756d626572206f662070726f7869657320746865207573657220686173202850292e2c23203c2f7765696768743e24616e6f6e796d6f75730c012870726f78795f74797065d00130543a3a50726f78795479706500011464656c6179100138543a3a426c6f636b4e756d626572000114696e646578d4010c75313600045c3901537061776e2061206672657368206e6577206163636f756e7420746861742069732067756172616e7465656420746f206265206f746865727769736520696e61636365737369626c652c20616e64fc696e697469616c697a65206974207769746820612070726f7879206f66206070726f78795f747970656020666f7220606f726967696e602073656e6465722e006c5265717569726573206120605369676e656460206f726967696e2e0051012d206070726f78795f74797065603a205468652074797065206f66207468652070726f78792074686174207468652073656e6465722077696c6c2062652072656769737465726564206173206f766572207468654d016e6577206163636f756e742e20546869732077696c6c20616c6d6f737420616c7761797320626520746865206d6f7374207065726d697373697665206050726f7879547970656020706f737369626c6520746f78616c6c6f7720666f72206d6178696d756d20666c65786962696c6974792e51012d2060696e646578603a204120646973616d626967756174696f6e20696e6465782c20696e206361736520746869732069732063616c6c6564206d756c7469706c652074696d657320696e207468652073616d655d017472616e73616374696f6e2028652e672e207769746820607574696c6974793a3a626174636860292e20556e6c65737320796f75277265207573696e67206062617463686020796f752070726f6261626c79206a7573744077616e7420746f20757365206030602e4d012d206064656c6179603a2054686520616e6e6f756e63656d656e7420706572696f64207265717569726564206f662074686520696e697469616c2070726f78792e2057696c6c2067656e6572616c6c79206265147a65726f2e0051014661696c73207769746820604475706c69636174656020696620746869732068617320616c7265616479206265656e2063616c6c656420696e2074686973207472616e73616374696f6e2c2066726f6d207468659873616d652073656e6465722c2077697468207468652073616d6520706172616d65746572732e00e44661696c732069662074686572652061726520696e73756666696369656e742066756e647320746f2070617920666f72206465706f7369742e002823203c7765696768743efc57656967687420697320612066756e6374696f6e206f6620746865206e756d626572206f662070726f7869657320746865207573657220686173202850292e2c23203c2f7765696768743e8c544f444f3a204d69676874206265206f76657220636f756e74696e6720312072656164386b696c6c5f616e6f6e796d6f757314011c737061776e6572000130543a3a4163636f756e74496400012870726f78795f74797065d00130543a3a50726f787954797065000114696e646578d4010c75313600011868656967687441010138543a3a426c6f636b4e756d6265720001246578745f696e6465783901010c753332000550b452656d6f76657320612070726576696f75736c7920737061776e656420616e6f6e796d6f75732070726f78792e0049015741524e494e473a202a2a416c6c2061636365737320746f2074686973206163636f756e742077696c6c206265206c6f73742e2a2a20416e792066756e64732068656c6420696e2069742077696c6c20626534696e61636365737369626c652e0059015265717569726573206120605369676e656460206f726967696e2c20616e64207468652073656e646572206163636f756e74206d7573742068617665206265656e206372656174656420627920612063616c6c20746fa860616e6f6e796d6f757360207769746820636f72726573706f6e64696e6720706172616d65746572732e004d012d2060737061776e6572603a20546865206163636f756e742074686174206f726967696e616c6c792063616c6c65642060616e6f6e796d6f75736020746f206372656174652074686973206163636f756e742e4d012d2060696e646578603a2054686520646973616d626967756174696f6e20696e646578206f726967696e616c6c792070617373656420746f2060616e6f6e796d6f7573602e2050726f6261626c79206030602e01012d206070726f78795f74797065603a205468652070726f78792074797065206f726967696e616c6c792070617373656420746f2060616e6f6e796d6f7573602e3d012d2060686569676874603a2054686520686569676874206f662074686520636861696e207768656e207468652063616c6c20746f2060616e6f6e796d6f757360207761732070726f6365737365642e49012d20606578745f696e646578603a205468652065787472696e73696320696e64657820696e207768696368207468652063616c6c20746f2060616e6f6e796d6f757360207761732070726f6365737365642e0049014661696c73207769746820604e6f5065726d697373696f6e6020696e2063617365207468652063616c6c6572206973206e6f7420612070726576696f75736c79206372656174656420616e6f6e796d6f7573f06163636f756e742077686f73652060616e6f6e796d6f7573602063616c6c2068617320636f72726573706f6e64696e6720706172616d65746572732e002823203c7765696768743efc57656967687420697320612066756e6374696f6e206f6620746865206e756d626572206f662070726f7869657320746865207573657220686173202850292e2c23203c2f7765696768743e20616e6e6f756e63650801107265616c000130543a3a4163636f756e74496400012463616c6c5f6861736824013443616c6c486173684f663c543e00065405015075626c697368207468652068617368206f6620612070726f78792d63616c6c20746861742077696c6c206265206d61646520696e20746865206675747572652e005d0154686973206d7573742062652063616c6c656420736f6d65206e756d626572206f6620626c6f636b73206265666f72652074686520636f72726573706f6e64696e67206070726f78796020697320617474656d7074656425016966207468652064656c6179206173736f6369617465642077697468207468652070726f78792072656c6174696f6e736869702069732067726561746572207468616e207a65726f2e0011014e6f206d6f7265207468616e20604d617850656e64696e676020616e6e6f756e63656d656e7473206d6179206265206d61646520617420616e79206f6e652074696d652e000901546869732077696c6c2074616b652061206465706f736974206f662060416e6e6f756e63656d656e744465706f736974466163746f72602061732077656c6c206173190160416e6e6f756e63656d656e744465706f736974426173656020696620746865726520617265206e6f206f746865722070656e64696e6720616e6e6f756e63656d656e74732e002501546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e6420612070726f7879206f6620607265616c602e002c506172616d65746572733a0d012d20607265616c603a20546865206163636f756e742074686174207468652070726f78792077696c6c206d616b6520612063616c6c206f6e20626568616c66206f662e15012d206063616c6c5f68617368603a205468652068617368206f66207468652063616c6c20746f206265206d6164652062792074686520607265616c60206163636f756e742e002823203c7765696768743e6057656967687420697320612066756e6374696f6e206f663a982d20413a20746865206e756d626572206f6620616e6e6f756e63656d656e7473206d6164652ea02d20503a20746865206e756d626572206f662070726f78696573207468652075736572206861732e2c23203c2f7765696768743e4c72656d6f76655f616e6e6f756e63656d656e740801107265616c000130543a3a4163636f756e74496400012463616c6c5f6861736824013443616c6c486173684f663c543e0007407052656d6f7665206120676976656e20616e6e6f756e63656d656e742e0059014d61792062652063616c6c656420627920612070726f7879206163636f756e7420746f2072656d6f766520612063616c6c20746865792070726576696f75736c7920616e6e6f756e63656420616e642072657475726e30746865206465706f7369742e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e002c506172616d65746572733a0d012d20607265616c603a20546865206163636f756e742074686174207468652070726f78792077696c6c206d616b6520612063616c6c206f6e20626568616c66206f662e15012d206063616c6c5f68617368603a205468652068617368206f66207468652063616c6c20746f206265206d6164652062792074686520607265616c60206163636f756e742e002823203c7765696768743e6057656967687420697320612066756e6374696f6e206f663a982d20413a20746865206e756d626572206f6620616e6e6f756e63656d656e7473206d6164652ea02d20503a20746865206e756d626572206f662070726f78696573207468652075736572206861732e2c23203c2f7765696768743e4c72656a6563745f616e6e6f756e63656d656e7408012064656c6567617465000130543a3a4163636f756e74496400012463616c6c5f6861736824013443616c6c486173684f663c543e000840b052656d6f76652074686520676976656e20616e6e6f756e63656d656e74206f6620612064656c65676174652e0061014d61792062652063616c6c6564206279206120746172676574202870726f7869656429206163636f756e7420746f2072656d6f766520612063616c6c2074686174206f6e65206f662074686569722064656c6567617465732501286064656c656761746560292068617320616e6e6f756e63656420746865792077616e7420746f20657865637574652e20546865206465706f7369742069732072657475726e65642e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e002c506172616d65746572733af42d206064656c6567617465603a20546865206163636f756e7420746861742070726576696f75736c7920616e6e6f756e636564207468652063616c6c2ebc2d206063616c6c5f68617368603a205468652068617368206f66207468652063616c6c20746f206265206d6164652e002823203c7765696768743e6057656967687420697320612066756e6374696f6e206f663a982d20413a20746865206e756d626572206f6620616e6e6f756e63656d656e7473206d6164652ea02d20503a20746865206e756d626572206f662070726f78696573207468652075736572206861732e2c23203c2f7765696768743e3c70726f78795f616e6e6f756e63656410012064656c6567617465000130543a3a4163636f756e7449640001107265616c000130543a3a4163636f756e744964000140666f7263655f70726f78795f74797065c50301504f7074696f6e3c543a3a50726f7879547970653e00011063616c6c71030160426f783c3c5420617320436f6e6669673e3a3a43616c6c3e0009444d0144697370617463682074686520676976656e206063616c6c602066726f6d20616e206163636f756e742074686174207468652073656e64657220697320617574686f72697a656420666f72207468726f75676830606164645f70726f7879602e00a852656d6f76657320616e7920636f72726573706f6e64696e6720616e6e6f756e63656d656e742873292e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e002c506172616d65746572733a0d012d20607265616c603a20546865206163636f756e742074686174207468652070726f78792077696c6c206d616b6520612063616c6c206f6e20626568616c66206f662e61012d2060666f7263655f70726f78795f74797065603a2053706563696679207468652065786163742070726f7879207479706520746f206265207573656420616e6420636865636b656420666f7220746869732063616c6c2ed02d206063616c6c603a205468652063616c6c20746f206265206d6164652062792074686520607265616c60206163636f756e742e002823203c7765696768743e6057656967687420697320612066756e6374696f6e206f663a982d20413a20746865206e756d626572206f6620616e6e6f756e63656d656e7473206d6164652ea02d20503a20746865206e756d626572206f662070726f78696573207468652075736572206861732e2c23203c2f7765696768743e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ec50304184f7074696f6e04045401d00108104e6f6e6500000010536f6d650400d00000010000c9030c3c70616c6c65745f707265696d6167651870616c6c65741043616c6c040454000110346e6f74655f707265696d616765040114627974657328011c5665633c75383e000010745265676973746572206120707265696d616765206f6e2d636861696e2e00550149662074686520707265696d616765207761732070726576696f75736c79207265717565737465642c206e6f2066656573206f72206465706f73697473206172652074616b656e20666f722070726f766964696e67550174686520707265696d6167652e204f74686572776973652c2061206465706f7369742069732074616b656e2070726f706f7274696f6e616c20746f207468652073697a65206f662074686520707265696d6167652e3c756e6e6f74655f707265696d6167650401106861736824011c543a3a48617368000104dc436c65617220616e20756e72657175657374656420707265696d6167652066726f6d207468652072756e74696d652073746f726167652e40726571756573745f707265696d6167650401106861736824011c543a3a48617368000210410152657175657374206120707265696d6167652062652075706c6f6164656420746f2074686520636861696e20776974686f757420706179696e6720616e792066656573206f72206465706f736974732e00550149662074686520707265696d6167652072657175657374732068617320616c7265616479206265656e2070726f7669646564206f6e2d636861696e2c20776520756e7265736572766520616e79206465706f7369743901612075736572206d6179206861766520706169642c20616e642074616b652074686520636f6e74726f6c206f662074686520707265696d616765206f7574206f662074686569722068616e64732e48756e726571756573745f707265696d6167650401106861736824011c543a3a4861736800030cbc436c65617220612070726576696f75736c79206d616465207265717565737420666f72206120707265696d6167652e002d014e4f54453a2054484953204d555354204e4f542042452043414c4c4544204f4e20606861736860204d4f52452054494d4553205448414e2060726571756573745f707265696d616765602e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ecd030c4470616c6c65745f6d656d626572736869701870616c6c65741043616c6c08045400044900011c286164645f6d656d62657204010c77686f000130543a3a4163636f756e74496400000c784164642061206d656d626572206077686f6020746f20746865207365742e009c4d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a4164644f726967696e602e3472656d6f76655f6d656d62657204010c77686f000130543a3a4163636f756e74496400010c8c52656d6f76652061206d656d626572206077686f602066726f6d20746865207365742e00a84d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a52656d6f76654f726967696e602e2c737761705f6d656d62657208011872656d6f7665000130543a3a4163636f756e74496400010c616464000130543a3a4163636f756e744964000214bc53776170206f7574206f6e65206d656d626572206072656d6f76656020666f7220616e6f746865722060616464602e00a04d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a537761704f726967696e602e000d015072696d65206d656d62657273686970206973202a6e6f742a207061737365642066726f6d206072656d6f76656020746f2060616464602c20696620657874616e742e3472657365745f6d656d6265727304011c6d656d626572738801445665633c543a3a4163636f756e7449643e00031055014368616e676520746865206d656d6265727368697020746f2061206e6577207365742c20646973726567617264696e6720746865206578697374696e67206d656d626572736869702e204265206e69636520616e64687061737320606d656d6265727360207072652d736f727465642e00a44d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a52657365744f726967696e602e286368616e67655f6b657904010c6e6577000130543a3a4163636f756e744964000414d453776170206f7574207468652073656e64696e67206d656d62657220666f7220736f6d65206f74686572206b657920606e6577602e00f04d6179206f6e6c792062652063616c6c65642066726f6d20605369676e656460206f726967696e206f6620612063757272656e74206d656d6265722e001d015072696d65206d656d62657273686970206973207061737365642066726f6d20746865206f726967696e206163636f756e7420746f20606e6577602c20696620657874616e742e247365745f7072696d6504010c77686f000130543a3a4163636f756e74496400050cbc53657420746865207072696d65206d656d6265722e204d75737420626520612063757272656e74206d656d6265722e00a44d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a5072696d654f726967696e602e2c636c6561725f7072696d6500060c9452656d6f766520746865207072696d65206d656d626572206966206974206578697374732e00a44d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a5072696d654f726967696e602e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ed1030c2c70616c6c65745f746970731870616c6c65741043616c6c040454000118387265706f72745f617765736f6d65080118726561736f6e28011c5665633c75383e00010c77686f000130543a3a4163636f756e74496400004c59015265706f727420736f6d657468696e672060726561736f6e60207468617420646573657276657320612074697020616e6420636c61696d20616e79206576656e7475616c207468652066696e6465722773206665652e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e0051015061796d656e743a20605469705265706f72744465706f73697442617365602077696c6c2062652072657365727665642066726f6d20746865206f726967696e206163636f756e742c2061732077656c6c206173bc60446174614465706f736974506572427974656020666f722065616368206279746520696e2060726561736f6e602e005d012d2060726561736f6e603a2054686520726561736f6e20666f722c206f7220746865207468696e6720746861742064657365727665732c20746865207469703b2067656e6572616c6c7920746869732077696c6c20626558202061205554462d382d656e636f6465642055524c2ee82d206077686f603a20546865206163636f756e742077686963682073686f756c6420626520637265646974656420666f7220746865207469702e0074456d69747320604e657754697060206966207375636365737366756c2e002823203c7765696768743ec82d20436f6d706c65786974793a20604f2852296020776865726520605260206c656e677468206f662060726561736f6e602e9020202d20656e636f64696e6720616e642068617368696e67206f662027726561736f6e27702d20446252656164733a2060526561736f6e73602c20605469707360742d2044625772697465733a2060526561736f6e73602c206054697073602c23203c2f7765696768743e2c726574726163745f7469700401106861736824011c543a3a4861736800014c5101526574726163742061207072696f72207469702d7265706f72742066726f6d20607265706f72745f617765736f6d65602c20616e642063616e63656c207468652070726f63657373206f662074697070696e672e00dc4966207375636365737366756c2c20746865206f726967696e616c206465706f7369742077696c6c20626520756e72657365727665642e004d01546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e642074686520746970206964656e7469666965642062792060686173686041016d7573742068617665206265656e207265706f7274656420627920746865207369676e696e67206163636f756e74207468726f75676820607265706f72745f617765736f6d65602028616e64206e6f744c7468726f75676820607469705f6e657760292e0061012d206068617368603a20546865206964656e74697479206f6620746865206f70656e2074697020666f722077686963682061207469702076616c7565206973206465636c617265642e205468697320697320666f726d65645d0120206173207468652068617368206f6620746865207475706c65206f6620746865206f726967696e616c207469702060726561736f6e6020616e64207468652062656e6566696369617279206163636f756e742049442e008c456d697473206054697052657472616374656460206966207375636365737366756c2e002823203c7765696768743e502d20436f6d706c65786974793a20604f28312960d820202d20446570656e6473206f6e20746865206c656e677468206f662060543a3a48617368602077686963682069732066697865642e8c2d20446252656164733a206054697073602c20606f726967696e206163636f756e7460bc2d2044625772697465733a2060526561736f6e73602c206054697073602c20606f726967696e206163636f756e74602c23203c2f7765696768743e1c7469705f6e65770c0118726561736f6e28011c5665633c75383e00010c77686f000130543a3a4163636f756e7449640001247469705f76616c75654901013042616c616e63654f663c543e000258f04769766520612074697020666f7220736f6d657468696e67206e65773b206e6f2066696e6465722773206665652077696c6c2062652074616b656e2e005101546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e6420746865207369676e696e67206163636f756e74206d7573742062652061706d656d626572206f662074686520605469707065727360207365742e005d012d2060726561736f6e603a2054686520726561736f6e20666f722c206f7220746865207468696e6720746861742064657365727665732c20746865207469703b2067656e6572616c6c7920746869732077696c6c20626558202061205554462d382d656e636f6465642055524c2ee82d206077686f603a20546865206163636f756e742077686963682073686f756c6420626520637265646974656420666f7220746865207469702e4d012d20607469705f76616c7565603a2054686520616d6f756e74206f66207469702074686174207468652073656e64657220776f756c64206c696b6520746f20676976652e20546865206d656469616e20746970d4202076616c7565206f662061637469766520746970706572732077696c6c20626520676976656e20746f20746865206077686f602e0074456d69747320604e657754697060206966207375636365737366756c2e002823203c7765696768743e51012d20436f6d706c65786974793a20604f2852202b2054296020776865726520605260206c656e677468206f662060726561736f6e602c2060546020697320746865206e756d626572206f6620746970706572732e5d0120202d20604f285429603a206465636f64696e6720605469707065726020766563206f66206c656e677468206054602e20605460206973206368617267656420617320757070657220626f756e6420676976656e2062792d012020202060436f6e7461696e734c656e677468426f756e64602e205468652061637475616c20636f737420646570656e6473206f6e2074686520696d706c656d656e746174696f6e206f66442020202060543a3a54697070657273602ee020202d20604f285229603a2068617368696e6720616e6420656e636f64696e67206f6620726561736f6e206f66206c656e677468206052607c2d20446252656164733a206054697070657273602c2060526561736f6e7360742d2044625772697465733a2060526561736f6e73602c206054697073602c23203c2f7765696768743e0c7469700801106861736824011c543a3a486173680001247469705f76616c75654901013042616c616e63654f663c543e000360b04465636c6172652061207469702076616c756520666f7220616e20616c72656164792d6f70656e207469702e005101546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e6420746865207369676e696e67206163636f756e74206d7573742062652061706d656d626572206f662074686520605469707065727360207365742e0061012d206068617368603a20546865206964656e74697479206f6620746865206f70656e2074697020666f722077686963682061207469702076616c7565206973206465636c617265642e205468697320697320666f726d65645d0120206173207468652068617368206f6620746865207475706c65206f66207468652068617368206f6620746865206f726967696e616c207469702060726561736f6e6020616e64207468652062656e65666963696172793420206163636f756e742049442e4d012d20607469705f76616c7565603a2054686520616d6f756e74206f66207469702074686174207468652073656e64657220776f756c64206c696b6520746f20676976652e20546865206d656469616e20746970d4202076616c7565206f662061637469766520746970706572732077696c6c20626520676976656e20746f20746865206077686f602e006101456d6974732060546970436c6f73696e676020696620746865207468726573686f6c64206f66207469707065727320686173206265656e207265616368656420616e642074686520636f756e74646f776e20706572696f643068617320737461727465642e002823203c7765696768743e61012d20436f6d706c65786974793a20604f285429602077686572652060546020697320746865206e756d626572206f6620746970706572732e206465636f64696e6720605469707065726020766563206f66206c656e6774682d0120206054602c20696e736572742074697020616e6420636865636b20636c6f73696e672c20605460206973206368617267656420617320757070657220626f756e6420676976656e2062795d01202060436f6e7461696e734c656e677468426f756e64602e205468652061637475616c20636f737420646570656e6473206f6e2074686520696d706c656d656e746174696f6e206f662060543a3a54697070657273602e005d01202041637475616c6c792077656967687420636f756c64206265206c6f77657220617320697420646570656e6473206f6e20686f77206d616e7920746970732061726520696e20604f70656e5469706020627574206974d02020697320776569676874656420617320696620616c6d6f73742066756c6c20692e65206f66206c656e6774682060542d31602e702d20446252656164733a206054697070657273602c20605469707360482d2044625772697465733a206054697073602c23203c2f7765696768743e24636c6f73655f7469700401106861736824011c543a3a486173680004405c436c6f736520616e64207061796f75742061207469702e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e00150154686520746970206964656e74696669656420627920606861736860206d75737420686176652066696e69736865642069747320636f756e74646f776e20706572696f642e0061012d206068617368603a20546865206964656e74697479206f6620746865206f70656e2074697020666f722077686963682061207469702076616c7565206973206465636c617265642e205468697320697320666f726d65645d0120206173207468652068617368206f6620746865207475706c65206f6620746865206f726967696e616c207469702060726561736f6e6020616e64207468652062656e6566696369617279206163636f756e742049442e002823203c7765696768743e61012d20436f6d706c65786974793a20604f285429602077686572652060546020697320746865206e756d626572206f6620746970706572732e206465636f64696e6720605469707065726020766563206f66206c656e677468510120206054602e20605460206973206368617267656420617320757070657220626f756e6420676976656e2062792060436f6e7461696e734c656e677468426f756e64602e205468652061637475616c20636f7374c02020646570656e6473206f6e2074686520696d706c656d656e746174696f6e206f662060543a3a54697070657273602ea82d20446252656164733a206054697073602c206054697070657273602c20607469702066696e64657260d82d2044625772697465733a2060526561736f6e73602c206054697073602c206054697070657273602c20607469702066696e646572602c23203c2f7765696768743e24736c6173685f7469700401106861736824011c543a3a486173680005309452656d6f766520616e6420736c61736820616e20616c72656164792d6f70656e207469702e00a84d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a52656a6563744f726967696e602e00f44173206120726573756c742c207468652066696e64657220697320736c617368656420616e6420746865206465706f7369747320617265206c6f73742e0084456d6974732060546970536c617368656460206966207375636365737366756c2e002823203c7765696768743efc2020605460206973206368617267656420617320757070657220626f756e6420676976656e2062792060436f6e7461696e734c656e677468426f756e64602e010120205468652061637475616c20636f737420646570656e6473206f6e2074686520696d706c656d656e746174696f6e206f662060543a3a54697070657273602e2c23203c2f7765696768743e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ed5030c1463747970651870616c6c65741043616c6c0404540001040c616464040114637479706528011c5665633c75383e00003009014372656174652061206e65772043547970652066726f6d2074686520676976656e20756e69717565204354797065206861736820616e64206173736f6369617465735069742077697468206974732063726561746f722e00dc412043547970652077697468207468652073616d652068617368206d757374206e6f742062652073746f726564206f6e20636861696e2e0054456d6974732060435479706543726561746564602e002823203c7765696768743e305765696768743a204f283129602d2052656164733a204374797065732c2042616c616e6365642d205772697465733a204374797065732c2042616c616e63652c23203c2f7765696768743e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ed9030c2c6174746573746174696f6e1870616c6c65741043616c6c0404540001100c6164640c0128636c61696d5f68617368240138436c61696d486173684f663c543e00012863747970655f686173682401384374797065486173684f663c543e000134617574686f72697a6174696f6edd0301604f7074696f6e3c543a3a416363657373436f6e74726f6c3e000054644372656174652061206e6577206174746573746174696f6e2e00f85468652061747465737465722063616e206f7074696f6e616c6c792070726f766964652061207265666572656e636520746f20616e206578697374696e67090164656c65676174696f6e20746861742077696c6c20626520736176656420616c6f6e67207769746820746865206174746573746174696f6e20697473656c6620696e8c74686520666f726d206f6620616e2061747465737465642064656c65676174696f6e2e00ec546865207265666572656e6365642043547970652068617368206d75737420616c72656164792062652070726573656e74206f6e20636861696e2e000901496620616e206f7074696f6e616c2064656c65676174696f6e2069642069732070726f76696465642c20746865206469737061746368206f726967696e206d757374e8626520746865206f776e6572206f66207468652064656c65676174696f6e2e204f74686572776973652c20697420636f756c6420626520616e79546044656c65676174696f6e456e746974794964602e006c456d69747320604174746573746174696f6e43726561746564602e002823203c7765696768743e305765696768743a204f283129b82d2052656164733a205b4f726967696e204163636f756e745d2c2043747970652c204174746573746174696f6e73e42d2052656164732069662064656c65676174696f6e2069642069732070726f76696465643a2044656c65676174696f6e732c20526f6f74732c5c202044656c6567617465644174746573746174696f6e73bc2d205772697465733a204174746573746174696f6e732c202844656c6567617465644174746573746174696f6e73292c23203c2f7765696768743e187265766f6b65080128636c61696d5f68617368240138436c61696d486173684f663c543e000134617574686f72697a6174696f6edd0301604f7074696f6e3c543a3a416363657373436f6e74726f6c3e0001447c5265766f6b6520616e206578697374696e67206174746573746174696f6e2e00fc546865207265766f6b6572206d75737420626520656974686572207468652063726561746f72206f6620746865206174746573746174696f6e206265696e6709017265766f6b6564206f7220616e20656e74697479207468617420696e207468652064656c65676174696f6e207472656520697320616e20616e636573746f72206f6609017468652061747465737465722c20692e652e2c2069742077617320656974686572207468652064656c656761746f72206f6620746865206174746573746572206f7250616e20616e636573746f722074686572656f662e006c456d69747320604174746573746174696f6e5265766f6b6564602e002823203c7765696768743e0d015765696768743a204f285029207768657265205020697320746865206e756d626572206f6620737465707320726571756972656420746f2076657269667920746861740901746865206469737061746368204f726967696e20636f6e74726f6c73207468652064656c65676174696f6e20656e7469746c656420746f207265766f6b6520746865c86174746573746174696f6e2e20497420697320626f756e64656420627920606d61785f706172656e745f636865636b73602ee82d2052656164733a205b4f726967696e204163636f756e745d2c204174746573746174696f6e732c2064656c65676174696f6e3a3a526f6f7473d82d205265616473207065722064656c65676174696f6e207374657020503a2064656c65676174696f6e3a3a44656c65676174696f6e73b42d205772697465733a204174746573746174696f6e732c2044656c6567617465644174746573746174696f6e732c23203c2f7765696768743e1872656d6f7665080128636c61696d5f68617368240138436c61696d486173684f663c543e000134617574686f72697a6174696f6edd0301604f7074696f6e3c543a3a416363657373436f6e74726f6c3e0002445852656d6f766520616e206174746573746174696f6e2e00f8546865206f726967696e206d75737420626520656974686572207468652063726561746f72206f6620746865206174746573746174696f6e206f7220616e0d01656e7469747920776869636820697320616e20616e636573746f72206f662074686520617474657374657220696e207468652064656c65676174696f6e20747265652c0101692e652e2c2069742077617320656974686572207468652064656c656761746f72206f6620746865206174746573746572206f7220616e20616e636573746f722074686572656f662e006c456d69747320604174746573746174696f6e52656d6f766564602e002823203c7765696768743e0d015765696768743a204f285029207768657265205020697320746865206e756d626572206f6620737465707320726571756972656420746f2076657269667920746861740901746865206469737061746368204f726967696e20636f6e74726f6c73207468652064656c65676174696f6e20656e7469746c656420746f207265766f6b6520746865c86174746573746174696f6e2e20497420697320626f756e64656420627920606d61785f706172656e745f636865636b73602ee82d2052656164733a205b4f726967696e204163636f756e745d2c204174746573746174696f6e732c2064656c65676174696f6e3a3a526f6f7473d82d205265616473207065722064656c65676174696f6e207374657020503a2064656c65676174696f6e3a3a44656c65676174696f6e73b42d205772697465733a204174746573746174696f6e732c2044656c6567617465644174746573746174696f6e732c23203c2f7765696768743e3c7265636c61696d5f6465706f736974040128636c61696d5f68617368240138436c61696d486173684f663c543e000324d05265636c61696d20612073746f72616765206465706f7369742062792072656d6f76696e6720616e206174746573746174696f6e0064456d69747320604465706f7369745265636c61696d6564602e002823203c7765696768743e305765696768743a204f283129f82d2052656164733a205b4f726967696e204163636f756e745d2c204174746573746174696f6e732c2044656c6567617465644174746573746174696f6e73b42d205772697465733a204174746573746174696f6e732c2044656c6567617465644174746573746174696f6e732c23203c2f7765696768743e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632edd0304184f7074696f6e04045401e1030108104e6f6e6500000010536f6d650400e1030000010000e1030c3872756e74696d655f636f6d6d6f6e34617574686f72697a6174696f6e3c50616c6c6574417574686f72697a65043044656c65676174696f6e416301e50301042844656c65676174696f6e0400e503013044656c65676174696f6e416300000000e5030c2864656c65676174696f6e386163636573735f636f6e74726f6c3044656c65676174696f6e416304045401e9030008013c7375626a6563745f6e6f64655f696424015444656c65676174696f6e4e6f646549644f663c543e0001286d61785f636865636b731c010c7533320000e90308447370697269746e65745f72756e74696d651c52756e74696d6500000000ed030c2864656c65676174696f6e1870616c6c65741043616c6c040454000114406372656174655f686965726172636879080130726f6f745f6e6f64655f696424015444656c65676174696f6e4e6f646549644f663c543e00012863747970655f686173682401384374797065486173684f663c543e00006401014372656174652061206e65772064656c65676174696f6e20726f6f74206173736f6369617465642077697468206120676976656e20435479706520686173682e00f8546865206e657720726f6f742077696c6c20616c6c6f772061206e65772074727573742068696572617263687920746f2062652063726561746564206279a0616464696e67206368696c6472656e2064656c65676174696f6e7320746f2074686520726f6f742e000d015468657265206d757374206265206e6f2064656c65676174696f6e2077697468207468652073616d652049442073746f726564206f6e20636861696e2c207768696c65fc7468657265206d75737420626520616c7265616479206120435479706520776974682074686520676976656e20686173682073746f72656420696e207468653443547970652070616c6c65742e0098546865206469737061746368206f726967696e206d7573742062652073706c697420696e746f0d012a2061207375626d6974746572206f66207479706520604163636f756e744964602077686f20697320726573706f6e7369626c6520666f7220706179696e67207468655420207472616e73616374696f6e2066656520616e6409012a206120444944207375626a656374206f662074797065206044656c65676174696f6e456e746974794964602077686f20637265617465732c206f776e7320616e6470202063616e207265766f6b65207468652064656c65676174696f6e2e000d015265717569726573207468652073656e646572206f6620746865207472616e73616374696f6e20746f206861766520612072657365727661626c652062616c616e6365886f66206174206c6561737420604465706f73697460206d616e7920746f6b656e732e0050456d6974732060526f6f7443726561746564602e002823203c7765696768743e305765696768743a204f283129a02d2052656164733a205b4f726967696e204163636f756e745d2c20526f6f74732c204354797065733c2d205772697465733a20526f6f74732c23203c2f7765696768743e386164645f64656c65676174696f6e14013464656c65676174696f6e5f696424015444656c65676174696f6e4e6f646549644f663c543e000124706172656e745f696424015444656c65676174696f6e4e6f646549644f663c543e00012064656c656761746500014044656c656761746f7249644f663c543e00012c7065726d697373696f6e73f8012c5065726d697373696f6e7300014864656c65676174655f7369676e6174757265f103016844656c65676174655369676e6174757265547970654f663c543e000180744372656174652061206e65772064656c65676174696f6e206e6f64652e00f4546865206e65772064656c65676174696f6e206e6f646520726570726573656e74732061206e65772074727573742068696572617263687920746861740d01636f6e73696465727320746865206e6577206e6f64652061732069747320726f6f742e20546865206f776e6572206f662074686973206e6f6465206861732066756c6ce0636f6e74726f6c206f76657220616e79206f66206974732064697265637420616e6420696e6469726563742064657363656e64616e74732e00fc466f7220746865206372656174696f6e20746f20737563636565642c207468652064656c656761746565206d7573742070726f7669646520612076616c696411017369676e6174757265206f766572207468652028626c616b65323536292068617368206f6620746865206372656174696f6e206f7065726174696f6e2064657461696c731101776869636820696e636c7564652028696e206f72646572292064656c65676174696f6e2069642c20726f6f74206e6f64652069642c20706172656e742069642c20616e64707065726d697373696f6e73206f6620746865206e6577206e6f64652e00f45468657265206d757374206265206e6f2064656c65676174696f6e2077697468207468652073616d652069642073746f726564206f6e20636861696e2e0501467572746865726d6f72652c20746865207265666572656e63656420726f6f7420616e6420706172656e74206e6f646573206d75737420616c7265616479206265050170726573656e74206f6e20636861696e20616e6420636f6e7461696e207468652076616c6964207065726d697373696f6e7320616e64207265766f636174696f6e6c7374617475732028692e652e2c206e6f74207265766f6b6564292e0098546865206469737061746368206f726967696e206d7573742062652073706c697420696e746f0d012a2061207375626d6974746572206f66207479706520604163636f756e744964602077686f20697320726573706f6e7369626c6520666f7220706179696e67207468655420207472616e73616374696f6e2066656520616e6409012a206120444944207375626a656374206f662074797065206044656c65676174696f6e456e746974794964602077686f20637265617465732c206f776e7320616e6470202063616e207265766f6b65207468652064656c65676174696f6e2e000d015265717569726573207468652073656e646572206f6620746865207472616e73616374696f6e20746f206861766520612072657365727661626c652062616c616e6365886f66206174206c6561737420604465706f73697460206d616e7920746f6b656e732e0068456d697473206044656c65676174696f6e43726561746564602e002823203c7765696768743e305765696768743a204f283129b42d2052656164733a205b4f726967696e204163636f756e745d2c20526f6f74732c2044656c65676174696f6e73542d205772697465733a2044656c65676174696f6e732c23203c2f7765696768743e447265766f6b655f64656c65676174696f6e0c013464656c65676174696f6e5f696424015444656c65676174696f6e4e6f646549644f663c543e0001446d61785f706172656e745f636865636b731c010c75333200013c6d61785f7265766f636174696f6e731c010c753332000274f85265766f6b6520612064656c65676174696f6e206e6f64652028706f74656e7469616c6c79206120726f6f74206e6f64652920616e6420616c6c20697473246368696c6472656e2e00fc446f6573206e6f7420726566756e64207468652064656c65676174696f6e206261636b20746f20746865206465706f736974206f776e657220617320746865f06e6f6465206973207374696c6c2073746f726564206f6e20636861696e2e20526571756972657320746f206164646974696f6e616c6c792063616c6cb46072656d6f76655f64656c65676174696f6e6020746f20756e7265736572766520746865206465706f7369742e0009015265766f6b696e6720612064656c65676174696f6e206e6f646520726573756c747320696e2074686520747275737420686965726172636879207374617274696e67090166726f6d2074686520676976656e206e6f6465206265696e67207265766f6b65642e204e657665727468656c6573732c207265766f636174696f6e20737461727473090166726f6d20746865206c65617665206e6f64657320757077617264732c20736f20696620746865206f7065726174696f6e20656e6473207072656d61747572656c791101626563617573652069742072756e73206f7574206f66206761732c207468652064656c65676174696f6e20737461746520776f756c6420626520636f6e73697374656e7401016173206e6f206368696c6420776f756c64202273757276697665222069747320706172656e742e204173206120636f6e73657175656e63652c206966207468650d01676976656e206e6f6465206973207265766f6b65642c2074686520747275737420686965726172636879207769746820746865206e6f646520617320726f6f7420697364746f20626520636f6e73696465726564207265766f6b65642e0098546865206469737061746368206f726967696e206d7573742062652073706c697420696e746f0d012a2061207375626d6974746572206f66207479706520604163636f756e744964602077686f20697320726573706f6e7369626c6520666f7220706179696e67207468655420207472616e73616374696f6e2066656520616e6409012a206120444944207375626a656374206f662074797065206044656c65676174696f6e456e746974794964602077686f20637265617465732c206f776e7320616e6470202063616e207265766f6b65207468652064656c65676174696f6e2e0078456d6974732043202a206044656c65676174696f6e5265766f6b6564602e002823203c7765696768743e01015765696768743a204f284329207768657265204320697320746865206e756d626572206f66206368696c6472656e206f66207468652064656c65676174696f6ea06e6f646520776869636820697320626f756e64656420627920606d61785f6368696c6472656e602e01012d2052656164733a205b4f726967696e204163636f756e745d2c20526f6f74732c2043202a2044656c65676174696f6e732c2043202a204368696c6472656e2e802d205772697465733a20526f6f74732c2043202a2044656c65676174696f6e732c23203c2f7765696768743e4472656d6f76655f64656c65676174696f6e08013464656c65676174696f6e5f696424015444656c65676174696f6e4e6f646549644f663c543e0001306d61785f72656d6f76616c731c010c753332000370f852656d6f766520612064656c65676174696f6e206e6f64652028706f74656e7469616c6c79206120726f6f74206e6f64652920616e6420616c6c20697473246368696c6472656e2e00f052657475726e73207468652064656c65676174696f6e206465706f73697420746f20746865206465706f736974206f776e657220666f722065616368a472656d6f7665642044656c65676174696f6e4e6f646520627920756e726573657276696e672069742e00090152656d6f76696e6720612064656c65676174696f6e206e6f646520726573756c747320696e2074686520747275737420686965726172636879207374617274696e67fc66726f6d2074686520676976656e206e6f6465206265696e672072656d6f7665642e204e657665727468656c6573732c2072656d6f76616c20737461727473090166726f6d20746865206c65617665206e6f64657320757077617264732c20736f20696620746865206f7065726174696f6e20656e6473207072656d61747572656c791101626563617573652069742072756e73206f7574206f66206761732c207468652064656c65676174696f6e20737461746520776f756c6420626520636f6e73697374656e7401016173206e6f206368696c6420776f756c64202273757276697665222069747320706172656e742e204173206120636f6e73657175656e63652c206966207468650d01676976656e206e6f64652069732072656d6f7665642c2074686520747275737420686965726172636879207769746820746865206e6f646520617320726f6f7420697364746f20626520636f6e736964657265642072656d6f7665642e0098546865206469737061746368206f726967696e206d7573742062652073706c697420696e746f0d012a2061207375626d6974746572206f66207479706520604163636f756e744964602077686f20697320726573706f6e7369626c6520666f7220706179696e67207468655420207472616e73616374696f6e2066656520616e6409012a206120444944207375626a656374206f662074797065206044656c65676174696f6e456e746974794964602077686f20637265617465732c206f776e7320616e6470202063616e207265766f6b65207468652064656c65676174696f6e2e0078456d6974732043202a206044656c65676174696f6e52656d6f766564602e002823203c7765696768743e01015765696768743a204f284329207768657265204320697320746865206e756d626572206f66206368696c6472656e206f66207468652064656c65676174696f6ea06e6f646520776869636820697320626f756e64656420627920606d61785f6368696c6472656e602e01012d2052656164733a205b4f726967696e204163636f756e745d2c20526f6f74732c2043202a2044656c65676174696f6e732c2043202a204368696c6472656e2e902d205772697465733a20526f6f74732c2032202a2043202a2044656c65676174696f6e732c23203c2f7765696768743e3c7265636c61696d5f6465706f73697408013464656c65676174696f6e5f696424015444656c65676174696f6e4e6f646549644f663c543e0001306d61785f72656d6f76616c731c010c753332000460f45265636c61696d20746865206465706f73697420666f7220612064656c65676174696f6e206e6f64652028706f74656e7469616c6c79206120726f6f74b86e6f6465292c2072656d6f76696e6720746865206e6f646520616e6420616c6c20697473206368696c6472656e2e00f052657475726e73207468652064656c65676174696f6e206465706f73697420746f20746865206465706f736974206f776e657220666f722065616368a472656d6f7665642044656c65676174696f6e4e6f646520627920756e726573657276696e672069742e00090152656d6f76696e6720612064656c65676174696f6e206e6f646520726573756c747320696e2074686520747275737420686965726172636879207374617274696e67fc66726f6d2074686520676976656e206e6f6465206265696e672072656d6f7665642e204e657665727468656c6573732c2072656d6f76616c20737461727473090166726f6d20746865206c65617665206e6f64657320757077617264732c20736f20696620746865206f7065726174696f6e20656e6473207072656d61747572656c791101626563617573652069742072756e73206f7574206f66206761732c207468652064656c65676174696f6e20737461746520776f756c6420626520636f6e73697374656e7401016173206e6f206368696c6420776f756c64202273757276697665222069747320706172656e742e204173206120636f6e73657175656e63652c206966207468650d01676976656e206e6f64652069732072656d6f7665642c2074686520747275737420686965726172636879207769746820746865206e6f646520617320726f6f7420697364746f20626520636f6e736964657265642072656d6f7665642e000d01546865206469737061746368206f726967696e206d757374206265207369676e6564206279207468652064656c65676174696f6e206465706f736974206f776e65722e004c604465706f7369745265636c61696d6564602e002823203c7765696768743e01015765696768743a204f284329207768657265204320697320746865206e756d626572206f66206368696c6472656e206f66207468652064656c65676174696f6ea06e6f646520776869636820697320626f756e64656420627920606d61785f72656d6f76616c73602e01012d2052656164733a205b4f726967696e204163636f756e745d2c20526f6f74732c2043202a2044656c65676174696f6e732c2043202a204368696c6472656e2e902d205772697465733a20526f6f74732c2032202a2043202a2044656c65676174696f6e732c23203c2f7765696768743e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ef1030c0c6469642c6469645f64657461696c73304469645369676e617475726500010c1c456432353531390400f5030148656432353531393a3a5369676e61747572650000001c537232353531390400fd030148737232353531393a3a5369676e617475726500010014456364736104000104014065636473613a3a5369676e617475726500020000f5030c1c73705f636f72651c65643235353139245369676e617475726500000400f90301205b75383b2036345d0000f903000003400000000800fd030c1c73705f636f72651c73723235353139245369676e617475726500000400f90301205b75383b2036345d000001040c1c73705f636f7265146563647361245369676e617475726500000400050401205b75383b2036355d0000050400000341000000080009040c0c6469641870616c6c65741043616c6c0404540001341863726561746508011c64657461696c730d040168426f783c4469644372656174696f6e44657461696c733c543e3e0001247369676e6174757265f10301304469645369676e617475726500007cec53746f72652061206e657720444944206f6e20636861696e2c20616674657220766572696679696e67207468617420746865206372656174696f6e05016f7065726174696f6e20686173206265656e207369676e656420627920746865204b494c54206163636f756e74206173736f63696174656420776974682074686501016964656e746966696572206f662074686520444944206265696e67206372656174656420616e6420746861742061204449442077697468207468652073616d6511016964656e74696669657220686173206e6f742070726576696f75736c792065786973746564206f6e2028616e64207468656e2064656c657465642066726f6d292074686518636861696e2e000d015468657265206d757374206265206e6f2044494420696e666f726d6174696f6e2073746f726564206f6e20636861696e20756e646572207468652073616d65204449442c6964656e7469666965722e00fc546865206e6577206b65797320616464656420776974682074686973206f7065726174696f6e206172652073746f72656420756e646572207468652044494405016964656e74696669657220616c6f6e6720776974682074686520626c6f636b206e756d62657220696e20776869636820746865206f7065726174696f6e207761732465786563757465642e000101546865206469737061746368206f726967696e2063616e20626520616e79204b494c54206163636f756e74207769746820656e6f7567682066756e647320746f0d0165786563757465207468652065787472696e73696320616e6420697420646f6573206e6f74206861766520746f206265207469656420696e20616e792077617920746fb4746865204b494c54206163636f756e74206964656e74696679696e672074686520444944207375626a6563742e004c456d697473206044696443726561746564602e002823203c7765696768743e0d012d20546865207472616e73616374696f6e277320636f6d706c6578697479206973206d61696e6c7920646570656e64656e74206f6e20746865206e756d626572206f66010120206e6577206b65792061677265656d656e74206b65797320616e6420746865206e756d626572206f66206e6577207365727669636520656e64706f696e7473702020696e636c7564656420696e20746865206f7065726174696f6e2e242d2d2d2d2d2d2d2d2df85765696768743a204f284b29202b204f284e29207768657265204b20697320746865206e756d626572206f66206e6577206b65792061677265656d656e7409016b65797320626f756e64656420627920604d61784e65774b657941677265656d656e744b657973602c207768696c65204e20697320746865206e756d626572206f66f46e6577207365727669636520656e64706f696e747320626f756e64656420627920604d61784e756d6265724f665365727669636573506572446964602eb02d2052656164733a205b4f726967696e204163636f756e745d2c204469642c20446964426c61636b6c697374fc2d205772697465733a20446964202877697468204b206e6577206b65792061677265656d656e74206b657973292c2053657276696365456e64706f696e7473cc20202877697468204e206e6577207365727669636520656e64706f696e7473292c20446964456e64706f696e7473436f756e742c23203c2f7765696768743e587365745f61757468656e7469636174696f6e5f6b657904011c6e65775f6b657925040148446964566572696669636174696f6e4b65790001408855706461746520746865204449442061757468656e7469636174696f6e206b65792e00ec546865206f6c64206b65792069732064656c657465642066726f6d2074686520736574206f66207075626c6963206b65797320696620697420697309016e6f74207573656420696e20616e79206f746865722070617274206f6620746865204449442e20546865206e6577206b657920697320616464656420746f207468654c736574206f66207075626c6963206b6579732e00e0546865206469737061746368206f726967696e206d757374206265206120444944206f726967696e2070726f78696564207669612074686570607375626d69745f6469645f63616c6c602065787472696e7369632e004c456d697473206044696455706461746564602e002823203c7765696768743e305765696768743a204f283129782d2052656164733a205b4f726967696e204163636f756e745d2c20446964342d205772697465733a204469642c23203c2f7765696768743e487365745f64656c65676174696f6e5f6b657904011c6e65775f6b657925040148446964566572696669636174696f6e4b657900024094536574206f722075706461746520746865204449442064656c65676174696f6e206b65792e000d01496620616e206f6c64206b657920657869737465642c2069742069732064656c657465642066726f6d2074686520736574206f66207075626c6963206b65797320696611016974206973206e6f74207573656420696e20616e79206f746865722070617274206f6620746865204449442e20546865206e6577206b657920697320616464656420746f5c74686520736574206f66207075626c6963206b6579732e00e0546865206469737061746368206f726967696e206d757374206265206120444944206f726967696e2070726f78696564207669612074686570607375626d69745f6469645f63616c6c602065787472696e7369632e004c456d697473206044696455706461746564602e002823203c7765696768743e305765696768743a204f283129782d2052656164733a205b4f726967696e204163636f756e745d2c20446964342d205772697465733a204469642c23203c2f7765696768743e5472656d6f76655f64656c65676174696f6e5f6b657900033c7852656d6f766520746865204449442064656c65676174696f6e206b65792e00d4546865206f6c64206b65792069732064656c657465642066726f6d2074686520736574206f66207075626c6963206b657973206966b06974206973206e6f74207573656420696e20616e79206f746865722070617274206f6620746865204449442e00e0546865206469737061746368206f726967696e206d757374206265206120444944206f726967696e2070726f78696564207669612074686570607375626d69745f6469645f63616c6c602065787472696e7369632e004c456d697473206044696455706461746564602e002823203c7765696768743e305765696768743a204f283129782d2052656164733a205b4f726967696e204163636f756e745d2c20446964342d205772697465733a204469642c23203c2f7765696768743e4c7365745f6174746573746174696f6e5f6b657904011c6e65775f6b657925040148446964566572696669636174696f6e4b657900044098536574206f72207570646174652074686520444944206174746573746174696f6e206b65792e000d01496620616e206f6c64206b657920657869737465642c2069742069732064656c657465642066726f6d2074686520736574206f66207075626c6963206b65797320696611016974206973206e6f74207573656420696e20616e79206f746865722070617274206f6620746865204449442e20546865206e6577206b657920697320616464656420746f5c74686520736574206f66207075626c6963206b6579732e00e0546865206469737061746368206f726967696e206d757374206265206120444944206f726967696e2070726f78696564207669612074686570607375626d69745f6469645f63616c6c602065787472696e7369632e004c456d697473206044696455706461746564602e002823203c7765696768743e305765696768743a204f283129782d2052656164733a205b4f726967696e204163636f756e745d2c20446964342d205772697465733a204469642c23203c2f7765696768743e5872656d6f76655f6174746573746174696f6e5f6b657900053c7c52656d6f76652074686520444944206174746573746174696f6e206b65792e00d4546865206f6c64206b65792069732064656c657465642066726f6d2074686520736574206f66207075626c6963206b657973206966b06974206973206e6f74207573656420696e20616e79206f746865722070617274206f6620746865204449442e00e0546865206469737061746368206f726967696e206d757374206265206120444944206f726967696e2070726f78696564207669612074686570607375626d69745f6469645f63616c6c602065787472696e7369632e004c456d697473206044696455706461746564602e002823203c7765696768743e305765696768743a204f283129782d2052656164733a205b4f726967696e204163636f756e745d2c20446964342d205772697465733a204469642c23203c2f7765696768743e546164645f6b65795f61677265656d656e745f6b657904011c6e65775f6b657915040140446964456e6372797074696f6e4b6579000638b841646420612073696e676c65206e6577206b65792061677265656d656e74206b657920746f20746865204449442e00bc546865206e6577206b657920697320616464656420746f2074686520736574206f66207075626c6963206b6579732e00e0546865206469737061746368206f726967696e206d757374206265206120444944206f726967696e2070726f78696564207669612074686570607375626d69745f6469645f63616c6c602065787472696e7369632e004c456d697473206044696455706461746564602e002823203c7765696768743e305765696768743a204f283129782d2052656164733a205b4f726967696e204163636f756e745d2c20446964342d205772697465733a204469642c23203c2f7765696768743e6072656d6f76655f6b65795f61677265656d656e745f6b65790401186b65795f69642401284b657949644f663c543e000734050152656d6f7665206120444944206b65792061677265656d656e74206b65792066726f6d20626f74682069747320736574206f66206b65792061677265656d656e74906b65797320616e642061732077656c6c20617320697473207075626c6963206b6579732e00e0546865206469737061746368206f726967696e206d757374206265206120444944206f726967696e2070726f78696564207669612074686570607375626d69745f6469645f63616c6c602065787472696e7369632e004c456d697473206044696455706461746564602e002823203c7765696768743e305765696768743a204f283129782d2052656164733a205b4f726967696e204163636f756e745d2c20446964342d205772697465733a204469642c23203c2f7765696768743e506164645f736572766963655f656e64706f696e74040140736572766963655f656e64706f696e7439040138446964456e64706f696e743c543e000830bc4164642061206e6577207365727669636520656e64706f696e7420756e6465722074686520676976656e204449442e00e0546865206469737061746368206f726967696e206d757374206265206120444944206f726967696e2070726f78696564207669612074686570607375626d69745f6469645f63616c6c602065787472696e7369632e004c456d697473206044696455706461746564602e002823203c7765696768743e305765696768743a204f2831290d012d2052656164733a205b4f726967696e204163636f756e745d2c204469642c2053657276696365456e64706f696e74732c20446964456e64706f696e7473436f756e74c82d205772697465733a204469642c2053657276696365456e64706f696e74732c20446964456e64706f696e7473436f756e742c23203c2f7765696768743e5c72656d6f76655f736572766963655f656e64706f696e74040128736572766963655f69643d04015053657276696365456e64706f696e7449643c543e000930d452656d6f76652074686520736572766963652077697468207468652070726f76696465642049442066726f6d20746865204449442e00e0546865206469737061746368206f726967696e206d757374206265206120444944206f726967696e2070726f78696564207669612074686570607375626d69745f6469645f63616c6c602065787472696e7369632e004c456d697473206044696455706461746564602e002823203c7765696768743e305765696768743a204f283129f82d2052656164733a205b4f726967696e204163636f756e745d2c2053657276696365456e64706f696e74732c20446964456e64706f696e7473436f756e74c82d205772697465733a204469642c2053657276696365456e64706f696e74732c20446964456e64706f696e7473436f756e742c23203c2f7765696768743e1864656c65746504014c656e64706f696e74735f746f5f72656d6f76651c010c753332000a600d0144656c6574652061204449442066726f6d2074686520636861696e20616e6420616c6c20696e666f726d6174696f6e206173736f63696174656420776974682069742c1101616674657220766572696679696e672074686174207468652064656c657465206f7065726174696f6e20686173206265656e207369676e65642062792074686520444944fc7375626a656374207573696e67207468652061757468656e7469636174696f6e206b65792063757272656e746c792073746f726564206f6e20636861696e2e000501546865207265666572656e63656420444944206964656e746966696572206d7573742062652070726573656e74206f6e20636861696e206265666f7265207468657864656c657465206f7065726174696f6e206973206576616c75617465642e00f441667465722069742069732064656c657465642c2061204449442077697468207468652073616d65206964656e7469666965722063616e6e6f742062655872652d63726561746564206576657220616761696e2e00010141732074686520726573756c74206f66207468652064656c6574696f6e2c20616c6c20747261636573206f662074686520444944206172652072656d6f766564e866726f6d207468652073746f726167652c20776869636820726573756c747320696e2074686520696e76616c69646174696f6e206f6620616c6c9c6174746573746174696f6e73206973737565642062792074686520444944207375626a6563742e00e0546865206469737061746368206f726967696e206d757374206265206120444944206f726967696e2070726f78696564207669612074686570607375626d69745f6469645f63616c6c602065787472696e7369632e004c456d697473206044696444656c65746564602e002823203c7765696768743e305765696768743a204f283129782d2052656164733a205b4f726967696e204163636f756e745d2c20446964cc2d204b696c6c733a2044696420656e747279206173736f63696174656420746f2074686520444944206964656e7469666965722c23203c2f7765696768743e3c7265636c61696d5f6465706f73697408012c6469645f7375626a6563740001484469644964656e7469666965724f663c543e00014c656e64706f696e74735f746f5f72656d6f76651c010c753332000b54f45265636c61696d2061206465706f73697420666f722061204449442e20546869732077696c6c2064656c657465207468652044494420616e6420616c6c0901696e666f726d6174696f6e206173736f63696174656420776974682069742c20616674657220766572696679696e672074686174207468652063616c6c657220697364746865206f776e6572206f6620746865206465706f7369742e000501546865207265666572656e63656420444944206964656e746966696572206d7573742062652070726573656e74206f6e20636861696e206265666f7265207468657864656c657465206f7065726174696f6e206973206576616c75617465642e00f441667465722069742069732064656c657465642c2061204449442077697468207468652073616d65206964656e7469666965722063616e6e6f742062655872652d63726561746564206576657220616761696e2e00010141732074686520726573756c74206f66207468652064656c6574696f6e2c20616c6c20747261636573206f662074686520444944206172652072656d6f766564e866726f6d207468652073746f726167652c20776869636820726573756c747320696e2074686520696e76616c69646174696f6e206f6620616c6c9c6174746573746174696f6e73206973737565642062792074686520444944207375626a6563742e004c456d697473206044696444656c65746564602e002823203c7765696768743e305765696768743a204f283129782d2052656164733a205b4f726967696e204163636f756e745d2c20446964cc2d204b696c6c733a2044696420656e747279206173736f63696174656420746f2074686520444944206964656e7469666965722c23203c2f7765696768743e3c7375626d69745f6469645f63616c6c0801206469645f63616c6c59040188426f783c446964417574686f72697a656443616c6c4f7065726174696f6e3c543e3e0001247369676e6174757265f10301304469645369676e6174757265000c8cec50726f7879206120646973706174636861626c652063616c6c206f6620616e6f746865722072756e74696d652065787472696e736963207468617458737570706f727473206120444944206f726967696e2e000501546865207265666572656e63656420444944206964656e746966696572206d7573742062652070726573656e74206f6e20636861696e206265666f726520746865606f7065726174696f6e20697320646973706174636865642e00fc412063616c6c207375626d6974746564207468726f75676820746869732065787472696e736963206d757374206265207369676e65642077697468207468650901726967687420444944206b65792c20646570656e64696e67206f6e207468652063616c6c2e205468697320696e666f726d6174696f6e2069732070726f766964656409016279207468652060446964417574686f72697a656443616c6c4f7065726174696f6e6020706172616d657465722c20776869636820737065636966696573207468650901444944207375626a65637420616374696e6720617320746865206f726967696e206f66207468652063616c6c2c2074686520444944277320747820636f756e7465720101286e6f6e6365292c2074686520646973706174636861626c6520746f2063616c6c20696e2063617365207369676e617475726520766572696669636174696f6ef073756363656564732c207468652074797065206f6620444944206b657920746f2075736520746f2076657269667920746865206f7065726174696f6efc7369676e61747572652c20616e642074686520626c6f636b206e756d62657220746865206f7065726174696f6e2077617320746172676574696e6720666f72a8696e636c7573696f6e2c207768656e20697420776173206372656174656420616e64207369676e65642e00fc496e206361736520746865207369676e617475726520697320696e636f72726563742c20746865206e6f6e6365206973206e6f742076616c69642c20746865fc7265717569726564206b6579206973206e6f742070726573656e7420666f722074686520737065636966696564204449442c206f722074686520626c6f636bfc73706563696669656420697320746f6f206f6c642074686520766572696669636174696f6e206661696c7320616e64207468652063616c6c206973206e6f74f4646973706174636865642e204f74686572776973652c207468652063616c6c2069732070726f7065726c79206469737061746368656420776974682061b8604469644f726967696e60206f726967696e20696e6469636174696e672074686520444944207375626a6563742e00110141207375636365737366756c206469737061746368206f7065726174696f6e20726573756c747320696e2074686520747820636f756e746572206173736f6369617465640501776974682074686520676976656e2044494420746f20626520696e6372656d656e7465642c20746f206d69746967617465207265706c61792061747461636b732e000101546865206469737061746368206f726967696e2063616e20626520616e79204b494c54206163636f756e74207769746820656e6f7567682066756e647320746f0d0165786563757465207468652065787472696e73696320616e6420697420646f6573206e6f74206861766520746f206265207469656420696e20616e792077617920746fb4746865204b494c54206163636f756e74206964656e74696679696e672074686520444944207375626a6563742e0068456d697473206044696443616c6c44697370617463686564602e002823203c7765696768743eb05765696768743a204f283129202b20776569676874206f662074686520646973706174636865642063616c6c782d2052656164733a205b4f726967696e204163636f756e745d2c20446964342d205772697465733a204469642c23203c2f7765696768743e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e0d040c0c6469642c6469645f64657461696c73484469644372656174696f6e44657461696c73040454000018010c6469640001484469644964656e7469666965724f663c543e0001247375626d69747465720001384163636f756e7449644f663c543e0001586e65775f6b65795f61677265656d656e745f6b6579731104016c4469644e65774b657941677265656d656e744b65795365743c543e00014c6e65775f6174746573746174696f6e5f6b6579210401684f7074696f6e3c446964566572696669636174696f6e4b65793e0001486e65775f64656c65676174696f6e5f6b6579210401684f7074696f6e3c446964566572696669636174696f6e4b65793e00014c6e65775f736572766963655f64657461696c733504014c5665633c446964456e64706f696e743c543e3e0000110410346672616d655f737570706f72741c73746f7261676544626f756e6465645f62747265655f7365743c426f756e64656442547265655365740804540115040453000004001904012c42547265655365743c543e000015040c0c6469642c6469645f64657461696c7340446964456e6372797074696f6e4b65790001041858323535313904000401205b75383b2033325d000000001904042042547265655365740404540115040004001d040000001d04000002150400210404184f7074696f6e0404540125040108104e6f6e6500000010536f6d6504002504000001000025040c0c6469642c6469645f64657461696c7348446964566572696669636174696f6e4b657900010c1c4564323535313904002904013c656432353531393a3a5075626c69630000001c537232353531390400f902013c737232353531393a3a5075626c696300010014456364736104002d04013465636473613a3a5075626c69630002000029040c1c73705f636f72651c65643235353139185075626c6963000004000401205b75383b2033325d00002d040c1c73705f636f7265146563647361185075626c696300000400310401205b75383b2033335d00003104000003210000000800350400000239040039040c0c64696444736572766963655f656e64706f696e74732c446964456e64706f696e7404045400000c010869643d04015053657276696365456e64706f696e7449643c543e000134736572766963655f74797065734104017453657276696365456e64706f696e7454797065456e74726965733c543e00011075726c734d04017053657276696365456e64706f696e7455726c456e74726965733c543e00003d0410346672616d655f737570706f72741c73746f726167652c626f756e6465645f76656328426f756e64656456656308045401080453000004002801185665633c543e0000410410346672616d655f737570706f72741c73746f726167652c626f756e6465645f76656328426f756e646564566563080454014504045300000400490401185665633c543e0000450410346672616d655f737570706f72741c73746f726167652c626f756e6465645f76656328426f756e64656456656308045401080453000004002801185665633c543e000049040000024504004d0410346672616d655f737570706f72741c73746f726167652c626f756e6465645f76656328426f756e646564566563080454015104045300000400550401185665633c543e0000510410346672616d655f737570706f72741c73746f726167652c626f756e6465645f76656328426f756e64656456656308045401080453000004002801185665633c543e0000550400000251040059040c0c6469642c6469645f64657461696c7368446964417574686f72697a656443616c6c4f7065726174696f6e040454000014010c6469640001484469644964656e7469666965724f663c543e00012874785f636f756e74657210010c75363400011063616c6c7103014044696443616c6c61626c654f663c543e000130626c6f636b5f6e756d626572100140426c6f636b4e756d6265724f663c543e0001247375626d69747465720001384163636f756e7449644f663c543e00005d040c4470616c6c65745f6469645f6c6f6f6b75701870616c6c65741043616c6c040454000114446173736f63696174655f6163636f756e740c011c6163636f756e740001384163636f756e7449644f663c543e00012865787069726174696f6e1001a03c54206173206672616d655f73797374656d3a3a436f6e6669673e3a3a426c6f636b4e756d62657200011470726f6f66610401385369676e61747572654f663c543e00004405014173736f63696174652074686520676976656e206163636f756e7420746f2074686520444944207468617420617574686f72697a656420746869732063616c6c2e000501546865206163636f756e742068617320746f207369676e207468652044494420616e64206120626c6f636b6e756d62657220616674657220776869636820746865e07369676e6174757265206578706972657320696e206f7264657220746f20617574686f72697a6520746865206173736f63696174696f6e2e001101546865207369676e61747572652077696c6c20626520636865636b656420616761696e737420746865207363616c6520656e636f646564207475706c65206f66207468650d016d6574686f64207370656369666963206964206f662074686520646964206964656e74696669657220616e642074686520626c6f636b206e756d626572206166746572bc776869636820746865207369676e61747572652073686f756c6420626520726567617264656420696e76616c69642e001101456d69747320604173736f63696174696f6e45737461626c69736865646020616e642c206f7074696f6e616c6c792c20604173736f63696174696f6e52656d6f76656460d069662074686572652077617320612070726576696f7573206173736f63696174696f6e20666f7220746865206163636f756e742e002823203c7765696768743e305765696768743a204f283129f42d2052656164733a20436f6e6e656374656444696473202b20436f6e6e65637465644163636f756e7473202b20444944204f726967696e20436865636bac2d205772697465733a20436f6e6e656374656444696473202b20436f6e6e65637465644163636f756e74732c23203c2f7765696768743e406173736f63696174655f73656e64657200012c01014173736f6369617465207468652073656e646572206f66207468652063616c6c20746f2074686520444944207468617420617574686f72697a656420746869731463616c6c2e001101456d69747320604173736f63696174696f6e45737461626c69736865646020616e642c206f7074696f6e616c6c792c20604173736f63696174696f6e52656d6f76656460d069662074686572652077617320612070726576696f7573206173736f63696174696f6e20666f7220746865206163636f756e742e002823203c7765696768743e305765696768743a204f283129f42d2052656164733a20436f6e6e656374656444696473202b20436f6e6e65637465644163636f756e7473202b20444944204f726967696e20436865636bac2d205772697465733a20436f6e6e656374656444696473202b20436f6e6e65637465644163636f756e74732c23203c2f7765696768743e6472656d6f76655f73656e6465725f6173736f63696174696f6e000228fc52656d6f766520746865206173736f63696174696f6e206f66207468652073656e646572206163636f756e742e20546869732063616c6c20646f65736e27740d01726571756972652074686520617574686f72697a6174696f6e206f6620746865204449442c206275742072657175697265732061207369676e6564206f726967696e2e006c456d69747320604173736f63696174696f6e52656d6f766564602e002823203c7765696768743e305765696768743a204f283129f42d2052656164733a20436f6e6e656374656444696473202b20436f6e6e65637465644163636f756e7473202b20444944204f726967696e20436865636bac2d205772697465733a20436f6e6e656374656444696473202b20436f6e6e65637465644163636f756e74732c23203c2f7765696768743e6872656d6f76655f6163636f756e745f6173736f63696174696f6e04011c6163636f756e740001384163636f756e7449644f663c543e00032c110152656d6f766520746865206173736f63696174696f6e206f66207468652070726f7669646564206163636f756e742049442e20546869732063616c6c20646f65736e27740d01726571756972652074686520617574686f72697a6174696f6e206f6620746865206163636f756e742049442c2062757420746865206173736f63696174656420444944c46e6565647320746f206d617463682074686520444944207468617420617574686f72697a656420746869732063616c6c2e006c456d69747320604173736f63696174696f6e52656d6f766564602e002823203c7765696768743e305765696768743a204f283129f42d2052656164733a20436f6e6e656374656444696473202b20436f6e6e65637465644163636f756e7473202b20444944204f726967696e20436865636bac2d205772697465733a20436f6e6e656374656444696473202b20436f6e6e65637465644163636f756e74732c23203c2f7765696768743e3c7265636c61696d5f6465706f73697404011c6163636f756e740001384163636f756e7449644f663c543e00042c090152656d6f766520746865206173736f63696174696f6e206f66207468652070726f7669646564206163636f756e742e20546869732063616c6c2063616e206f6e6c79f862652063616c6c65642066726f6d20746865206465706f736974206f776e65722e20546865207265736572766564206465706f7369742077696c6c2062651866726565642e006c456d69747320604173736f63696174696f6e52656d6f766564602e002823203c7765696768743e305765696768743a204f283129582d2052656164733a20436f6e6e6563746564446964735c2d205772697465733a20436f6e6e6563746564446964732c23203c2f7765696768743e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e6104082873705f72756e74696d65384d756c74695369676e617475726500010c1c456432353531390400f5030148656432353531393a3a5369676e61747572650000001c537232353531390400fd030148737232353531393a3a5369676e617475726500010014456364736104000104014065636473613a3a5369676e61747572650002000065040c4470616c6c65745f776562335f6e616d65731870616c6c65741043616c6c04045400011414636c61696d0401106e616d650d010140576562334e616d65496e7075743c543e00003ce841737369676e2074686520737065636966696564206e616d6520746f20746865206f776e65722061732073706563696669656420696e207468651c6f726967696e2e000d01546865206e616d65206d757374206e6f74206861766520616c7265616479206265656e20636c61696d656420627920736f6d656f6e6520656c736520616e6420746865a06f776e6572206d757374206e6f7420616c7265616479206f776e20616e6f74686572206e616d652e00dc456d6974732060576562334e616d65436c61696d65646020696620746865206f7065726174696f6e2069732063617272696564206f7574347375636365737366756c6c792e002823203c7765696768743e305765696768743a204f28312909012d2052656164733a204e616d65732c204f776e65722c2042616e6e65642073746f7261676520656e7472696573202b20617661696c61626c652063757272656e6379582020636865636b202b206f726967696e20636865636b05012d205772697465733a204e616d65732c204f776e65722073746f7261676520656e7472696573202b2063757272656e6379206465706f73697420726573657276652c23203c2f7765696768743e4072656c656173655f62795f6f776e6572000130a452656c65617365207468652070726f7669646564206e616d652066726f6d20697473206f776e65722e00cc546865206f726967696e206d75737420626520746865206f776e6572206f662074686520737065636966696564206e616d652e00e0456d6974732060576562334e616d6552656c65617365646020696620746865206f7065726174696f6e2069732063617272696564206f7574347375636365737366756c6c792e002823203c7765696768743e305765696768743a204f283129ac2d2052656164733a204e616d65732073746f7261676520656e747279202b206f726967696e20636865636b05012d205772697465733a204e616d65732c204f776e65722073746f7261676520656e7472696573202b2063757272656e6379206465706f7369742072656c656173652c23203c2f7765696768743e3c7265636c61696d5f6465706f7369740401106e616d650d010140576562334e616d65496e7075743c543e000230a452656c65617365207468652070726f7669646564206e616d652066726f6d20697473206f776e65722e000101546865206f726967696e206d75737420626520746865206163636f756e742074686174207061696420666f7220746865206e616d652773206465706f7369742e00e0456d6974732060576562334e616d6552656c65617365646020696620746865206f7065726174696f6e2069732063617272696564206f7574347375636365737366756c6c792e002823203c7765696768743e305765696768743a204f283129ac2d2052656164733a204f776e65722073746f7261676520656e747279202b206f726967696e20636865636b05012d205772697465733a204e616d65732c204f776e65722073746f7261676520656e7472696573202b2063757272656e6379206465706f7369742072656c656173652c23203c2f7765696768743e0c62616e0401106e616d650d010140576562334e616d65496e7075743c543e0003402c42616e2061206e616d652e00f4412062616e6e6564206e616d652063616e6e6f7420626520636c61696d656420627920616e796f6e652e20546865206e616d652773206465706f7369748869732072657475726e656420746f20746865206f726967696e616c2070617965722e0088546865206f726967696e206d757374206265207468652062616e206f726967696e2e00d8456d6974732060576562334e616d6542616e6e65646020696620746865206f7065726174696f6e2069732063617272696564206f7574347375636365737366756c6c792e002823203c7765696768743e305765696768743a204f283129f02d2052656164733a2042616e6e65642c204f776e65722c204e616d65732073746f7261676520656e7472696573202b206f726967696e20636865636b05012d205772697465733a204e616d65732c204f776e65722c2042616e6e65642073746f7261676520656e7472696573202b2063757272656e6379206465706f73697424202072656c656173652c23203c2f7765696768743e14756e62616e0401106e616d650d010140576562334e616d65496e7075743c543e00043834556e62616e2061206e616d652e00704d616b652061206e616d6520636c61696d61626c6520616761696e2e0088546865206f726967696e206d757374206265207468652062616e206f726967696e2e00e0456d6974732060576562334e616d65556e62616e6e65646020696620746865206f7065726174696f6e2069732063617272696564206f7574347375636365737366756c6c792e002823203c7765696768743e305765696768743a204f283129b02d2052656164733a2042616e6e65642073746f7261676520656e747279202b206f726967696e20636865636bb82d205772697465733a2042616e6e65642073746f7261676520656e747279206465706f7369742072656c656173652c23203c2f7765696768743e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e69040c7c63756d756c75735f70616c6c65745f70617261636861696e5f73797374656d1870616c6c65741043616c6c0404540001104c7365745f76616c69646174696f6e5f64617461040110646174616d04015450617261636861696e496e686572656e744461746100002480536574207468652063757272656e742076616c69646174696f6e20646174612e004101546869732073686f756c6420626520696e766f6b65642065786163746c79206f6e63652070657220626c6f636b2e2049742077696c6c2070616e6963206174207468652066696e616c697a6174696f6e887068617365206966207468652063616c6c20776173206e6f7420696e766f6b65642e00d0546865206469737061746368206f726967696e20666f7220746869732063616c6c206d7573742062652060496e686572656e7460002101417320612073696465206566666563742c20746869732066756e6374696f6e207570677261646573207468652063757272656e742076616c69646174696f6e2066756e6374696f6e8469662074686520617070726f7072696174652074696d652068617320636f6d652e607375646f5f73656e645f7570776172645f6d65737361676504011c6d6573736167652801345570776172644d65737361676500010044617574686f72697a655f75706772616465040124636f64655f6861736824011c543a3a4861736800020060656e6163745f617574686f72697a65645f75706772616465040110636f646528011c5665633c75383e000300042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e6d04089463756d756c75735f7072696d6974697665735f70617261636861696e5f696e686572656e745450617261636861696e496e686572656e7444617461000010013c76616c69646174696f6e5f646174617104015c50657273697374656456616c69646174696f6e4461746100014472656c61795f636861696e5f73746174657904015473705f747269653a3a53746f7261676550726f6f66000144646f776e776172645f6d657373616765738104016c5665633c496e626f756e64446f776e776172644d6573736167653e00014c686f72697a6f6e74616c5f6d65737361676573890401a442547265654d61703c5061726149642c205665633c496e626f756e6448726d704d6573736167653e3e000071040c4c706f6c6b61646f745f7072696d6974697665730876325c50657273697374656456616c69646174696f6e446174610804480124044e011c0010012c706172656e745f6865616475040120486561644461746100014c72656c61795f706172656e745f6e756d6265721c01044e00016472656c61795f706172656e745f73746f726167655f726f6f74240104480001306d61785f706f765f73697a651c010c753332000075040c48706f6c6b61646f745f70617261636861696e287072696d6974697665732048656164446174610000040028011c5665633c75383e000079040c1c73705f747269653473746f726167655f70726f6f663053746f7261676550726f6f660000040128747269655f6e6f6465737d04014442547265655365743c5665633c75383e3e00007d04042042547265655365740404540128000400ed01000000810400000285040085040860706f6c6b61646f745f636f72655f7072696d69746976657358496e626f756e64446f776e776172644d657373616765042c426c6f636b4e756d626572011c0008011c73656e745f61741c012c426c6f636b4e756d62657200010c6d736728013c446f776e776172644d65737361676500008904042042547265654d617008044b0121010456018d0400040095040000008d0400000291040091040860706f6c6b61646f745f636f72655f7072696d69746976657348496e626f756e6448726d704d657373616765042c426c6f636b4e756d626572011c0008011c73656e745f61741c012c426c6f636b4e756d6265720001106461746128015073705f7374643a3a7665633a3a5665633c75383e0000950400000299040099040000040821018d04009d040c6463756d756c75735f70616c6c65745f78636d705f71756575651870616c6c65741043616c6c04045400012448736572766963655f6f766572776569676874080114696e64657810013c4f766572776569676874496e6465780001307765696768745f6c696d697410011857656967687400003484536572766963657320612073696e676c65206f7665727765696768742058434d2e00c02d20606f726967696e603a204d75737420706173732060457865637574654f7665727765696768744f726967696e602ed42d2060696e646578603a2054686520696e646578206f6620746865206f7665727765696768742058434d20746f20736572766963650d012d20607765696768745f6c696d6974603a2054686520616d6f756e74206f662077656967687420746861742058434d20657865637574696f6e206d61792074616b652e001c4572726f72733a5d012d20604261644f766572776569676874496e646578603a2058434d20756e6465722060696e64657860206973206e6f7420666f756e6420696e2074686520604f766572776569676874602073746f72616765206d61702e45012d206042616458636d603a2058434d20756e6465722060696e646578602063616e6e6f742062652070726f7065726c79206465636f64656420696e746f20612076616c69642058434d20666f726d61742e09012d20605765696768744f7665724c696d6974603a2058434d20657865637574696f6e206d617920757365206772656174657220607765696768745f6c696d6974602e001c4576656e74733a8c2d20604f7665727765696768745365727669636564603a204f6e20737563636573732e5473757370656e645f78636d5f657865637574696f6e00010c490153757370656e647320616c6c2058434d20657865637574696f6e7320666f72207468652058434d502071756575652c207265676172646c657373206f66207468652073656e6465722773206f726967696e2e00a42d20606f726967696e603a204d75737420706173732060436f6e74726f6c6c65724f726967696e602e50726573756d655f78636d5f657865637574696f6e000214b8526573756d657320616c6c2058434d20657865637574696f6e7320666f72207468652058434d502071756575652e003d014e6f7465207468617420746869732066756e6374696f6e20646f65736e2774206368616e67652074686520737461747573206f662074686520696e2f6f757420626f756e64206368616e6e656c732e00a42d20606f726967696e603a204d75737420706173732060436f6e74726f6c6c65724f726967696e602e607570646174655f73757370656e645f7468726573686f6c6404010c6e65771c010c75333200031499014f76657277726974657320746865206e756d626572206f66207061676573206f66206d65737361676573207768696368206d75737420626520696e2074686520717565756520666f7220746865206f74686572207369646520746f20626520746f6c6420746f5873757370656e642074686569722073656e64696e672e00742d20606f726967696e603a204d75737420706173732060526f6f74602ee82d20606e6577603a20446573697265642076616c756520666f7220605175657565436f6e666967446174612e73757370656e645f76616c756560547570646174655f64726f705f7468726573686f6c6404010c6e65771c010c75333200041495014f76657277726974657320746865206e756d626572206f66207061676573206f66206d65737361676573207768696368206d75737420626520696e207468652071756575652061667465722077686963682077652064726f7020616e792066757274686572686d657373616765732066726f6d20746865206368616e6e656c2e00742d20606f726967696e603a204d75737420706173732060526f6f74602eec2d20606e6577603a20446573697265642076616c756520666f7220605175657565436f6e666967446174612e64726f705f7468726573686f6c64605c7570646174655f726573756d655f7468726573686f6c6404010c6e65771c010c75333200051491014f76657277726974657320746865206e756d626572206f66207061676573206f66206d6573736167657320776869636820746865207175657565206d757374206265207265647563656420746f206265666f7265206974207369676e616c732074686174ec6d6573736167652073656e64696e67206d6179207265636f6d6d656e636520616674657220697420686173206265656e2073757370656e6465642e00742d20606f726967696e603a204d75737420706173732060526f6f74602ef42d20606e6577603a20446573697265642076616c756520666f7220605175657565436f6e666967446174612e726573756d655f7468726573686f6c64605c7570646174655f7468726573686f6c645f77656967687404010c6e657710011857656967687400061049014f7665727772697465732074686520616d6f756e74206f662072656d61696e696e672077656967687420756e6465722077686963682077652073746f702070726f63657373696e67206d657373616765732e00742d20606f726967696e603a204d75737420706173732060526f6f74602ef42d20606e6577603a20446573697265642076616c756520666f7220605175657565436f6e666967446174612e7468726573686f6c645f77656967687460707570646174655f7765696768745f72657374726963745f646563617904010c6e657710011857656967687400071445014f7665727772697465732074686520737065656420746f2077686963682074686520617661696c61626c652077656967687420617070726f616368657320746865206d6178696d756d207765696768742ea50141206c6f776572206e756d62657220726573756c747320696e2061206661737465722070726f6772657373696f6e2e20412076616c7565206f662031206d616b65732074686520656e746972652077656967687420617661696c61626c6520696e697469616c6c792e00742d20606f726967696e603a204d75737420706173732060526f6f74602e0d012d20606e6577603a20446573697265642076616c756520666f7220605175657565436f6e666967446174612e7765696768745f72657374726963745f6465636179602e847570646174655f78636d705f6d61785f696e646976696475616c5f77656967687404010c6e657710011857656967687400081429014f766572777269746520746865206d6178696d756d20616d6f756e74206f662077656967687420616e7920696e646976696475616c206d657373616765206d617920636f6e73756d652e71014d657373616765732061626f766520746869732077656967687420676f20696e746f20746865206f76657277656967687420717565756520616e64206d6179206f6e6c79206265207365727669636564206578706c696369746c792e00742d20606f726967696e603a204d75737420706173732060526f6f74602e21012d20606e6577603a20446573697265642076616c756520666f7220605175657565436f6e666967446174612e78636d705f6d61785f696e646976696475616c5f776569676874602e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ea1040c2870616c6c65745f78636d1870616c6c65741043616c6c0404540001281073656e6408011064657374bd01016c426f783c56657273696f6e65644d756c74694c6f636174696f6e3e00011c6d657373616765a5040154426f783c56657273696f6e656458636d3c28293e3e0000003c74656c65706f72745f61737365747310011064657374bd01016c426f783c56657273696f6e65644d756c74694c6f636174696f6e3e00012c62656e6566696369617279bd01016c426f783c56657273696f6e65644d756c74694c6f636174696f6e3e000118617373657473a9010164426f783c56657273696f6e65644d756c74694173736574733e0001386665655f61737365745f6974656d1c010c75333200013c110154656c65706f727420736f6d65206173736574732066726f6d20746865206c6f63616c20636861696e20746f20736f6d652064657374696e6174696f6e20636861696e2e005101466565207061796d656e74206f6e207468652064657374696e6174696f6e2073696465206973206d6164652066726f6d2074686520617373657420696e2074686520606173736574736020766563746f72206f666101696e64657820606665655f61737365745f6974656d602e2054686520776569676874206c696d697420666f722066656573206973206e6f742070726f766964656420616e64207468757320697320756e6c696d697465642cb47769746820616c6c20666565732074616b656e206173206e65656465642066726f6d207468652061737365742e0029012d20606f726967696e603a204d7573742062652063617061626c65206f66207769746864726177696e672074686520606173736574736020616e6420657865637574696e672058434d2e8d012d206064657374603a2044657374696e6174696f6e20636f6e7465787420666f7220746865206173736574732e2057696c6c207479706963616c6c792062652060583228506172656e742c2050617261636861696e282e2e29296020746f2073656e645901202066726f6d2070617261636861696e20746f2070617261636861696e2c206f72206058312850617261636861696e282e2e29296020746f2073656e642066726f6d2072656c617920746f2070617261636861696e2e89012d206062656e6566696369617279603a20412062656e6566696369617279206c6f636174696f6e20666f72207468652061737365747320696e2074686520636f6e74657874206f66206064657374602e2057696c6c2067656e6572616c6c79206265642020616e20604163636f756e7449643332602076616c75652ead012d2060617373657473603a205468652061737365747320746f2062652077697468647261776e2e20546865206669727374206974656d2073686f756c64206265207468652063757272656e6379207573656420746f20746f207061792074686520666565206f6e2074686580202060646573746020736964652e204d6179206e6f7420626520656d7074792e4d012d20606665655f61737365745f6974656d603a2054686520696e64657820696e746f206061737365747360206f6620746865206974656d2077686963682073686f756c64206265207573656420746f207061791c2020666565732e5c726573657276655f7472616e736665725f61737365747310011064657374bd01016c426f783c56657273696f6e65644d756c74694c6f636174696f6e3e00012c62656e6566696369617279bd01016c426f783c56657273696f6e65644d756c74694c6f636174696f6e3e000118617373657473a9010164426f783c56657273696f6e65644d756c74694173736574733e0001386665655f61737365745f6974656d1c010c7533320002404d015472616e7366657220736f6d65206173736574732066726f6d20746865206c6f63616c20636861696e20746f2074686520736f7665726569676e206163636f756e74206f6620612064657374696e6174696f6e94636861696e20616e6420666f72776172642061206e6f74696669636174696f6e2058434d2e005101466565207061796d656e74206f6e207468652064657374696e6174696f6e2073696465206973206d6164652066726f6d2074686520617373657420696e2074686520606173736574736020766563746f72206f666101696e64657820606665655f61737365745f6974656d602e2054686520776569676874206c696d697420666f722066656573206973206e6f742070726f766964656420616e64207468757320697320756e6c696d697465642cb47769746820616c6c20666565732074616b656e206173206e65656465642066726f6d207468652061737365742e0029012d20606f726967696e603a204d7573742062652063617061626c65206f66207769746864726177696e672074686520606173736574736020616e6420657865637574696e672058434d2e8d012d206064657374603a2044657374696e6174696f6e20636f6e7465787420666f7220746865206173736574732e2057696c6c207479706963616c6c792062652060583228506172656e742c2050617261636861696e282e2e29296020746f2073656e645901202066726f6d2070617261636861696e20746f2070617261636861696e2c206f72206058312850617261636861696e282e2e29296020746f2073656e642066726f6d2072656c617920746f2070617261636861696e2e89012d206062656e6566696369617279603a20412062656e6566696369617279206c6f636174696f6e20666f72207468652061737365747320696e2074686520636f6e74657874206f66206064657374602e2057696c6c2067656e6572616c6c79206265642020616e20604163636f756e7449643332602076616c75652e85012d2060617373657473603a205468652061737365747320746f2062652077697468647261776e2e20546869732073686f756c6420696e636c7564652074686520617373657473207573656420746f207061792074686520666565206f6e2074686538202060646573746020736964652e4d012d20606665655f61737365745f6974656d603a2054686520696e64657820696e746f206061737365747360206f6620746865206974656d2077686963682073686f756c64206265207573656420746f207061791c2020666565732e1c6578656375746508011c6d657373616765d10401a4426f783c56657273696f6e656458636d3c3c5420617320537973436f6e6669673e3a3a43616c6c3e3e0001286d61785f77656967687410011857656967687400032cd04578656375746520616e2058434d206d6573736167652066726f6d2061206c6f63616c2c207369676e65642c206f726967696e2e004d01416e206576656e74206973206465706f736974656420696e6469636174696e67207768657468657220606d73676020636f756c6420626520657865637574656420636f6d706c6574656c79206f72206f6e6c79287061727469616c6c792e006d014e6f206d6f7265207468616e20606d61785f776569676874602077696c6c206265207573656420696e2069747320617474656d7074656420657865637574696f6e2e2049662074686973206973206c657373207468616e2074686559016d6178696d756d20616d6f756e74206f6620776569676874207468617420746865206d65737361676520636f756c642074616b6520746f2062652065786563757465642c207468656e206e6f20657865637574696f6e54617474656d70742077696c6c206265206d6164652e006d014e4f54453a2041207375636365737366756c2072657475726e20746f207468697320646f6573202a6e6f742a20696d706c7920746861742074686520606d73676020776173206578656375746564207375636365737366756c6c79cc746f20636f6d706c6574696f6e3b206f6e6c792074686174202a736f6d652a206f66206974207761732065786563757465642e44666f7263655f78636d5f76657273696f6e0801206c6f636174696f6e2d010148426f783c4d756c74694c6f636174696f6e3e00012c78636d5f76657273696f6e1c012858636d56657273696f6e00041849014578746f6c6c2074686174206120706172746963756c61722064657374696e6174696f6e2063616e20626520636f6d6d756e6963617465642077697468207468726f756768206120706172746963756c61723c76657273696f6e206f662058434d2e00642d20606f726967696e603a204d75737420626520526f6f742ed82d20606c6f636174696f6e603a205468652064657374696e6174696f6e2074686174206973206265696e67206465736372696265642e11012d206078636d5f76657273696f6e603a20546865206c61746573742076657273696f6e206f662058434d207468617420606c6f636174696f6e6020737570706f7274732e64666f7263655f64656661756c745f78636d5f76657273696f6e0401446d617962655f78636d5f76657273696f6e650301484f7074696f6e3c58636d56657273696f6e3e0005145901536574206120736166652058434d2076657273696f6e20287468652076657273696f6e20746861742058434d2073686f756c6420626520656e636f646564207769746820696620746865206d6f737420726563656e74b476657273696f6e20612064657374696e6174696f6e2063616e2061636365707420697320756e6b6e6f776e292e00642d20606f726967696e603a204d75737420626520526f6f742e39012d20606d617962655f78636d5f76657273696f6e603a205468652064656661756c742058434d20656e636f64696e672076657273696f6e2c206f7220604e6f6e656020746f2064697361626c652e78666f7263655f7375627363726962655f76657273696f6e5f6e6f746966790401206c6f636174696f6ebd01016c426f783c56657273696f6e65644d756c74694c6f636174696f6e3e000610390141736b2061206c6f636174696f6e20746f206e6f7469667920757320726567617264696e672074686569722058434d2076657273696f6e20616e6420616e79206368616e67657320746f2069742e00642d20606f726967696e603a204d75737420626520526f6f742e59012d20606c6f636174696f6e603a20546865206c6f636174696f6e20746f2077686963682077652073686f756c642073756273637269626520666f722058434d2076657273696f6e206e6f74696669636174696f6e732e80666f7263655f756e7375627363726962655f76657273696f6e5f6e6f746966790401206c6f636174696f6ebd01016c426f783c56657273696f6e65644d756c74694c6f636174696f6e3e0007184901526571756972652074686174206120706172746963756c61722064657374696e6174696f6e2073686f756c64206e6f206c6f6e676572206e6f7469667920757320726567617264696e6720616e792058434d4076657273696f6e206368616e6765732e00642d20606f726967696e603a204d75737420626520526f6f742e3d012d20606c6f636174696f6e603a20546865206c6f636174696f6e20746f207768696368207765206172652063757272656e746c79207375627363726962656420666f722058434d2076657273696f6ea820206e6f74696669636174696f6e73207768696368207765206e6f206c6f6e676572206465736972652e7c6c696d697465645f726573657276655f7472616e736665725f61737365747314011064657374bd01016c426f783c56657273696f6e65644d756c74694c6f636174696f6e3e00012c62656e6566696369617279bd01016c426f783c56657273696f6e65644d756c74694c6f636174696f6e3e000118617373657473a9010164426f783c56657273696f6e65644d756c74694173736574733e0001386665655f61737365745f6974656d1c010c7533320001307765696768745f6c696d6974a101012c5765696768744c696d69740008484d015472616e7366657220736f6d65206173736574732066726f6d20746865206c6f63616c20636861696e20746f2074686520736f7665726569676e206163636f756e74206f6620612064657374696e6174696f6e94636861696e20616e6420666f72776172642061206e6f74696669636174696f6e2058434d2e005101466565207061796d656e74206f6e207468652064657374696e6174696f6e2073696465206973206d6164652066726f6d2074686520617373657420696e2074686520606173736574736020766563746f72206f666101696e64657820606665655f61737365745f6974656d602c20757020746f20656e6f75676820746f2070617920666f7220607765696768745f6c696d697460206f66207765696768742e204966206d6f72652077656967687459016973206e6565646564207468616e20607765696768745f6c696d6974602c207468656e20746865206f7065726174696f6e2077696c6c206661696c20616e6420746865206173736574732073656e64206d6179206265206174207269736b2e0029012d20606f726967696e603a204d7573742062652063617061626c65206f66207769746864726177696e672074686520606173736574736020616e6420657865637574696e672058434d2e8d012d206064657374603a2044657374696e6174696f6e20636f6e7465787420666f7220746865206173736574732e2057696c6c207479706963616c6c792062652060583228506172656e742c2050617261636861696e282e2e29296020746f2073656e645901202066726f6d2070617261636861696e20746f2070617261636861696e2c206f72206058312850617261636861696e282e2e29296020746f2073656e642066726f6d2072656c617920746f2070617261636861696e2e89012d206062656e6566696369617279603a20412062656e6566696369617279206c6f636174696f6e20666f72207468652061737365747320696e2074686520636f6e74657874206f66206064657374602e2057696c6c2067656e6572616c6c79206265642020616e20604163636f756e7449643332602076616c75652e85012d2060617373657473603a205468652061737365747320746f2062652077697468647261776e2e20546869732073686f756c6420696e636c7564652074686520617373657473207573656420746f207061792074686520666565206f6e2074686538202060646573746020736964652e4d012d20606665655f61737365745f6974656d603a2054686520696e64657820696e746f206061737365747360206f6620746865206974656d2077686963682073686f756c64206265207573656420746f207061791c2020666565732e45012d20607765696768745f6c696d6974603a205468652072656d6f74652d7369646520776569676874206c696d69742c20696620616e792c20666f72207468652058434d206665652070757263686173652e5c6c696d697465645f74656c65706f72745f61737365747314011064657374bd01016c426f783c56657273696f6e65644d756c74694c6f636174696f6e3e00012c62656e6566696369617279bd01016c426f783c56657273696f6e65644d756c74694c6f636174696f6e3e000118617373657473a9010164426f783c56657273696f6e65644d756c74694173736574733e0001386665655f61737365745f6974656d1c010c7533320001307765696768745f6c696d6974a101012c5765696768744c696d6974000944110154656c65706f727420736f6d65206173736574732066726f6d20746865206c6f63616c20636861696e20746f20736f6d652064657374696e6174696f6e20636861696e2e005101466565207061796d656e74206f6e207468652064657374696e6174696f6e2073696465206973206d6164652066726f6d2074686520617373657420696e2074686520606173736574736020766563746f72206f666101696e64657820606665655f61737365745f6974656d602c20757020746f20656e6f75676820746f2070617920666f7220607765696768745f6c696d697460206f66207765696768742e204966206d6f72652077656967687459016973206e6565646564207468616e20607765696768745f6c696d6974602c207468656e20746865206f7065726174696f6e2077696c6c206661696c20616e6420746865206173736574732073656e64206d6179206265206174207269736b2e0029012d20606f726967696e603a204d7573742062652063617061626c65206f66207769746864726177696e672074686520606173736574736020616e6420657865637574696e672058434d2e8d012d206064657374603a2044657374696e6174696f6e20636f6e7465787420666f7220746865206173736574732e2057696c6c207479706963616c6c792062652060583228506172656e742c2050617261636861696e282e2e29296020746f2073656e645901202066726f6d2070617261636861696e20746f2070617261636861696e2c206f72206058312850617261636861696e282e2e29296020746f2073656e642066726f6d2072656c617920746f2070617261636861696e2e89012d206062656e6566696369617279603a20412062656e6566696369617279206c6f636174696f6e20666f72207468652061737365747320696e2074686520636f6e74657874206f66206064657374602e2057696c6c2067656e6572616c6c79206265642020616e20604163636f756e7449643332602076616c75652ead012d2060617373657473603a205468652061737365747320746f2062652077697468647261776e2e20546865206669727374206974656d2073686f756c64206265207468652063757272656e6379207573656420746f20746f207061792074686520666565206f6e2074686580202060646573746020736964652e204d6179206e6f7420626520656d7074792e4d012d20606665655f61737365745f6974656d603a2054686520696e64657820696e746f206061737365747360206f6620746865206974656d2077686963682073686f756c64206265207573656420746f207061791c2020666565732e45012d20607765696768745f6c696d6974603a205468652072656d6f74652d7369646520776569676874206c696d69742c20696620616e792c20666f72207468652058434d206665652070757263686173652e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ea504080c78636d3056657273696f6e656458636d041043616c6c00010c0856300400a904013476303a3a58636d3c43616c6c3e0000000856310400bd04013476313a3a58636d3c43616c6c3e00010008563204005501013476323a3a58636d3c43616c6c3e00020000a9040c0c78636d0876300c58636d041043616c6c00012c3457697468647261774173736574080118617373657473ad01013c5665633c4d756c746941737365743e00011c65666665637473ad0401405665633c4f726465723c43616c6c3e3e0000004c5265736572766541737365744465706f736974080118617373657473ad01013c5665633c4d756c746941737365743e00011c65666665637473ad0401405665633c4f726465723c43616c6c3e3e0001003454656c65706f72744173736574080118617373657473ad01013c5665633c4d756c746941737365743e00011c65666665637473ad0401405665633c4f726465723c43616c6c3e3e000200345175657279526573706f6e736508012071756572795f69644101010c753634000120726573706f6e7365b9040120526573706f6e7365000300345472616e736665724173736574080118617373657473ad01013c5665633c4d756c746941737365743e00011064657374b50101344d756c74694c6f636174696f6e000400505472616e736665725265736572766541737365740c0118617373657473ad01013c5665633c4d756c746941737365743e00011064657374b50101344d756c74694c6f636174696f6e00011c65666665637473ad0401385665633c4f726465723c28293e3e000500205472616e736163740c012c6f726967696e5f747970658d0101284f726967696e4b696e64000158726571756972655f7765696768745f61745f6d6f737410010c75363400011063616c6c9101014c446f75626c65456e636f6465643c43616c6c3e0006006448726d704e65774368616e6e656c4f70656e526571756573740c011873656e6465723901010c7533320001406d61785f6d6573736167655f73697a653901010c7533320001306d61785f63617061636974793901010c7533320007004c48726d704368616e6e656c4163636570746564040124726563697069656e743901010c7533320008004848726d704368616e6e656c436c6f73696e670c0124696e69746961746f723901010c75333200011873656e6465723901010c753332000124726563697069656e743901010c7533320009002c52656c6179656446726f6d08010c77686fb50101344d756c74694c6f636174696f6e00011c6d657373616765a9040170616c6c6f633a3a626f7865643a3a426f783c58636d3c43616c6c3e3e000a0000ad04000002b10400b104100c78636d087630146f72646572144f72646572041043616c6c000120104e756c6c000000304465706f7369744173736574080118617373657473ad01013c5665633c4d756c746941737365743e00011064657374b50101344d756c74694c6f636174696f6e0001004c4465706f7369745265736572766541737365740c0118617373657473ad01013c5665633c4d756c746941737365743e00011064657374b50101344d756c74694c6f636174696f6e00011c65666665637473ad0401385665633c4f726465723c28293e3e0002003445786368616e6765417373657408011067697665ad01013c5665633c4d756c746941737365743e00011c72656365697665ad01013c5665633c4d756c746941737365743e0003005c496e6974696174655265736572766557697468647261770c0118617373657473ad01013c5665633c4d756c746941737365743e00011c72657365727665b50101344d756c74694c6f636174696f6e00011c65666665637473ad0401385665633c4f726465723c28293e3e00040040496e69746961746554656c65706f72740c0118617373657473ad01013c5665633c4d756c746941737365743e00011064657374b50101344d756c74694c6f636174696f6e00011c65666665637473ad0401385665633c4f726465723c28293e3e000500305175657279486f6c64696e670c012071756572795f69644101010c75363400011064657374b50101344d756c74694c6f636174696f6e000118617373657473ad01013c5665633c4d756c746941737365743e00060030427579457865637574696f6e14011066656573b10101284d756c7469417373657400011877656967687410010c7536340001106465627410010c75363400013468616c745f6f6e5f6572726f72a40110626f6f6c00010c78636db50401385665633c58636d3c43616c6c3e3e00070000b504000002a90400b9040c0c78636d08763020526573706f6e7365000104184173736574730400ad01013c5665633c4d756c746941737365743e00000000bd040c0c78636d0876310c58636d041043616c6c00013434576974686472617741737365740801186173736574736101012c4d756c746941737365747300011c65666665637473c10401405665633c4f726465723c43616c6c3e3e000000545265736572766541737365744465706f73697465640801186173736574736101012c4d756c746941737365747300011c65666665637473c10401405665633c4f726465723c43616c6c3e3e000100585265636569766554656c65706f7274656441737365740801186173736574736101012c4d756c746941737365747300011c65666665637473c10401405665633c4f726465723c43616c6c3e3e000200345175657279526573706f6e736508012071756572795f69644101010c753634000120726573706f6e7365cd040120526573706f6e7365000300345472616e7366657241737365740801186173736574736101012c4d756c746941737365747300012c62656e65666963696172792d0101344d756c74694c6f636174696f6e000400505472616e736665725265736572766541737365740c01186173736574736101012c4d756c7469417373657473000110646573742d0101344d756c74694c6f636174696f6e00011c65666665637473c10401385665633c4f726465723c28293e3e000500205472616e736163740c012c6f726967696e5f747970658d0101284f726967696e4b696e64000158726571756972655f7765696768745f61745f6d6f737410010c75363400011063616c6c9101014c446f75626c65456e636f6465643c43616c6c3e0006006448726d704e65774368616e6e656c4f70656e526571756573740c011873656e6465723901010c7533320001406d61785f6d6573736167655f73697a653901010c7533320001306d61785f63617061636974793901010c7533320007004c48726d704368616e6e656c4163636570746564040124726563697069656e743901010c7533320008004848726d704368616e6e656c436c6f73696e670c0124696e69746961746f723901010c75333200011873656e6465723901010c753332000124726563697069656e743901010c7533320009002c52656c6179656446726f6d08010c77686f31010154496e746572696f724d756c74694c6f636174696f6e00011c6d657373616765bd040170616c6c6f633a3a626f7865643a3a426f783c58636d3c43616c6c3e3e000a004053756273637269626556657273696f6e08012071756572795f69644101010c75363400014c6d61785f726573706f6e73655f7765696768744101010c753634000b0048556e73756273637269626556657273696f6e000c0000c104000002c50400c504100c78636d087631146f72646572144f72646572041043616c6c000120104e6f6f70000000304465706f73697441737365740c0118617373657473950101404d756c7469417373657446696c7465720001286d61785f6173736574731c010c75333200012c62656e65666963696172792d0101344d756c74694c6f636174696f6e0001004c4465706f736974526573657276654173736574100118617373657473950101404d756c7469417373657446696c7465720001286d61785f6173736574731c010c753332000110646573742d0101344d756c74694c6f636174696f6e00011c65666665637473c10401385665633c4f726465723c28293e3e0002003445786368616e6765417373657408011067697665950101404d756c7469417373657446696c74657200011c726563656976656101012c4d756c74694173736574730003005c496e6974696174655265736572766557697468647261770c0118617373657473950101404d756c7469417373657446696c74657200011c726573657276652d0101344d756c74694c6f636174696f6e00011c65666665637473c10401385665633c4f726465723c28293e3e00040040496e69746961746554656c65706f72740c0118617373657473950101404d756c7469417373657446696c746572000110646573742d0101344d756c74694c6f636174696f6e00011c65666665637473c10401385665633c4f726465723c28293e3e000500305175657279486f6c64696e670c012071756572795f69644101010c753634000110646573742d0101344d756c74694c6f636174696f6e000118617373657473950101404d756c7469417373657446696c74657200060030427579457865637574696f6e14011066656573690101284d756c7469417373657400011877656967687410010c7536340001106465627410010c75363400013468616c745f6f6e5f6572726f72a40110626f6f6c000130696e737472756374696f6e73c90401385665633c58636d3c43616c6c3e3e00070000c904000002bd0400cd040c0c78636d08763120526573706f6e73650001081841737365747304006101012c4d756c74694173736574730000001c56657273696f6e04001c013873757065723a3a56657273696f6e00010000d104080c78636d3056657273696f6e656458636d041043616c6c00010c0856300400d504013476303a3a58636d3c43616c6c3e0000000856310400e904013476313a3a58636d3c43616c6c3e0001000856320400f904013476323a3a58636d3c43616c6c3e00020000d5040c0c78636d0876300c58636d041043616c6c00012c3457697468647261774173736574080118617373657473ad01013c5665633c4d756c746941737365743e00011c65666665637473d90401405665633c4f726465723c43616c6c3e3e0000004c5265736572766541737365744465706f736974080118617373657473ad01013c5665633c4d756c746941737365743e00011c65666665637473d90401405665633c4f726465723c43616c6c3e3e0001003454656c65706f72744173736574080118617373657473ad01013c5665633c4d756c746941737365743e00011c65666665637473d90401405665633c4f726465723c43616c6c3e3e000200345175657279526573706f6e736508012071756572795f69644101010c753634000120726573706f6e7365b9040120526573706f6e7365000300345472616e736665724173736574080118617373657473ad01013c5665633c4d756c746941737365743e00011064657374b50101344d756c74694c6f636174696f6e000400505472616e736665725265736572766541737365740c0118617373657473ad01013c5665633c4d756c746941737365743e00011064657374b50101344d756c74694c6f636174696f6e00011c65666665637473ad0401385665633c4f726465723c28293e3e000500205472616e736163740c012c6f726967696e5f747970658d0101284f726967696e4b696e64000158726571756972655f7765696768745f61745f6d6f737410010c75363400011063616c6ce504014c446f75626c65456e636f6465643c43616c6c3e0006006448726d704e65774368616e6e656c4f70656e526571756573740c011873656e6465723901010c7533320001406d61785f6d6573736167655f73697a653901010c7533320001306d61785f63617061636974793901010c7533320007004c48726d704368616e6e656c4163636570746564040124726563697069656e743901010c7533320008004848726d704368616e6e656c436c6f73696e670c0124696e69746961746f723901010c75333200011873656e6465723901010c753332000124726563697069656e743901010c7533320009002c52656c6179656446726f6d08010c77686fb50101344d756c74694c6f636174696f6e00011c6d657373616765d5040170616c6c6f633a3a626f7865643a3a426f783c58636d3c43616c6c3e3e000a0000d904000002dd0400dd04100c78636d087630146f72646572144f72646572041043616c6c000120104e756c6c000000304465706f7369744173736574080118617373657473ad01013c5665633c4d756c746941737365743e00011064657374b50101344d756c74694c6f636174696f6e0001004c4465706f7369745265736572766541737365740c0118617373657473ad01013c5665633c4d756c746941737365743e00011064657374b50101344d756c74694c6f636174696f6e00011c65666665637473ad0401385665633c4f726465723c28293e3e0002003445786368616e6765417373657408011067697665ad01013c5665633c4d756c746941737365743e00011c72656365697665ad01013c5665633c4d756c746941737365743e0003005c496e6974696174655265736572766557697468647261770c0118617373657473ad01013c5665633c4d756c746941737365743e00011c72657365727665b50101344d756c74694c6f636174696f6e00011c65666665637473ad0401385665633c4f726465723c28293e3e00040040496e69746961746554656c65706f72740c0118617373657473ad01013c5665633c4d756c746941737365743e00011064657374b50101344d756c74694c6f636174696f6e00011c65666665637473ad0401385665633c4f726465723c28293e3e000500305175657279486f6c64696e670c012071756572795f69644101010c75363400011064657374b50101344d756c74694c6f636174696f6e000118617373657473ad01013c5665633c4d756c746941737365743e00060030427579457865637574696f6e14011066656573b10101284d756c7469417373657400011877656967687410010c7536340001106465627410010c75363400013468616c745f6f6e5f6572726f72a40110626f6f6c00010c78636de10401385665633c58636d3c43616c6c3e3e00070000e104000002d50400e5040c0c78636d38646f75626c655f656e636f64656434446f75626c65456e636f646564040454000004011c656e636f64656428011c5665633c75383e0000e9040c0c78636d0876310c58636d041043616c6c00013434576974686472617741737365740801186173736574736101012c4d756c746941737365747300011c65666665637473ed0401405665633c4f726465723c43616c6c3e3e000000545265736572766541737365744465706f73697465640801186173736574736101012c4d756c746941737365747300011c65666665637473ed0401405665633c4f726465723c43616c6c3e3e000100585265636569766554656c65706f7274656441737365740801186173736574736101012c4d756c746941737365747300011c65666665637473ed0401405665633c4f726465723c43616c6c3e3e000200345175657279526573706f6e736508012071756572795f69644101010c753634000120726573706f6e7365cd040120526573706f6e7365000300345472616e7366657241737365740801186173736574736101012c4d756c746941737365747300012c62656e65666963696172792d0101344d756c74694c6f636174696f6e000400505472616e736665725265736572766541737365740c01186173736574736101012c4d756c7469417373657473000110646573742d0101344d756c74694c6f636174696f6e00011c65666665637473c10401385665633c4f726465723c28293e3e000500205472616e736163740c012c6f726967696e5f747970658d0101284f726967696e4b696e64000158726571756972655f7765696768745f61745f6d6f737410010c75363400011063616c6ce504014c446f75626c65456e636f6465643c43616c6c3e0006006448726d704e65774368616e6e656c4f70656e526571756573740c011873656e6465723901010c7533320001406d61785f6d6573736167655f73697a653901010c7533320001306d61785f63617061636974793901010c7533320007004c48726d704368616e6e656c4163636570746564040124726563697069656e743901010c7533320008004848726d704368616e6e656c436c6f73696e670c0124696e69746961746f723901010c75333200011873656e6465723901010c753332000124726563697069656e743901010c7533320009002c52656c6179656446726f6d08010c77686f31010154496e746572696f724d756c74694c6f636174696f6e00011c6d657373616765e9040170616c6c6f633a3a626f7865643a3a426f783c58636d3c43616c6c3e3e000a004053756273637269626556657273696f6e08012071756572795f69644101010c75363400014c6d61785f726573706f6e73655f7765696768744101010c753634000b0048556e73756273637269626556657273696f6e000c0000ed04000002f10400f104100c78636d087631146f72646572144f72646572041043616c6c000120104e6f6f70000000304465706f73697441737365740c0118617373657473950101404d756c7469417373657446696c7465720001286d61785f6173736574731c010c75333200012c62656e65666963696172792d0101344d756c74694c6f636174696f6e0001004c4465706f736974526573657276654173736574100118617373657473950101404d756c7469417373657446696c7465720001286d61785f6173736574731c010c753332000110646573742d0101344d756c74694c6f636174696f6e00011c65666665637473c10401385665633c4f726465723c28293e3e0002003445786368616e6765417373657408011067697665950101404d756c7469417373657446696c74657200011c726563656976656101012c4d756c74694173736574730003005c496e6974696174655265736572766557697468647261770c0118617373657473950101404d756c7469417373657446696c74657200011c726573657276652d0101344d756c74694c6f636174696f6e00011c65666665637473c10401385665633c4f726465723c28293e3e00040040496e69746961746554656c65706f72740c0118617373657473950101404d756c7469417373657446696c746572000110646573742d0101344d756c74694c6f636174696f6e00011c65666665637473c10401385665633c4f726465723c28293e3e000500305175657279486f6c64696e670c012071756572795f69644101010c753634000110646573742d0101344d756c74694c6f636174696f6e000118617373657473950101404d756c7469417373657446696c74657200060030427579457865637574696f6e14011066656573690101284d756c7469417373657400011877656967687410010c7536340001106465627410010c75363400013468616c745f6f6e5f6572726f72a40110626f6f6c000130696e737472756374696f6e73f50401385665633c58636d3c43616c6c3e3e00070000f504000002e90400f9040c0c78636d0876320c58636d041043616c6c00000400fd0401585665633c496e737472756374696f6e3c43616c6c3e3e0000fd0400000201050001050c0c78636d0876322c496e737472756374696f6e041043616c6c000170345769746864726177417373657404006101012c4d756c7469417373657473000000545265736572766541737365744465706f736974656404006101012c4d756c7469417373657473000100585265636569766554656c65706f72746564417373657404006101012c4d756c7469417373657473000200345175657279526573706f6e73650c012071756572795f69644101011c51756572794964000120726573706f6e736581010120526573706f6e73650001286d61785f7765696768744101010c753634000300345472616e7366657241737365740801186173736574736101012c4d756c746941737365747300012c62656e65666963696172792d0101344d756c74694c6f636174696f6e000400505472616e736665725265736572766541737365740c01186173736574736101012c4d756c7469417373657473000110646573742d0101344d756c74694c6f636174696f6e00010c78636d5501011c58636d3c28293e000500205472616e736163740c012c6f726967696e5f747970658d0101284f726967696e4b696e64000158726571756972655f7765696768745f61745f6d6f73744101010c75363400011063616c6ce504014c446f75626c65456e636f6465643c43616c6c3e0006006448726d704e65774368616e6e656c4f70656e526571756573740c011873656e6465723901010c7533320001406d61785f6d6573736167655f73697a653901010c7533320001306d61785f63617061636974793901010c7533320007004c48726d704368616e6e656c4163636570746564040124726563697069656e743901010c7533320008004848726d704368616e6e656c436c6f73696e670c0124696e69746961746f723901010c75333200011873656e6465723901010c753332000124726563697069656e743901010c7533320009002c436c6561724f726967696e000a003444657363656e644f726967696e040031010154496e746572696f724d756c74694c6f636174696f6e000b002c5265706f72744572726f720c012071756572795f69644101011c51756572794964000110646573742d0101344d756c74694c6f636174696f6e00014c6d61785f726573706f6e73655f7765696768744101010c753634000c00304465706f73697441737365740c0118617373657473950101404d756c7469417373657446696c7465720001286d61785f6173736574733901010c75333200012c62656e65666963696172792d0101344d756c74694c6f636174696f6e000d004c4465706f736974526573657276654173736574100118617373657473950101404d756c7469417373657446696c7465720001286d61785f6173736574733901010c753332000110646573742d0101344d756c74694c6f636174696f6e00010c78636d5501011c58636d3c28293e000e003445786368616e6765417373657408011067697665950101404d756c7469417373657446696c74657200011c726563656976656101012c4d756c7469417373657473000f005c496e6974696174655265736572766557697468647261770c0118617373657473950101404d756c7469417373657446696c74657200011c726573657276652d0101344d756c74694c6f636174696f6e00010c78636d5501011c58636d3c28293e00100040496e69746961746554656c65706f72740c0118617373657473950101404d756c7469417373657446696c746572000110646573742d0101344d756c74694c6f636174696f6e00010c78636d5501011c58636d3c28293e001100305175657279486f6c64696e6710012071756572795f69644101011c51756572794964000110646573742d0101344d756c74694c6f636174696f6e000118617373657473950101404d756c7469417373657446696c74657200014c6d61785f726573706f6e73655f7765696768744101010c75363400120030427579457865637574696f6e08011066656573690101284d756c746941737365740001307765696768745f6c696d6974a101012c5765696768744c696d697400130034526566756e64537572706c75730014003c5365744572726f7248616e646c65720400f904012458636d3c43616c6c3e0015002c536574417070656e6469780400f904012458636d3c43616c6c3e00160028436c6561724572726f7200170028436c61696d41737365740801186173736574736101012c4d756c74694173736574730001187469636b65742d0101344d756c74694c6f636174696f6e001800105472617004004101010c7536340019004053756273637269626556657273696f6e08012071756572795f69644101011c5175657279496400014c6d61785f726573706f6e73655f7765696768744101010c753634001a0048556e73756273637269626556657273696f6e001b000005050c6063756d756c75735f70616c6c65745f646d705f71756575651870616c6c65741043616c6c04045400010448736572766963655f6f766572776569676874080114696e64657810013c4f766572776569676874496e6465780001307765696768745f6c696d6974100118576569676874000030905365727669636520612073696e676c65206f766572776569676874206d6573736167652e00c02d20606f726967696e603a204d75737420706173732060457865637574654f7665727765696768744f726967696e602ee82d2060696e646578603a2054686520696e646578206f6620746865206f766572776569676874206d65737361676520746f20736572766963652e1d012d20607765696768745f6c696d6974603a2054686520616d6f756e74206f66207765696768742074686174206d65737361676520657865637574696f6e206d61792074616b652e001c4572726f72733aac2d2060556e6b6e6f776e603a204d657373616765206f662060696e6465786020697320756e6b6e6f776e2e15012d20604f7665724c696d6974603a204d65737361676520657865637574696f6e206d6179207573652067726561746572207468616e20607765696768745f6c696d6974602e001c4576656e74733a8c2d20604f7665727765696768745365727669636564603a204f6e20737563636573732e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e0905084470616c6c65745f636f6c6c65637469766514566f74657308244163636f756e74496401002c426c6f636b4e756d626572011000140114696e6465781c013450726f706f73616c496e6465780001247468726573686f6c641c012c4d656d626572436f756e74000110617965738801385665633c4163636f756e7449643e0001106e6179738801385665633c4163636f756e7449643e00010c656e6410012c426c6f636b4e756d62657200000d050c4470616c6c65745f636f6c6c6563746976651870616c6c6574144572726f72080454000449000128244e6f744d656d6265720000045c4163636f756e74206973206e6f742061206d656d626572444475706c696361746550726f706f73616c0001047c4475706c69636174652070726f706f73616c73206e6f7420616c6c6f7765643c50726f706f73616c4d697373696e670002044c50726f706f73616c206d7573742065786973742857726f6e67496e646578000304404d69736d61746368656420696e646578344475706c6963617465566f7465000404584475706c696361746520766f74652069676e6f72656448416c7265616479496e697469616c697a6564000504804d656d626572732061726520616c726561647920696e697469616c697a65642120546f6f4561726c79000604010154686520636c6f73652063616c6c20776173206d61646520746f6f206561726c792c206265666f72652074686520656e64206f662074686520766f74696e672e40546f6f4d616e7950726f706f73616c73000704fc54686572652063616e206f6e6c792062652061206d6178696d756d206f6620604d617850726f706f73616c7360206163746976652070726f706f73616c732e4c57726f6e6750726f706f73616c576569676874000804d054686520676976656e2077656967687420626f756e6420666f72207468652070726f706f73616c2077617320746f6f206c6f772e4c57726f6e6750726f706f73616c4c656e677468000904d054686520676976656e206c656e67746820626f756e6420666f72207468652070726f706f73616c2077617320746f6f206c6f772e04ad010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f7273290a0909096f6620746869732070616c6c65742e0a090909110510346672616d655f737570706f72741c73746f726167652c626f756e6465645f76656328426f756e6465645665630804540124045300000400cd0101185665633c543e000015050c4470616c6c65745f636f6c6c6563746976651870616c6c6574144572726f72080454000449000128244e6f744d656d6265720000045c4163636f756e74206973206e6f742061206d656d626572444475706c696361746550726f706f73616c0001047c4475706c69636174652070726f706f73616c73206e6f7420616c6c6f7765643c50726f706f73616c4d697373696e670002044c50726f706f73616c206d7573742065786973742857726f6e67496e646578000304404d69736d61746368656420696e646578344475706c6963617465566f7465000404584475706c696361746520766f74652069676e6f72656448416c7265616479496e697469616c697a6564000504804d656d626572732061726520616c726561647920696e697469616c697a65642120546f6f4561726c79000604010154686520636c6f73652063616c6c20776173206d61646520746f6f206561726c792c206265666f72652074686520656e64206f662074686520766f74696e672e40546f6f4d616e7950726f706f73616c73000704fc54686572652063616e206f6e6c792062652061206d6178696d756d206f6620604d617850726f706f73616c7360206163746976652070726f706f73616c732e4c57726f6e6750726f706f73616c576569676874000804d054686520676976656e2077656967687420626f756e6420666f72207468652070726f706f73616c2077617320746f6f206c6f772e4c57726f6e6750726f706f73616c4c656e677468000904d054686520676976656e206c656e67746820626f756e6420666f72207468652070726f706f73616c2077617320746f6f206c6f772e04ad010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f7273290a0909096f6620746869732070616c6c65742e0a09090919050c4470616c6c65745f6d656d626572736869701870616c6c6574144572726f7208045400044900010834416c72656164794d656d62657200000444416c72656164792061206d656d6265722e244e6f744d656d626572000104344e6f742061206d656d6265722e04ad010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f7273290a0909096f6620746869732070616c6c65742e0a0909091d05083c70616c6c65745f74726561737572792050726f706f73616c08244163636f756e74496401001c42616c616e636501180010012070726f706f7365720001244163636f756e74496400011476616c756518011c42616c616e636500012c62656e65666963696172790001244163636f756e744964000110626f6e6418011c42616c616e63650000210510346672616d655f737570706f72741c73746f726167652c626f756e6465645f76656328426f756e646564566563080454011c045300000400fd0201185665633c543e000025050c3473705f61726974686d65746963287065725f7468696e67731c5065726d696c6c000004001c010c7533320000290504184f7074696f6e04045401180108104e6f6e6500000010536f6d6504001800000100002d0508346672616d655f737570706f72742050616c6c65744964000004007901011c5b75383b20385d000031050c3c70616c6c65745f74726561737572791870616c6c6574144572726f7208045400044900011070496e73756666696369656e7450726f706f7365727342616c616e63650000047850726f706f73657227732062616c616e636520697320746f6f206c6f772e30496e76616c6964496e646578000104904e6f2070726f706f73616c206f7220626f756e7479206174207468617420696e6465782e40546f6f4d616e79417070726f76616c7300020480546f6f206d616e7920617070726f76616c7320696e207468652071756575652e4c50726f706f73616c4e6f74417070726f7665640003047c50726f706f73616c20686173206e6f74206265656e20617070726f7665642e04784572726f7220666f72207468652074726561737572792070616c6c65742e35050c3870616c6c65745f7574696c6974791870616c6c6574144572726f7204045400010430546f6f4d616e7943616c6c730000045c546f6f206d616e792063616c6c7320626174636865642e04ad010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f7273290a0909096f6620746869732070616c6c65742e0a090909390510346672616d655f737570706f72741c73746f726167652c626f756e6465645f76656328426f756e64656456656308045401b1030453000004003d0501185665633c543e00003d05000002b103004105083870616c6c65745f76657374696e672052656c65617365730001080856300000000856310001000045050c3870616c6c65745f76657374696e671870616c6c6574144572726f72040454000114284e6f7456657374696e6700000484546865206163636f756e7420676976656e206973206e6f742076657374696e672e5441744d617856657374696e675363686564756c65730001082501546865206163636f756e7420616c72656164792068617320604d617856657374696e675363686564756c65736020636f756e74206f66207363686564756c657320616e642074687573510163616e6e6f742061646420616e6f74686572206f6e652e20436f6e7369646572206d657267696e67206578697374696e67207363686564756c657320696e206f7264657220746f2061646420616e6f746865722e24416d6f756e744c6f770002040501416d6f756e74206265696e67207472616e7366657272656420697320746f6f206c6f7720746f2063726561746520612076657374696e67207363686564756c652e605363686564756c65496e6465784f75744f66426f756e6473000304d0416e20696e64657820776173206f7574206f6620626f756e6473206f66207468652076657374696e67207363686564756c65732e54496e76616c69645363686564756c65506172616d730004040d014661696c656420746f206372656174652061206e6577207363686564756c65206265636175736520736f6d6520706172616d657465722077617320696e76616c69642e04744572726f7220666f72207468652076657374696e672070616c6c65742e49050000024d05004d0504184f7074696f6e0404540151050108104e6f6e6500000010536f6d650400510500000100005105084070616c6c65745f7363686564756c65722c5363686564756c65645633101043616c6c01bd032c426c6f636b4e756d62657201103450616c6c6574734f726967696e018d03244163636f756e7449640100001401206d617962655f6964c4013c4f7074696f6e3c5665633c75383e3e0001207072696f726974790801487363686564756c653a3a5072696f7269747900011063616c6cbd03011043616c6c0001386d617962655f706572696f646963b90301944f7074696f6e3c7363686564756c653a3a506572696f643c426c6f636b4e756d6265723e3e0001186f726967696e8d03013450616c6c6574734f726967696e000055050c4070616c6c65745f7363686564756c65721870616c6c6574144572726f72040454000110404661696c6564546f5363686564756c65000004644661696c656420746f207363686564756c6520612063616c6c204e6f74466f756e640001047c43616e6e6f742066696e6420746865207363686564756c65642063616c6c2e5c546172676574426c6f636b4e756d626572496e50617374000204a4476976656e2074617267657420626c6f636b206e756d62657220697320696e2074686520706173742e4852657363686564756c654e6f4368616e6765000304f052657363686564756c65206661696c6564206265636175736520697420646f6573206e6f74206368616e6765207363686564756c65642074696d652e04ad010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f7273290a0909096f6620746869732070616c6c65742e0a0909095905000004085d0518005d0510346672616d655f737570706f72741c73746f726167652c626f756e6465645f76656328426f756e646564566563080454016105045300000400650501185665633c543e00006105083070616c6c65745f70726f78793c50726f7879446566696e6974696f6e0c244163636f756e74496401002450726f78795479706501d02c426c6f636b4e756d6265720110000c012064656c65676174650001244163636f756e74496400012870726f78795f74797065d0012450726f78795479706500011464656c617910012c426c6f636b4e756d626572000065050000026105006905000004086d0518006d0510346672616d655f737570706f72741c73746f726167652c626f756e6465645f76656328426f756e646564566563080454017105045300000400750501185665633c543e00007105083070616c6c65745f70726f787930416e6e6f756e63656d656e740c244163636f756e7449640100104861736801242c426c6f636b4e756d6265720110000c01107265616c0001244163636f756e74496400012463616c6c5f686173682401104861736800011868656967687410012c426c6f636b4e756d6265720000750500000271050079050c3070616c6c65745f70726f78791870616c6c6574144572726f720404540001201c546f6f4d616e79000004210154686572652061726520746f6f206d616e792070726f786965732072656769737465726564206f7220746f6f206d616e7920616e6e6f756e63656d656e74732070656e64696e672e204e6f74466f756e640001047450726f787920726567697374726174696f6e206e6f7420666f756e642e204e6f7450726f7879000204cc53656e646572206973206e6f7420612070726f7879206f6620746865206163636f756e7420746f2062652070726f786965642e2c556e70726f787961626c650003042101412063616c6c20776869636820697320696e636f6d70617469626c652077697468207468652070726f7879207479706527732066696c7465722077617320617474656d707465642e244475706c69636174650004046c4163636f756e7420697320616c726561647920612070726f78792e304e6f5065726d697373696f6e000504150143616c6c206d6179206e6f74206265206d6164652062792070726f78792062656361757365206974206d617920657363616c617465206974732070726976696c656765732e2c556e616e6e6f756e636564000604d0416e6e6f756e63656d656e742c206966206d61646520617420616c6c2c20776173206d61646520746f6f20726563656e746c792e2c4e6f53656c6650726f78790007046443616e6e6f74206164642073656c662061732070726f78792e04ad010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f7273290a0909096f6620746869732070616c6c65742e0a0909097d05083c70616c6c65745f707265696d616765345265717565737453746174757308244163636f756e74496401001c42616c616e6365011801082c556e7265717565737465640400810501704f7074696f6e3c284163636f756e7449642c2042616c616e6365293e0000002452657175657374656404001c010c75333200010000810504184f7074696f6e0404540185050108104e6f6e6500000010536f6d65040085050000010000850500000408001800890510346672616d655f737570706f72741c73746f726167652c626f756e6465645f76656328426f756e64656456656308045401080453000004002801185665633c543e00008d050c3c70616c6c65745f707265696d6167651870616c6c6574144572726f7204045400011820546f6f4c61726765000004a0507265696d61676520697320746f6f206c6172676520746f2073746f7265206f6e2d636861696e2e30416c72656164794e6f746564000104a4507265696d6167652068617320616c7265616479206265656e206e6f746564206f6e2d636861696e2e344e6f74417574686f72697a6564000204c85468652075736572206973206e6f7420617574686f72697a656420746f20706572666f726d207468697320616374696f6e2e204e6f744e6f746564000304fc54686520707265696d6167652063616e6e6f742062652072656d6f7665642073696e636520697420686173206e6f7420796574206265656e206e6f7465642e2452657175657374656400040409014120707265696d616765206d6179206e6f742062652072656d6f766564207768656e20746865726520617265206f75747374616e64696e672072657175657374732e304e6f745265717565737465640005042d0154686520707265696d61676520726571756573742063616e6e6f742062652072656d6f7665642073696e6365206e6f206f75747374616e64696e672072657175657374732065786973742e04ad010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f7273290a0909096f6620746869732070616c6c65742e0a09090991050c4470616c6c65745f6d656d626572736869701870616c6c6574144572726f7208045400044900010834416c72656164794d656d62657200000444416c72656164792061206d656d6265722e244e6f744d656d626572000104344e6f742061206d656d6265722e04ad010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f7273290a0909096f6620746869732070616c6c65742e0a0909099505082c70616c6c65745f746970731c4f70656e54697010244163636f756e74496401001c42616c616e636501182c426c6f636b4e756d626572011010486173680124001c0118726561736f6e2401104861736800010c77686f0001244163636f756e74496400011866696e6465720001244163636f756e74496400011c6465706f73697418011c42616c616e6365000118636c6f736573fd01014c4f7074696f6e3c426c6f636b4e756d6265723e00011074697073990501645665633c284163636f756e7449642c2042616c616e6365293e00012c66696e646572735f666565a40110626f6f6c000099050000028505009d050c3473705f61726974686d65746963287065725f7468696e67731c50657263656e740000040008010875380000a1050c2c70616c6c65745f746970731870616c6c6574144572726f7204045400011830526561736f6e546f6f4269670000048454686520726561736f6e20676976656e206973206a75737420746f6f206269672e30416c72656164794b6e6f776e00010488546865207469702077617320616c726561647920666f756e642f737461727465642e28556e6b6e6f776e5469700002046054686520746970206861736820697320756e6b6e6f776e2e244e6f7446696e6465720003041d01546865206163636f756e7420617474656d7074696e6720746f20726574726163742074686520746970206973206e6f74207468652066696e646572206f6620746865207469702e245374696c6c4f70656e0004042901546865207469702063616e6e6f7420626520636c61696d65642f636c6f736564206265636175736520746865726520617265206e6f7420656e6f7567682074697070657273207965742e245072656d61747572650005043101546865207469702063616e6e6f7420626520636c61696d65642f636c6f73656420626563617573652069742773207374696c6c20696e2074686520636f756e74646f776e20706572696f642e04ad010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f7273290a0909096f6620746869732070616c6c65742e0a090909a5050c1463747970651870616c6c6574144572726f7204045400010c3443547970654e6f74466f756e64000004985468657265206973206e6f20435479706520776974682074686520676976656e20686173682e484354797065416c72656164794578697374730001046454686520435479706520616c7265616479206578697374732e3c556e61626c65546f506179466565730002040d0154686520706179696e67206163636f756e742077617320756e61626c6520746f2070617920746865206665657320666f72206372656174696e6720612063747970652e04ad010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f7273290a0909096f6620746869732070616c6c65742e0a090909a9050c2c6174746573746174696f6e306174746573746174696f6e73484174746573746174696f6e44657461696c73040454000014012863747970655f686173682401384374797065486173684f663c543e000120617474657374657200013441747465737465724f663c543e000140617574686f72697a6174696f6e5f6964ec01704f7074696f6e3c417574686f72697a6174696f6e49644f663c543e3e00011c7265766f6b6564a40110626f6f6c00011c6465706f736974ad0501944465706f7369743c4163636f756e7449644f663c543e2c2042616c616e63654f663c543e3e0000ad050c306b696c745f737570706f72741c6465706f7369741c4465706f736974081c4163636f756e7401001c42616c616e63650118000801146f776e657200011c4163636f756e74000118616d6f756e7418011c42616c616e63650000b10500000408f02400b5050c2c6174746573746174696f6e1870616c6c6574144572726f720404540001183c416c726561647941747465737465640000080901546865726520697320616c726561647920616e206174746573746174696f6e2077697468207468652073616d6520636c61696d20686173682073746f726564206f6e18636861696e2e38416c72656164795265766f6b6564000104a4546865206174746573746174696f6e2068617320616c7265616479206265656e207265766f6b65642e4c4174746573746174696f6e4e6f74466f756e64000204c04e6f206174746573746174696f6e206f6e20636861696e206d61746368696e672074686520636c61696d20686173682e3443547970654d69736d61746368000308fc546865206174746573746174696f6e20435479706520646f6573206e6f74206d61746368207468652043547970652073706563696669656420696e207468656864656c65676174696f6e2068696572617263687920726f6f742e30556e617574686f72697a6564000404f05468652063616c6c206f726967696e206973206e6f7420617574686f72697a656420746f206368616e676520746865206174746573746174696f6e2e804d617844656c6567617465644174746573746174696f6e73457863656564656400050cf4546865206d6178696d756d206e756d626572206f662064656c656761746564206174746573746174696f6e732068617320616c7265616479206265656e05017265616368656420666f722074686520636f72726573706f6e64696e672064656c65676174696f6e2069642073756368207468617420616e6f74686572206f6e654063616e6e6f742062652061646465642e04ad010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f7273290a0909096f6620746869732070616c6c65742e0a090909b9050c2864656c65676174696f6e5064656c65676174696f6e5f6869657261726368793844656c65676174696f6e4e6f646504045400001401446869657261726368795f726f6f745f696424015444656c65676174696f6e4e6f646549644f663c543e000118706172656e74190101744f7074696f6e3c44656c65676174696f6e4e6f646549644f663c543e3e0001206368696c6472656ebd0501d8426f756e64656442547265655365743c44656c65676174696f6e4e6f646549644f663c543e2c20543a3a4d61784368696c6472656e3e00011c64657461696c73c505015044656c65676174696f6e44657461696c733c543e00011c6465706f736974ad0501944465706f7369743c4163636f756e7449644f663c543e2c2042616c616e63654f663c543e3e0000bd0510346672616d655f737570706f72741c73746f7261676544626f756e6465645f62747265655f7365743c426f756e64656442547265655365740804540124045300000400c105012c42547265655365743c543e0000c105042042547265655365740404540124000400cd01000000c5050c2864656c65676174696f6e5064656c65676174696f6e5f6869657261726368794444656c65676174696f6e44657461696c7304045400000c01146f776e657200014044656c656761746f7249644f663c543e00011c7265766f6b6564a40110626f6f6c00012c7065726d697373696f6e73f8012c5065726d697373696f6e730000c9050c2864656c65676174696f6e5064656c65676174696f6e5f6869657261726368796844656c65676174696f6e48696572617263687944657461696c73040454000004012863747970655f686173682401384374797065486173684f663c543e0000cd050c2864656c65676174696f6e1870616c6c6574144572726f720404540001585c44656c65676174696f6e416c72656164794578697374730000041101546865726520697320616c726561647920612064656c65676174696f6e206e6f64652077697468207468652073616d652049442073746f726564206f6e20636861696e2e60496e76616c696444656c65676174655369676e617475726500010805015468652064656c65676174652773207369676e617475726520666f72207468652064656c65676174696f6e206372656174696f6e206f7065726174696f6e20697320696e76616c69642e4844656c65676174696f6e4e6f74466f756e64000204c04e6f2064656c65676174696f6e20776974682074686520676976656e2049442073746f726564206f6e20636861696e2e4044656c65676174654e6f74466f756e64000304b84e6f2064656c656761746520776974682074686520676976656e2049442073746f726564206f6e20636861696e2e58486965726172636879416c7265616479457869737473000404f8546865726520697320616c72656164792061206869657261726368792077697468207468652073616d652049442073746f726564206f6e20636861696e2e444869657261726368794e6f74466f756e64000504bc4e6f2068696572617263687920776974682074686520676976656e2049442073746f726564206f6e20636861696e2e544d617853656172636844657074685265616368656400060409014d6178206e756d626572206f66206e6f64657320636865636b656420776974686f757420766572696679696e672074686520676976656e20636f6e646974696f6e2e684e6f744f776e65724f66506172656e7444656c65676174696f6e000708f45468652064656c65676174696f6e2063726561746f72206973206e6f7420616c6c6f77656420746f207772697465207468652064656c65676174696f6ef462656361757365207468657920617265206e6f7420746865206f776e6572206f66207468652064656c65676174696f6e20706172656e74206e6f64652e744e6f744f776e65724f6644656c65676174696f6e486965726172636879000808f45468652064656c65676174696f6e2063726561746f72206973206e6f7420616c6c6f77656420746f207772697465207468652064656c65676174696f6eec62656361757365207468657920617265206e6f7420746865206f776e6572206f66207468652064656c65676174696f6e20726f6f74206e6f64652e60506172656e7444656c65676174696f6e4e6f74466f756e64000904dc4e6f20706172656e742064656c65676174696f6e20776974682074686520676976656e2049442073746f726564206f6e20636861696e2e5c506172656e7444656c65676174696f6e5265766f6b6564000a04c854686520706172656e742064656c65676174696f6e206861732070726576696f75736c79206265656e207265766f6b65642e58556e617574686f72697a65645265766f636174696f6e000b04fc5468652064656c65676174696f6e207265766f6b6572206973206e6f7420616c6c6f77656420746f207265766f6b65207468652064656c65676174696f6e2e4c556e617574686f72697a656452656d6f76616c000c04ec5468652063616c6c206f726967696e206973206e6f7420617574686f72697a656420746f2072656d6f7665207468652064656c65676174696f6e2e58556e617574686f72697a656444656c65676174696f6e000d04fc5468652064656c65676174696f6e2063726561746f72206973206e6f7420616c6c6f77656420746f20637265617465207468652064656c65676174696f6e2e3041636365737344656e696564000e04f0546865206f7065726174696f6e207761736e277420616c6c6f7765642062656361757365206f6620696e73756666696369656e74207269676874732e6045786365656465645265766f636174696f6e426f756e6473000f080d014d6178206e756d626572206f66207265766f636174696f6e7320666f722064656c65676174696f6e206e6f64657320686173206265656e207265616368656420666f7238746865206f7065726174696f6e2e54457863656564656452656d6f76616c426f756e647300100811014d6178206e756d626572206f662072656d6f76616c7320666f722064656c65676174696f6e206e6f64657320686173206265656e207265616368656420666f7220746865286f7065726174696f6e2e584d61785265766f636174696f6e73546f6f4c61726765001104f8546865206d6178206e756d626572206f66207265766f636174696f6e206578636565647320746865206c696d697420666f72207468652070616c6c65742e4c4d617852656d6f76616c73546f6f4c61726765001204f0546865206d6178206e756d626572206f662072656d6f76616c73206578636565647320746865206c696d697420666f72207468652070616c6c65742e5c4d6178506172656e74436865636b73546f6f4c617267650013040501546865206d6178206e756d626572206f6620706172656e7420636865636b73206578636565647320746865206c696d697420666f72207468652070616c6c65742e34496e7465726e616c4572726f72001404f4416e206572726f722074686174206973206e6f7420737570706f73656420746f2074616b6520706c6163652c207965742069742068617070656e65642e4c4d61784368696c6472656e4578636565646564001508dc546865206d6178206e756d626572206f6620616c6c206368696c6472656e20686173206265656e207265616368656420666f722074686578636f72726573706f6e64696e672064656c65676174696f6e206e6f64652e04ad010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f7273290a0909096f6620746869732070616c6c65742e0a090909d1050c0c6469642c6469645f64657461696c732844696444657461696c7304045400001c014861757468656e7469636174696f6e5f6b65792401284b657949644f663c543e0001486b65795f61677265656d656e745f6b657973d50501604469644b657941677265656d656e744b65795365743c543e00013864656c65676174696f6e5f6b6579190101484f7074696f6e3c4b657949644f663c543e3e00013c6174746573746174696f6e5f6b6579190101484f7074696f6e3c4b657949644f663c543e3e00012c7075626c69635f6b657973d90501484469645075626c69634b65794d61703c543e00013c6c6173745f74785f636f756e74657210010c75363400011c6465706f736974ad0501944465706f7369743c4163636f756e7449644f663c543e2c2042616c616e63654f663c543e3e0000d50510346672616d655f737570706f72741c73746f7261676544626f756e6465645f62747265655f7365743c426f756e64656442547265655365740804540124045300000400c105012c42547265655365743c543e0000d90510346672616d655f737570706f72741c73746f7261676544626f756e6465645f62747265655f6d61703c426f756e64656442547265654d61700c044b0124045601dd05045300000400e505013842547265654d61703c4b2c20563e0000dd050c0c6469642c6469645f64657461696c734c4469645075626c69634b657944657461696c73040454000008010c6b6579e10501304469645075626c69634b6579000130626c6f636b5f6e756d626572100140426c6f636b4e756d6265724f663c543e0000e1050c0c6469642c6469645f64657461696c73304469645075626c69634b6579000108545075626c6963566572696669636174696f6e4b6579040025040148446964566572696669636174696f6e4b65790000004c5075626c6963456e6372797074696f6e4b6579040015040140446964456e6372797074696f6e4b657900010000e505042042547265654d617008044b0124045601dd05000400e905000000e905000002ed0500ed050000040824dd0500f10500000408003d0400f5050c0c6469641870616c6c6574144572726f7204045400016c58496e76616c69645369676e6174757265466f726d6174000008050154686520444944206f7065726174696f6e207369676e6174757265206973206e6f7420696e2074686520666f726d61742074686520766572696669636174696f6e306b657920657870656374732e40496e76616c69645369676e6174757265000108f854686520444944206f7065726174696f6e207369676e617475726520697320696e76616c696420666f7220746865207061796c6f616420616e642074686568766572696669636174696f6e206b65792070726f76696465642e44446964416c726561647950726573656e74000204f85468652044494420776974682074686520676976656e206964656e74696669657220697320616c72656164792070726573656e74206f6e20636861696e2e344469644e6f7450726573656e74000304d44e6f2044494420776974682074686520676976656e206964656e7469666965722069732070726573656e74206f6e20636861696e2e64566572696669636174696f6e4b65794e6f7450726573656e7400040809014f6e65206f72206d6f726520766572696669636174696f6e206b657973207265666572656e63656420617265206e6f742073746f72656420696e2074686520736574546f6620766572696669636174696f6e206b6579732e30496e76616c69644e6f6e6365000504090154686520444944206f7065726174696f6e206e6f6e6365206973206e6f7420657175616c20746f207468652063757272656e7420444944206e6f6e6365202b20312e7c556e737570706f72746564446964417574686f72697a6174696f6e43616c6c000604e05468652063616c6c65642065787472696e73696320646f6573206e6f7420737570706f72742044494420617574686f7269736174696f6e2e6c496e76616c6964446964417574686f72697a6174696f6e43616c6c000708dc5468652063616c6c2068616420706172616d6574657273207468617420636f6e666c696374656420776974682065616368206f74686572406f72207765726520696e76616c69642e804d61784b657941677265656d656e744b6579734c696d697445786365656465640008080d0141206e756d626572206f66206e6577206b65792061677265656d656e74206b6579732067726561746572207468616e20746865206d6178696d756d20616c6c6f77656448686173206265656e2070726f76696465642e6c4d61785075626c69634b65797350657244696445786365656465640009080501546865206d6178696d756d206e756d626572206f66207075626c6963206b65797320666f72207468697320444944206b6579206964656e74696669657220686173346265656e20726561636865642e804d6178546f74616c4b657941677265656d656e744b6579734578636565646564000a080501546865206d6178696d756d206e756d626572206f66206b65792061677265656d656e747320686173206265656e207265616368656420666f722074686520444944207375626a6563742e304261644469644f726967696e000b04bc546865204449442063616c6c20776173207375626d6974746564206279207468652077726f6e67206163636f756e74485472616e73616374696f6e45787069726564000c040d0154686520626c6f636b206e756d6265722070726f766964656420696e2061204449442d617574686f72697a6564206f7065726174696f6e20697320696e76616c69642e44446964416c726561647944656c65746564000d04b0546865204449442068617320616c7265616479206265656e2070726576696f75736c792064656c657465642e444e6f744f776e65724f664465706f736974000e04fc4f6e6c7920746865206f776e6572206f6620746865206465706f7369742063616e207265636c61696d206974732072657365727665642062616c616e63652e3c556e61626c65546f50617946656573000f04f0546865206f726967696e20697320756e61626c6520746f207265736572766520746865206465706f73697420616e642070617920746865206665652e844d61784e756d6265724f66536572766963657350657244696445786365656465640010041101546865206d6178696d756d206e756d626572206f66207365727669636520656e64706f696e747320666f7220612044494420686173206265656e2065786365656465642e684d61785365727669636549644c656e6774684578636565646564001104f0546865207365727669636520656e64706f696e7420494420657863656564656420746865206d6178696d756d20616c6c6f776564206c656e6774682e704d617853657276696365547970654c656e6774684578636565646564001208f84f6e65206f6620746865207365727669636520656e64706f696e7420747970657320657863656564656420746865206d6178696d756d20616c6c6f7765641c6c656e6774682e884d61784e756d6265724f665479706573506572536572766963654578636565646564001308ec546865206d6178696d756d206e756d626572206f6620747970657320666f722061207365727669636520656e64706f696e7420686173206265656e2465786365656465642e6c4d61785365727669636555726c4c656e6774684578636565646564001408f44f6e65206f6620746865207365727669636520656e64706f696e742055524c7320657863656564656420746865206d6178696d756d20616c6c6f7765641c6c656e6774682e844d61784e756d6265724f6655726c735065725365727669636545786365656465640015041101546865206d6178696d756d206e756d626572206f662055524c7320666f722061207365727669636520656e64706f696e7420686173206265656e2065786365656465642e5453657276696365416c726561647950726573656e7400160411014120736572766963652077697468207468652070726f766964656420494420697320616c72656164792070726573656e7420666f722074686520676976656e204449442e44536572766963654e6f7450726573656e7400170409014120736572766963652077697468207468652070726f7669646564204944206973206e6f742070726573656e7420756e6465722074686520676976656e204449442e58496e76616c696453657276696365456e636f64696e6700180409014f6e65206f6620746865207365727669636520656e64706f696e742064657461696c7320636f6e7461696e73206e6f6e2d415343494920636861726163746572732e7053746f726564456e64706f696e7473436f756e74546f6f4c617267650019080d01546865206e756d626572206f66207365727669636520656e64706f696e74732073746f72656420756e6465722074686520444944206973206c6172676572207468616e88746865206e756d626572206f6620656e64706f696e747320746f2064656c6574652e34496e7465726e616c4572726f72001a04f4416e206572726f722074686174206973206e6f7420737570706f73656420746f2074616b6520706c6163652c207965742069742068617070656e65642e04ad010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f7273290a0909096f6620746869732070616c6c65742e0a090909f9050c4470616c6c65745f6469645f6c6f6f6b757044636f6e6e656374696f6e5f7265636f726440436f6e6e656374696f6e5265636f72640c344469644964656e74696669657201001c4163636f756e7401001c42616c616e636501180008010c6469640001344469644964656e74696669657200011c6465706f736974ad0501644465706f7369743c4163636f756e742c2042616c616e63653e0000fd050000040800000001060c4470616c6c65745f6469645f6c6f6f6b75701870616c6c6574144572726f720404540001104c4173736f63696174696f6e4e6f74466f756e640000047c546865206173736f63696174696f6e20646f6573206e6f742065786973742e344e6f74417574686f72697a65640001081101546865206f726967696e20776173206e6f7420616c6c6f77656420746f206d616e61676520746865206173736f63696174696f6e206265747765656e20746865204449444c616e6420746865206163636f756e742049442e344f7574646174656450726f6f66000204b454686520737570706c6965642070726f6f66206f66206f776e65727368697020776173206f757464617465642e44496e73756666696369656e7446756e64730003081101546865206163636f756e742068617320696e73756666696369656e742066756e647320616e642063616e277420706179207468652066656573206f72207265736572766530746865206465706f7369742e04ad010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f7273290a0909096f6620746869732070616c6c65742e0a09090905060c4470616c6c65745f776562335f6e616d657324776562335f6e616d6544576562334e616d654f776e6572736869700c144f776e657201001c4465706f73697401ad052c426c6f636b4e756d6265720110000c01146f776e65720001144f776e6572000128636c61696d65645f617410012c426c6f636b4e756d62657200011c6465706f736974ad05011c4465706f736974000009060c4470616c6c65745f776562335f6e616d65731870616c6c6574144572726f7204045400013044496e73756666696369656e7446756e64730000040d01546865207478207375626d697474657220646f6573206e6f74206861766520656e6f7567682066756e647320746f2070617920666f7220746865206465706f7369742e58576562334e616d65416c7265616479436c61696d6564000104dc54686520737065636966696564206e616d652068617320616c7265616479206265656e2070726576696f75736c7920636c61696d65642e40576562334e616d654e6f74466f756e640002048854686520737065636966696564206e616d6520646f6573206e6f742065786973742e484f776e6572416c7265616479457869737473000304a054686520737065636966696564206f776e657220616c7265616479206f776e732061206e616d652e344f776e65724e6f74466f756e64000404ac54686520737065636966696564206f776e657220646f6573206e6f74206f776e20616e79206e616d65732e38576562334e616d6542616e6e6564000508ec54686520737065636966696564206e616d6520686173206265656e2062616e6e656420616e642063616e6e6f7420626520696e746572616374656414776974682e44576562334e616d654e6f7442616e6e6564000604ac54686520737065636966696564206e616d65206973206e6f742063757272656e746c792062616e6e65642e54576562334e616d65416c726561647942616e6e6564000704d854686520737065636966696564206e616d652068617320616c7265616479206265656e2070726576696f75736c792062616e6e65642e344e6f74417574686f72697a6564000804cc546865206163746f722063616e6e6f7420706572666f726d65642074686520737065636966696564206f7065726174696f6e2e40576562334e616d65546f6f53686f7274000904a841206e616d65207468617420697320746f6f2073686f7274206973206265696e6720636c61696d65642e3c576562334e616d65546f6f4c6f6e67000a04a441206e616d65207468617420697320746f6f206c6f6e67206973206265696e6720636c61696d65642e60496e76616c6964576562334e616d65436861726163746572000b04f441206e616d65207468617420636f6e7461696e73206e6f7420616c6c6f7765642063686172616374657273206973206265696e6720636c61696d65642e04ad010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f7273290a0909096f6620746869732070616c6c65742e0a0909090d0604184f7074696f6e0404540111060108104e6f6e6500000010536f6d6504001106000001000011060c4c706f6c6b61646f745f7072696d69746976657308763248557067726164655265737472696374696f6e0001041c50726573656e740000000015060c7c63756d756c75735f70616c6c65745f70617261636861696e5f73797374656d5072656c61795f73746174655f736e617073686f74584d6573736167696e675374617465536e617073686f740000100130646d715f6d71635f6865616424014472656c61795f636861696e3a3a4861736800016472656c61795f64697370617463685f71756575655f73697a6519060128287533322c2075333229000140696e67726573735f6368616e6e656c731d0601885665633c285061726149642c20416272696467656448726d704368616e6e656c293e00013c6567726573735f6368616e6e656c731d0601885665633c285061726149642c20416272696467656448726d704368616e6e656c293e00001906000004081c1c001d06000002210600210600000408210125060025060c4c706f6c6b61646f745f7072696d6974697665730876324c416272696467656448726d704368616e6e656c00001801306d61785f63617061636974791c010c7533320001386d61785f746f74616c5f73697a651c010c7533320001406d61785f6d6573736167655f73697a651c010c7533320001246d73675f636f756e741c010c753332000128746f74616c5f73697a651c010c7533320001206d71635f68656164190101304f7074696f6e3c486173683e000029060c4c706f6c6b61646f745f7072696d697469766573087632644162726964676564486f7374436f6e66696775726174696f6e00002401346d61785f636f64655f73697a651c010c7533320001486d61785f686561645f646174615f73697a651c010c7533320001586d61785f7570776172645f71756575655f636f756e741c010c7533320001546d61785f7570776172645f71756575655f73697a651c010c75333200015c6d61785f7570776172645f6d6573736167655f73697a651c010c7533320001906d61785f7570776172645f6d6573736167655f6e756d5f7065725f63616e6469646174651c010c75333200018868726d705f6d61785f6d6573736167655f6e756d5f7065725f63616e6469646174651c010c75333200016c76616c69646174696f6e5f757067726164655f636f6f6c646f776e1c012c426c6f636b4e756d62657200016076616c69646174696f6e5f757067726164655f64656c61791c012c426c6f636b4e756d62657200002d06089463756d756c75735f7072696d6974697665735f70617261636861696e5f696e686572656e74444d6573736167655175657565436861696e0000040024012452656c61794861736800003106042042547265654d617008044b0121010456012d060004003506000000350600000239060039060000040821012d06003d0600000241060041060860706f6c6b61646f745f636f72655f7072696d6974697665734c4f7574626f756e6448726d704d6573736167650408496401210100080124726563697069656e742101010849640001106461746128015073705f7374643a3a7665633a3a5665633c75383e000045060c7c63756d756c75735f70616c6c65745f70617261636861696e5f73797374656d1870616c6c6574144572726f720404540001204c4f7665726c617070696e6755706772616465730000041501417474656d707420746f20757067726164652076616c69646174696f6e2066756e6374696f6e207768696c65206578697374696e6720757067726164652070656e64696e675050726f686962697465644279506f6c6b61646f740001044901506f6c6b61646f742063757272656e746c792070726f68696269747320746869732070617261636861696e2066726f6d20757067726164696e67206974732076616c69646174696f6e2066756e6374696f6e18546f6f426967000208450154686520737570706c6965642076616c69646174696f6e2066756e6374696f6e2068617320636f6d70696c656420696e746f206120626c6f62206c6172676572207468616e20506f6c6b61646f742069733877696c6c696e6720746f2072756e6856616c69646174696f6e446174614e6f74417661696c61626c65000304190154686520696e686572656e7420776869636820737570706c696573207468652076616c69646174696f6e206461746120646964206e6f742072756e207468697320626c6f636b74486f7374436f6e66696775726174696f6e4e6f74417661696c61626c65000404250154686520696e686572656e7420776869636820737570706c6965732074686520686f737420636f6e66696775726174696f6e20646964206e6f742072756e207468697320626c6f636b304e6f745363686564756c6564000504d84e6f2076616c69646174696f6e2066756e6374696f6e20757067726164652069732063757272656e746c79207363686564756c65642e444e6f7468696e67417574686f72697a6564000604904e6f20636f6465207570677261646520686173206265656e20617574686f72697a65642e30556e617574686f72697a6564000704bc54686520676976656e20636f6465207570677261646520686173206e6f74206265656e20617574686f72697a65642e04ad010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f7273290a0909096f6620746869732070616c6c65742e0a09090949060000024d06004d06086463756d756c75735f70616c6c65745f78636d705f717565756554496e626f756e644368616e6e656c44657461696c7300000c011873656e64657221010118506172614964000114737461746551060130496e626f756e6453746174650001406d6573736167655f6d65746164617461550601a85665633c2852656c6179426c6f636b4e756d6265722c2058636d704d657373616765466f726d6174293e00005106086463756d756c75735f70616c6c65745f78636d705f717565756530496e626f756e645374617465000108084f6b0000002453757370656e6465640001000055060000025906005906000004081c5d06005d060c48706f6c6b61646f745f70617261636861696e287072696d6974697665734458636d704d657373616765466f726d617400010c60436f6e636174656e6174656456657273696f6e656458636d0000005c436f6e636174656e61746564456e636f646564426c6f620001001c5369676e616c730002000061060000040821011c0065060000026906006906086463756d756c75735f70616c6c65745f78636d705f7175657565584f7574626f756e644368616e6e656c44657461696c730000140124726563697069656e742101011850617261496400011473746174656d0601344f7574626f756e6453746174650001347369676e616c735f6578697374a40110626f6f6c00012c66697273745f696e646578d4010c7531360001286c6173745f696e646578d4010c75313600006d06086463756d756c75735f70616c6c65745f78636d705f7175657565344f7574626f756e645374617465000108084f6b0000002453757370656e646564000100007106000004082101d4007506086463756d756c75735f70616c6c65745f78636d705f71756575653c5175657565436f6e66696744617461000018014473757370656e645f7468726573686f6c641c010c75333200013864726f705f7468726573686f6c641c010c753332000140726573756d655f7468726573686f6c641c010c7533320001407468726573686f6c645f7765696768741001185765696768740001547765696768745f72657374726963745f646563617910011857656967687400016878636d705f6d61785f696e646976696475616c5f776569676874100118576569676874000079060000040c21011c28007d060c6463756d756c75735f70616c6c65745f78636d705f71756575651870616c6c6574144572726f72040454000114304661696c6564546f53656e640000046c4661696c656420746f2073656e642058434d206d6573736167652e3042616458636d4f726967696e0001043c4261642058434d206f726967696e2e1842616458636d000204344261642058434d20646174612e484261644f766572776569676874496e64657800030454426164206f76657277656967687420696e6465782e3c5765696768744f7665724c696d6974000404f850726f76696465642077656967687420697320706f737369626c79206e6f7420656e6f75676820746f206578656375746520746865206d6573736167652e04ad010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f7273290a0909096f6620746869732070616c6c65742e0a09090981060c2870616c6c65745f78636d1870616c6c6574144572726f720404540001342c556e726561636861626c650000085d0154686520646573697265642064657374696e6174696f6e2077617320756e726561636861626c652c2067656e6572616c6c7920626563617573652074686572652069732061206e6f20776179206f6620726f7574696e6718746f2069742e2c53656e644661696c757265000108610154686572652077617320736f6d65206f746865722069737375652028692e652e206e6f7420746f20646f207769746820726f7574696e672920696e2073656e64696e6720746865206d6573736167652e2050657268617073a861206c61636b206f6620737061636520666f7220627566666572696e6720746865206d6573736167652e2046696c74657265640002049c546865206d65737361676520657865637574696f6e206661696c73207468652066696c7465722e48556e776569676861626c654d657373616765000304b4546865206d65737361676527732077656967687420636f756c64206e6f742062652064657465726d696e65642e6044657374696e6174696f6e4e6f74496e7665727469626c65000404f05468652064657374696e6174696f6e20604d756c74694c6f636174696f6e602070726f76696465642063616e6e6f7420626520696e7665727465642e14456d707479000504805468652061737365747320746f2062652073656e742061726520656d7074792e3843616e6e6f745265616e63686f720006043501436f756c64206e6f742072652d616e63686f72207468652061737365747320746f206465636c61726520746865206665657320666f72207468652064657374696e6174696f6e20636861696e2e34546f6f4d616e79417373657473000704c4546f6f206d616e79206173736574732068617665206265656e20617474656d7074656420666f72207472616e736665722e34496e76616c69644f726967696e000804784f726967696e20697320696e76616c696420666f722073656e64696e672e2842616456657273696f6e00090421015468652076657273696f6e206f6620746865206056657273696f6e6564602076616c75652075736564206973206e6f742061626c6520746f20626520696e7465727072657465642e2c4261644c6f636174696f6e000a08410154686520676976656e206c6f636174696f6e20636f756c64206e6f7420626520757365642028652e672e20626563617573652069742063616e6e6f742062652065787072657373656420696e2074686560646573697265642076657273696f6e206f662058434d292e384e6f537562736372697074696f6e000b04bc546865207265666572656e63656420737562736372697074696f6e20636f756c64206e6f7420626520666f756e642e44416c726561647953756273637269626564000c041101546865206c6f636174696f6e20697320696e76616c69642073696e636520697420616c726561647920686173206120737562736372697074696f6e2066726f6d2075732e04ad010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f7273290a0909096f6620746869732070616c6c65742e0a09090985060c4863756d756c75735f70616c6c65745f78636d1870616c6c6574144572726f7204045400010004ad010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f7273290a0909096f6620746869732070616c6c65742e0a0909098906086063756d756c75735f70616c6c65745f646d705f717565756528436f6e6669674461746100000401386d61785f696e646976696475616c10011857656967687400008d06086063756d756c75735f70616c6c65745f646d705f71756575653450616765496e6465784461746100000c0128626567696e5f757365641c012c50616765436f756e746572000120656e645f757365641c012c50616765436f756e7465720001406f7665727765696768745f636f756e7410013c4f766572776569676874496e646578000091060000029506009506000004081c280099060c6063756d756c75735f70616c6c65745f646d705f71756575651870616c6c6574144572726f720404540001081c556e6b6e6f776e0000048c546865206d65737361676520696e64657820676976656e20697320756e6b6e6f776e2e244f7665724c696d6974000104310154686520616d6f756e74206f662077656967687420676976656e20697320706f737369626c79206e6f7420656e6f75676820666f7220657865637574696e6720746865206d6573736167652e04ad010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f7273290a0909096f6620746869732070616c6c65742e0a0909099d06102873705f72756e74696d651c67656e657269634c756e636865636b65645f65787472696e73696348556e636865636b656445787472696e736963101c416464726573730159021043616c6c017103245369676e617475726501610414457874726101a10600040028000000a10600000420a506a906ad06b106b506bd06c106c50600a50610306672616d655f73797374656d28657874656e73696f6e7354636865636b5f6e6f6e5f7a65726f5f73656e64657248436865636b4e6f6e5a65726f53656e64657204045400000000a90610306672616d655f73797374656d28657874656e73696f6e7348636865636b5f737065635f76657273696f6e40436865636b5370656356657273696f6e04045400000000ad0610306672616d655f73797374656d28657874656e73696f6e7340636865636b5f74785f76657273696f6e38436865636b547856657273696f6e04045400000000b10610306672616d655f73797374656d28657874656e73696f6e7334636865636b5f67656e6573697330436865636b47656e6573697304045400000000b50610306672616d655f73797374656d28657874656e73696f6e733c636865636b5f6d6f7274616c69747938436865636b4d6f7274616c69747904045400000400b906010c4572610000b906102873705f72756e74696d651c67656e657269630c6572610c4572610001010420496d6d6f7274616c0000001c4d6f7274616c31040008000001001c4d6f7274616c32040008000002001c4d6f7274616c33040008000003001c4d6f7274616c34040008000004001c4d6f7274616c35040008000005001c4d6f7274616c36040008000006001c4d6f7274616c37040008000007001c4d6f7274616c38040008000008001c4d6f7274616c3904000800000900204d6f7274616c313004000800000a00204d6f7274616c313104000800000b00204d6f7274616c313204000800000c00204d6f7274616c313304000800000d00204d6f7274616c313404000800000e00204d6f7274616c313504000800000f00204d6f7274616c313604000800001000204d6f7274616c313704000800001100204d6f7274616c313804000800001200204d6f7274616c313904000800001300204d6f7274616c323004000800001400204d6f7274616c323104000800001500204d6f7274616c323204000800001600204d6f7274616c323304000800001700204d6f7274616c323404000800001800204d6f7274616c323504000800001900204d6f7274616c323604000800001a00204d6f7274616c323704000800001b00204d6f7274616c323804000800001c00204d6f7274616c323904000800001d00204d6f7274616c333004000800001e00204d6f7274616c333104000800001f00204d6f7274616c333204000800002000204d6f7274616c333304000800002100204d6f7274616c333404000800002200204d6f7274616c333504000800002300204d6f7274616c333604000800002400204d6f7274616c333704000800002500204d6f7274616c333804000800002600204d6f7274616c333904000800002700204d6f7274616c343004000800002800204d6f7274616c343104000800002900204d6f7274616c343204000800002a00204d6f7274616c343304000800002b00204d6f7274616c343404000800002c00204d6f7274616c343504000800002d00204d6f7274616c343604000800002e00204d6f7274616c343704000800002f00204d6f7274616c343804000800003000204d6f7274616c343904000800003100204d6f7274616c353004000800003200204d6f7274616c353104000800003300204d6f7274616c353204000800003400204d6f7274616c353304000800003500204d6f7274616c353404000800003600204d6f7274616c353504000800003700204d6f7274616c353604000800003800204d6f7274616c353704000800003900204d6f7274616c353804000800003a00204d6f7274616c353904000800003b00204d6f7274616c363004000800003c00204d6f7274616c363104000800003d00204d6f7274616c363204000800003e00204d6f7274616c363304000800003f00204d6f7274616c363404000800004000204d6f7274616c363504000800004100204d6f7274616c363604000800004200204d6f7274616c363704000800004300204d6f7274616c363804000800004400204d6f7274616c363904000800004500204d6f7274616c373004000800004600204d6f7274616c373104000800004700204d6f7274616c373204000800004800204d6f7274616c373304000800004900204d6f7274616c373404000800004a00204d6f7274616c373504000800004b00204d6f7274616c373604000800004c00204d6f7274616c373704000800004d00204d6f7274616c373804000800004e00204d6f7274616c373904000800004f00204d6f7274616c383004000800005000204d6f7274616c383104000800005100204d6f7274616c383204000800005200204d6f7274616c383304000800005300204d6f7274616c383404000800005400204d6f7274616c383504000800005500204d6f7274616c383604000800005600204d6f7274616c383704000800005700204d6f7274616c383804000800005800204d6f7274616c383904000800005900204d6f7274616c393004000800005a00204d6f7274616c393104000800005b00204d6f7274616c393204000800005c00204d6f7274616c393304000800005d00204d6f7274616c393404000800005e00204d6f7274616c393504000800005f00204d6f7274616c393604000800006000204d6f7274616c393704000800006100204d6f7274616c393804000800006200204d6f7274616c393904000800006300244d6f7274616c31303004000800006400244d6f7274616c31303104000800006500244d6f7274616c31303204000800006600244d6f7274616c31303304000800006700244d6f7274616c31303404000800006800244d6f7274616c31303504000800006900244d6f7274616c31303604000800006a00244d6f7274616c31303704000800006b00244d6f7274616c31303804000800006c00244d6f7274616c31303904000800006d00244d6f7274616c31313004000800006e00244d6f7274616c31313104000800006f00244d6f7274616c31313204000800007000244d6f7274616c31313304000800007100244d6f7274616c31313404000800007200244d6f7274616c31313504000800007300244d6f7274616c31313604000800007400244d6f7274616c31313704000800007500244d6f7274616c31313804000800007600244d6f7274616c31313904000800007700244d6f7274616c31323004000800007800244d6f7274616c31323104000800007900244d6f7274616c31323204000800007a00244d6f7274616c31323304000800007b00244d6f7274616c31323404000800007c00244d6f7274616c31323504000800007d00244d6f7274616c31323604000800007e00244d6f7274616c31323704000800007f00244d6f7274616c31323804000800008000244d6f7274616c31323904000800008100244d6f7274616c31333004000800008200244d6f7274616c31333104000800008300244d6f7274616c31333204000800008400244d6f7274616c31333304000800008500244d6f7274616c31333404000800008600244d6f7274616c31333504000800008700244d6f7274616c31333604000800008800244d6f7274616c31333704000800008900244d6f7274616c31333804000800008a00244d6f7274616c31333904000800008b00244d6f7274616c31343004000800008c00244d6f7274616c31343104000800008d00244d6f7274616c31343204000800008e00244d6f7274616c31343304000800008f00244d6f7274616c31343404000800009000244d6f7274616c31343504000800009100244d6f7274616c31343604000800009200244d6f7274616c31343704000800009300244d6f7274616c31343804000800009400244d6f7274616c31343904000800009500244d6f7274616c31353004000800009600244d6f7274616c31353104000800009700244d6f7274616c31353204000800009800244d6f7274616c31353304000800009900244d6f7274616c31353404000800009a00244d6f7274616c31353504000800009b00244d6f7274616c31353604000800009c00244d6f7274616c31353704000800009d00244d6f7274616c31353804000800009e00244d6f7274616c31353904000800009f00244d6f7274616c3136300400080000a000244d6f7274616c3136310400080000a100244d6f7274616c3136320400080000a200244d6f7274616c3136330400080000a300244d6f7274616c3136340400080000a400244d6f7274616c3136350400080000a500244d6f7274616c3136360400080000a600244d6f7274616c3136370400080000a700244d6f7274616c3136380400080000a800244d6f7274616c3136390400080000a900244d6f7274616c3137300400080000aa00244d6f7274616c3137310400080000ab00244d6f7274616c3137320400080000ac00244d6f7274616c3137330400080000ad00244d6f7274616c3137340400080000ae00244d6f7274616c3137350400080000af00244d6f7274616c3137360400080000b000244d6f7274616c3137370400080000b100244d6f7274616c3137380400080000b200244d6f7274616c3137390400080000b300244d6f7274616c3138300400080000b400244d6f7274616c3138310400080000b500244d6f7274616c3138320400080000b600244d6f7274616c3138330400080000b700244d6f7274616c3138340400080000b800244d6f7274616c3138350400080000b900244d6f7274616c3138360400080000ba00244d6f7274616c3138370400080000bb00244d6f7274616c3138380400080000bc00244d6f7274616c3138390400080000bd00244d6f7274616c3139300400080000be00244d6f7274616c3139310400080000bf00244d6f7274616c3139320400080000c000244d6f7274616c3139330400080000c100244d6f7274616c3139340400080000c200244d6f7274616c3139350400080000c300244d6f7274616c3139360400080000c400244d6f7274616c3139370400080000c500244d6f7274616c3139380400080000c600244d6f7274616c3139390400080000c700244d6f7274616c3230300400080000c800244d6f7274616c3230310400080000c900244d6f7274616c3230320400080000ca00244d6f7274616c3230330400080000cb00244d6f7274616c3230340400080000cc00244d6f7274616c3230350400080000cd00244d6f7274616c3230360400080000ce00244d6f7274616c3230370400080000cf00244d6f7274616c3230380400080000d000244d6f7274616c3230390400080000d100244d6f7274616c3231300400080000d200244d6f7274616c3231310400080000d300244d6f7274616c3231320400080000d400244d6f7274616c3231330400080000d500244d6f7274616c3231340400080000d600244d6f7274616c3231350400080000d700244d6f7274616c3231360400080000d800244d6f7274616c3231370400080000d900244d6f7274616c3231380400080000da00244d6f7274616c3231390400080000db00244d6f7274616c3232300400080000dc00244d6f7274616c3232310400080000dd00244d6f7274616c3232320400080000de00244d6f7274616c3232330400080000df00244d6f7274616c3232340400080000e000244d6f7274616c3232350400080000e100244d6f7274616c3232360400080000e200244d6f7274616c3232370400080000e300244d6f7274616c3232380400080000e400244d6f7274616c3232390400080000e500244d6f7274616c3233300400080000e600244d6f7274616c3233310400080000e700244d6f7274616c3233320400080000e800244d6f7274616c3233330400080000e900244d6f7274616c3233340400080000ea00244d6f7274616c3233350400080000eb00244d6f7274616c3233360400080000ec00244d6f7274616c3233370400080000ed00244d6f7274616c3233380400080000ee00244d6f7274616c3233390400080000ef00244d6f7274616c3234300400080000f000244d6f7274616c3234310400080000f100244d6f7274616c3234320400080000f200244d6f7274616c3234330400080000f300244d6f7274616c3234340400080000f400244d6f7274616c3234350400080000f500244d6f7274616c3234360400080000f600244d6f7274616c3234370400080000f700244d6f7274616c3234380400080000f800244d6f7274616c3234390400080000f900244d6f7274616c3235300400080000fa00244d6f7274616c3235310400080000fb00244d6f7274616c3235320400080000fc00244d6f7274616c3235330400080000fd00244d6f7274616c3235340400080000fe00244d6f7274616c3235350400080000ff0000bd0610306672616d655f73797374656d28657874656e73696f6e732c636865636b5f6e6f6e636528436865636b4e6f6e63650404540000040041010120543a3a496e6465780000c10610306672616d655f73797374656d28657874656e73696f6e7330636865636b5f7765696768742c436865636b57656967687404045400000000c506086870616c6c65745f7472616e73616374696f6e5f7061796d656e74604368617267655472616e73616374696f6e5061796d656e74040454000004004901013042616c616e63654f663c543e0000901853797374656d011853797374656d401c4163636f756e7401010402000c510100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004e8205468652066756c6c206163636f756e7420696e666f726d6174696f6e20666f72206120706172746963756c6172206163636f756e742049442e3845787472696e736963436f756e7400001c040004b820546f74616c2065787472696e7369637320636f756e7420666f72207468652063757272656e7420626c6f636b2e2c426c6f636b576569676874010020600000000000000000000000000000000000000000000000000488205468652063757272656e742077656967687420666f722074686520626c6f636b2e40416c6c45787472696e736963734c656e00001c040004410120546f74616c206c656e6774682028696e2062797465732920666f7220616c6c2065787472696e736963732070757420746f6765746865722c20666f72207468652063757272656e7420626c6f636b2e24426c6f636b486173680101040510248000000000000000000000000000000000000000000000000000000000000000000498204d6170206f6620626c6f636b206e756d6265727320746f20626c6f636b206861736865732e3445787472696e73696344617461010104051c280400043d012045787472696e73696373206461746120666f72207468652063757272656e7420626c6f636b20286d61707320616e2065787472696e736963277320696e64657820746f206974732064617461292e184e756d626572010010200000000000000000040901205468652063757272656e7420626c6f636b206e756d626572206265696e672070726f6365737365642e205365742062792060657865637574655f626c6f636b602e28506172656e744861736801002480000000000000000000000000000000000000000000000000000000000000000004702048617368206f66207468652070726576696f757320626c6f636b2e1844696765737401002c040004f020446967657374206f66207468652063757272656e7420626c6f636b2c20616c736f2070617274206f662074686520626c6f636b206865616465722e184576656e747301003c04001ca0204576656e7473206465706f736974656420666f72207468652063757272656e7420626c6f636b2e001d01204e4f54453a20546865206974656d20697320756e626f756e6420616e642073686f756c64207468657265666f7265206e657665722062652072656164206f6e20636861696e2ed020497420636f756c64206f746865727769736520696e666c6174652074686520506f562073697a65206f66206120626c6f636b2e002d01204576656e747320686176652061206c6172676520696e2d6d656d6f72792073697a652e20426f7820746865206576656e747320746f206e6f7420676f206f75742d6f662d6d656d6f7279fc206a75737420696e206361736520736f6d656f6e65207374696c6c207265616473207468656d2066726f6d2077697468696e207468652072756e74696d652e284576656e74436f756e7401001c100000000004b820546865206e756d626572206f66206576656e747320696e2074686520604576656e74733c543e60206c6973742e2c4576656e74546f706963730101040224d1010400282501204d617070696e67206265747765656e206120746f7069632028726570726573656e74656420627920543a3a486173682920616e64206120766563746f72206f6620696e646578657394206f66206576656e747320696e2074686520603c4576656e74733c543e3e60206c6973742e00510120416c6c20746f70696320766563746f727320686176652064657465726d696e69737469632073746f72616765206c6f636174696f6e7320646570656e64696e67206f6e2074686520746f7069632e2054686973450120616c6c6f7773206c696768742d636c69656e747320746f206c6576657261676520746865206368616e67657320747269652073746f7261676520747261636b696e67206d656368616e69736d20616e64e420696e2063617365206f66206368616e67657320666574636820746865206c697374206f66206576656e7473206f6620696e7465726573742e004d01205468652076616c756520686173207468652074797065206028543a3a426c6f636b4e756d6265722c204576656e74496e646578296020626563617573652069662077652075736564206f6e6c79206a7573744d012074686520604576656e74496e64657860207468656e20696e20636173652069662074686520746f70696320686173207468652073616d6520636f6e74656e7473206f6e20746865206e65787420626c6f636b0101206e6f206e6f74696669636174696f6e2077696c6c20626520747269676765726564207468757320746865206576656e74206d69676874206265206c6f73742e484c61737452756e74696d65557067726164650000d50104000455012053746f726573207468652060737065635f76657273696f6e6020616e642060737065635f6e616d6560206f66207768656e20746865206c6173742072756e74696d6520757067726164652068617070656e65642e545570677261646564546f553332526566436f756e740100a40400044d012054727565206966207765206861766520757067726164656420736f207468617420607479706520526566436f756e74602069732060753332602e2046616c7365202864656661756c7429206966206e6f742e605570677261646564546f547269706c65526566436f756e740100a40400085d012054727565206966207765206861766520757067726164656420736f2074686174204163636f756e74496e666f20636f6e7461696e73207468726565207479706573206f662060526566436f756e74602e2046616c736548202864656661756c7429206966206e6f742e38457865637574696f6e50686173650000c901040004882054686520657865637574696f6e207068617365206f662074686520626c6f636b2e01dd0101481830426c6f636b57656967687473f1018501e0687c3e010000000088526a74000000b8201d050000000001485165a64b0000000100e6bd4f57000000010000000000000000b8201d05000000000148f3f9c068000000010088526a740000000100a2941a1d000000b8201d050000000000000004d020426c6f636b20262065787472696e7369637320776569676874733a20626173652076616c75657320616e64206c696d6974732e2c426c6f636b4c656e67746801023000003c00000050000000500004a820546865206d6178696d756d206c656e677468206f66206120626c6f636b2028696e206279746573292e38426c6f636b48617368436f756e7410206009000000000000045501204d6178696d756d206e756d626572206f6620626c6f636b206e756d62657220746f20626c6f636b2068617368206d617070696e677320746f206b65657020286f6c64657374207072756e6564206669727374292e20446257656967687409024040787d010000000000e1f505000000000409012054686520776569676874206f662072756e74696d65206461746162617365206f7065726174696f6e73207468652072756e74696d652063616e20696e766f6b652e1c56657273696f6e0d02a102386b696c742d7370697269746e6574386b696c742d7370697269746e657401000000d62900000000000028df6acb689907609b0400000037e397fc7c91f5e401000000bc9d89904f5b923f0100000037c8bb1350a9a2a80100000040fe3ad401f8959a06000000d2bc9897eed08f1503000000f78b278be53f454c02000000ab3c0572291feb8b01000000dd718d5cc53262d401000000ea93e3f16f3d69620200000003000000000484204765742074686520636861696e27732063757272656e742076657273696f6e2e2853533538507265666978d408260014a8205468652064657369676e61746564205353383520707265666978206f66207468697320636861696e2e0039012054686973207265706c6163657320746865202273733538466f726d6174222070726f7065727479206465636c6172656420696e2074686520636861696e20737065632e20526561736f6e20697331012074686174207468652072756e74696d652073686f756c64206b6e6f772061626f7574207468652070726566697820696e206f7264657220746f206d616b6520757365206f662069742061737020616e206964656e746966696572206f662074686520636861696e2e011d02006052616e646f6d6e657373436f6c6c656374697665466c6970016052616e646f6d6e657373436f6c6c656374697665466c6970043852616e646f6d4d6174657269616c0100210204000c610120536572696573206f6620626c6f636b20686561646572732066726f6d20746865206c61737420383120626c6f636b73207468617420616374732061732072616e646f6d2073656564206d6174657269616c2e2054686973610120697320617272616e67656420617320612072696e672062756666657220776974682060626c6f636b5f6e756d626572202520383160206265696e672074686520696e64657820696e746f20746865206056656360206f664420746865206f6c6465737420686173682e00000000012454696d657374616d70012454696d657374616d70080c4e6f7701001020000000000000000004902043757272656e742074696d6520666f72207468652063757272656e7420626c6f636b2e244469645570646174650100a4040004b420446964207468652074696d657374616d7020676574207570646174656420696e207468697320626c6f636b3f0125020004344d696e696d756d506572696f6410207017000000000000104d0120546865206d696e696d756d20706572696f64206265747765656e20626c6f636b732e204265776172652074686174207468697320697320646966666572656e7420746f20746865202a65787065637465642a5d0120706572696f6420746861742074686520626c6f636b2070726f64756374696f6e206170706172617475732070726f76696465732e20596f75722063686f73656e20636f6e73656e7375732073797374656d2077696c6c5d012067656e6572616c6c7920776f726b2077697468207468697320746f2064657465726d696e6520612073656e7369626c6520626c6f636b2074696d652e20652e672e20466f7220417572612c2069742077696c6c206265a020646f75626c65207468697320706572696f64206f6e2064656661756c742073657474696e67732e00021c496e6469636573011c496e646963657304204163636f756e7473000104021029020400048820546865206c6f6f6b75702066726f6d20696e64657820746f206163636f756e742e012d02016c041c4465706f736974184000b47cf328350000000000000000000004ac20546865206465706f736974206e656564656420666f7220726573657276696e6720616e20696e6465782e013102052042616c616e636573012042616c616e6365731434546f74616c49737375616e6365010018400000000000000000000000000000000004982054686520746f74616c20756e6974732069737375656420696e207468652073797374656d2e1c4163636f756e74010104020014010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600901205468652042616c616e6365732070616c6c6574206578616d706c65206f662073746f72696e67207468652062616c616e6365206f6620616e206163636f756e742e00282023204578616d706c650034206060606e6f636f6d70696c65b02020696d706c2070616c6c65745f62616c616e6365733a3a436f6e66696720666f722052756e74696d65207b19022020202074797065204163636f756e7453746f7265203d2053746f726167654d61705368696d3c53656c663a3a4163636f756e743c52756e74696d653e2c206672616d655f73797374656d3a3a50726f76696465723c52756e74696d653e2c204163636f756e7449642c2053656c663a3a4163636f756e74446174613c42616c616e63653e3e0c20207d102060606000150120596f752063616e20616c736f2073746f7265207468652062616c616e6365206f6620616e206163636f756e7420696e20746865206053797374656d602070616c6c65742e00282023204578616d706c650034206060606e6f636f6d70696c65b02020696d706c2070616c6c65745f62616c616e6365733a3a436f6e66696720666f722052756e74696d65207b7420202074797065204163636f756e7453746f7265203d2053797374656d0c20207d102060606000510120427574207468697320636f6d657320776974682074726164656f6666732c2073746f72696e67206163636f756e742062616c616e63657320696e207468652073797374656d2070616c6c65742073746f7265736d0120606672616d655f73797374656d60206461746120616c6f6e677369646520746865206163636f756e74206461746120636f6e747261727920746f2073746f72696e67206163636f756e742062616c616e63657320696e207468652901206042616c616e636573602070616c6c65742c20776869636820757365732061206053746f726167654d61706020746f2073746f72652062616c616e6365732064617461206f6e6c792e4101204e4f54453a2054686973206973206f6e6c79207573656420696e207468652063617365207468617420746869732070616c6c6574206973207573656420746f2073746f72652062616c616e6365732e144c6f636b7301010402003502040008b820416e79206c6971756964697479206c6f636b73206f6e20736f6d65206163636f756e742062616c616e6365732e2501204e4f54453a2053686f756c64206f6e6c79206265206163636573736564207768656e2073657474696e672c206368616e67696e6720616e642066726565696e672061206c6f636b2e20526573657276657301010402004502040004a4204e616d6564207265736572766573206f6e20736f6d65206163636f756e742062616c616e6365732e3853746f7261676556657273696f6e0100510204000c7c2053746f726167652076657273696f6e206f66207468652070616c6c65742e00a020546869732069732073657420746f2076322e302e3020666f72206e6577206e6574776f726b732e01550201700c484578697374656e7469616c4465706f736974184000a0724e18090000000000000000000004d420546865206d696e696d756d20616d6f756e7420726571756972656420746f206b65657020616e206163636f756e74206f70656e2e204d61784c6f636b731c103200000008f420546865206d6178696d756d206e756d626572206f66206c6f636b7320746861742073686f756c64206578697374206f6e20616e206163636f756e742edc204e6f74207374726963746c7920656e666f726365642c20627574207573656420666f722077656967687420657374696d6174696f6e2e2c4d617852657365727665731c1032000000040d0120546865206d6178696d756d206e756d626572206f66206e616d656420726573657276657320746861742063616e206578697374206f6e20616e206163636f756e742e01610206485472616e73616374696f6e5061796d656e7401485472616e73616374696f6e5061796d656e7408444e6578744665654d756c7469706c6965720100650240000064a7b3b6e00d0000000000000000003853746f7261676556657273696f6e01006902040000000004604f7065726174696f6e616c4665654d756c7469706c696572080405545901204120666565206d756c6974706c69657220666f7220604f7065726174696f6e616c602065787472696e7369637320746f20636f6d7075746520227669727475616c207469702220746f20626f6f73742074686569722c20607072696f7269747960004d0120546869732076616c7565206973206d756c7469706c656420627920746865206066696e616c5f6665656020746f206f627461696e206120227669727475616c20746970222074686174206973206c61746572f420616464656420746f20612074697020636f6d706f6e656e7420696e20726567756c617220607072696f72697479602063616c63756c6174696f6e732e4d01204974206d65616e732074686174206120604e6f726d616c60207472616e73616374696f6e2063616e2066726f6e742d72756e20612073696d696c61726c792d73697a656420604f7065726174696f6e616c6041012065787472696e736963202877697468206e6f20746970292c20627920696e636c7564696e672061207469702076616c75652067726561746572207468616e20746865207669727475616c207469702e003c20606060727573742c69676e6f726540202f2f20466f7220604e6f726d616c608c206c6574207072696f72697479203d207072696f726974795f63616c6328746970293b0054202f2f20466f7220604f7065726174696f6e616c601101206c6574207669727475616c5f746970203d2028696e636c7573696f6e5f666565202b2074697029202a204f7065726174696f6e616c4665654d756c7469706c6965723bc4206c6574207072696f72697479203d207072696f726974795f63616c6328746970202b207669727475616c5f746970293b1020606060005101204e6f746520746861742073696e636520776520757365206066696e616c5f6665656020746865206d756c7469706c696572206170706c69657320616c736f20746f2074686520726567756c61722060746970605d012073656e74207769746820746865207472616e73616374696f6e2e20536f2c206e6f74206f6e6c7920646f657320746865207472616e73616374696f6e206765742061207072696f726974792062756d702062617365646101206f6e207468652060696e636c7573696f6e5f666565602c2062757420776520616c736f20616d706c6966792074686520696d70616374206f662074697073206170706c69656420746f20604f7065726174696f6e616c6038207472616e73616374696f6e732e000728417574686f72736869700128417574686f72736869700c18556e636c657301006d020400041c20556e636c657318417574686f720000000400046420417574686f72206f662063757272656e7420626c6f636b2e30446964536574556e636c65730100a4040004bc205768657468657220756e636c6573207765726520616c72656164792073657420696e207468697320626c6f636b2e017902000440556e636c6547656e65726174696f6e73102000000000000000000ccc20546865206e756d626572206f6620626c6f636b73206261636b2077652073686f756c642061636365707420756e636c65732ee42054686973206d65616e7320746861742077652077696c6c206465616c207769746820756e636c652d706172656e7473207468617420617265942060556e636c6547656e65726174696f6e73202b203160206265666f726520606e6f77602e018902144050617261636861696e5374616b696e67014050617261636861696e5374616b696e6734544d617853656c656374656443616e6469646174657301001c100000000004090120546865206d6178696d756d206e756d626572206f6620636f6c6c61746f722063616e646964617465732073656c6563746564206174206561636820726f756e642e14526f756e6401008d0250000000000000000000000000140000000000000004e82043757272656e7420726f756e64206e756d62657220616e64206e65787420726f756e64207363686564756c6564207472616e736974696f6e2e384c61737444656c65676174696f6e01010405009102200000000000000000140d012044656c65676174696f6e20696e666f726d6174696f6e20666f7220746865206c61746573742073657373696f6e20696e20776869636820612064656c656761746f722c2064656c6567617465642e000501204974206d6170732066726f6d20616e206163636f756e7420746f20746865206e756d626572206f662064656c65676174696f6e7320696e20746865206c617374982073657373696f6e20696e2077686963682074686579202872652d2964656c6567617465642e3844656c656761746f7253746174650001040500950204000c802044656c65676174696f6e207374616b696e6720696e666f726d6174696f6e2e00cc204974206d6170732066726f6d20616e206163636f756e7420746f206974732064656c65676174696f6e2064657461696c732e3443616e646964617465506f6f6c0001040500a902040010a420546865207374616b696e6720696e666f726d6174696f6e20666f7220612063616e6469646174652e00b0204974206d6170732066726f6d20616e206163636f756e7420746f2069747320696e666f726d6174696f6e2eb8204d6f72656f7665722c20697420636f756e747320746865206e756d626572206f662063616e646964617465732e5c436f756e746572466f7243616e646964617465506f6f6c01001c100000000004ac436f756e74657220666f72207468652072656c6174656420636f756e7465642073746f72616765206d617048546f74616c436f6c6c61746f725374616b650100b90280000000000000000000000000000000000000000000000000000000000000000014f420546f74616c2066756e6473206c6f636b656420746f206261636b207468652063757272656e746c792073656c656374656420636f6c6c61746f72732ed0205468652073756d206f6620616c6c20636f6c6c61746f7220616e642074686569722064656c656761746f72207374616b65732e002101204e6f74653a20546865726520617265206d6f72652066756e6473206c6f636b656420627920746869732070616c6c65742c2073696e636520746865206261636b696e6720666f720901206e6f6e20636f6c6c6174696e672063616e64696461746573206973206e6f7420696e636c7564656420696e205b546f74616c436f6c6c61746f725374616b655d2e34546f7043616e646964617465730100bd02040028e82054686520636f6c6c61746f722063616e64696461746573207769746820746865206869676865737420616d6f756e74206f66207374616b652e00190120456163682074696d6520746865207374616b65206f66206120636f6c6c61746f7220697320696e637265617365642c20697420697320636865636b65642077686574686572050120746869732070757368657320616e6f746865722063616e646964617465206f7574206f6620746865206c6973742e205768656e20746865207374616b652069732101207265647563656420686f77657665722c206974206973206e6f7420636865636b656420696620616e6f746865722063616e64696461746520686173206d6f7265207374616b652c11012073696e6365207468697320776f756c64207265717569726520697465726174696e67206f7665722074686520656e74697265205b43616e646964617465506f6f6c5d2e001501205468657265206d75737420616c77617973206265206d6f72652063616e64696461746573207468616e205b4d617853656c656374656443616e646964617465735d20736f0d012074686174206120636f6c6c61746f722063616e2064726f70206f7574206f662074686520636f6c6c61746f7220736574206279207265647563696e672074686569721c207374616b652e3c496e666c6174696f6e436f6e6669670100c502c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000046420496e666c6174696f6e20636f6e66696775726174696f6e2e24556e7374616b696e670101040500d10204001088205468652066756e64732077616974696e6720746f20626520756e7374616b65642e001d01204974206d6170732066726f6d206163636f756e747320746f20616c6c207468652066756e64732061646472657373656420746f207468656d20696e20746865206675747572652020626c6f636b732e644d6178436f6c6c61746f7243616e6469646174655374616b65010018400000000000000000000000000000000004cc20546865206d6178696d756d20616d6f756e74206120636f6c6c61746f722063616e6469646174652063616e207374616b652e4c4c617374526577617264526564756374696f6e010010200000000000000000140d0120546865207965617220696e20776869636820746865206c617374206175746f6d6174696320726564756374696f6e206f66207468652072657761726420726174657328206f636375727265642e00250120497420737461727473206174207a65726f2061742067656e6573697320616e6420696e6372656d656e7473206279206f6e6520657665727920424c4f434b535f5045525f5945415234206d616e7920626c6f636b732e34466f7263654e6577526f756e640100a404000001e102017844444d696e426c6f636b73506572526f756e6410202c0100000000000004d4204d696e696d756d206e756d626572206f6620626c6f636b732076616c69646174696f6e20726f756e64732063616e206c6173742e5444656661756c74426c6f636b73506572526f756e641020580200000000000008fc2044656661756c74206e756d626572206f6620626c6f636b732076616c69646174696f6e20726f756e6473206c6173742c2061732073657420696e207468655c2067656e6573697320636f6e66696775726174696f6e2e345374616b654475726174696f6e1020e0c40000000000000c0501204e756d626572206f6620626c6f636b7320666f7220776869636820756e7374616b65642062616c616e63652077696c6c207374696c6c206265206c6f636b6564f0206265666f72652069742063616e20626520756e6c6f636b6564206279206163746976656c792063616c6c696e67207468652065787472696e7369634c2060756e6c6f636b5f756e7374616b6564602e3845786974517565756544656c61791c1002000000080901204e756d626572206f6620726f756e6473206120636f6c6c61746f722068617320746f207374617920616374697665206166746572207375626d697474696e672061c4207265717565737420746f206c656176652074686520736574206f6620636f6c6c61746f722063616e646964617465732e304d696e436f6c6c61746f72731c1010000000080d01204d696e696d756d206e756d626572206f6620636f6c6c61746f72732073656c65637465642066726f6d2074686520736574206f662063616e64696461746573206174602065766572792076616c69646174696f6e20726f756e642e504d696e5265717569726564436f6c6c61746f72731c1004000000081101204d696e696d756d206e756d626572206f6620636f6c6c61746f72732077686963682063616e6e6f74206c6561766520746865206e6574776f726b2069662074686572653c20617265206e6f206f74686572732e584d617844656c65676174696f6e73506572526f756e641c1001000000140101204d6178696d756d206e756d626572206f662064656c65676174696f6e732077686963682063616e206265206d6164652077697468696e207468652073616d651c20726f756e642e000d01204e4f54453a20546f2070726576656e742072652d64656c65676174696f6e2d7265776172642061747461636b732c2077652073686f756c64206b65657020746869732c20746f206265206f6e652e604d617844656c656761746f7273506572436f6c6c61746f721c102300000004e4204d6178696d756d206e756d626572206f662064656c656761746f727320612073696e676c6520636f6c6c61746f722063616e20686176652e604d6178436f6c6c61746f727350657244656c656761746f721c100100000004f4204d6178696d756d206e756d626572206f6620636f6c6c61746f727320612073696e676c652064656c656761746f722063616e2064656c65676174652e404d6178546f7043616e646964617465731c104b00000004a0204d6178696d756d2073697a65206f662074686520746f702063616e64696461746573207365742e404d696e436f6c6c61746f725374616b6518400000e8890423c78a0000000000000000080901204d696e696d756d207374616b6520726571756972656420666f7220616e79206163636f756e7420746f20626520656c65637465642061732076616c696461746f723420666f72206120726f756e642e644d696e436f6c6c61746f7243616e6469646174655374616b6518400000e8890423c78a0000000000000000080501204d696e696d756d207374616b6520726571756972656420666f7220616e79206163636f756e7420746f20626520616464656420746f2074686520736574206f66302063616e646964617465732e344d696e44656c65676174696f6e1840000082dfe40d4700000000000000000004fc204d696e696d756d207374616b6520726571756972656420666f7220616e79206163636f756e7420746f2062652061626c6520746f2064656c65676174652e444d696e44656c656761746f725374616b651840000082dfe40d4700000000000000000004f8204d696e696d756d207374616b6520726571756972656420666f7220616e79206163636f756e7420746f206265636f6d6520612064656c656761746f722e484d6178556e7374616b6552657175657374731c100a00000028e8204d6178206e756d626572206f6620636f6e63757272656e742061637469766520756e7374616b696e67207265717565737473206265666f72652c20756e6c6f636b696e672e001501204e4f54453a20546f2070726f7465637420616761696e737420697272656d6f766162696c697479206f6620612063616e646964617465206f722064656c656761746f722cf4207765206f6e6c7920616c6c6f7720666f72204d6178556e7374616b655265717565737473202d2031206d616e79206d616e75616c20756e7374616b6501012072657175657374732e20546865206c617374206f6e6520736572766573206173206120706c616365686f6c64657220666f7220746865206361736573206f66f02063616c6c696e672065697468657220606b69636b5f64656c656761746f72602c20666f7263655f72656d6f76655f63616e64696461746560206f7209012060657865637574655f6c656176655f63616e64696461746573602e204f74686572776973652c2061207573657220636f756c64206d6178206f75742074686569720d0120756e7374616b6520726571756573747320616e642070726576656e74207468656d73656c7665732066726f6d206265696e67206b69636b65642066726f6d20746865f020736574206f662063616e646964617465732f64656c656761746f727320756e74696c207468657920756e6c6f636b2074686569722066756e64732e484e6574776f726b5265776172645374617274102048a3c800000000000c110120546865207374617274696e6720626c6f636b206e756d62657220666f7220746865206e6574776f726b20726577617264732e204f6e6365207468652063757272656e74090120626c6f636b206e756d626572206578636565647320746869732073746172742c207468652062656e65666963696172792077696c6c2072656365697665207468658420636f6e666967757265642072657761726420696e206561636820626c6f636b2e444e6574776f726b526577617264526174657c2000008a5d784563010c0d0120546865207261746520696e2070657263656e7420666f7220746865206e6574776f726b207265776172647320776869636820617265206261736564206f6e207468650901206d6178696d756d206e756d626572206f6620636f6c6c61746f727320616e6420746865206d6178696d756d20616d6f756e74206120636f6c6c61746f722063616e1c207374616b652e01e502151c53657373696f6e011c53657373696f6e1c2856616c696461746f72730100880400047c205468652063757272656e7420736574206f662076616c696461746f72732e3043757272656e74496e64657801001c100000000004782043757272656e7420696e646578206f66207468652073657373696f6e2e345175657565644368616e6765640100a4040008390120547275652069662074686520756e6465726c79696e672065636f6e6f6d6963206964656e746974696573206f7220776569676874696e6720626568696e64207468652076616c696461746f7273a420686173206368616e67656420696e20746865207175657565642076616c696461746f72207365742e285175657565644b6579730100e9020400083d012054686520717565756564206b65797320666f7220746865206e6578742073657373696f6e2e205768656e20746865206e6578742073657373696f6e20626567696e732c207468657365206b657973e02077696c6c206265207573656420746f2064657465726d696e65207468652076616c696461746f7227732073657373696f6e206b6579732e4844697361626c656456616c696461746f72730100fd020400148020496e6469636573206f662064697361626c65642076616c696461746f72732e003d01205468652076656320697320616c77617973206b65707420736f7274656420736f20746861742077652063616e2066696e642077686574686572206120676976656e2076616c696461746f722069733d012064697361626c6564207573696e672062696e617279207365617263682e204974206765747320636c6561726564207768656e20606f6e5f73657373696f6e5f656e64696e67602072657475726e73642061206e657720736574206f66206964656e7469746965732e204e6578744b6579730001040500f1020400049c20546865206e6578742073657373696f6e206b65797320666f7220612076616c696461746f722e204b65794f776e657200010405010300040004090120546865206f776e6572206f662061206b65792e20546865206b65792069732074686520604b657954797065496460202b2074686520656e636f646564206b65792e010903018000010d03161041757261011041757261082c417574686f726974696573010011030400046c205468652063757272656e7420617574686f72697479207365742e2c43757272656e74536c6f74010019032000000000000000000c80205468652063757272656e7420736c6f74206f66207468697320626c6f636b2e009420546869732077696c6c2062652073657420696e20606f6e5f696e697469616c697a65602e00000000171c41757261457874011c41757261457874042c417574686f72697469657301001503040014942053657276657320617320636163686520666f722074686520617574686f7269746965732e0071012054686520617574686f72697469657320696e204175526120617265206f7665727772697474656e20696e20606f6e5f696e697469616c697a6560207768656e2077652073776974636820746f2061206e65772073657373696f6e2c790120627574207765207265717569726520746865206f6c6420617574686f72697469657320746f2076657269667920746865207365616c207768656e2076616c69646174696e67206120506f562e20546869732077696c6c20616c77617973f0206265207570646174656420746f20746865206c6174657374204175526120617574686f72697469657320696e20606f6e5f66696e616c697a65602e011d03000000182444656d6f6372616379012444656d6f6372616379343c5075626c696350726f70436f756e7401001c100000000004f420546865206e756d626572206f6620287075626c6963292070726f706f73616c7320746861742068617665206265656e206d61646520736f206661722e2c5075626c696350726f707301002103040004210120546865207075626c69632070726f706f73616c732e20556e736f727465642e20546865207365636f6e64206974656d206973207468652070726f706f73616c277320686173682e244465706f7369744f66000104051c290304000c842054686f73652077686f2068617665206c6f636b65642061206465706f7369742e00d82054574f582d4e4f54453a20536166652c20617320696e6372656173696e6720696e7465676572206b6579732061726520736166652e24507265696d6167657300010406242d030400086101204d6170206f662068617368657320746f207468652070726f706f73616c20707265696d6167652c20616c6f6e6720776974682077686f207265676973746572656420697420616e64207468656972206465706f7369742ee42054686520626c6f636b206e756d6265722069732074686520626c6f636b20617420776869636820697420776173206465706f73697465642e3c5265666572656e64756d436f756e7401001c100000000004310120546865206e6578742066726565207265666572656e64756d20696e6465782c20616b6120746865206e756d626572206f66207265666572656e6461207374617274656420736f206661722e344c6f77657374556e62616b656401001c100000000008250120546865206c6f77657374207265666572656e64756d20696e64657820726570726573656e74696e6720616e20756e62616b6564207265666572656e64756d2e20457175616c20746fdc20605265666572656e64756d436f756e74602069662074686572652069736e2774206120756e62616b6564207265666572656e64756d2e405265666572656e64756d496e666f4f66000104051c310304000cb420496e666f726d6174696f6e20636f6e6365726e696e6720616e7920676976656e207265666572656e64756d2e0009012054574f582d4e4f54453a205341464520617320696e646578657320617265206e6f7420756e64657220616e2061747461636b6572e280997320636f6e74726f6c2e20566f74696e674f6601010405003d03e800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000105d0120416c6c20766f74657320666f72206120706172746963756c617220766f7465722e2057652073746f7265207468652062616c616e636520666f7220746865206e756d626572206f6620766f74657320746861742077655d012068617665207265636f726465642e20546865207365636f6e64206974656d2069732074686520746f74616c20616d6f756e74206f662064656c65676174696f6e732c20746861742077696c6c2062652061646465642e00e82054574f582d4e4f54453a205341464520617320604163636f756e7449646073206172652063727970746f2068617368657320616e797761792e544c6173745461626c656457617345787465726e616c0100a40400085901205472756520696620746865206c617374207265666572656e64756d207461626c656420776173207375626d69747465642065787465726e616c6c792e2046616c7365206966206974207761732061207075626c6963282070726f706f73616c2e304e65787445787465726e616c00005503040010590120546865207265666572656e64756d20746f206265207461626c6564207768656e6576657220697420776f756c642062652076616c696420746f207461626c6520616e2065787465726e616c2070726f706f73616c2e550120546869732068617070656e73207768656e2061207265666572656e64756d206e6565647320746f206265207461626c656420616e64206f6e65206f662074776f20636f6e646974696f6e7320617265206d65743aa4202d20604c6173745461626c656457617345787465726e616c60206973206066616c7365603b206f7268202d20605075626c696350726f70736020697320656d7074792e24426c61636b6c6973740001040624590304000851012041207265636f7264206f662077686f207665746f656420776861742e204d6170732070726f706f73616c206861736820746f206120706f737369626c65206578697374656e7420626c6f636b206e756d626572e82028756e74696c207768656e206974206d6179206e6f742062652072657375626d69747465642920616e642077686f207665746f65642069742e3443616e63656c6c6174696f6e730101040624a40400042901205265636f7264206f6620616c6c2070726f706f73616c7320746861742068617665206265656e207375626a65637420746f20656d657267656e63792063616e63656c6c6174696f6e2e3853746f7261676556657273696f6e00005d0304000c7c2053746f726167652076657273696f6e206f66207468652070616c6c65742e0098204e6577206e6574776f726b732073746172742077697468206c6173742076657273696f6e2e01610301842c3c456e6163746d656e74506572696f641020201c00000000000014e82054686520706572696f64206265747765656e20612070726f706f73616c206265696e6720617070726f76656420616e6420656e61637465642e0031012049742073686f756c642067656e6572616c6c792062652061206c6974746c65206d6f7265207468616e2074686520756e7374616b6520706572696f6420746f20656e737572652074686174510120766f74696e67207374616b657273206861766520616e206f70706f7274756e69747920746f2072656d6f7665207468656d73656c7665732066726f6d207468652073797374656d20696e207468652063617365b4207768657265207468657920617265206f6e20746865206c6f73696e672073696465206f66206120766f74652e304c61756e6368506572696f641020e0c400000000000004e420486f77206f6674656e2028696e20626c6f636b7329206e6577207075626c6963207265666572656e646120617265206c61756e636865642e30566f74696e67506572696f641020e0c400000000000004b820486f77206f6674656e2028696e20626c6f636b732920746f20636865636b20666f72206e657720766f7465732e44566f74654c6f636b696e67506572696f641020e0c4000000000000109020546865206d696e696d756d20706572696f64206f6620766f7465206c6f636b696e672e0065012049742073686f756c64206265206e6f2073686f72746572207468616e20656e6163746d656e7420706572696f6420746f20656e73757265207468617420696e207468652063617365206f6620616e20617070726f76616c2c49012074686f7365207375636365737366756c20766f7465727320617265206c6f636b656420696e746f2074686520636f6e73657175656e636573207468617420746865697220766f74657320656e7461696c2e384d696e696d756d4465706f73697418400080c6a47e8d0300000000000000000004350120546865206d696e696d756d20616d6f756e7420746f20626520757365642061732061206465706f73697420666f722061207075626c6963207265666572656e64756d2070726f706f73616c2e38496e7374616e74416c6c6f776564a404010c550120496e64696361746f7220666f72207768657468657220616e20656d657267656e6379206f726967696e206973206576656e20616c6c6f77656420746f2068617070656e2e20536f6d6520636861696e73206d617961012077616e7420746f207365742074686973207065726d616e656e746c7920746f206066616c7365602c206f7468657273206d61792077616e7420746f20636f6e646974696f6e206974206f6e207468696e67732073756368a020617320616e207570677261646520686176696e672068617070656e656420726563656e746c792e5446617374547261636b566f74696e67506572696f641020840300000000000004ec204d696e696d756d20766f74696e6720706572696f6420616c6c6f77656420666f72206120666173742d747261636b207265666572656e64756d2e34436f6f6c6f6666506572696f641020e0c400000000000004610120506572696f6420696e20626c6f636b7320776865726520616e2065787465726e616c2070726f706f73616c206d6179206e6f742062652072652d7375626d6974746564206166746572206265696e67207665746f65642e4c507265696d616765427974654465706f736974184000743ba40b00000000000000000000000429012054686520616d6f756e74206f662062616c616e63652074686174206d757374206265206465706f7369746564207065722062797465206f6620707265696d6167652073746f7265642e204d6178566f7465731c106400000010b020546865206d6178696d756d206e756d626572206f6620766f74657320666f7220616e206163636f756e742e00d420416c736f207573656420746f20636f6d70757465207765696768742c20616e206f7665726c79206269672076616c75652063616e1501206c65616420746f2065787472696e7369632077697468207665727920626967207765696768743a20736565206064656c65676174656020666f7220696e7374616e63652e304d617850726f706f73616c731c1064000000040d0120546865206d6178696d756d206e756d626572206f66207075626c69632070726f706f73616c7320746861742063616e20657869737420617420616e792074696d652e0169031e1c436f756e63696c011c436f756e63696c182450726f706f73616c7301006d03040004902054686520686173686573206f6620746865206163746976652070726f706f73616c732e2850726f706f73616c4f6600010406247103040004cc2041637475616c2070726f706f73616c20666f72206120676976656e20686173682c20696620697427732063757272656e742e18566f74696e6700010406240905040004b420566f746573206f6e206120676976656e2070726f706f73616c2c206966206974206973206f6e676f696e672e3450726f706f73616c436f756e7401001c100000000004482050726f706f73616c7320736f206661722e1c4d656d626572730100880400043901205468652063757272656e74206d656d62657273206f662074686520636f6c6c6563746976652e20546869732069732073746f72656420736f7274656420286a7573742062792076616c7565292e145072696d65000000040004650120546865207072696d65206d656d62657220746861742068656c70732064657465726d696e65207468652064656661756c7420766f7465206265686176696f7220696e2063617365206f6620616273656e746174696f6e732e01750301a000010d051f48546563686e6963616c436f6d6d69747465650148546563686e6963616c436f6d6d6974746565182450726f706f73616c7301001105040004902054686520686173686573206f6620746865206163746976652070726f706f73616c732e2850726f706f73616c4f6600010406247103040004cc2041637475616c2070726f706f73616c20666f72206120676976656e20686173682c20696620697427732063757272656e742e18566f74696e6700010406240905040004b420566f746573206f6e206120676976656e2070726f706f73616c2c206966206974206973206f6e676f696e672e3450726f706f73616c436f756e7401001c100000000004482050726f706f73616c7320736f206661722e1c4d656d626572730100880400043901205468652063757272656e74206d656d62657273206f662074686520636f6c6c6563746976652e20546869732069732073746f72656420736f7274656420286a7573742062792076616c7565292e145072696d65000000040004650120546865207072696d65206d656d62657220746861742068656c70732064657465726d696e65207468652064656661756c7420766f7465206265686176696f7220696e2063617365206f6620616273656e746174696f6e732e01790301a800011505204c546563686e6963616c4d656d62657273686970014c546563686e6963616c4d656d62657273686970081c4d656d62657273010088040004c8205468652063757272656e74206d656d626572736869702c2073746f72656420617320616e206f726465726564205665632e145072696d65000000040004a4205468652063757272656e74207072696d65206d656d6265722c206966206f6e65206578697374732e017d0301ac0001190522205472656173757279012054726561737572790c3450726f706f73616c436f756e7401001c100000000004a4204e756d626572206f662070726f706f73616c7320746861742068617665206265656e206d6164652e2450726f706f73616c73000104051c1d050400047c2050726f706f73616c7320746861742068617665206265656e206d6164652e24417070726f76616c7301002105040004f82050726f706f73616c20696e646963657320746861742068617665206265656e20617070726f76656420627574206e6f742079657420617761726465642e01810301b01c3050726f706f73616c426f6e6425051050c30000085501204672616374696f6e206f6620612070726f706f73616c27732076616c756520746861742073686f756c6420626520626f6e64656420696e206f7264657220746f20706c616365207468652070726f706f73616c2e110120416e2061636365707465642070726f706f73616c2067657473207468657365206261636b2e20412072656a65637465642070726f706f73616c20646f6573206e6f742e4c50726f706f73616c426f6e644d696e696d756d1840000082dfe40d47000000000000000000044901204d696e696d756d20616d6f756e74206f662066756e647320746861742073686f756c6420626520706c6163656420696e2061206465706f73697420666f72206d616b696e6720612070726f706f73616c2e4c50726f706f73616c426f6e644d6178696d756d29050400044901204d6178696d756d20616d6f756e74206f662066756e647320746861742073686f756c6420626520706c6163656420696e2061206465706f73697420666f72206d616b696e6720612070726f706f73616c2e2c5370656e64506572696f641020c0a8000000000000048820506572696f64206265747765656e2073756363657373697665207370656e64732e104275726e250510000000000411012050657263656e74616765206f662073706172652066756e64732028696620616e7929207468617420617265206275726e7420706572207370656e6420706572696f642e2050616c6c657449642d05206b696c742f7473790419012054686520747265617375727927732070616c6c65742069642c207573656420666f72206465726976696e672069747320736f7665726569676e206163636f756e742049442e304d6178417070726f76616c731c10640000000c150120546865206d6178696d756d206e756d626572206f6620617070726f76616c7320746861742063616e207761697420696e20746865207370656e64696e672071756575652e004d01204e4f54453a205468697320706172616d6574657220697320616c736f20757365642077697468696e2074686520426f756e746965732050616c6c657420657874656e73696f6e20696620656e61626c65642e013105231c5574696c6974790001850301b4044c626174636865645f63616c6c735f6c696d69741c10aa2a000004a820546865206c696d6974206f6e20746865206e756d626572206f6620626174636865642063616c6c732e013505281c56657374696e67011c56657374696e67081c56657374696e6700010402003905040004d820496e666f726d6174696f6e20726567617264696e67207468652076657374696e67206f66206120676976656e206163636f756e742e3853746f7261676556657273696f6e0100410504000c7c2053746f726167652076657273696f6e206f66207468652070616c6c65742e003101204e6577206e6574776f726b732073746172742077697468206c61746573742076657273696f6e2c2061732064657465726d696e6564206279207468652067656e65736973206275696c642e01ad0301b808444d696e5665737465645472616e73666572184000407a10f35a0000000000000000000004e820546865206d696e696d756d20616d6f756e74207472616e7366657272656420746f2063616c6c20607665737465645f7472616e73666572602e4c4d617856657374696e675363686564756c65731c101c0000000001450529245363686564756c657201245363686564756c657208184167656e6461010104051049050400044d01204974656d7320746f2062652065786563757465642c20696e64657865642062792074686520626c6f636b206e756d626572207468617420746865792073686f756c64206265206578656375746564206f6e2e184c6f6f6b75700001040528c00400040101204c6f6f6b75702066726f6d206964656e7469747920746f2074686520626c6f636b206e756d62657220616e6420696e646578206f6620746865207461736b2e01b50301bc08344d6178696d756d576569676874102000a0db215d00000008450120546865206d6178696d756d207765696768742074686174206d6179206265207363686564756c65642070657220626c6f636b20666f7220616e7920646973706174636861626c6573206f66206c657373a4207072696f72697479207468616e20607363686564756c653a3a484152445f444541444c494e45602e504d61785363686564756c6564506572426c6f636b1c1032000000081d0120546865206d6178696d756d206e756d626572206f66207363686564756c65642063616c6c7320696e2074686520717565756520666f7220612073696e676c6520626c6f636b2edc204e6f74207374726963746c7920656e666f726365642c20627574207573656420666f722077656967687420657374696d6174696f6e2e0155052a1450726f7879011450726f7879081c50726f78696573010104050059054400000000000000000000000000000000000845012054686520736574206f66206163636f756e742070726f786965732e204d61707320746865206163636f756e74207768696368206861732064656c65676174656420746f20746865206163636f756e7473210120776869636820617265206265696e672064656c65676174656420746f2c20746f67657468657220776974682074686520616d6f756e742068656c64206f6e206465706f7369742e34416e6e6f756e63656d656e74730101040500690544000000000000000000000000000000000004ac2054686520616e6e6f756e63656d656e7473206d616465206279207468652070726f787920286b6579292e01c10301cc184050726f78794465706f7369744261736518400020f7a54b330000000000000000000010110120546865206261736520616d6f756e74206f662063757272656e6379206e656564656420746f207265736572766520666f72206372656174696e6720612070726f78792e00010120546869732069732068656c6420666f7220616e206164646974696f6e616c2073746f72616765206974656d2077686f73652076616c75652073697a652069732501206073697a656f662842616c616e6365296020627974657320616e642077686f7365206b65792073697a65206973206073697a656f66284163636f756e74496429602062797465732e4850726f78794465706f736974466163746f72184000f4a92b80010000000000000000000014bc2054686520616d6f756e74206f662063757272656e6379206e6565646564207065722070726f78792061646465642e00350120546869732069732068656c6420666f7220616464696e6720333220627974657320706c757320616e20696e7374616e6365206f66206050726f78795479706560206d6f726520696e746f20616101207072652d6578697374696e672073746f726167652076616c75652e20546875732c207768656e20636f6e6669677572696e67206050726f78794465706f736974466163746f7260206f6e652073686f756c642074616b65f420696e746f206163636f756e7420603332202b2070726f78795f747970652e656e636f646528292e6c656e282960206279746573206f6620646174612e284d617850726f786965731c100a00000004f020546865206d6178696d756d20616d6f756e74206f662070726f7869657320616c6c6f77656420666f7220612073696e676c65206163636f756e742e284d617850656e64696e671c100a00000004450120546865206d6178696d756d20616d6f756e74206f662074696d652d64656c6179656420616e6e6f756e63656d656e747320746861742061726520616c6c6f77656420746f2062652070656e64696e672e5c416e6e6f756e63656d656e744465706f7369744261736518400020f7a54b330000000000000000000010310120546865206261736520616d6f756e74206f662063757272656e6379206e656564656420746f207265736572766520666f72206372656174696e6720616e20616e6e6f756e63656d656e742e00490120546869732069732068656c64207768656e2061206e65772073746f72616765206974656d20686f6c64696e672061206042616c616e636560206973206372656174656420287479706963616c6c7920313620206279746573292e64416e6e6f756e63656d656e744465706f736974466163746f72184000e8535700030000000000000000000010d42054686520616d6f756e74206f662063757272656e6379206e65656465642070657220616e6e6f756e63656d656e74206d6164652e00590120546869732069732068656c6420666f7220616464696e6720616e20604163636f756e744964602c2060486173686020616e642060426c6f636b4e756d6265726020287479706963616c6c79203638206279746573298c20696e746f2061207072652d6578697374696e672073746f726167652076616c75652e0179052b20507265696d6167650120507265696d6167650824537461747573466f7200010406247d050400049020546865207265717565737420737461747573206f66206120676976656e20686173682e2c507265696d616765466f7200010406248905040004942054686520707265696d616765732073746f72656420627920746869732070616c6c65742e01c90301d800018d052c38546970734d656d626572736869700138546970734d656d62657273686970081c4d656d62657273010088040004c8205468652063757272656e74206d656d626572736869702c2073746f72656420617320616e206f726465726564205665632e145072696d65000000040004a4205468652063757272656e74207072696d65206d656d6265722c206966206f6e65206578697374732e01cd0301dc000191052d10546970730110546970730810546970730001040524950504000c650120546970734d6170207468617420617265206e6f742079657420636f6d706c657465642e204b65796564206279207468652068617368206f66206028726561736f6e2c2077686f29602066726f6d207468652076616c75652e3d012054686973206861732074686520696e73656375726520656e756d657261626c6520686173682066756e6374696f6e2073696e636520746865206b657920697473656c6620697320616c7265616479802067756172616e7465656420746f20626520612073656375726520686173682e1c526561736f6e7300010406242804000849012053696d706c6520707265696d616765206c6f6f6b75702066726f6d2074686520726561736f6e2773206861736820746f20746865206f726967696e616c20646174612e20416761696e2c2068617320616e610120696e73656375726520656e756d657261626c6520686173682073696e636520746865206b65792069732067756172616e7465656420746f2062652074686520726573756c74206f6620612073656375726520686173682e01d10301e0144c4d6178696d756d526561736f6e4c656e6774681c10004000000c88204d6178696d756d2061636365707461626c6520726561736f6e206c656e6774682e0065012042656e63686d61726b7320646570656e64206f6e20746869732076616c75652c206265207375726520746f2075706461746520776569676874732066696c65207768656e206368616e67696e6720746869732076616c756548446174614465706f73697450657242797465184000743ba40b00000000000000000000000461012054686520616d6f756e742068656c64206f6e206465706f7369742070657220627974652077697468696e2074686520746970207265706f727420726561736f6e206f7220626f756e7479206465736372697074696f6e2e30546970436f756e74646f776e1020201c0000000000000445012054686520706572696f6420666f722077686963682061207469702072656d61696e73206f70656e20616674657220697320686173206163686965766564207468726573686f6c6420746970706572732e3454697046696e646572734665659d050414043501205468652070657263656e74206f66207468652066696e616c2074697020776869636820676f657320746f20746865206f726967696e616c207265706f72746572206f6620746865207469702e505469705265706f72744465706f73697442617365184000f45628fa320000000000000000000004d42054686520616d6f756e742068656c64206f6e206465706f73697420666f7220706c6163696e67206120746970207265706f72742e01a1052e14437479706501144374797065041843747970657300010402240004000c60204354797065732073746f726564206f6e20636861696e2e00a8204974206d6170732066726f6d2061204354797065206861736820746f206974732063726561746f722e01d50301e40001a5053d2c4174746573746174696f6e012c4174746573746174696f6e08304174746573746174696f6e730001040224a90504000c78204174746573746174696f6e732073746f726564206f6e20636861696e2e00cc204974206d6170732066726f6d206120636c61696d206861736820746f207468652066756c6c206174746573746174696f6e2e5045787465726e616c4174746573746174696f6e730101080502b105a404000ca02044656c656761746564206174746573746174696f6e732073746f726564206f6e20636861696e2e00e8204974206d6170732066726f6d20612064656c65676174696f6e20494420746f206120766563746f72206f6620636c61696d206861736865732e01d90301e8081c4465706f7369741840001cc9dd006e0000000000000000000004e420546865206465706f736974207468617420697320726571756972656420666f722073746f72696e6720616e206174746573746174696f6e2e604d617844656c6567617465644174746573746174696f6e731c10e803000008090120546865206d6178696d756d206e756d626572206f662064656c656761746564206174746573746174696f6e732077686963682063616e206265206d61646520627954207468652073616d652064656c65676174696f6e2e01b5053e2844656c65676174696f6e012844656c65676174696f6e083c44656c65676174696f6e4e6f6465730001040224b90504000c882044656c65676174696f6e206e6f6465732073746f726564206f6e20636861696e2e00b0204974206d6170732066726f6d2061206e6f646520494420746f20746865206e6f64652064657461696c732e5444656c65676174696f6e48696572617263686965730001040224c90504000ca02044656c65676174696f6e2068696572617263686965732073746f726564206f6e20636861696e2e00dc204974206d61707320666f7220612028726f6f7429206e6f646520494420746f20746865206869657261726368792064657461696c732e01ed0301f4181c4465706f73697418400080c6a47e8d0300000000000000000004dc20546865206465706f736974207468617420697320726571756972656420666f722073746f72696e6720612064656c65676174696f6e2e584d61785369676e6174757265427974654c656e677468d408400000384d61785265766f636174696f6e731c1005000000047c204d6178696d756d206e756d626572206f66207265766f636174696f6e732e2c4d617852656d6f76616c731c100500000004f4204d6178696d756d206e756d626572206f662072656d6f76616c732e2053686f756c642062652073616d65206173204d61785265766f636174696f6e733c4d6178506172656e74436865636b731c1005000000080d01204d6178696d756d206e756d626572206f6620757077617264732074726176657273616c73206f66207468652064656c65676174696f6e20747265652066726f6d2061f0206e6f646520746f2074686520726f6f7420616e64207468757320746865206465707468206f66207468652064656c65676174696f6e20747265652e2c4d61784368696c6472656e1c10e80300000c0d01204d6178696d756d206e756d626572206f6620616c6c206368696c6472656e20666f7220612064656c65676174696f6e206e6f64652e20466f7220612062696e617279fc20747265652c20746869732073686f756c6420626520747769636520746865206d6178696d756d206465707468206f662074686520747265652c20692e652e5c206032205e204d6178506172656e74436865636b73602e01cd053f0c446964010c446964100c4469640001040200d10504000c5820444944732073746f726564206f6e20636861696e2e00c8204974206d6170732066726f6d206120444944206964656e74696669657220746f20746865204449442064657461696c732e4053657276696365456e64706f696e74730001080502f105390404000ca0205365727669636520656e64706f696e7473206173736f636961746564207769746820444944732e000901204974206d6170732066726f6d2028444944206964656e7469666965722c20736572766963652049442920746f2074686520736572766963652064657461696c732e44446964456e64706f696e7473436f756e7401010402001c10000000000cac20436f756e746572206f66207365727669636520656e64706f696e747320666f722065616368204449442e00cc204974206d6170732066726f6d2028444944206964656e7469666965722920746f20612033322d62697420636f756e7465722e30446964426c61636b6c6973740001040200940400141d012054686520736574206f66204449447320746861742068617665206265656e2064656c6574656420616e642063616e6e6f74207468657265666f726520626520637265617465647020616761696e20666f7220736563757269747920726561736f6e732e002101204974206d6170732066726f6d206120444944206964656e74696669657220746f206120756e6974207475706c652c20666f72207468652073616b65206f6620747261636b696e674420444944206964656e746966696572732e01090401fc301c4465706f736974184000983ea62c22070000000000000000000c0d012054686520616d6f756e74206f662062616c616e636520746861742077696c6c2062652074616b656e20666f722065616368204449442061732061206465706f736974110120746f20696e63656e746976697365206661697220757365206f6620746865206f6e20636861696e2073746f726167652e20546865206465706f7369742063616e2062658c207265636c61696d6564207768656e20746865204449442069732064656c657465642e0c466565184000203d88792d000000000000000000000c09012054686520616d6f756e74206f662062616c616e636520746861742077696c6c2062652074616b656e20666f7220656163682044494420617320612066656520746f0d0120696e63656e746976697365206661697220757365206f6620746865206f6e20636861696e2073746f726167652e20546865206665652077696c6c206e6f74206765748820726566756e646564207768656e20746865204449442069732064656c657465642e4c4d61785075626c69634b6579735065724469641c10140000000c1101204d6178696d756d206e756d626572206f6620746f74616c207075626c6963206b6579732077686963682063616e2062652073746f7265642070657220444944206b6579d8206964656e7469666965722e205468697320696e636c7564657320746865206f6e65732063757272656e746c79207573656420666f72f02061757468656e7469636174696f6e2c206b65792061677265656d656e742c206174746573746174696f6e2c20616e642064656c65676174696f6e2e584d61784e65774b657941677265656d656e744b6579731c100a000000081501204d6178696d756d206e756d626572206f66206b65792061677265656d656e74206b65797320746861742063616e20626520616464656420696e2061206372656174696f6e2c206f7065726174696f6e2e604d6178546f74616c4b657941677265656d656e744b6579731c1013000000101101204d6178696d756d206e756d626572206f6620746f74616c206b65792061677265656d656e74206b65797320746861742063616e2062652073746f72656420666f7220613420444944207375626a6563742e00c42053686f756c642062652067726561746572207468616e20604d61784e65774b657941677265656d656e744b657973602e4c4d6178426c6f636b73547856616c696469747910202c0100000000000008ec20546865206d6178696d756d206e756d626572206f6620626c6f636b732061204449442d617574686f72697a6564206f7065726174696f6e2069739420636f6e736964657265642076616c696420616674657220697473206372656174696f6e2e644d61784e756d6265724f6653657276696365735065724469641c101900000004fc20546865206d6178696d756d206e756d626572206f6620736572766963657320746861742063616e2062652073746f72656420756e6465722061204449442e484d61785365727669636549644c656e6774681c1032000000049020546865206d6178696d756d206c656e677468206f66206120736572766963652049442e504d617853657276696365547970654c656e6774681c103200000004c820546865206d6178696d756d206c656e677468206f66206120736572766963652074797065206465736372697074696f6e2e684d61784e756d6265724f665479706573506572536572766963651c100100000004090120546865206d6178696d756d206e756d626572206f662061207479706573206465736372697074696f6e20666f722061207365727669636520656e64706f696e742e4c4d61785365727669636555726c4c656e6774681c10c8000000049420546865206d6178696d756d206c656e677468206f66206120736572766963652055524c2e644d61784e756d6265724f6655726c73506572536572766963651c100100000004d420546865206d6178696d756d206e756d626572206f6620612055524c7320666f722061207365727669636520656e64706f696e742e01f5054024496e666c6174696f6e000000084c496e697469616c506572696f644c656e677468102048a3c800000000000c050120546865206c656e677468206f662074686520696e697469616c20706572696f6420696e2077686963682074686520636f6e7374616e74207265776172642069731101206d696e7465642e204f6e6365207468652063757272656e7420626c6f636b206578636565647320746869732c207265776172647320617265206e6f206675727468657220206973737565642e4c496e697469616c506572696f64526577617264184036f539fdaeb30200000000000000000008fc2054686520616d6f756e74206f66206e65776c792069737375656420746f6b656e732070657220626c6f636b20647572696e672074686520696e697469616c2020706572696f642e0042244469644c6f6f6b757001244469644c6f6f6b75700834436f6e6e6563746564446964730001040200f905040004a8204d617070696e672066726f6d206163636f756e74206964656e7469666965727320746f20444944732e44436f6e6e65637465644163636f756e74730001080202fd059404000cbc204d617070696e672066726f6d2028444944202b206163636f756e74206964656e74696669657229202d3e2028292e0d012054686520656d707479207475706c65206973207573656420617320612073656e74696e656c2076616c756520746f2073696d706c7920696e64696361746520746865982070726573656e6365206f66206120676976656e207475706c6520696e20746865206d61702e015d04010101041c4465706f736974184000c0afd69136000000000000000000000c0d012054686520616d6f756e74206f662062616c616e636520746861742077696c6c2062652074616b656e20666f722065616368204449442061732061206465706f736974110120746f20696e63656e746976697365206661697220757365206f6620746865206f6e20636861696e2073746f726167652e20546865206465706f7369742063616e2062658c207265636c61696d6564207768656e20746865204449442069732064656c657465642e0101064324576562334e616d65730124576562334e616d65730c144f776e6572000104020901050604000488204d6170206f66206e616d65202d3e206f776e6572736869702064657461696c732e144e616d65730001040200090104000458204d6170206f66206f776e6572202d3e206e616d652e1842616e6e65640001040209019404000c4c204d6170206f66206e616d65202d3e2028292e00e02049662061206e616d65206b65792069732070726573656e742c20746865206e616d652069732063757272656e746c792062616e6e65642e0165040105010c1c4465706f736974184000d450a85d6b0000000000000000000004bc2054686520616d6f756e74206f66204b494c5420746f206465706f73697420746f20636c61696d2061206e616d652e344d696e4e616d654c656e6774681c1003000000048820546865206d696e20656e636f646564206c656e677468206f662061206e616d652e344d61784e616d654c656e6774681c1020000000048820546865206d617820656e636f646564206c656e677468206f662061206e616d652e010906443c50617261636861696e53797374656d013c50617261636861696e53797374656d505450656e64696e6756616c69646174696f6e436f64650100280400187d0120496e2063617365206f662061207363686564756c656420757067726164652c20746869732073746f72616765206669656c6420636f6e7461696e73207468652076616c69646174696f6e20636f646520746f206265206170706c6965642e00c10120417320736f6f6e206173207468652072656c617920636861696e2067697665732075732074686520676f2d6168656164207369676e616c2c2077652077696c6c206f766572777269746520746865205b603a636f6465605d5b77656c6c5f6b6e6f776e5f6b6579733a3a434f44455dad012077686963682077696c6c20726573756c7420746865206e65787420626c6f636b2070726f63657373207769746820746865206e65772076616c69646174696f6e20636f64652e205468697320636f6e636c756465732074686520757067726164652070726f636573732e000501205b77656c6c5f6b6e6f776e5f6b6579733a3a434f44455d3a2073705f636f72653a3a73746f726167653a3a77656c6c5f6b6e6f776e5f6b6579733a3a434f4445444e657756616c69646174696f6e436f64650000280400145d012056616c69646174696f6e20636f6465207468617420697320736574206279207468652070617261636861696e20616e6420697320746f20626520636f6d6d756e69636174656420746f20636f6c6c61746f7220616e647820636f6e73657175656e746c79207468652072656c61792d636861696e2e00650120546869732077696c6c20626520636c656172656420696e20606f6e5f696e697469616c697a6560206f662065616368206e657720626c6f636b206966206e6f206f746865722070616c6c657420616c7265616479207365742c207468652076616c75652e3856616c69646174696f6e446174610000710404000cd020546865205b6050657273697374656456616c69646174696f6e44617461605d2073657420666f72207468697320626c6f636b2e2d0120546869732076616c756520697320657870656374656420746f20626520736574206f6e6c79206f6e63652070657220626c6f636b20616e642069742773206e657665722073746f7265643420696e2074686520747269652e5044696453657456616c69646174696f6e436f64650100a4040004e02057657265207468652076616c69646174696f6e20646174612073657420746f206e6f74696679207468652072656c617920636861696e3f60557067726164655265737472696374696f6e5369676e616c01000d0604001c750120416e206f7074696f6e20776869636820696e64696361746573206966207468652072656c61792d636861696e20726573747269637473207369676e616c6c696e6720612076616c69646174696f6e20636f646520757067726164652e610120496e206f7468657220776f7264732c20696620746869732069732060536f6d656020616e64205b604e657756616c69646174696f6e436f6465605d2069732060536f6d6560207468656e207468652070726f64756365646c2063616e6469646174652077696c6c20626520696e76616c69642e00710120546869732073746f72616765206974656d2069732061206d6972726f72206f662074686520636f72726573706f6e64696e672076616c756520666f72207468652063757272656e742070617261636861696e2066726f6d207468656d012072656c61792d636861696e2e20546869732076616c756520697320657068656d6572616c207768696368206d65616e7320697420646f65736e277420686974207468652073746f726167652e20546869732076616c756520697360207365742061667465722074686520696e686572656e742e3c52656c6179537461746550726f6f6600007904040018c4205468652073746174652070726f6f6620666f7220746865206c6173742072656c617920706172656e7420626c6f636b2e006d012054686973206669656c64206973206d65616e7420746f2062652075706461746564206561636820626c6f636b2077697468207468652076616c69646174696f6e206461746120696e686572656e742e205468657265666f72652c4d01206265666f72652070726f63657373696e67206f662074686520696e686572656e742c20652e672e20696e20606f6e5f696e697469616c697a656020746869732064617461206d6179206265207374616c652e00ac2054686973206461746120697320616c736f20616273656e742066726f6d207468652067656e657369732e5852656c6576616e744d6573736167696e6753746174650000150604001c65012054686520736e617073686f74206f6620736f6d652073746174652072656c6174656420746f206d6573736167696e672072656c6576616e7420746f207468652063757272656e742070617261636861696e2061732070657248207468652072656c617920706172656e742e006d012054686973206669656c64206973206d65616e7420746f2062652075706461746564206561636820626c6f636b2077697468207468652076616c69646174696f6e206461746120696e686572656e742e205468657265666f72652c4d01206265666f72652070726f63657373696e67206f662074686520696e686572656e742c20652e672e20696e20606f6e5f696e697469616c697a656020746869732064617461206d6179206265207374616c652e00ac2054686973206461746120697320616c736f20616273656e742066726f6d207468652067656e657369732e44486f7374436f6e66696775726174696f6e000029060400182901205468652070617261636861696e20686f737420636f6e66696775726174696f6e207468617420776173206f627461696e65642066726f6d207468652072656c617920706172656e742e006d012054686973206669656c64206973206d65616e7420746f2062652075706461746564206561636820626c6f636b2077697468207468652076616c69646174696f6e206461746120696e686572656e742e205468657265666f72652c4d01206265666f72652070726f63657373696e67206f662074686520696e686572656e742c20652e672e20696e20606f6e5f696e697469616c697a656020746869732064617461206d6179206265207374616c652e00ac2054686973206461746120697320616c736f20616273656e742066726f6d207468652067656e657369732e384c617374446d714d71634865616401002d0680000000000000000000000000000000000000000000000000000000000000000010f420546865206c61737420646f776e77617264206d65737361676520717565756520636861696e20686561642077652068617665206f627365727665642e00650120546869732076616c7565206973206c6f61646564206265666f726520616e642073617665642061667465722070726f63657373696e6720696e626f756e6420646f776e77617264206d65737361676573206361727269656460206279207468652073797374656d20696e686572656e742e404c61737448726d704d7163486561647301003106040010490120546865206d65737361676520717565756520636861696e2068656164732077652068617665206f62736572766564207065722065616368206368616e6e656c20696e636f6d696e67206368616e6e656c2e00650120546869732076616c7565206973206c6f61646564206265666f726520616e642073617665642061667465722070726f63657373696e6720696e626f756e6420646f776e77617264206d65737361676573206361727269656460206279207468652073797374656d20696e686572656e742e6450726f636573736564446f776e776172644d6573736167657301001c10000000000cc8204e756d626572206f6620646f776e77617264206d657373616765732070726f63657373656420696e206120626c6f636b2e00ec20546869732077696c6c20626520636c656172656420696e20606f6e5f696e697469616c697a6560206f662065616368206e657720626c6f636b2e3448726d7057617465726d61726b01001c10000000000ca02048524d502077617465726d61726b2074686174207761732073657420696e206120626c6f636b2e00ec20546869732077696c6c20626520636c656172656420696e20606f6e5f696e697469616c697a6560206f662065616368206e657720626c6f636b2e5048726d704f7574626f756e644d6573736167657301003d0604000ca42048524d50206d65737361676573207468617420776572652073656e7420696e206120626c6f636b2e00ec20546869732077696c6c20626520636c656172656420696e20606f6e5f696e697469616c697a6560206f662065616368206e657720626c6f636b2e385570776172644d657373616765730100ed0104000cac20557077617264206d65737361676573207468617420776572652073656e7420696e206120626c6f636b2e00ec20546869732077696c6c20626520636c656172656420696e20606f6e5f696e697469616c697a6560206f662065616368206e657720626c6f636b2e5450656e64696e675570776172644d657373616765730100ed01040004310120557077617264206d65737361676573207468617420617265207374696c6c2070656e64696e6720616e64206e6f74207965742073656e6420746f207468652072656c617920636861696e2e84416e6e6f756e63656448726d704d6573736167657350657243616e64696461746501001c100000000008650120546865206e756d626572206f662048524d50206d65737361676573207765206f6273657276656420696e20606f6e5f696e697469616c697a656020616e64207468757320757365642074686174206e756d62657220666f72f020616e6e6f756e63696e672074686520776569676874206f6620606f6e5f696e697469616c697a656020616e6420606f6e5f66696e616c697a65602e68526573657276656458636d705765696768744f766572726964650000100400085d01205468652077656967687420776520726573657276652061742074686520626567696e6e696e67206f662074686520626c6f636b20666f722070726f63657373696e672058434d50206d657373616765732e2054686973b8206f76657272696465732074686520616d6f756e742073657420696e2074686520436f6e6669672074726169742e645265736572766564446d705765696768744f766572726964650000100400085901205468652077656967687420776520726573657276652061742074686520626567696e6e696e67206f662074686520626c6f636b20666f722070726f63657373696e6720444d50206d657373616765732e2054686973b8206f76657272696465732074686520616d6f756e742073657420696e2074686520436f6e6669672074726169742e44417574686f72697a656455706772616465000024040004b820546865206e65787420617574686f72697a656420757067726164652c206966207468657265206973206f6e652e60437573746f6d56616c69646174696f6e486561644461746100002804000c2901204120637573746f6d2068656164206461746120746861742073686f756c642062652072657475726e656420617320726573756c74206f66206076616c69646174655f626c6f636b602e00190120536565205b6050616c6c65743a3a7365745f637573746f6d5f76616c69646174696f6e5f686561645f64617461605d20666f72206d6f726520696e666f726d6174696f6e2e01690401110100014506503450617261636861696e496e666f013450617261636861696e496e666f042c50617261636861696e49640100210110640000000000000000512458636d705175657565012458636d7051756575652444496e626f756e6458636d70537461747573010049060400049420537461747573206f662074686520696e626f756e642058434d50206368616e6e656c732e4c496e626f756e6458636d704d657373616765730101080205610628040004190120496e626f756e64206167677265676174652058434d50206d657373616765732e2049742063616e206f6e6c79206265206f6e6520706572205061726149642f626c6f636b2e484f7574626f756e6458636d70537461747573010065060400185d0120546865206e6f6e2d656d7074792058434d50206368616e6e656c7320696e206f72646572206f66206265636f6d696e67206e6f6e2d656d7074792c20616e642074686520696e646578206f6620746865206669727374510120616e64206c617374206f7574626f756e64206d6573736167652e204966207468652074776f20696e64696365732061726520657175616c2c207468656e20697420696e6469636174657320616e20656d707479590120717565756520616e64207468657265206d7573742062652061206e6f6e2d604f6b6020604f7574626f756e64537461747573602e20576520617373756d65207175657565732067726f77206e6f20677265617465725901207468616e203635353335206974656d732e20517565756520696e646963657320666f72206e6f726d616c206d6573736167657320626567696e206174206f6e653b207a65726f20697320726573657276656420696e11012063617365206f6620746865206e65656420746f2073656e64206120686967682d7072696f72697479207369676e616c206d657373616765207468697320626c6f636b2e09012054686520626f6f6c20697320747275652069662074686572652069732061207369676e616c206d6573736167652077616974696e6720746f2062652073656e742e504f7574626f756e6458636d704d657373616765730101080205710628040004bc20546865206d65737361676573206f7574626f756e6420696e206120676976656e2058434d50206368616e6e656c2e385369676e616c4d6573736167657301010402210128040004a020416e79207369676e616c206d657373616765732077616974696e6720746f2062652073656e742e2c5175657565436f6e6669670100750690020000000500000001000000a086010000000000020000000000000000c817a8040000000415012054686520636f6e66696775726174696f6e20776869636820636f6e74726f6c73207468652064796e616d696373206f6620746865206f7574626f756e642071756575652e284f76657277656967687400010405107906040010050120546865206d657373616765732074686174206578636565646564206d617820696e646976696475616c206d65737361676520776569676874206275646765742e003901205468657365206d657373616765207374617920696e20746869732073746f72616765206d617020756e74696c207468657920617265206d616e75616c6c79206469737061746368656420766961582060736572766963655f6f766572776569676874602e3c4f766572776569676874436f756e7401001020000000000000000008690120546865206e756d626572206f66206f766572776569676874206d657373616765732065766572207265636f7264656420696e20604f766572776569676874602e20416c736f20646f75626c657320617320746865206e6578748420617661696c61626c652066726565206f76657277656967687420696e6465782e38517565756553757370656e6465640100a404000441012057686574686572206f72206e6f74207468652058434d502071756575652069732073757370656e6465642066726f6d20657865637574696e6720696e636f6d696e672058434d73206f72206e6f742e019d0401150100017d06522c506f6c6b61646f7458636d0001a10401250100018106532843756d756c757358636d000001c101000185065420446d7051756575650120446d7051756575651034436f6e66696775726174696f6e010089062000e40b5402000000044c2054686520636f6e66696775726174696f6e2e2450616765496e64657801008d064000000000000000000000000000000000044020546865207061676520696e6465782e145061676573010104021c910604000444205468652071756575652070616765732e284f766572776569676874000104021095060400046420546865206f766572776569676874206d657373616765732e01050501c50100019906559d06042048436865636b4e6f6e5a65726f53656e646572a5069440436865636b5370656356657273696f6ea9061c38436865636b547856657273696f6ead061c30436865636b47656e65736973b1062438436865636b4d6f7274616c697479b5062428436865636b4e6f6e6365bd06942c436865636b576569676874c10694604368617267655472616e73616374696f6e5061796d656e74c50694e903"} \ No newline at end of file +{"result":"0x6d6574610ef106000c1c73705f636f72651863727970746f2c4163636f756e7449643332000004000401205b75383b2033325d0000040000032000000008000800000503000c08306672616d655f73797374656d2c4163636f756e74496e666f0814496e64657801102c4163636f756e74446174610114001401146e6f6e6365100114496e646578000124636f6e73756d6572731c0120526566436f756e7400012470726f7669646572731c0120526566436f756e7400012c73756666696369656e74731c0120526566436f756e740001106461746114012c4163636f756e7444617461000010000005060014083c70616c6c65745f62616c616e6365732c4163636f756e7444617461041c42616c616e63650118001001106672656518011c42616c616e6365000120726573657276656418011c42616c616e636500012c6d6973635f66726f7a656e18011c42616c616e63650001286665655f66726f7a656e18011c42616c616e636500001800000507001c0000050500200c346672616d655f737570706f72741c77656967687473405065724469737061746368436c6173730404540110000c01186e6f726d616c1001045400012c6f7065726174696f6e616c100104540001246d616e6461746f727910010454000024083c7072696d69746976655f74797065731048323536000004000401205b75383b2033325d00002800000208002c102873705f72756e74696d651c67656e65726963186469676573741844696765737400000401106c6f677330013c5665633c4469676573744974656d3e000030000002340034102873705f72756e74696d651c67656e6572696318646967657374284469676573744974656d0001142850726552756e74696d650800380144436f6e73656e737573456e67696e654964000028011c5665633c75383e00060024436f6e73656e7375730800380144436f6e73656e737573456e67696e654964000028011c5665633c75383e000400105365616c0800380144436f6e73656e737573456e67696e654964000028011c5665633c75383e000500144f74686572040028011c5665633c75383e0000006452756e74696d65456e7669726f6e6d656e745570646174656400080000380000030400000008003c00000240004008306672616d655f73797374656d2c4576656e745265636f7264080445014404540124000c01147068617365dd01011450686173650001146576656e7444010445000118746f70696373e10101185665633c543e00004408447370697269746e65745f72756e74696d65144576656e7400017c1853797374656d04004801706672616d655f73797374656d3a3a4576656e743c52756e74696d653e0000001c496e646963657304006c017870616c6c65745f696e64696365733a3a4576656e743c52756e74696d653e0005002042616c616e636573040070017c70616c6c65745f62616c616e6365733a3a4576656e743c52756e74696d653e000600485472616e73616374696f6e5061796d656e7404007801a870616c6c65745f7472616e73616374696f6e5f7061796d656e743a3a4576656e743c52756e74696d653e0007004050617261636861696e5374616b696e6704007c018470617261636861696e5f7374616b696e673a3a4576656e743c52756e74696d653e0015001c53657373696f6e040084015470616c6c65745f73657373696f6e3a3a4576656e740016002444656d6f6372616379040088018070616c6c65745f64656d6f63726163793a3a4576656e743c52756e74696d653e001e001c436f756e63696c0400a401fc70616c6c65745f636f6c6c6563746976653a3a4576656e743c52756e74696d652c2070616c6c65745f636f6c6c6563746976653a3a496e7374616e6365313e001f0048546563686e6963616c436f6d6d69747465650400ac01fc70616c6c65745f636f6c6c6563746976653a3a4576656e743c52756e74696d652c2070616c6c65745f636f6c6c6563746976653a3a496e7374616e6365323e0020004c546563686e6963616c4d656d626572736869700400b001fc70616c6c65745f6d656d626572736869703a3a4576656e743c52756e74696d652c2070616c6c65745f6d656d626572736869703a3a496e7374616e6365313e0022002054726561737572790400b4017c70616c6c65745f74726561737572793a3a4576656e743c52756e74696d653e0023003852656c61794d6967726174696f6e0400b8019870616c6c65745f72656c61795f6d6967726174696f6e3a3a4576656e743c52756e74696d653e0024002444796e46696c7465720400bc018470616c6c65745f64796e5f66696c7465723a3a4576656e743c52756e74696d653e0025001c5574696c6974790400c4015470616c6c65745f7574696c6974793a3a4576656e740028001c56657374696e670400c8017870616c6c65745f76657374696e673a3a4576656e743c52756e74696d653e002900245363686564756c65720400cc018070616c6c65745f7363686564756c65723a3a4576656e743c52756e74696d653e002a001450726f78790400dc017070616c6c65745f70726f78793a3a4576656e743c52756e74696d653e002b0020507265696d6167650400e8017c70616c6c65745f707265696d6167653a3a4576656e743c52756e74696d653e002c0038546970734d656d626572736869700400ec01fc70616c6c65745f6d656d626572736869703a3a4576656e743c52756e74696d652c2070616c6c65745f6d656d626572736869703a3a496e7374616e6365323e002d0010546970730400f0016c70616c6c65745f746970733a3a4576656e743c52756e74696d653e002e001443747970650400f4015463747970653a3a4576656e743c52756e74696d653e003d002c4174746573746174696f6e0400f8016c6174746573746174696f6e3a3a4576656e743c52756e74696d653e003e002844656c65676174696f6e04000501016864656c65676174696f6e3a3a4576656e743c52756e74696d653e003f000c44696404000d01014c6469643a3a4576656e743c52756e74696d653e004000244469644c6f6f6b757004001101018470616c6c65745f6469645f6c6f6f6b75703a3a4576656e743c52756e74696d653e00430024576562334e616d657304001501018470616c6c65745f776562335f6e616d65733a3a4576656e743c52756e74696d653e0044003c50617261636861696e53797374656d0400210101bc63756d756c75735f70616c6c65745f70617261636861696e5f73797374656d3a3a4576656e743c52756e74696d653e0050002458636d7051756575650400250101a463756d756c75735f70616c6c65745f78636d705f71756575653a3a4576656e743c52756e74696d653e0052002c506f6c6b61646f7458636d04003501016870616c6c65745f78636d3a3a4576656e743c52756e74696d653e0053002843756d756c757358636d0400d501018863756d756c75735f70616c6c65745f78636d3a3a4576656e743c52756e74696d653e00540020446d7051756575650400d90101a063756d756c75735f70616c6c65745f646d705f71756575653a3a4576656e743c52756e74696d653e00550000480c306672616d655f73797374656d1870616c6c6574144576656e740404540001184045787472696e7369635375636365737304013464697370617463685f696e666f4c01304469737061746368496e666f00000490416e2065787472696e73696320636f6d706c65746564207375636365737366756c6c792e3c45787472696e7369634661696c656408013864697370617463685f6572726f7258013444697370617463684572726f7200013464697370617463685f696e666f4c01304469737061746368496e666f00010450416e2065787472696e736963206661696c65642e2c436f64655570646174656400020450603a636f6465602077617320757064617465642e284e65774163636f756e7404011c6163636f756e74000130543a3a4163636f756e7449640003046841206e6577206163636f756e742077617320637265617465642e344b696c6c65644163636f756e7404011c6163636f756e74000130543a3a4163636f756e74496400040458416e206163636f756e7420776173207265617065642e2052656d61726b656408011873656e646572000130543a3a4163636f756e7449640001106861736824011c543a3a48617368000504704f6e206f6e2d636861696e2072656d61726b2068617070656e65642e04704576656e7420666f72207468652053797374656d2070616c6c65742e4c0c346672616d655f737570706f72741c77656967687473304469737061746368496e666f00000c0118776569676874100118576569676874000114636c6173735001344469737061746368436c617373000120706179735f666565540110506179730000500c346672616d655f737570706f72741c77656967687473344469737061746368436c61737300010c184e6f726d616c0000002c4f7065726174696f6e616c000100244d616e6461746f727900020000540c346672616d655f737570706f72741c7765696768747310506179730001080c596573000000084e6f0001000058082873705f72756e74696d653444697370617463684572726f72000128144f746865720000003043616e6e6f744c6f6f6b7570000100244261644f726967696e000200184d6f64756c6504005c012c4d6f64756c654572726f7200030044436f6e73756d657252656d61696e696e670004002c4e6f50726f76696465727300050040546f6f4d616e79436f6e73756d65727300060014546f6b656e0400600128546f6b656e4572726f720007002841726974686d65746963040064013c41726974686d657469634572726f72000800345472616e73616374696f6e616c04006801485472616e73616374696f6e616c4572726f72000900005c082873705f72756e74696d652c4d6f64756c654572726f720000080114696e64657808010875380001146572726f7238018c5b75383b204d41585f4d4f44554c455f4552524f525f454e434f4445445f53495a455d000060082873705f72756e74696d6528546f6b656e4572726f7200011c1c4e6f46756e647300000020576f756c644469650001003042656c6f774d696e696d756d0002003043616e6e6f7443726561746500030030556e6b6e6f776e41737365740004001846726f7a656e0005002c556e737570706f727465640006000064082873705f72756e74696d653c41726974686d657469634572726f7200010c24556e646572666c6f77000000204f766572666c6f77000100384469766973696f6e42795a65726f0002000068082873705f72756e74696d65485472616e73616374696f6e616c4572726f72000108304c696d6974526561636865640000001c4e6f4c61796572000100006c0c3870616c6c65745f696e64696365731870616c6c6574144576656e7404045400010c34496e64657841737369676e656408010c77686f000130543a3a4163636f756e744964000114696e64657810013c543a3a4163636f756e74496e6465780000047441206163636f756e7420696e646578207761732061737369676e65642e28496e6465784672656564040114696e64657810013c543a3a4163636f756e74496e646578000104bc41206163636f756e7420696e64657820686173206265656e2066726565642075702028756e61737369676e6564292e2c496e64657846726f7a656e080114696e64657810013c543a3a4163636f756e74496e64657800010c77686f000130543a3a4163636f756e744964000204e841206163636f756e7420696e64657820686173206265656e2066726f7a656e20746f206974732063757272656e74206163636f756e742049442e0499010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f72732920656d69747465640a090909627920746869732070616c6c65742e0a090909700c3c70616c6c65745f62616c616e6365731870616c6c6574144576656e740804540004490001281c456e646f77656408011c6163636f756e74000130543a3a4163636f756e744964000130667265655f62616c616e6365180128543a3a42616c616e6365000004b8416e206163636f756e74207761732063726561746564207769746820736f6d6520667265652062616c616e63652e20447573744c6f737408011c6163636f756e74000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e63650001083d01416e206163636f756e74207761732072656d6f7665642077686f73652062616c616e636520776173206e6f6e2d7a65726f206275742062656c6f77204578697374656e7469616c4465706f7369742c78726573756c74696e6720696e20616e206f75747269676874206c6f73732e205472616e736665720c011066726f6d000130543a3a4163636f756e744964000108746f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e63650002044c5472616e73666572207375636365656465642e2842616c616e63655365740c010c77686f000130543a3a4163636f756e74496400011066726565180128543a3a42616c616e63650001207265736572766564180128543a3a42616c616e636500030468412062616c616e6365207761732073657420627920726f6f742e20526573657276656408010c77686f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e6365000404e0536f6d652062616c616e63652077617320726573657276656420286d6f7665642066726f6d206672656520746f207265736572766564292e28556e726573657276656408010c77686f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e6365000504e8536f6d652062616c616e63652077617320756e726573657276656420286d6f7665642066726f6d20726573657276656420746f2066726565292e4852657365727665526570617472696174656410011066726f6d000130543a3a4163636f756e744964000108746f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e636500014864657374696e6174696f6e5f7374617475737401185374617475730006084d01536f6d652062616c616e636520776173206d6f7665642066726f6d207468652072657365727665206f6620746865206669727374206163636f756e7420746f20746865207365636f6e64206163636f756e742ed846696e616c20617267756d656e7420696e64696361746573207468652064657374696e6174696f6e2062616c616e636520747970652e1c4465706f73697408010c77686f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e6365000704d8536f6d6520616d6f756e7420776173206465706f73697465642028652e672e20666f72207472616e73616374696f6e2066656573292e20576974686472617708010c77686f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e63650008041d01536f6d6520616d6f756e74207761732077697468647261776e2066726f6d20746865206163636f756e742028652e672e20666f72207472616e73616374696f6e2066656573292e1c536c617368656408010c77686f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e63650009040101536f6d6520616d6f756e74207761732072656d6f7665642066726f6d20746865206163636f756e742028652e672e20666f72206d69736265686176696f72292e0499010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f72732920656d69747465640a090909627920746869732070616c6c65742e0a0909097414346672616d655f737570706f72741874726169747318746f6b656e73106d6973633442616c616e6365537461747573000108104672656500000020526573657276656400010000780c6870616c6c65745f7472616e73616374696f6e5f7061796d656e741870616c6c6574144576656e74040454000104485472616e73616374696f6e466565506169640c010c77686f000130543a3a4163636f756e74496400012861637475616c5f66656518013042616c616e63654f663c543e00010c74697018013042616c616e63654f663c543e000008590141207472616e73616374696f6e20666565206061637475616c5f666565602c206f662077686963682060746970602077617320616464656420746f20746865206d696e696d756d20696e636c7573696f6e206665652c5c686173206265656e2070616964206279206077686f602e0499010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f72732920656d69747465640a090909627920746869732070616c6c65742e0a0909097c0c4470617261636861696e5f7374616b696e671870616c6c6574144576656e74040454000154204e6577526f756e640800100138543a3a426c6f636b4e756d62657200001c013053657373696f6e496e6465780000088041206e6577207374616b696e6720726f756e642068617320737461727465642e785c5b626c6f636b206e756d6265722c20726f756e64206e756d6265725c5d50456e7465726564546f7043616e646964617465730400000130543a3a4163636f756e744964000108cc41206e6577206163636f756e7420686173206a6f696e65642074686520736574206f6620746f702063616e646964617465732e2c5c5b6163636f756e745c5d444c656674546f7043616e646964617465730400000130543a3a4163636f756e744964000208d8416e206163636f756e74207761732072656d6f7665642066726f6d2074686520736574206f6620746f702063616e646964617465732e2c5c5b6163636f756e745c5d604a6f696e6564436f6c6c61746f7243616e646964617465730800000130543a3a4163636f756e744964000018013042616c616e63654f663c543e000308e041206e6577206163636f756e7420686173206a6f696e65642074686520736574206f6620636f6c6c61746f722063616e646964617465732ebc5c5b6163636f756e742c20616d6f756e74207374616b656420627920746865206e65772063616e6469646174655c5d48436f6c6c61746f725374616b65644d6f72650c00000130543a3a4163636f756e744964000018013042616c616e63654f663c543e000018013042616c616e63654f663c543e00040801014120636f6c6c61746f722063616e6469646174652068617320696e637265617365642074686520616d6f756e74206f662066756e6473206174207374616b652ec45c5b636f6c6c61746f722773206163636f756e742c2070726576696f7573207374616b652c206e6577207374616b655c5d48436f6c6c61746f725374616b65644c6573730c00000130543a3a4163636f756e744964000018013042616c616e63654f663c543e000018013042616c616e63654f663c543e00050801014120636f6c6c61746f722063616e64696461746520686173206465637265617365642074686520616d6f756e74206f662066756e6473206174207374616b652ec45c5b636f6c6c61746f722773206163636f756e742c2070726576696f7573207374616b652c206e6577207374616b655c5d54436f6c6c61746f725363686564756c6564457869740c001c013053657373696f6e496e6465780000000130543a3a4163636f756e74496400001c013053657373696f6e496e64657800061001014120636f6c6c61746f722063616e646964617465206861732073746172746564207468652070726f6365737320746f206c656176652074686520736574206f66050163616e646964617465732e205c5b726f756e64206e756d6265722c20636f6c6c61746f722773206163636f756e742c20726f756e64206e756d626572207768656ee074686520636f6c6c61746f722077696c6c206265206566666563746976656c792072656d6f7665642066726f6d2074686520736574206f663063616e646964617465735c5d50436f6c6c61746f7243616e63656c6564457869740400000130543a3a4163636f756e74496400070c05014120636f6c6c61746f722063616e646964617465206861732063616e63656c6564207468652070726f6365737320746f206c656176652074686520736574206f66050163616e6469646174657320616e6420776173206164646564206261636b20746f207468652063616e64696461746520706f6f6c2e205c5b636f6c6c61746f722773246163636f756e745c5d3443616e6469646174654c6566740800000130543a3a4163636f756e744964000018013042616c616e63654f663c543e000808cc416e206163636f756e7420686173206c6566742074686520736574206f6620636f6c6c61746f722063616e646964617465732e985c5b6163636f756e742c20616d6f756e74206f662066756e647320756e2d7374616b65645c5d3c436f6c6c61746f7252656d6f7665640800000130543a3a4163636f756e744964000018013042616c616e63654f663c543e000908e4416e206163636f756e742077617320666f726365646c792072656d6f7665642066726f6d207468652020736574206f6620636f6c6c61746f72c863616e646964617465732e205c5b6163636f756e742c20616d6f756e74206f662066756e647320756e2d7374616b65645c5d604d617843616e6469646174655374616b654368616e676564040018013042616c616e63654f663c543e000a08b4546865206d6178696d756d2063616e646964617465207374616b6520686173206265656e206368616e6765642e485c5b6e6577206d617820616d6f756e745c5d4c44656c656761746f725374616b65644d6f72651000000130543a3a4163636f756e7449640000000130543a3a4163636f756e744964000018013042616c616e63654f663c543e000018013042616c616e63654f663c543e000b0cf0412064656c656761746f722068617320696e637265617365642074686520616d6f756e74206f662066756e6473206174207374616b6520666f722061f4636f6c6c61746f722e205c5b64656c656761746f722773206163636f756e742c20636f6c6c61746f722773206163636f756e742c2070726576696f7573a064656c65676174696f6e207374616b652c206e65772064656c65676174696f6e207374616b655c5d4c44656c656761746f725374616b65644c6573731000000130543a3a4163636f756e7449640000000130543a3a4163636f756e744964000018013042616c616e63654f663c543e000018013042616c616e63654f663c543e000c0cf0412064656c656761746f7220686173206465637265617365642074686520616d6f756e74206f662066756e6473206174207374616b6520666f722061f4636f6c6c61746f722e205c5b64656c656761746f722773206163636f756e742c20636f6c6c61746f722773206163636f756e742c2070726576696f7573a064656c65676174696f6e207374616b652c206e65772064656c65676174696f6e207374616b655c5d3444656c656761746f724c6566740800000130543a3a4163636f756e744964000018013042616c616e63654f663c543e000d08a8416e206163636f756e7420686173206c6566742074686520736574206f662064656c656761746f72732e985c5b6163636f756e742c20616d6f756e74206f662066756e647320756e2d7374616b65645c5d2844656c65676174696f6e1000000130543a3a4163636f756e744964000018013042616c616e63654f663c543e0000000130543a3a4163636f756e744964000018013042616c616e63654f663c543e000e0cc8416e206163636f756e74206861732064656c6567617465642061206e657720636f6c6c61746f722063616e6469646174652e11015c5b6163636f756e742c20616d6f756e74206f662066756e6473207374616b65642c20746f74616c20616d6f756e74206f662064656c656761746f7273272066756e64738c7374616b656420666f722074686520636f6c6c61746f722063616e6469646174655c5d4844656c65676174696f6e5265706c616365641800000130543a3a4163636f756e744964000018013042616c616e63654f663c543e0000000130543a3a4163636f756e744964000018013042616c616e63654f663c543e0000000130543a3a4163636f756e744964000018013042616c616e63654f663c543e000f180d0141206e65772064656c65676174696f6e20686173207265706c6163656420616e206578697374696e67206f6e6520696e2074686520736574206f66206f6e676f696e67010164656c65676174696f6e7320666f72206120636f6c6c61746f722063616e6469646174652e205c5b6e65772064656c656761746f722773206163636f756e742c0901616d6f756e74206f662066756e6473207374616b656420696e20746865206e65772064656c65676174696f6e2c207265706c616365642064656c656761746f7227730d016163636f756e742c20616d6f756e74206f662066756e6473207374616b656420696e20746865207265706c6163652064656c65676174696f6e2c20636f6c6c61746f72050163616e6469646174652773206163636f756e742c206e657720746f74616c20616d6f756e74206f662064656c656761746f7273272066756e6473207374616b656470666f722074686520636f6c6c61746f722063616e6469646174655c5d5444656c656761746f724c656674436f6c6c61746f721000000130543a3a4163636f756e7449640000000130543a3a4163636f756e744964000018013042616c616e63654f663c543e000018013042616c616e63654f663c543e00100cdc416e206163636f756e74206861732073746f707065642064656c65676174696e67206120636f6c6c61746f722063616e6469646174652e09015c5b6163636f756e742c20636f6c6c61746f722063616e6469646174652773206163636f756e742c206f6c6420616d6f756e74206f662064656c656761746f727327d866756e6473207374616b65642c206e657720616d6f756e74206f662064656c656761746f7273272066756e6473207374616b65645c5d2052657761726465640800000130543a3a4163636f756e744964000018013042616c616e63654f663c543e001108c04120636f6c6c61746f72206f7220612064656c656761746f72206861732072656365697665642061207265776172642e745c5b6163636f756e742c20616d6f756e74206f66207265776172645c5d44526f756e64496e666c6174696f6e536574100080012c5065727175696e74696c6c000080012c5065727175696e74696c6c000080012c5065727175696e74696c6c000080012c5065727175696e74696c6c00120c0501496e666c6174696f6e20636f6e66696775726174696f6e20666f72206675747572652076616c69646174696f6e20726f756e647320686173206368616e6765642e09015c5b6d6178696d756d20636f6c6c61746f722773207374616b696e6720726174652c206d6178696d756d20636f6c6c61746f7227732072657761726420726174652c0d016d6178696d756d2064656c656761746f722773207374616b696e6720726174652c206d6178696d756d2064656c656761746f7227732072657761726420726174655c5d604d617853656c656374656443616e6469646174657353657408001c010c75333200001c010c753332001308f0546865206d6178696d756d206e756d626572206f6620636f6c6c61746f722063616e646964617465732073656c656374656420696e20667574757265dc76616c69646174696f6e20726f756e647320686173206368616e6765642e205c5b6f6c642076616c75652c206e65772076616c75655c5d44426c6f636b73506572526f756e6453657410001c013053657373696f6e496e6465780000100138543a3a426c6f636b4e756d6265720000100138543a3a426c6f636b4e756d6265720000100138543a3a426c6f636b4e756d62657200140cf8546865206c656e67746820696e20626c6f636b7320666f72206675747572652076616c69646174696f6e20726f756e647320686173206368616e6765642e01015c5b726f756e64206e756d6265722c20666972737420626c6f636b20696e207468652063757272656e7420726f756e642c206f6c642076616c75652c206e65771c76616c75655c5d0499010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f72732920656d69747465640a090909627920746869732070616c6c65742e0a090909800c3473705f61726974686d65746963287065725f7468696e67732c5065727175696e74696c6c0000040010010c7536340000840c3870616c6c65745f73657373696f6e1870616c6c6574144576656e74000104284e657753657373696f6e04013473657373696f6e5f696e6465781c013053657373696f6e496e64657800000839014e65772073657373696f6e206861732068617070656e65642e204e6f746520746861742074686520617267756d656e74206973207468652073657373696f6e20696e6465782c206e6f74207468659c626c6f636b206e756d626572206173207468652074797065206d6967687420737567676573742e0499010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f72732920656d69747465640a090909627920746869732070616c6c65742e0a090909880c4070616c6c65745f64656d6f63726163791870616c6c6574144576656e740404540001502050726f706f73656408013870726f706f73616c5f696e6465781c012450726f70496e64657800011c6465706f73697418013042616c616e63654f663c543e000004bc41206d6f74696f6e20686173206265656e2070726f706f7365642062792061207075626c6963206163636f756e742e185461626c65640c013870726f706f73616c5f696e6465781c012450726f70496e64657800011c6465706f73697418013042616c616e63654f663c543e0001286465706f7369746f72738c01445665633c543a3a4163636f756e7449643e000104d841207075626c69632070726f706f73616c20686173206265656e207461626c656420666f72207265666572656e64756d20766f74652e3845787465726e616c5461626c656400020494416e2065787465726e616c2070726f706f73616c20686173206265656e207461626c65642e1c537461727465640801247265665f696e6465781c013c5265666572656e64756d496e6465780001247468726573686f6c64900134566f74655468726573686f6c640003045c41207265666572656e64756d2068617320626567756e2e185061737365640401247265665f696e6465781c013c5265666572656e64756d496e646578000404ac412070726f706f73616c20686173206265656e20617070726f766564206279207265666572656e64756d2e244e6f745061737365640401247265665f696e6465781c013c5265666572656e64756d496e646578000504ac412070726f706f73616c20686173206265656e2072656a6563746564206279207265666572656e64756d2e2443616e63656c6c65640401247265665f696e6465781c013c5265666572656e64756d496e6465780006048041207265666572656e64756d20686173206265656e2063616e63656c6c65642e2045786563757465640801247265665f696e6465781c013c5265666572656e64756d496e646578000118726573756c749401384469737061746368526573756c7400070470412070726f706f73616c20686173206265656e20656e61637465642e2444656c65676174656408010c77686f000130543a3a4163636f756e744964000118746172676574000130543a3a4163636f756e744964000804dc416e206163636f756e74206861732064656c65676174656420746865697220766f746520746f20616e6f74686572206163636f756e742e2c556e64656c65676174656404011c6163636f756e74000130543a3a4163636f756e744964000904e4416e206163636f756e74206861732063616e63656c6c656420612070726576696f75732064656c65676174696f6e206f7065726174696f6e2e185665746f65640c010c77686f000130543a3a4163636f756e74496400013470726f706f73616c5f6861736824011c543a3a48617368000114756e74696c100138543a3a426c6f636b4e756d626572000a0494416e2065787465726e616c2070726f706f73616c20686173206265656e207665746f65642e34507265696d6167654e6f7465640c013470726f706f73616c5f6861736824011c543a3a4861736800010c77686f000130543a3a4163636f756e74496400011c6465706f73697418013042616c616e63654f663c543e000b04dc412070726f706f73616c277320707265696d61676520776173206e6f7465642c20616e6420746865206465706f7369742074616b656e2e30507265696d616765557365640c013470726f706f73616c5f6861736824011c543a3a4861736800012070726f7669646572000130543a3a4163636f756e74496400011c6465706f73697418013042616c616e63654f663c543e000c041101412070726f706f73616c20707265696d616765207761732072656d6f76656420616e6420757365642028746865206465706f736974207761732072657475726e6564292e3c507265696d616765496e76616c696408013470726f706f73616c5f6861736824011c543a3a486173680001247265665f696e6465781c013c5265666572656e64756d496e646578000d040901412070726f706f73616c20636f756c64206e6f7420626520657865637574656420626563617573652069747320707265696d6167652077617320696e76616c69642e3c507265696d6167654d697373696e6708013470726f706f73616c5f6861736824011c543a3a486173680001247265665f696e6465781c013c5265666572656e64756d496e646578000e040901412070726f706f73616c20636f756c64206e6f7420626520657865637574656420626563617573652069747320707265696d61676520776173206d697373696e672e38507265696d61676552656170656410013470726f706f73616c5f6861736824011c543a3a4861736800012070726f7669646572000130543a3a4163636f756e74496400011c6465706f73697418013042616c616e63654f663c543e000118726561706572000130543a3a4163636f756e744964000f04290141207265676973746572656420707265696d616765207761732072656d6f76656420616e6420746865206465706f73697420636f6c6c656374656420627920746865207265617065722e2c426c61636b6c697374656404013470726f706f73616c5f6861736824011c543a3a48617368001004c4412070726f706f73616c5f6861736820686173206265656e20626c61636b6c6973746564207065726d616e656e746c792e14566f7465640c0114766f746572000130543a3a4163636f756e7449640001247265665f696e6465781c013c5265666572656e64756d496e646578000110766f74659c01644163636f756e74566f74653c42616c616e63654f663c543e3e00110490416e206163636f756e742068617320766f74656420696e2061207265666572656e64756d205365636f6e6465640801207365636f6e646572000130543a3a4163636f756e74496400012870726f705f696e6465781c012450726f70496e6465780012048c416e206163636f756e742068617320736563636f6e64656420612070726f706f73616c4050726f706f73616c43616e63656c656404012870726f705f696e6465781c012450726f70496e64657800130460412070726f706f73616c20676f742063616e63656c65642e0499010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f72732920656d69747465640a090909627920746869732070616c6c65742e0a0909098c0000020000900c4070616c6c65745f64656d6f637261637938766f74655f7468726573686f6c6434566f74655468726573686f6c6400010c5053757065724d616a6f72697479417070726f76650000005053757065724d616a6f72697479416761696e73740001003853696d706c654d616a6f7269747900020000940418526573756c740804540198044501580108084f6b040098000000000c45727204005800000100009800000400009c0c4070616c6c65745f64656d6f637261637910766f74652c4163636f756e74566f7465041c42616c616e636501180108205374616e64617264080110766f7465a00110566f746500011c62616c616e636518011c42616c616e63650000001453706c697408010c61796518011c42616c616e636500010c6e617918011c42616c616e636500010000a00c4070616c6c65745f64656d6f637261637910766f746510566f74650000040008000000a40c4470616c6c65745f636f6c6c6563746976651870616c6c6574144576656e7408045400044900011c2050726f706f73656410011c6163636f756e74000130543a3a4163636f756e74496400013870726f706f73616c5f696e6465781c013450726f706f73616c496e64657800013470726f706f73616c5f6861736824011c543a3a486173680001247468726573686f6c641c012c4d656d626572436f756e74000008490141206d6f74696f6e2028676976656e20686173682920686173206265656e2070726f706f7365642028627920676976656e206163636f756e742920776974682061207468726573686f6c642028676976656e3c604d656d626572436f756e7460292e14566f74656414011c6163636f756e74000130543a3a4163636f756e74496400013470726f706f73616c5f6861736824011c543a3a48617368000114766f746564a80110626f6f6c00010c7965731c012c4d656d626572436f756e740001086e6f1c012c4d656d626572436f756e74000108050141206d6f74696f6e2028676976656e20686173682920686173206265656e20766f746564206f6e20627920676976656e206163636f756e742c206c656176696e671501612074616c6c79202879657320766f74657320616e64206e6f20766f74657320676976656e20726573706563746976656c7920617320604d656d626572436f756e7460292e20417070726f76656404013470726f706f73616c5f6861736824011c543a3a48617368000204c041206d6f74696f6e2077617320617070726f76656420627920746865207265717569726564207468726573686f6c642e2c446973617070726f76656404013470726f706f73616c5f6861736824011c543a3a48617368000304d041206d6f74696f6e20776173206e6f7420617070726f76656420627920746865207265717569726564207468726573686f6c642e20457865637574656408013470726f706f73616c5f6861736824011c543a3a48617368000118726573756c749401384469737061746368526573756c74000404210141206d6f74696f6e207761732065786563757465643b20726573756c742077696c6c20626520604f6b602069662069742072657475726e656420776974686f7574206572726f722e384d656d626572457865637574656408013470726f706f73616c5f6861736824011c543a3a48617368000118726573756c749401384469737061746368526573756c740005044901412073696e676c65206d656d6265722064696420736f6d6520616374696f6e3b20726573756c742077696c6c20626520604f6b602069662069742072657475726e656420776974686f7574206572726f722e18436c6f7365640c013470726f706f73616c5f6861736824011c543a3a4861736800010c7965731c012c4d656d626572436f756e740001086e6f1c012c4d656d626572436f756e740006045501412070726f706f73616c2077617320636c6f736564206265636175736520697473207468726573686f6c64207761732072656163686564206f7220616674657220697473206475726174696f6e207761732075702e0499010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f72732920656d69747465640a090909627920746869732070616c6c65742e0a090909a80000050000ac0c4470616c6c65745f636f6c6c6563746976651870616c6c6574144576656e7408045400044900011c2050726f706f73656410011c6163636f756e74000130543a3a4163636f756e74496400013870726f706f73616c5f696e6465781c013450726f706f73616c496e64657800013470726f706f73616c5f6861736824011c543a3a486173680001247468726573686f6c641c012c4d656d626572436f756e74000008490141206d6f74696f6e2028676976656e20686173682920686173206265656e2070726f706f7365642028627920676976656e206163636f756e742920776974682061207468726573686f6c642028676976656e3c604d656d626572436f756e7460292e14566f74656414011c6163636f756e74000130543a3a4163636f756e74496400013470726f706f73616c5f6861736824011c543a3a48617368000114766f746564a80110626f6f6c00010c7965731c012c4d656d626572436f756e740001086e6f1c012c4d656d626572436f756e74000108050141206d6f74696f6e2028676976656e20686173682920686173206265656e20766f746564206f6e20627920676976656e206163636f756e742c206c656176696e671501612074616c6c79202879657320766f74657320616e64206e6f20766f74657320676976656e20726573706563746976656c7920617320604d656d626572436f756e7460292e20417070726f76656404013470726f706f73616c5f6861736824011c543a3a48617368000204c041206d6f74696f6e2077617320617070726f76656420627920746865207265717569726564207468726573686f6c642e2c446973617070726f76656404013470726f706f73616c5f6861736824011c543a3a48617368000304d041206d6f74696f6e20776173206e6f7420617070726f76656420627920746865207265717569726564207468726573686f6c642e20457865637574656408013470726f706f73616c5f6861736824011c543a3a48617368000118726573756c749401384469737061746368526573756c74000404210141206d6f74696f6e207761732065786563757465643b20726573756c742077696c6c20626520604f6b602069662069742072657475726e656420776974686f7574206572726f722e384d656d626572457865637574656408013470726f706f73616c5f6861736824011c543a3a48617368000118726573756c749401384469737061746368526573756c740005044901412073696e676c65206d656d6265722064696420736f6d6520616374696f6e3b20726573756c742077696c6c20626520604f6b602069662069742072657475726e656420776974686f7574206572726f722e18436c6f7365640c013470726f706f73616c5f6861736824011c543a3a4861736800010c7965731c012c4d656d626572436f756e740001086e6f1c012c4d656d626572436f756e740006045501412070726f706f73616c2077617320636c6f736564206265636175736520697473207468726573686f6c64207761732072656163686564206f7220616674657220697473206475726174696f6e207761732075702e0499010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f72732920656d69747465640a090909627920746869732070616c6c65742e0a090909b00c4470616c6c65745f6d656d626572736869701870616c6c6574144576656e740804540004490001182c4d656d6265724164646564000004e054686520676976656e206d656d626572207761732061646465643b2073656520746865207472616e73616374696f6e20666f722077686f2e344d656d62657252656d6f766564000104e854686520676976656e206d656d626572207761732072656d6f7665643b2073656520746865207472616e73616374696f6e20666f722077686f2e384d656d6265727353776170706564000204d854776f206d656d62657273207765726520737761707065643b2073656520746865207472616e73616374696f6e20666f722077686f2e304d656d6265727352657365740003041501546865206d656d62657273686970207761732072657365743b2073656520746865207472616e73616374696f6e20666f722077686f20746865206e6577207365742069732e284b65794368616e676564000404844f6e65206f6620746865206d656d6265727327206b657973206368616e6765642e1444756d6d790005046c5068616e746f6d206d656d6265722c206e6576657220757365642e0499010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f72732920656d69747465640a090909627920746869732070616c6c65742e0a090909b40c3c70616c6c65745f74726561737572791870616c6c6574144576656e740804540004490001202050726f706f73656404013870726f706f73616c5f696e6465781c013450726f706f73616c496e646578000004344e65772070726f706f73616c2e205370656e64696e670401406275646765745f72656d61696e696e6718013c42616c616e63654f663c542c20493e000104e45765206861766520656e6465642061207370656e6420706572696f6420616e642077696c6c206e6f7720616c6c6f636174652066756e64732e1c417761726465640c013870726f706f73616c5f696e6465781c013450726f706f73616c496e646578000114617761726418013c42616c616e63654f663c542c20493e00011c6163636f756e74000130543a3a4163636f756e7449640002047c536f6d652066756e64732068617665206265656e20616c6c6f63617465642e2052656a656374656408013870726f706f73616c5f696e6465781c013450726f706f73616c496e64657800011c736c617368656418013c42616c616e63654f663c542c20493e000304b0412070726f706f73616c207761732072656a65637465643b2066756e6473207765726520736c61736865642e144275726e7404012c6275726e745f66756e647318013c42616c616e63654f663c542c20493e00040488536f6d65206f66206f75722066756e64732068617665206265656e206275726e742e20526f6c6c6f766572040140726f6c6c6f7665725f62616c616e636518013c42616c616e63654f663c542c20493e0005042d015370656e64696e67206861732066696e69736865643b20746869732069732074686520616d6f756e74207468617420726f6c6c73206f76657220756e74696c206e657874207370656e642e1c4465706f73697404011476616c756518013c42616c616e63654f663c542c20493e0006047c536f6d652066756e64732068617665206265656e206465706f73697465642e345370656e64417070726f7665640c013870726f706f73616c5f696e6465781c013450726f706f73616c496e646578000118616d6f756e7418013c42616c616e63654f663c542c20493e00012c62656e6566696369617279000130543a3a4163636f756e7449640007049c41206e6577207370656e642070726f706f73616c20686173206265656e20617070726f7665642e0499010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f72732920656d69747465640a090909627920746869732070616c6c65742e0a090909b80c5870616c6c65745f72656c61795f6d6967726174696f6e1870616c6c6574144576656e74040454000108484c6561736553776170496e697469617465640000049c5468652070617261636861696e206c6561736520737761702077617320696e697469617465642e4c52656c61794e756d626572436865636b536574040118737472696374a80110626f6f6c04c05265666c656374732073657474696e6720746f2052656c61794e756d6265725374726963746c79496e637265617365730104e854686520726571756972656d656e7420666f72206173736f6369617465642072656c617920626c6f636b206e756d6265727320776173207365740499010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f72732920656d69747465640a090909627920746869732070616c6c65742e0a090909bc0c4470616c6c65745f64796e5f66696c7465721870616c6c6574144576656e74040454000104384e657746696c74657252756c657304011472756c6573c0013846696c74657253657474696e67730000000499010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f72732920656d69747465640a090909627920746869732070616c6c65742e0a090909c00c4470616c6c65745f64796e5f66696c7465721c73657474696e673846696c74657253657474696e677300000c01447472616e736665725f64697361626c6564a80110626f6f6c000140666561747572655f64697361626c6564a80110626f6f6c00013078636d5f64697361626c6564a80110626f6f6c0000c40c3870616c6c65745f7574696c6974791870616c6c6574144576656e74000118404261746368496e746572727570746564080114696e6465781c010c7533320001146572726f7258013444697370617463684572726f7200000855014261746368206f66206469737061746368657320646964206e6f7420636f6d706c6574652066756c6c792e20496e646578206f66206669727374206661696c696e6720646973706174636820676976656e2c2061734877656c6c20617320746865206572726f722e384261746368436f6d706c65746564000104c84261746368206f66206469737061746368657320636f6d706c657465642066756c6c792077697468206e6f206572726f722e604261746368436f6d706c65746564576974684572726f7273000204b44261746368206f66206469737061746368657320636f6d706c657465642062757420686173206572726f72732e344974656d436f6d706c657465640003041d01412073696e676c65206974656d2077697468696e2061204261746368206f6620646973706174636865732068617320636f6d706c657465642077697468206e6f206572726f722e284974656d4661696c65640401146572726f7258013444697370617463684572726f720004041101412073696e676c65206974656d2077697468696e2061204261746368206f6620646973706174636865732068617320636f6d706c657465642077697468206572726f722e30446973706174636865644173040118726573756c749401384469737061746368526573756c7400050458412063616c6c2077617320646973706174636865642e0499010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f72732920656d69747465640a090909627920746869732070616c6c65742e0a090909c80c3870616c6c65745f76657374696e671870616c6c6574144576656e740404540001083856657374696e675570646174656408011c6163636f756e74000130543a3a4163636f756e744964000120756e76657374656418013042616c616e63654f663c543e000008510154686520616d6f756e742076657374656420686173206265656e20757064617465642e205468697320636f756c6420696e6469636174652061206368616e676520696e2066756e647320617661696c61626c652e25015468652062616c616e636520676976656e2069732074686520616d6f756e74207768696368206973206c65667420756e7665737465642028616e642074687573206c6f636b6564292e4056657374696e67436f6d706c6574656404011c6163636f756e74000130543a3a4163636f756e7449640001049c416e205c5b6163636f756e745c5d20686173206265636f6d652066756c6c79207665737465642e0499010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f72732920656d69747465640a090909627920746869732070616c6c65742e0a090909cc0c4070616c6c65745f7363686564756c65721870616c6c6574144576656e74040454000110245363686564756c65640801107768656e100138543a3a426c6f636b4e756d626572000114696e6465781c010c753332000004505363686564756c656420736f6d65207461736b2e2043616e63656c65640801107768656e100138543a3a426c6f636b4e756d626572000114696e6465781c010c7533320001044c43616e63656c656420736f6d65207461736b2e28446973706174636865640c01107461736bd0016c5461736b416464726573733c543a3a426c6f636b4e756d6265723e0001086964d4013c4f7074696f6e3c5665633c75383e3e000118726573756c749401384469737061746368526573756c74000204544469737061746368656420736f6d65207461736b2e4043616c6c4c6f6f6b75704661696c65640c01107461736bd0016c5461736b416464726573733c543a3a426c6f636b4e756d6265723e0001086964d4013c4f7074696f6e3c5665633c75383e3e0001146572726f72d8012c4c6f6f6b75704572726f7200030429015468652063616c6c20666f72207468652070726f7669646564206861736820776173206e6f7420666f756e6420736f20746865207461736b20686173206265656e2061626f727465642e04304576656e747320747970652ed000000408101c00d404184f7074696f6e04045401280108104e6f6e6500000010536f6d650400280000010000d810346672616d655f737570706f727418747261697473207363686564756c652c4c6f6f6b75704572726f720001081c556e6b6e6f776e00000024426164466f726d617400010000dc0c3070616c6c65745f70726f78791870616c6c6574144576656e740404540001143450726f78794578656375746564040118726573756c749401384469737061746368526573756c74000004bc412070726f78792077617320657865637574656420636f72726563746c792c20776974682074686520676976656e2e40416e6f6e796d6f757343726561746564100124616e6f6e796d6f7573000130543a3a4163636f756e74496400010c77686f000130543a3a4163636f756e74496400012870726f78795f74797065e00130543a3a50726f787954797065000150646973616d626967756174696f6e5f696e646578e4010c753136000108e8416e6f6e796d6f7573206163636f756e7420686173206265656e2063726561746564206279206e65772070726f7879207769746820676976656e90646973616d626967756174696f6e20696e64657820616e642070726f787920747970652e24416e6e6f756e6365640c01107265616c000130543a3a4163636f756e74496400011470726f7879000130543a3a4163636f756e74496400012463616c6c5f6861736824013443616c6c486173684f663c543e000204e0416e20616e6e6f756e63656d656e742077617320706c6163656420746f206d616b6520612063616c6c20696e20746865206675747572652e2850726f7879416464656410012464656c656761746f72000130543a3a4163636f756e74496400012464656c656761746565000130543a3a4163636f756e74496400012870726f78795f74797065e00130543a3a50726f78795479706500011464656c6179100138543a3a426c6f636b4e756d62657200030448412070726f7879207761732061646465642e3050726f787952656d6f76656410012464656c656761746f72000130543a3a4163636f756e74496400012464656c656761746565000130543a3a4163636f756e74496400012870726f78795f74797065e00130543a3a50726f78795479706500011464656c6179100138543a3a426c6f636b4e756d62657200040450412070726f7879207761732072656d6f7665642e0499010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f72732920656d69747465640a090909627920746869732070616c6c65742e0a090909e008447370697269746e65745f72756e74696d652450726f7879547970650001180c416e790000002c4e6f6e5472616e7366657200010028476f7665726e616e63650002004050617261636861696e5374616b696e670003002c43616e63656c50726f7879000400484e6f6e4465706f736974436c61696d696e6700050000e40000050400e80c3c70616c6c65745f707265696d6167651870616c6c6574144576656e7404045400010c144e6f7465640401106861736824011c543a3a48617368000004684120707265696d61676520686173206265656e206e6f7465642e245265717565737465640401106861736824011c543a3a48617368000104784120707265696d61676520686173206265656e207265717565737465642e1c436c65617265640401106861736824011c543a3a486173680002046c4120707265696d616765206861732062656e20636c65617265642e0499010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f72732920656d69747465640a090909627920746869732070616c6c65742e0a090909ec0c4470616c6c65745f6d656d626572736869701870616c6c6574144576656e740804540004490001182c4d656d6265724164646564000004e054686520676976656e206d656d626572207761732061646465643b2073656520746865207472616e73616374696f6e20666f722077686f2e344d656d62657252656d6f766564000104e854686520676976656e206d656d626572207761732072656d6f7665643b2073656520746865207472616e73616374696f6e20666f722077686f2e384d656d6265727353776170706564000204d854776f206d656d62657273207765726520737761707065643b2073656520746865207472616e73616374696f6e20666f722077686f2e304d656d6265727352657365740003041501546865206d656d62657273686970207761732072657365743b2073656520746865207472616e73616374696f6e20666f722077686f20746865206e6577207365742069732e284b65794368616e676564000404844f6e65206f6620746865206d656d6265727327206b657973206368616e6765642e1444756d6d790005046c5068616e746f6d206d656d6265722c206e6576657220757365642e0499010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f72732920656d69747465640a090909627920746869732070616c6c65742e0a090909f00c2c70616c6c65745f746970731870616c6c6574144576656e74080454000449000114184e65775469700401207469705f6861736824011c543a3a486173680000049441206e6577207469702073756767657374696f6e20686173206265656e206f70656e65642e28546970436c6f73696e670401207469705f6861736824011c543a3a48617368000104d841207469702073756767657374696f6e206861732072656163686564207468726573686f6c6420616e6420697320636c6f73696e672e24546970436c6f7365640c01207469705f6861736824011c543a3a4861736800010c77686f000130543a3a4163636f756e7449640001187061796f757418013c42616c616e63654f663c542c20493e0002048441207469702073756767657374696f6e20686173206265656e20636c6f7365642e305469705265747261637465640401207469705f6861736824011c543a3a486173680003049041207469702073756767657374696f6e20686173206265656e207265747261637465642e28546970536c61736865640c01207469705f6861736824011c543a3a4861736800011866696e646572000130543a3a4163636f756e74496400011c6465706f73697418013c42616c616e63654f663c542c20493e0004048841207469702073756767657374696f6e20686173206265656e20736c61736865642e0499010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f72732920656d69747465640a090909627920746869732070616c6c65742e0a090909f40c1463747970651870616c6c6574144576656e74040454000104304354797065437265617465640800000144437479706543726561746f724f663c543e00002401384374797065486173684f663c543e0000087441206e657720435479706520686173206265656e20637265617465642e885c5b63726561746f72206964656e7469666965722c20435479706520686173685c5d0499010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f72732920656d69747465640a090909627920746869732070616c6c65742e0a090909f80c2c6174746573746174696f6e1870616c6c6574144576656e74040454000110484174746573746174696f6e43726561746564100000013441747465737465724f663c543e0000240138436c61696d486173684f663c543e00002401384374797065486173684f663c543e0000fc01704f7074696f6e3c417574686f72697a6174696f6e49644f663c543e3e0000088c41206e6577206174746573746174696f6e20686173206265656e20637265617465642e05015c5b61747465737465722049442c20636c61696d20686173682c20435479706520686173682c20286f7074696f6e616c292064656c65676174696f6e2049445c5d484174746573746174696f6e5265766f6b6564080000013441747465737465724f663c543e0000240138436c61696d486173684f663c543e00010880416e206174746573746174696f6e20686173206265656e207265766f6b65642e685c5b6163636f756e742069642c20636c61696d20686173685c5d484174746573746174696f6e52656d6f766564080000013441747465737465724f663c543e0000240138436c61696d486173684f663c543e00020880416e206174746573746174696f6e20686173206265656e2072656d6f7665642e685c5b6163636f756e742069642c20636c61696d20686173685c5d404465706f7369745265636c61696d656408000001384163636f756e7449644f663c543e0000240138436c61696d486173684f663c543e0003080501546865206465706f736974206f776e6572207265636c61696d65642061206465706f7369742062792072656d6f76696e6720616e206174746573746174696f6e2e685c5b6163636f756e742069642c20636c61696d20686173685c5d0499010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f72732920656d69747465640a090909627920746869732070616c6c65742e0a090909fc04184f7074696f6e0404540101010108104e6f6e6500000010536f6d6504000101000001000001010c3872756e74696d655f636f6d6d6f6e34617574686f72697a6174696f6e3c417574686f72697a6174696f6e4964043044656c65676174696f6e4964012401042844656c65676174696f6e040024013044656c65676174696f6e49640000000005010c2864656c65676174696f6e1870616c6c6574144576656e7404045400011c40486965726172636879437265617465640c0000014044656c656761746f7249644f663c543e000024015444656c65676174696f6e4e6f646549644f663c543e00002401384374797065486173684f663c543e0000088441206e65772068696572617263687920686173206265656e20637265617465642ea05c5b63726561746f722049442c20726f6f74206e6f64652049442c20435459504520686173685c5d404869657261726368795265766f6b6564080000014044656c656761746f7249644f663c543e000024015444656c65676174696f6e4e6f646549644f663c543e00010874412068696572617263687920686173206265656e207265766f6b65642e705c5b7265766f6b65722049442c20726f6f74206e6f64652049445c5d4048696572617263687952656d6f766564080000014044656c656761746f7249644f663c543e000024015444656c65676174696f6e4e6f646549644f663c543e000208dc412068696572617263687920686173206265656e2072656d6f7665642066726f6d207468652073746f72616765206f6e20636861696e2e705c5b72656d6f7665722049442c20726f6f74206e6f64652049445c5d4444656c65676174696f6e43726561746564180000014044656c656761746f7249644f663c543e000024015444656c65676174696f6e4e6f646549644f663c543e000024015444656c65676174696f6e4e6f646549644f663c543e000024015444656c65676174696f6e4e6f646549644f663c543e000000014044656c656761746f7249644f663c543e00000901012c5065726d697373696f6e7300030c8841206e65772064656c65676174696f6e20686173206265656e20637265617465642efc5c5b63726561746f722049442c20726f6f74206e6f64652049442c2064656c65676174696f6e206e6f64652049442c20706172656e74206e6f64652049442c6864656c65676174652049442c207065726d697373696f6e735c5d4444656c65676174696f6e5265766f6b6564080000014044656c656761746f7249644f663c543e000024015444656c65676174696f6e4e6f646549644f663c543e00040878412064656c65676174696f6e20686173206265656e207265766f6b65642e885c5b7265766f6b65722049442c2064656c65676174696f6e206e6f64652049445c5d4444656c65676174696f6e52656d6f76656408000001384163636f756e7449644f663c543e000024015444656c65676174696f6e4e6f646549644f663c543e00050878412064656c65676174696f6e20686173206265656e2072656d6f7665642e885c5b72656d6f7665722049442c2064656c65676174696f6e206e6f64652049445c5d404465706f7369745265636c61696d656408000001384163636f756e7449644f663c543e000024015444656c65676174696f6e4e6f646549644f663c543e000608f8546865206465706f736974206f776e6572207265636c61696d65642061206465706f7369742062792072656d6f76696e6720612064656c65676174696f6eac737562747265652e205c5b7265766f6b65722049442c2064656c65676174696f6e206e6f64652049445c5d0499010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f72732920656d69747465640a090909627920746869732070616c6c65742e0a09090909010c2864656c65676174696f6e5064656c65676174696f6e5f6869657261726368792c5065726d697373696f6e730000040110626974731c010c75333200000d010c0c6469641870616c6c6574144576656e74040454000110284469644372656174656408000001384163636f756e7449644f663c543e00000001484469644964656e7469666965724f663c543e0000086c41206e65772044494420686173206265656e20637265617465642e985c5b7472616e73616374696f6e207369676e65722c20444944206964656e7469666965725c5d284469645570646174656404000001484469644964656e7469666965724f663c543e0001085c412044494420686173206265656e20757064617465642e485c5b444944206964656e7469666965725c5d2844696444656c6574656404000001484469644964656e7469666965724f663c543e0002085c412044494420686173206265656e2064656c657465642e485c5b444944206964656e7469666965725c5d4444696443616c6c4469737061746368656408000001484469644964656e7469666965724f663c543e00009401384469737061746368526573756c74000308a041204449442d617574686f72697365642063616c6c20686173206265656e2065786563757465642e7c5c5b4449442063616c6c65722c20646973706174636820726573756c745c5d0499010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f72732920656d69747465640a090909627920746869732070616c6c65742e0a09090911010c4470616c6c65745f6469645f6c6f6f6b75701870616c6c6574144576656e74040454000108584173736f63696174696f6e45737461626c697368656408000001384163636f756e7449644f663c543e00000001484469644964656e7469666965724f663c543e000004f841206e6577206173736f63696174696f6e206265747765656e20612044494420616e6420616e206163636f756e742049442077617320637265617465642e484173736f63696174696f6e52656d6f76656408000001384163636f756e7449644f663c543e00000001484469644964656e7469666965724f663c543e000104ec416e206173736f63696174696f6e206265747765656e20612044494420616e6420616e206163636f756e74204944207761732072656d6f7665642e0499010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f72732920656d69747465640a090909627920746869732070616c6c65742e0a09090915010c4470616c6c65745f776562335f6e616d65731870616c6c6574144576656e740404540001103c576562334e616d65436c61696d65640801146f776e6572000148576562334e616d654f776e65724f663c543e0001106e616d6519010134576562334e616d654f663c543e0000047041206e6577206e616d6520686173206265656e20636c61696d65642e40576562334e616d6552656c65617365640801146f776e6572000148576562334e616d654f776e65724f663c543e0001106e616d6519010134576562334e616d654f663c543e0001046441206e616d6520686173206265656e2072656c65617365642e38576562334e616d6542616e6e65640401106e616d6519010134576562334e616d654f663c543e0002045c41206e616d6520686173206265656e2062616e6e65642e40576562334e616d65556e62616e6e65640401106e616d6519010134576562334e616d654f663c543e0003046441206e616d6520686173206265656e20756e62616e6e65642e0499010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f72732920656d69747465640a090909627920746869732070616c6c65742e0a09090919010c4470616c6c65745f776562335f6e616d657324776562335f6e616d65344173636969576562334e616d65040454000004001d010180426f756e6465645665633c75382c20543a3a4d61784e616d654c656e6774683e00001d01102873705f72756e74696d651c626f756e6465642c626f756e6465645f76656328426f756e64656456656308045401080453000004002801185665633c543e000021010c7c63756d756c75735f70616c6c65745f70617261636861696e5f73797374656d1870616c6c6574144576656e740404540001186056616c69646174696f6e46756e6374696f6e53746f726564000004d05468652076616c69646174696f6e2066756e6374696f6e20686173206265656e207363686564756c656420746f206170706c792e6456616c69646174696f6e46756e6374696f6e4170706c69656404015472656c61795f636861696e5f626c6f636b5f6e756d1c015452656c6179436861696e426c6f636b4e756d62657200010445015468652076616c69646174696f6e2066756e6374696f6e20776173206170706c696564206173206f662074686520636f6e7461696e65642072656c617920636861696e20626c6f636b206e756d6265722e6c56616c69646174696f6e46756e6374696f6e446973636172646564000204b05468652072656c61792d636861696e2061626f727465642074686520757067726164652070726f636573732e4455706772616465417574686f72697a6564040124636f64655f6861736824011c543a3a486173680003047c416e207570677261646520686173206265656e20617574686f72697a65642e60446f776e776172644d657373616765735265636569766564040114636f756e741c010c7533320004040101536f6d6520646f776e77617264206d657373616765732068617665206265656e20726563656976656420616e642077696c6c2062652070726f6365737365642e64446f776e776172644d6573736167657350726f63657373656408012c7765696768745f75736564100118576569676874000120646d715f6865616424014472656c61795f636861696e3a3a48617368000504e0446f776e77617264206d6573736167657320776572652070726f636573736564207573696e672074686520676976656e207765696768742e0499010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f72732920656d69747465640a090909627920746869732070616c6c65742e0a09090925010c6463756d756c75735f70616c6c65745f78636d705f71756575651870616c6c6574144576656e740404540001201c537563636573730801306d6573736167655f686173682901013c4f7074696f6e3c543a3a486173683e00011877656967687410011857656967687400000464536f6d652058434d20776173206578656375746564206f6b2e104661696c0c01306d6573736167655f686173682901013c4f7074696f6e3c543a3a486173683e0001146572726f722d01012058636d4572726f7200011877656967687410011857656967687400010440536f6d652058434d206661696c65642e2842616456657273696f6e0401306d6573736167655f686173682901013c4f7074696f6e3c543a3a486173683e000204544261642058434d2076657273696f6e20757365642e24426164466f726d61740401306d6573736167655f686173682901013c4f7074696f6e3c543a3a486173683e000304504261642058434d20666f726d617420757365642e445570776172644d65737361676553656e740401306d6573736167655f686173682901013c4f7074696f6e3c543a3a486173683e000404b8416e20757077617264206d657373616765207761732073656e7420746f207468652072656c617920636861696e2e3c58636d704d65737361676553656e740401306d6573736167655f686173682901013c4f7074696f6e3c543a3a486173683e000504c0416e2048524d50206d657373616765207761732073656e7420746f2061207369626c696e672070617261636861696e2e484f766572776569676874456e71756575656410011873656e6465723101011850617261496400011c73656e745f61741c014052656c6179426c6f636b4e756d626572000114696e64657810013c4f766572776569676874496e6465780001207265717569726564100118576569676874000604d4416e2058434d2065786365656465642074686520696e646976696475616c206d65737361676520776569676874206275646765742e484f7665727765696768745365727669636564080114696e64657810013c4f766572776569676874496e646578000110757365641001185765696768740007044101416e2058434d2066726f6d20746865206f7665727765696768742071756575652077617320657865637574656420776974682074686520676976656e2061637475616c2077656967687420757365642e0499010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f72732920656d69747465640a090909627920746869732070616c6c65742e0a090909290104184f7074696f6e04045401240108104e6f6e6500000010536f6d6504002400000100002d01100c78636d08763218747261697473144572726f72000168204f766572666c6f7700000034556e696d706c656d656e74656400010060556e74727573746564526573657276654c6f636174696f6e00020064556e7472757374656454656c65706f72744c6f636174696f6e000300444d756c74694c6f636174696f6e46756c6c000400684d756c74694c6f636174696f6e4e6f74496e7665727469626c65000500244261644f726967696e0006003c496e76616c69644c6f636174696f6e0007003441737365744e6f74466f756e64000800544661696c6564546f5472616e7361637441737365740009003c4e6f74576974686472617761626c65000a00484c6f636174696f6e43616e6e6f74486f6c64000b0054457863656564734d61784d65737361676553697a65000c005844657374696e6174696f6e556e737570706f72746564000d00245472616e73706f7274000e0028556e726f757461626c65000f0030556e6b6e6f776e436c61696d001000384661696c6564546f4465636f6465001100404d6178576569676874496e76616c6964001200384e6f74486f6c64696e674665657300130030546f6f457870656e736976650014001054726170040010010c7536340015004c556e68616e646c656458636d56657273696f6e001600485765696768744c696d69745265616368656404001001185765696768740017001c426172726965720018004c5765696768744e6f74436f6d70757461626c650019000031010c48706f6c6b61646f745f70617261636861696e287072696d697469766573084964000004001c010c753332000035010c2870616c6c65745f78636d1870616c6c6574144576656e7404045400014024417474656d7074656404003901015078636d3a3a6c61746573743a3a4f7574636f6d6500000ca8457865637574696f6e206f6620616e2058434d206d6573736167652077617320617474656d707465642e00345c5b206f7574636f6d65205c5d1053656e740c003d0101344d756c74694c6f636174696f6e00003d0101344d756c74694c6f636174696f6e00006901011c58636d3c28293e00010c5c412058434d206d657373616765207761732073656e742e00885c5b206f726967696e2c2064657374696e6174696f6e2c206d657373616765205c5d48556e6578706563746564526573706f6e736508003d0101344d756c74694c6f636174696f6e000010011c517565727949640002145901517565727920726573706f6e736520726563656976656420776869636820646f6573206e6f74206d61746368206120726567697374657265642071756572792e2054686973206d61792062652062656361757365206155016d61746368696e6720717565727920776173206e6576657220726567697374657265642c206974206d617920626520626563617573652069742069732061206475706c696361746520726573706f6e73652c206f727062656361757365207468652071756572792074696d6564206f75742e00645c5b206f726967696e206c6f636174696f6e2c206964205c5d34526573706f6e73655265616479080010011c51756572794964000095010120526573706f6e73650003105d01517565727920726573706f6e736520686173206265656e20726563656976656420616e6420697320726561647920666f722074616b696e672077697468206074616b655f726573706f6e7365602e205468657265206973806e6f2072656769737465726564206e6f74696669636174696f6e2063616c6c2e00485c5b2069642c20726573706f6e7365205c5d204e6f7469666965640c0010011c5175657279496400000801087538000008010875380004105901517565727920726573706f6e736520686173206265656e20726563656976656420616e642071756572792069732072656d6f7665642e205468652072656769737465726564206e6f74696669636174696f6e20686173a86265656e206469737061746368656420616e64206578656375746564207375636365737366756c6c792e00885c5b2069642c2070616c6c657420696e6465782c2063616c6c20696e646578205c5d404e6f746966794f766572776569676874140010011c517565727949640000080108753800000801087538000010011857656967687400001001185765696768740005146101517565727920726573706f6e736520686173206265656e20726563656976656420616e642071756572792069732072656d6f7665642e205468652072656769737465726564206e6f74696669636174696f6e20636f756c6441016e6f742062652064697370617463686564206265636175736520746865206469737061746368207765696768742069732067726561746572207468616e20746865206d6178696d756d20776569676874e46f726967696e616c6c7920627564676574656420627920746869732072756e74696d6520666f722074686520717565727920726573756c742e0019015c5b2069642c2070616c6c657420696e6465782c2063616c6c20696e6465782c2061637475616c207765696768742c206d617820627564676574656420776569676874205c5d4c4e6f7469667944697370617463684572726f720c0010011c5175657279496400000801087538000008010875380006105501517565727920726573706f6e736520686173206265656e20726563656976656420616e642071756572792069732072656d6f7665642e2054686572652077617320612067656e6572616c206572726f722077697468886469737061746368696e6720746865206e6f74696669636174696f6e2063616c6c2e00885c5b2069642c2070616c6c657420696e6465782c2063616c6c20696e646578205c5d484e6f746966794465636f64654661696c65640c0010011c5175657279496400000801087538000008010875380007145101517565727920726573706f6e736520686173206265656e20726563656976656420616e642071756572792069732072656d6f7665642e205468652064697370617463682077617320756e61626c6520746f20626559016465636f64656420696e746f2061206043616c6c603b2074686973206d696768742062652064756520746f2064697370617463682066756e6374696f6e20686176696e672061207369676e6174757265207768696368946973206e6f742060286f726967696e2c20517565727949642c20526573706f6e736529602e00885c5b2069642c2070616c6c657420696e6465782c2063616c6c20696e646578205c5d40496e76616c6964526573706f6e6465720c003d0101344d756c74694c6f636174696f6e000010011c517565727949640000b90101544f7074696f6e3c4d756c74694c6f636174696f6e3e0008145901457870656374656420717565727920726573706f6e736520686173206265656e2072656365697665642062757420746865206f726967696e206c6f636174696f6e206f662074686520726573706f6e736520646f657355016e6f74206d6174636820746861742065787065637465642e205468652071756572792072656d61696e73207265676973746572656420666f722061206c617465722c2076616c69642c20726573706f6e736520746f6c626520726563656976656420616e642061637465642075706f6e2e00b05c5b206f726967696e206c6f636174696f6e2c2069642c206578706563746564206c6f636174696f6e205c5d5c496e76616c6964526573706f6e64657256657273696f6e08003d0101344d756c74694c6f636174696f6e000010011c517565727949640009245101457870656374656420717565727920726573706f6e736520686173206265656e2072656365697665642062757420746865206578706563746564206f726967696e206c6f636174696f6e20706c6163656420696e4d0173746f7261676520627920746869732072756e74696d652070726576696f75736c792063616e6e6f74206265206465636f6465642e205468652071756572792072656d61696e7320726567697374657265642e0041015468697320697320756e6578706563746564202873696e63652061206c6f636174696f6e20706c6163656420696e2073746f7261676520696e20612070726576696f75736c7920657865637574696e674d0172756e74696d652073686f756c64206265207265616461626c65207072696f7220746f2071756572792074696d656f75742920616e642064616e6765726f75732073696e63652074686520706f737369626c79590176616c696420726573706f6e73652077696c6c2062652064726f707065642e204d616e75616c20676f7665726e616e636520696e74657276656e74696f6e2069732070726f6261626c7920676f696e6720746f2062651c6e65656465642e00645c5b206f726967696e206c6f636174696f6e2c206964205c5d34526573706f6e736554616b656e040010011c51756572794964000a0cc8526563656976656420717565727920726573706f6e736520686173206265656e207265616420616e642072656d6f7665642e00205c5b206964205c5d34417373657473547261707065640c002401104832353600003d0101344d756c74694c6f636174696f6e0000bd01015056657273696f6e65644d756c7469417373657473000b0cb8536f6d65206173736574732068617665206265656e20706c6163656420696e20616e20617373657420747261702e00685c5b20686173682c206f726967696e2c20617373657473205c5d5456657273696f6e4368616e67654e6f74696669656408003d0101344d756c74694c6f636174696f6e00001c012858636d56657273696f6e000c0c2501416e2058434d2076657273696f6e206368616e6765206e6f74696669636174696f6e206d65737361676520686173206265656e20617474656d7074656420746f2062652073656e742e00645c5b2064657374696e6174696f6e2c20726573756c74205c5d5c537570706f7274656456657273696f6e4368616e67656408003d0101344d756c74694c6f636174696f6e00001c012858636d56657273696f6e000d10390154686520737570706f727465642076657273696f6e206f662061206c6f636174696f6e20686173206265656e206368616e6765642e2054686973206d69676874206265207468726f75676820616ec06175746f6d61746963206e6f74696669636174696f6e206f722061206d616e75616c20696e74657276656e74696f6e2e006c5c5b206c6f636174696f6e2c2058434d2076657273696f6e205c5d504e6f7469667954617267657453656e644661696c0c003d0101344d756c74694c6f636174696f6e000010011c5175657279496400002d01012058636d4572726f72000e1059014120676976656e206c6f636174696f6e2077686963682068616420612076657273696f6e206368616e676520737562736372697074696f6e207761732064726f70706564206f77696e6720746f20616e206572726f727c73656e64696e6720746865206e6f74696669636174696f6e20746f2069742e007c5c5b206c6f636174696f6e2c2071756572792049442c206572726f72205c5d644e6f746966795461726765744d6967726174696f6e4661696c0800d101015856657273696f6e65644d756c74694c6f636174696f6e000010011c51756572794964000f1059014120676976656e206c6f636174696f6e2077686963682068616420612076657273696f6e206368616e676520737562736372697074696f6e207761732064726f70706564206f77696e6720746f20616e206572726f72b46d6967726174696e6720746865206c6f636174696f6e20746f206f7572206e65772058434d20666f726d61742e00605c5b206c6f636174696f6e2c207175657279204944205c5d0499010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f72732920656d69747465640a090909627920746869732070616c6c65742e0a0909093901100c78636d087632187472616974731c4f7574636f6d6500010c20436f6d706c657465040010011857656967687400000028496e636f6d706c657465080010011857656967687400002d0101144572726f72000100144572726f7204002d0101144572726f72000200003d01100c78636d087631346d756c74696c6f636174696f6e344d756c74694c6f636174696f6e000008011c706172656e74730801087538000120696e746572696f72410101244a756e6374696f6e7300004101100c78636d087631346d756c74696c6f636174696f6e244a756e6374696f6e7300012410486572650000000858310400450101204a756e6374696f6e0001000858320800450101204a756e6374696f6e0000450101204a756e6374696f6e0002000858330c00450101204a756e6374696f6e0000450101204a756e6374696f6e0000450101204a756e6374696f6e0003000858341000450101204a756e6374696f6e0000450101204a756e6374696f6e0000450101204a756e6374696f6e0000450101204a756e6374696f6e0004000858351400450101204a756e6374696f6e0000450101204a756e6374696f6e0000450101204a756e6374696f6e0000450101204a756e6374696f6e0000450101204a756e6374696f6e0005000858361800450101204a756e6374696f6e0000450101204a756e6374696f6e0000450101204a756e6374696f6e0000450101204a756e6374696f6e0000450101204a756e6374696f6e0000450101204a756e6374696f6e0006000858371c00450101204a756e6374696f6e0000450101204a756e6374696f6e0000450101204a756e6374696f6e0000450101204a756e6374696f6e0000450101204a756e6374696f6e0000450101204a756e6374696f6e0000450101204a756e6374696f6e0007000858382000450101204a756e6374696f6e0000450101204a756e6374696f6e0000450101204a756e6374696f6e0000450101204a756e6374696f6e0000450101204a756e6374696f6e0000450101204a756e6374696f6e0000450101204a756e6374696f6e0000450101204a756e6374696f6e000800004501100c78636d087631206a756e6374696f6e204a756e6374696f6e0001242450617261636861696e04004901010c7533320000002c4163636f756e744964333208011c6e6574776f726b4d0101244e6574776f726b496400010869640401205b75383b2033325d000100384163636f756e74496e646578363408011c6e6574776f726b4d0101244e6574776f726b4964000114696e6465785501010c753634000200304163636f756e744b6579323008011c6e6574776f726b4d0101244e6574776f726b496400010c6b6579590101205b75383b2032305d0003003850616c6c6574496e7374616e6365040008010875380004003047656e6572616c496e64657804005d010110753132380005002847656e6572616c4b65790400510101805765616b426f756e6465645665633c75382c20436f6e73745533323c33323e3e000600244f6e6c794368696c6400070024506c7572616c697479080108696461010118426f647949640001107061727465010120426f6479506172740008000049010000061c004d01100c78636d087630206a756e6374696f6e244e6574776f726b49640001100c416e79000000144e616d65640400510101805765616b426f756e6465645665633c75382c20436f6e73745533323c33323e3e00010020506f6c6b61646f74000200184b7573616d61000300005101102873705f72756e74696d651c626f756e646564407765616b5f626f756e6465645f766563385765616b426f756e64656456656308045401080453000004002801185665633c543e00005501000006100059010000031400000008005d0100000618006101100c78636d087630206a756e6374696f6e18426f6479496400011c10556e6974000000144e616d65640400510101805765616b426f756e6465645665633c75382c20436f6e73745533323c33323e3e00010014496e64657804004901010c7533320002002445786563757469766500030024546563686e6963616c0004002c4c656769736c6174697665000500204a7564696369616c000600006501100c78636d087630206a756e6374696f6e20426f64795061727400011414566f6963650000001c4d656d62657273040114636f756e744901010c753332000100204672616374696f6e08010c6e6f6d4901010c75333200011464656e6f6d4901010c7533320002004441744c6561737450726f706f7274696f6e08010c6e6f6d4901010c75333200011464656e6f6d4901010c753332000300484d6f72655468616e50726f706f7274696f6e08010c6e6f6d4901010c75333200011464656e6f6d4901010c7533320004000069010c0c78636d0876320c58636d041043616c6c000004006d0101585665633c496e737472756374696f6e3c43616c6c3e3e00006d0100000271010071010c0c78636d0876322c496e737472756374696f6e041043616c6c000170345769746864726177417373657404007501012c4d756c7469417373657473000000545265736572766541737365744465706f736974656404007501012c4d756c7469417373657473000100585265636569766554656c65706f72746564417373657404007501012c4d756c7469417373657473000200345175657279526573706f6e73650c012071756572795f69645501011c51756572794964000120726573706f6e736595010120526573706f6e73650001286d61785f7765696768745501010c753634000300345472616e7366657241737365740801186173736574737501012c4d756c746941737365747300012c62656e65666963696172793d0101344d756c74694c6f636174696f6e000400505472616e736665725265736572766541737365740c01186173736574737501012c4d756c7469417373657473000110646573743d0101344d756c74694c6f636174696f6e00010c78636d6901011c58636d3c28293e000500205472616e736163740c012c6f726967696e5f74797065a10101284f726967696e4b696e64000158726571756972655f7765696768745f61745f6d6f73745501010c75363400011063616c6ca501014c446f75626c65456e636f6465643c43616c6c3e0006006448726d704e65774368616e6e656c4f70656e526571756573740c011873656e6465724901010c7533320001406d61785f6d6573736167655f73697a654901010c7533320001306d61785f63617061636974794901010c7533320007004c48726d704368616e6e656c4163636570746564040124726563697069656e744901010c7533320008004848726d704368616e6e656c436c6f73696e670c0124696e69746961746f724901010c75333200011873656e6465724901010c753332000124726563697069656e744901010c7533320009002c436c6561724f726967696e000a003444657363656e644f726967696e040041010154496e746572696f724d756c74694c6f636174696f6e000b002c5265706f72744572726f720c012071756572795f69645501011c51756572794964000110646573743d0101344d756c74694c6f636174696f6e00014c6d61785f726573706f6e73655f7765696768745501010c753634000c00304465706f73697441737365740c0118617373657473a90101404d756c7469417373657446696c7465720001286d61785f6173736574734901010c75333200012c62656e65666963696172793d0101344d756c74694c6f636174696f6e000d004c4465706f736974526573657276654173736574100118617373657473a90101404d756c7469417373657446696c7465720001286d61785f6173736574734901010c753332000110646573743d0101344d756c74694c6f636174696f6e00010c78636d6901011c58636d3c28293e000e003445786368616e6765417373657408011067697665a90101404d756c7469417373657446696c74657200011c726563656976657501012c4d756c7469417373657473000f005c496e6974696174655265736572766557697468647261770c0118617373657473a90101404d756c7469417373657446696c74657200011c726573657276653d0101344d756c74694c6f636174696f6e00010c78636d6901011c58636d3c28293e00100040496e69746961746554656c65706f72740c0118617373657473a90101404d756c7469417373657446696c746572000110646573743d0101344d756c74694c6f636174696f6e00010c78636d6901011c58636d3c28293e001100305175657279486f6c64696e6710012071756572795f69645501011c51756572794964000110646573743d0101344d756c74694c6f636174696f6e000118617373657473a90101404d756c7469417373657446696c74657200014c6d61785f726573706f6e73655f7765696768745501010c75363400120030427579457865637574696f6e080110666565737d0101284d756c746941737365740001307765696768745f6c696d6974b501012c5765696768744c696d697400130034526566756e64537572706c75730014003c5365744572726f7248616e646c657204006901012458636d3c43616c6c3e0015002c536574417070656e64697804006901012458636d3c43616c6c3e00160028436c6561724572726f7200170028436c61696d41737365740801186173736574737501012c4d756c74694173736574730001187469636b65743d0101344d756c74694c6f636174696f6e001800105472617004005501010c7536340019004053756273637269626556657273696f6e08012071756572795f69645501011c5175657279496400014c6d61785f726573706f6e73655f7765696768745501010c753634001a0048556e73756273637269626556657273696f6e001b00007501100c78636d087631286d756c746961737365742c4d756c7469417373657473000004007901013c5665633c4d756c746941737365743e000079010000027d01007d01100c78636d087631286d756c74696173736574284d756c74694173736574000008010869648101011c4173736574496400010c66756e8501012c46756e676962696c69747900008101100c78636d087631286d756c746961737365741c4173736574496400010820436f6e637265746504003d0101344d756c74694c6f636174696f6e000000204162737472616374040028011c5665633c75383e000100008501100c78636d087631286d756c746961737365742c46756e676962696c6974790001082046756e6769626c6504005d010110753132380000002c4e6f6e46756e6769626c650400890101344173736574496e7374616e6365000100008901100c78636d087631286d756c74696173736574344173736574496e7374616e636500011c24556e646566696e656400000014496e64657804005d0101107531323800010018417272617934040038011c5b75383b20345d0002001841727261793804008d01011c5b75383b20385d0003001c417272617931360400910101205b75383b2031365d0004001c4172726179333204000401205b75383b2033325d00050010426c6f62040028011c5665633c75383e000600008d01000003080000000800910100000310000000080095010c0c78636d08763220526573706f6e7365000110104e756c6c0000001841737365747304007501012c4d756c74694173736574730001003c457865637574696f6e526573756c740400990101504f7074696f6e3c287533322c204572726f72293e0002001c56657273696f6e04001c013873757065723a3a56657273696f6e00030000990104184f7074696f6e040454019d010108104e6f6e6500000010536f6d6504009d0100000100009d01000004081c2d0100a1010c0c78636d087630284f726967696e4b696e64000110184e617469766500000040536f7665726569676e4163636f756e74000100245375706572757365720002000c58636d00030000a5010c0c78636d38646f75626c655f656e636f64656434446f75626c65456e636f646564040454000004011c656e636f64656428011c5665633c75383e0000a901100c78636d087631286d756c74696173736574404d756c7469417373657446696c74657200010820446566696e69746504007501012c4d756c74694173736574730000001057696c640400ad01013857696c644d756c7469417373657400010000ad01100c78636d087631286d756c746961737365743857696c644d756c746941737365740001080c416c6c00000014416c6c4f6608010869648101011c4173736574496400010c66756eb101013c57696c6446756e676962696c69747900010000b101100c78636d087631286d756c746961737365743c57696c6446756e676962696c6974790001082046756e6769626c650000002c4e6f6e46756e6769626c6500010000b5010c0c78636d0876322c5765696768744c696d697400010824556e6c696d697465640000001c4c696d6974656404005501010c75363400010000b90104184f7074696f6e040454013d010108104e6f6e6500000010536f6d6504003d010000010000bd01080c78636d5056657273696f6e65644d756c74694173736574730001080856300400c101014c5665633c76303a3a4d756c746941737365743e00000008563104007501013c76313a3a4d756c746941737365747300010000c101000002c50100c501100c78636d0876302c6d756c74695f6173736574284d756c74694173736574000130104e6f6e650000000c416c6c0001002c416c6c46756e6769626c6500020038416c6c4e6f6e46756e6769626c650003004c416c6c416273747261637446756e6769626c65040108696428011c5665633c75383e00040058416c6c41627374726163744e6f6e46756e6769626c65040114636c61737328011c5665633c75383e0005004c416c6c436f6e637265746546756e6769626c650401086964c90101344d756c74694c6f636174696f6e00060058416c6c436f6e63726574654e6f6e46756e6769626c65040114636c617373c90101344d756c74694c6f636174696f6e00070040416273747261637446756e6769626c65080108696428011c5665633c75383e000118616d6f756e745d010110753132380008004c41627374726163744e6f6e46756e6769626c65080114636c61737328011c5665633c75383e000120696e7374616e6365890101344173736574496e7374616e636500090040436f6e637265746546756e6769626c650801086964c90101344d756c74694c6f636174696f6e000118616d6f756e745d01011075313238000a004c436f6e63726574654e6f6e46756e6769626c65080114636c617373c90101344d756c74694c6f636174696f6e000120696e7374616e6365890101344173736574496e7374616e6365000b0000c901100c78636d087630386d756c74695f6c6f636174696f6e344d756c74694c6f636174696f6e000124104e756c6c0000000858310400cd0101204a756e6374696f6e0001000858320800cd0101204a756e6374696f6e0000cd0101204a756e6374696f6e0002000858330c00cd0101204a756e6374696f6e0000cd0101204a756e6374696f6e0000cd0101204a756e6374696f6e0003000858341000cd0101204a756e6374696f6e0000cd0101204a756e6374696f6e0000cd0101204a756e6374696f6e0000cd0101204a756e6374696f6e0004000858351400cd0101204a756e6374696f6e0000cd0101204a756e6374696f6e0000cd0101204a756e6374696f6e0000cd0101204a756e6374696f6e0000cd0101204a756e6374696f6e0005000858361800cd0101204a756e6374696f6e0000cd0101204a756e6374696f6e0000cd0101204a756e6374696f6e0000cd0101204a756e6374696f6e0000cd0101204a756e6374696f6e0000cd0101204a756e6374696f6e0006000858371c00cd0101204a756e6374696f6e0000cd0101204a756e6374696f6e0000cd0101204a756e6374696f6e0000cd0101204a756e6374696f6e0000cd0101204a756e6374696f6e0000cd0101204a756e6374696f6e0000cd0101204a756e6374696f6e0007000858382000cd0101204a756e6374696f6e0000cd0101204a756e6374696f6e0000cd0101204a756e6374696f6e0000cd0101204a756e6374696f6e0000cd0101204a756e6374696f6e0000cd0101204a756e6374696f6e0000cd0101204a756e6374696f6e0000cd0101204a756e6374696f6e00080000cd01100c78636d087630206a756e6374696f6e204a756e6374696f6e00012818506172656e740000002450617261636861696e04004901010c7533320001002c4163636f756e744964333208011c6e6574776f726b4d0101244e6574776f726b496400010869640401205b75383b2033325d000200384163636f756e74496e646578363408011c6e6574776f726b4d0101244e6574776f726b4964000114696e6465785501010c753634000300304163636f756e744b6579323008011c6e6574776f726b4d0101244e6574776f726b496400010c6b6579590101205b75383b2032305d0004003850616c6c6574496e7374616e6365040008010875380005003047656e6572616c496e64657804005d010110753132380006002847656e6572616c4b65790400510101805765616b426f756e6465645665633c75382c20436f6e73745533323c33323e3e000700244f6e6c794368696c6400080024506c7572616c697479080108696461010118426f647949640001107061727465010120426f64795061727400090000d101080c78636d5856657273696f6e65644d756c74694c6f636174696f6e0001080856300400c901014476303a3a4d756c74694c6f636174696f6e00000008563104003d01014476313a3a4d756c74694c6f636174696f6e00010000d5010c4863756d756c75735f70616c6c65745f78636d1870616c6c6574144576656e7404045400010c34496e76616c6964466f726d617404008d01011c5b75383b20385d00000880446f776e77617264206d65737361676520697320696e76616c69642058434d2e205c5b206964205c5d48556e737570706f7274656456657273696f6e04008d01011c5b75383b20385d000108bc446f776e77617264206d65737361676520697320756e737570706f727465642076657273696f6e206f662058434d2e205c5b206964205c5d404578656375746564446f776e7761726408008d01011c5b75383b20385d00003901011c4f7574636f6d65000208c4446f776e77617264206d65737361676520657865637574656420776974682074686520676976656e206f7574636f6d652e445c5b2069642c206f7574636f6d65205c5d0499010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f72732920656d69747465640a090909627920746869732070616c6c65742e0a090909d9010c6063756d756c75735f70616c6c65745f646d705f71756575651870616c6c6574144576656e7404045400011834496e76616c6964466f726d61740401286d6573736167655f69640401244d657373616765496400000480446f776e77617264206d65737361676520697320696e76616c69642058434d2e48556e737570706f7274656456657273696f6e0401286d6573736167655f69640401244d6573736167654964000104bc446f776e77617264206d65737361676520697320756e737570706f727465642076657273696f6e206f662058434d2e404578656375746564446f776e776172640801286d6573736167655f69640401244d657373616765496400011c6f7574636f6d653901011c4f7574636f6d65000204c4446f776e77617264206d65737361676520657865637574656420776974682074686520676976656e206f7574636f6d652e3c5765696768744578686175737465640c01286d6573736167655f69640401244d657373616765496400014072656d61696e696e675f77656967687410011857656967687400013c72657175697265645f776569676874100118576569676874000304f054686520776569676874206c696d697420666f722068616e646c696e6720646f776e77617264206d657373616765732077617320726561636865642e484f766572776569676874456e7175657565640c01286d6573736167655f69640401244d65737361676549640001406f7665727765696768745f696e64657810013c4f766572776569676874496e64657800013c72657175697265645f7765696768741001185765696768740004041901446f776e77617264206d657373616765206973206f76657277656967687420616e642077617320706c6163656420696e20746865206f7665727765696768742071756575652e484f76657277656967687453657276696365640801406f7665727765696768745f696e64657810013c4f766572776569676874496e64657800012c7765696768745f75736564100118576569676874000504e0446f776e77617264206d6573736167652066726f6d20746865206f766572776569676874207175657565207761732065786563757465642e0499010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f72732920656d69747465640a090909627920746869732070616c6c65742e0a090909dd0108306672616d655f73797374656d14506861736500010c384170706c7945787472696e73696304001c010c7533320000003046696e616c697a6174696f6e00010038496e697469616c697a6174696f6e00020000e1010000022400e501000002d000e90108306672616d655f73797374656d584c61737452756e74696d6555706772616465496e666f0000080130737065635f76657273696f6e4901014c636f6465633a3a436f6d706163743c7533323e000124737065635f6e616d65ed01016473705f72756e74696d653a3a52756e74696d65537472696e670000ed010000050200f1010c306672616d655f73797374656d1870616c6c65741043616c6c0404540001242866696c6c5f626c6f636b040114726174696ff501011c50657262696c6c00000405014120646973706174636820746861742077696c6c2066696c6c2074686520626c6f636b2077656967687420757020746f2074686520676976656e20726174696f2e1872656d61726b04011872656d61726b28011c5665633c75383e000114684d616b6520736f6d65206f6e2d636861696e2072656d61726b2e002823203c7765696768743e202d20604f283129602c23203c2f7765696768743e387365745f686561705f7061676573040114706167657310010c753634000204f853657420746865206e756d626572206f6620706167657320696e2074686520576562417373656d626c7920656e7669726f6e6d656e74277320686561702e207365745f636f6465040110636f646528011c5665633c75383e0003306453657420746865206e65772072756e74696d6520636f64652e002823203c7765696768743e31012d20604f2843202b2053296020776865726520604360206c656e677468206f662060636f64656020616e642060536020636f6d706c6578697479206f66206063616e5f7365745f636f64656045012d20312063616c6c20746f206063616e5f7365745f636f6465603a20604f28532960202863616c6c73206073705f696f3a3a6d6973633a3a72756e74696d655f76657273696f6e60207768696368206973342020657870656e73697665292e842d20312073746f726167652077726974652028636f64656320604f28432960292e402d203120646967657374206974656d2e282d2031206576656e742e4d0154686520776569676874206f6620746869732066756e6374696f6e20697320646570656e64656e74206f6e207468652072756e74696d652c206275742067656e6572616c6c7920746869732069732076657279b8657870656e736976652e2057652077696c6c207472656174207468697320617320612066756c6c20626c6f636b2e2c23203c2f7765696768743e5c7365745f636f64655f776974686f75745f636865636b73040110636f646528011c5665633c75383e000424190153657420746865206e65772072756e74696d6520636f646520776974686f757420646f696e6720616e7920636865636b73206f662074686520676976656e2060636f6465602e002823203c7765696768743e8c2d20604f2843296020776865726520604360206c656e677468206f662060636f646560842d20312073746f726167652077726974652028636f64656320604f28432960292e402d203120646967657374206974656d2e282d2031206576656e742e550154686520776569676874206f6620746869732066756e6374696f6e20697320646570656e64656e74206f6e207468652072756e74696d652e2057652077696c6c207472656174207468697320617320612066756c6c48626c6f636b2e2023203c2f7765696768743e2c7365745f73746f726167650401146974656d73f90101345665633c4b657956616c75653e0005046853657420736f6d65206974656d73206f662073746f726167652e306b696c6c5f73746f726167650401106b657973010201205665633c4b65793e000604744b696c6c20736f6d65206974656d732066726f6d2073746f726167652e2c6b696c6c5f70726566697808011870726566697828010c4b657900011c7375626b6579731c010c75333200071011014b696c6c20616c6c2073746f72616765206974656d7320776974682061206b657920746861742073746172747320776974682074686520676976656e207072656669782e0039012a2a4e4f54453a2a2a2057652072656c79206f6e2074686520526f6f74206f726967696e20746f2070726f7669646520757320746865206e756d626572206f66207375626b65797320756e6465723d0174686520707265666978207765206172652072656d6f76696e6720746f2061636375726174656c792063616c63756c6174652074686520776569676874206f6620746869732066756e6374696f6e2e4472656d61726b5f776974685f6576656e7404011872656d61726b28011c5665633c75383e000804a44d616b6520736f6d65206f6e2d636861696e2072656d61726b20616e6420656d6974206576656e742e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ef5010c3473705f61726974686d65746963287065725f7468696e67731c50657262696c6c000004001c010c7533320000f901000002fd0100fd01000004082828000102000002280005020c306672616d655f73797374656d186c696d69747330426c6f636b5765696768747300000c0128626173655f626c6f636b1001185765696768740001246d61785f626c6f636b1001185765696768740001247065725f636c617373090201845065724469737061746368436c6173733c57656967687473506572436c6173733e000009020c346672616d655f737570706f72741c77656967687473405065724469737061746368436c617373040454010d02000c01186e6f726d616c0d0201045400012c6f7065726174696f6e616c0d020104540001246d616e6461746f72790d0201045400000d020c306672616d655f73797374656d186c696d6974733c57656967687473506572436c6173730000100138626173655f65787472696e7369631001185765696768740001346d61785f65787472696e736963110201384f7074696f6e3c5765696768743e0001246d61785f746f74616c110201384f7074696f6e3c5765696768743e0001207265736572766564110201384f7074696f6e3c5765696768743e0000110204184f7074696f6e04045401100108104e6f6e6500000010536f6d65040010000001000015020c306672616d655f73797374656d186c696d6974732c426c6f636b4c656e677468000004010c6d6178190201545065724469737061746368436c6173733c7533323e000019020c346672616d655f737570706f72741c77656967687473405065724469737061746368436c617373040454011c000c01186e6f726d616c1c01045400012c6f7065726174696f6e616c1c0104540001246d616e6461746f72791c01045400001d020c346672616d655f737570706f72741c776569676874733c52756e74696d654462576569676874000008011072656164100118576569676874000114777269746510011857656967687400002102082873705f76657273696f6e3852756e74696d6556657273696f6e0000200124737065635f6e616d65ed01013452756e74696d65537472696e67000124696d706c5f6e616d65ed01013452756e74696d65537472696e67000144617574686f72696e675f76657273696f6e1c010c753332000130737065635f76657273696f6e1c010c753332000130696d706c5f76657273696f6e1c010c753332000110617069732502011c4170697356656300014c7472616e73616374696f6e5f76657273696f6e1c010c75333200013473746174655f76657273696f6e080108753800002502040c436f77040454012902000400290200000029020000022d02002d02000004088d011c0031020c306672616d655f73797374656d1870616c6c6574144572726f720404540001183c496e76616c6964537065634e616d650000081101546865206e616d65206f662073706563696669636174696f6e20646f6573206e6f74206d61746368206265747765656e207468652063757272656e742072756e74696d6550616e6420746865206e65772072756e74696d652e685370656356657273696f6e4e65656473546f496e63726561736500010841015468652073706563696669636174696f6e2076657273696f6e206973206e6f7420616c6c6f77656420746f206465637265617365206265747765656e207468652063757272656e742072756e74696d6550616e6420746865206e65772072756e74696d652e744661696c6564546f4578747261637452756e74696d6556657273696f6e00020cec4661696c656420746f2065787472616374207468652072756e74696d652076657273696f6e2066726f6d20746865206e65772072756e74696d652e0009014569746865722063616c6c696e672060436f72655f76657273696f6e60206f72206465636f64696e67206052756e74696d6556657273696f6e60206661696c65642e4c4e6f6e44656661756c74436f6d706f73697465000304fc537569636964652063616c6c6564207768656e20746865206163636f756e7420686173206e6f6e2d64656661756c7420636f6d706f7369746520646174612e3c4e6f6e5a65726f526566436f756e74000404350154686572652069732061206e6f6e2d7a65726f207265666572656e636520636f756e742070726576656e74696e6720746865206163636f756e742066726f6d206265696e67207075726765642e3043616c6c46696c7465726564000504d0546865206f726967696e2066696c7465722070726576656e74207468652063616c6c20746f20626520646973706174636865642e046c4572726f7220666f72207468652053797374656d2070616c6c65743502102873705f72756e74696d651c626f756e6465642c626f756e6465645f76656328426f756e6465645665630804540124045300000400e10101185665633c543e000039020c4070616c6c65745f74696d657374616d701870616c6c65741043616c6c0404540001040c73657404010c6e6f7755010124543a3a4d6f6d656e7400004054536574207468652063757272656e742074696d652e005501546869732063616c6c2073686f756c6420626520696e766f6b65642065786163746c79206f6e63652070657220626c6f636b2e2049742077696c6c2070616e6963206174207468652066696e616c697a6174696f6ed470686173652c20696620746869732063616c6c206861736e2774206265656e20696e766f6b656420627920746861742074696d652e0041015468652074696d657374616d702073686f756c642062652067726561746572207468616e207468652070726576696f7573206f6e652062792074686520616d6f756e742073706563696669656420627940604d696e696d756d506572696f64602e00d4546865206469737061746368206f726967696e20666f7220746869732063616c6c206d7573742062652060496e686572656e74602e002823203c7765696768743e31012d20604f2831296020284e6f7465207468617420696d706c656d656e746174696f6e73206f6620604f6e54696d657374616d7053657460206d75737420616c736f20626520604f283129602961012d20312073746f72616765207265616420616e6420312073746f72616765206d75746174696f6e2028636f64656320604f28312960292e202862656361757365206f6620604469645570646174653a3a74616b656020696e402020606f6e5f66696e616c697a656029d42d2031206576656e742068616e646c657220606f6e5f74696d657374616d705f736574602e204d75737420626520604f283129602e2c23203c2f7765696768743e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e3d020000040c0018a80041020c3870616c6c65745f696e64696365731870616c6c65741043616c6c04045400011414636c61696d040114696e64657810013c543a3a4163636f756e74496e6465780000489841737369676e20616e2070726576696f75736c7920756e61737369676e656420696e6465782e00dc5061796d656e743a20604465706f736974602069732072657365727665642066726f6d207468652073656e646572206163636f756e742e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e00f02d2060696e646578603a2074686520696e64657820746f20626520636c61696d65642e2054686973206d757374206e6f7420626520696e207573652e0090456d6974732060496e64657841737369676e656460206966207375636365737366756c2e002823203c7765696768743e242d20604f283129602e982d204f6e652073746f72616765206d75746174696f6e2028636f64656320604f28312960292e602d204f6e652072657365727665206f7065726174696f6e2e302d204f6e65206576656e742e4c2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d902d204442205765696768743a203120526561642f577269746520284163636f756e7473292c23203c2f7765696768743e207472616e7366657208010c6e6577000130543a3a4163636f756e744964000114696e64657810013c543a3a4163636f756e74496e6465780001505d0141737369676e20616e20696e64657820616c7265616479206f776e6564206279207468652073656e64657220746f20616e6f74686572206163636f756e742e205468652062616c616e6365207265736572766174696f6eb86973206566666563746976656c79207472616e7366657272656420746f20746865206e6577206163636f756e742e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e0025012d2060696e646578603a2074686520696e64657820746f2062652072652d61737369676e65642e2054686973206d757374206265206f776e6564206279207468652073656e6465722e5d012d20606e6577603a20746865206e6577206f776e6572206f662074686520696e6465782e20546869732066756e6374696f6e2069732061206e6f2d6f7020696620697420697320657175616c20746f2073656e6465722e0090456d6974732060496e64657841737369676e656460206966207375636365737366756c2e002823203c7765696768743e242d20604f283129602e982d204f6e652073746f72616765206d75746174696f6e2028636f64656320604f28312960292e642d204f6e65207472616e73666572206f7065726174696f6e2e302d204f6e65206576656e742e4c2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d302d204442205765696768743ae02020202d2052656164733a20496e6469636573204163636f756e74732c2053797374656d204163636f756e742028726563697069656e7429e42020202d205772697465733a20496e6469636573204163636f756e74732c2053797374656d204163636f756e742028726563697069656e74292c23203c2f7765696768743e1066726565040114696e64657810013c543a3a4163636f756e74496e646578000248944672656520757020616e20696e646578206f776e6564206279207468652073656e6465722e005d015061796d656e743a20416e792070726576696f7573206465706f73697420706c6163656420666f722074686520696e64657820697320756e726573657276656420696e207468652073656e646572206163636f756e742e005501546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d757374206f776e2074686520696e6465782e000d012d2060696e646578603a2074686520696e64657820746f2062652066726565642e2054686973206d757374206265206f776e6564206279207468652073656e6465722e0084456d6974732060496e646578467265656460206966207375636365737366756c2e002823203c7765696768743e242d20604f283129602e982d204f6e652073746f72616765206d75746174696f6e2028636f64656320604f28312960292e602d204f6e652072657365727665206f7065726174696f6e2e302d204f6e65206576656e742e4c2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d902d204442205765696768743a203120526561642f577269746520284163636f756e7473292c23203c2f7765696768743e38666f7263655f7472616e736665720c010c6e6577000130543a3a4163636f756e744964000114696e64657810013c543a3a4163636f756e74496e646578000118667265657a65a80110626f6f6c0003545501466f72636520616e20696e64657820746f20616e206163636f756e742e205468697320646f65736e277420726571756972652061206465706f7369742e2049662074686520696e64657820697320616c7265616479e868656c642c207468656e20616e79206465706f736974206973207265696d62757273656420746f206974732063757272656e74206f776e65722e00c4546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f526f6f745f2e00a42d2060696e646578603a2074686520696e64657820746f206265202872652d2961737369676e65642e5d012d20606e6577603a20746865206e6577206f776e6572206f662074686520696e6465782e20546869732066756e6374696f6e2069732061206e6f2d6f7020696620697420697320657175616c20746f2073656e6465722e41012d2060667265657a65603a2069662073657420746f206074727565602c2077696c6c20667265657a652074686520696e64657820736f2069742063616e6e6f74206265207472616e736665727265642e0090456d6974732060496e64657841737369676e656460206966207375636365737366756c2e002823203c7765696768743e242d20604f283129602e982d204f6e652073746f72616765206d75746174696f6e2028636f64656320604f28312960292e782d20557020746f206f6e652072657365727665206f7065726174696f6e2e302d204f6e65206576656e742e4c2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d302d204442205765696768743af42020202d2052656164733a20496e6469636573204163636f756e74732c2053797374656d204163636f756e7420286f726967696e616c206f776e657229f82020202d205772697465733a20496e6469636573204163636f756e74732c2053797374656d204163636f756e7420286f726967696e616c206f776e6572292c23203c2f7765696768743e18667265657a65040114696e64657810013c543a3a4163636f756e74496e6465780004484101467265657a6520616e20696e64657820736f2069742077696c6c20616c7761797320706f696e7420746f207468652073656e646572206163636f756e742e205468697320636f6e73756d657320746865206465706f7369742e005901546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e6420746865207369676e696e67206163636f756e74206d757374206861766520616c6e6f6e2d66726f7a656e206163636f756e742060696e646578602e00ac2d2060696e646578603a2074686520696e64657820746f2062652066726f7a656e20696e20706c6163652e0088456d6974732060496e64657846726f7a656e60206966207375636365737366756c2e002823203c7765696768743e242d20604f283129602e982d204f6e652073746f72616765206d75746174696f6e2028636f64656320604f28312960292e702d20557020746f206f6e6520736c617368206f7065726174696f6e2e302d204f6e65206576656e742e4c2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d902d204442205765696768743a203120526561642f577269746520284163636f756e7473292c23203c2f7765696768743e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e45020c3870616c6c65745f696e64696365731870616c6c6574144572726f720404540001142c4e6f7441737369676e65640000048c54686520696e64657820776173206e6f7420616c72656164792061737369676e65642e204e6f744f776e6572000104a454686520696e6465782069732061737369676e656420746f20616e6f74686572206163636f756e742e14496e5573650002047054686520696e64657820776173206e6f7420617661696c61626c652e2c4e6f745472616e73666572000304c854686520736f7572636520616e642064657374696e6174696f6e206163636f756e747320617265206964656e746963616c2e245065726d616e656e74000404d054686520696e646578206973207065726d616e656e7420616e64206d6179206e6f742062652066726565642f6368616e6765642e04ad010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f7273290a0909096f6620746869732070616c6c65742e0a0909094902102873705f72756e74696d651c626f756e646564407765616b5f626f756e6465645f766563385765616b426f756e646564566563080454014d02045300000400550201185665633c543e00004d02083c70616c6c65745f62616c616e6365732c42616c616e63654c6f636b041c42616c616e63650118000c010869648d0101384c6f636b4964656e746966696572000118616d6f756e7418011c42616c616e636500011c726561736f6e735102011c526561736f6e7300005102083c70616c6c65745f62616c616e6365731c526561736f6e7300010c0c466565000000104d6973630001000c416c6c0002000055020000024d02005902102873705f72756e74696d651c626f756e6465642c626f756e6465645f76656328426f756e646564566563080454015d02045300000400610201185665633c543e00005d02083c70616c6c65745f62616c616e6365732c52657365727665446174610844526573657276654964656e746966696572018d011c42616c616e636501180008010869648d010144526573657276654964656e746966696572000118616d6f756e7418011c42616c616e6365000061020000025d02006502083c70616c6c65745f62616c616e6365732052656c65617365730001081856315f305f300000001856325f305f300001000069020c3c70616c6c65745f62616c616e6365731870616c6c65741043616c6c080454000449000118207472616e73666572080110646573746d02018c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f7572636500011476616c75655d010128543a3a42616c616e6365000064d45472616e7366657220736f6d65206c697175696420667265652062616c616e636520746f20616e6f74686572206163636f756e742e000501607472616e73666572602077696c6c207365742074686520604672656542616c616e636560206f66207468652073656e64657220616e642072656365697665722e11014966207468652073656e6465722773206163636f756e742069732062656c6f7720746865206578697374656e7469616c206465706f736974206173206120726573756c74b06f6620746865207472616e736665722c20746865206163636f756e742077696c6c206265207265617065642e001501546865206469737061746368206f726967696e20666f7220746869732063616c6c206d75737420626520605369676e65646020627920746865207472616e736163746f722e002823203c7765696768743e61012d20446570656e64656e74206f6e20617267756d656e747320627574206e6f7420637269746963616c2c20676976656e2070726f70657220696d706c656d656e746174696f6e7320666f7220696e70757420636f6e66696794202074797065732e205365652072656c617465642066756e6374696f6e732062656c6f772e31012d20497420636f6e7461696e732061206c696d69746564206e756d626572206f6620726561647320616e642077726974657320696e7465726e616c6c7920616e64206e6f20636f6d706c6578382020636f6d7075746174696f6e2e004852656c617465642066756e6374696f6e733a004d0120202d2060656e737572655f63616e5f77697468647261776020697320616c776179732063616c6c656420696e7465726e616c6c792062757420686173206120626f756e64656420636f6d706c65786974792e290120202d205472616e7366657272696e672062616c616e63657320746f206163636f756e7473207468617420646964206e6f74206578697374206265666f72652077696c6c206361757365cc2020202060543a3a4f6e4e65774163636f756e743a3a6f6e5f6e65775f6163636f756e746020746f2062652063616c6c65642e5d0120202d2052656d6f76696e6720656e6f7567682066756e64732066726f6d20616e206163636f756e742077696c6c20747269676765722060543a3a4475737452656d6f76616c3a3a6f6e5f756e62616c616e636564602e5d0120202d20607472616e736665725f6b6565705f616c6976656020776f726b73207468652073616d652077617920617320607472616e73666572602c206275742068617320616e206164646974696f6e616c20636865636bdc202020207468617420746865207472616e736665722077696c6c206e6f74206b696c6c20746865206f726967696e206163636f756e742e842d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d11012d204f726967696e206163636f756e7420697320616c726561647920696e206d656d6f72792c20736f206e6f204442206f7065726174696f6e7320666f72207468656d2e2c23203c2f7765696768743e2c7365745f62616c616e63650c010c77686f6d02018c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263650001206e65775f667265655d010128543a3a42616c616e63650001306e65775f72657365727665645d010128543a3a42616c616e636500012090536574207468652062616c616e636573206f66206120676976656e206163636f756e742e001d01546869732077696c6c20616c74657220604672656542616c616e63656020616e642060526573657276656442616c616e63656020696e2073746f726167652e2069742077696c6c3101616c736f20616c7465722074686520746f74616c2069737375616e6365206f66207468652073797374656d202860546f74616c49737375616e6365602920617070726f7072696174656c792e1501496620746865206e65772066726565206f722072657365727665642062616c616e63652069732062656c6f7720746865206578697374656e7469616c206465706f7369742cfc69742077696c6c20726573657420746865206163636f756e74206e6f6e63652028606672616d655f73797374656d3a3a4163636f756e744e6f6e636560292e00b0546865206469737061746368206f726967696e20666f7220746869732063616c6c2069732060726f6f74602e38666f7263655f7472616e736665720c0118736f757263656d02018c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365000110646573746d02018c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f7572636500011476616c75655d010128543a3a42616c616e63650002184d0145786163746c7920617320607472616e73666572602c2065786365707420746865206f726967696e206d75737420626520726f6f7420616e642074686520736f75726365206163636f756e74206d6179206265287370656369666965642e2823203c7765696768743e4d012d2053616d65206173207472616e736665722c20627574206164646974696f6e616c207265616420616e6420777269746520626563617573652074686520736f75726365206163636f756e74206973206e6f747c2020617373756d656420746f20626520696e20746865206f7665726c61792e2c23203c2f7765696768743e4c7472616e736665725f6b6565705f616c697665080110646573746d02018c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f7572636500011476616c75655d010128543a3a42616c616e63650003184d0153616d6520617320746865205b607472616e73666572605d2063616c6c2c206275742077697468206120636865636b207468617420746865207472616e736665722077696c6c206e6f74206b696c6c207468653c6f726967696e206163636f756e742e00b8393925206f66207468652074696d6520796f752077616e74205b607472616e73666572605d20696e73746561642e00c05b607472616e73666572605d3a207374727563742e50616c6c65742e68746d6c236d6574686f642e7472616e73666572307472616e736665725f616c6c080110646573746d02018c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263650001286b6565705f616c697665a80110626f6f6c00044405015472616e736665722074686520656e74697265207472616e7366657261626c652062616c616e63652066726f6d207468652063616c6c6572206163636f756e742e0059014e4f54453a20546869732066756e6374696f6e206f6e6c7920617474656d70747320746f207472616e73666572205f7472616e7366657261626c655f2062616c616e6365732e2054686973206d65616e7320746861746101616e79206c6f636b65642c2072657365727665642c206f72206578697374656e7469616c206465706f7369747320287768656e20606b6565705f616c6976656020697320607472756560292c2077696c6c206e6f742062655d017472616e7366657272656420627920746869732066756e6374696f6e2e20546f20656e73757265207468617420746869732066756e6374696f6e20726573756c747320696e2061206b696c6c6564206163636f756e742c4501796f75206d69676874206e65656420746f207072657061726520746865206163636f756e742062792072656d6f76696e6720616e79207265666572656e636520636f756e746572732c2073746f72616765406465706f736974732c206574632e2e2e00c0546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205369676e65642e00a02d206064657374603a2054686520726563697069656e74206f6620746865207472616e736665722e59012d20606b6565705f616c697665603a204120626f6f6c65616e20746f2064657465726d696e652069662074686520607472616e736665725f616c6c60206f7065726174696f6e2073686f756c642073656e6420616c6c4d0120206f66207468652066756e647320746865206163636f756e74206861732c2063617573696e67207468652073656e646572206163636f756e7420746f206265206b696c6c6564202866616c7365292c206f72590120207472616e736665722065766572797468696e6720657863657074206174206c6561737420746865206578697374656e7469616c206465706f7369742c2077686963682077696c6c2067756172616e74656520746fc820206b656570207468652073656e646572206163636f756e7420616c697665202874727565292e2023203c7765696768743e39012d204f2831292e204a757374206c696b65207472616e736665722c206275742072656164696e672074686520757365722773207472616e7366657261626c652062616c616e63652066697273742e302020233c2f7765696768743e3c666f7263655f756e7265736572766508010c77686f6d02018c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365000118616d6f756e74180128543a3a42616c616e636500050cb0556e7265736572766520736f6d652062616c616e63652066726f6d2061207573657220627920666f7263652e006c43616e206f6e6c792062652063616c6c656420627920524f4f542e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e6d020c2873705f72756e74696d65306d756c746961646472657373304d756c74694164647265737308244163636f756e7449640100304163636f756e74496e6465780198011408496404000001244163636f756e74496400000014496e6465780400710201304163636f756e74496e6465780001000c526177040028011c5665633c75383e0002002441646472657373333204000401205b75383b2033325d000300244164647265737332300400590101205b75383b2032305d000400007102000006980075020c3c70616c6c65745f62616c616e6365731870616c6c6574144572726f720804540004490001203856657374696e6742616c616e63650000049856657374696e672062616c616e636520746f6f206869676820746f2073656e642076616c7565544c69717569646974795265737472696374696f6e73000104c44163636f756e74206c6971756964697479207265737472696374696f6e732070726576656e74207769746864726177616c4c496e73756666696369656e7442616c616e63650002047442616c616e636520746f6f206c6f7720746f2073656e642076616c7565484578697374656e7469616c4465706f736974000304e856616c756520746f6f206c6f7720746f20637265617465206163636f756e742064756520746f206578697374656e7469616c206465706f736974244b656570416c6976650004048c5472616e736665722f7061796d656e7420776f756c64206b696c6c206163636f756e745c4578697374696e6756657374696e675363686564756c65000504c8412076657374696e67207363686564756c6520616c72656164792065786973747320666f722074686973206163636f756e742c446561644163636f756e740006048842656e6566696369617279206163636f756e74206d757374207072652d65786973743c546f6f4d616e795265736572766573000704ac4e756d626572206f66206e616d656420726573657276657320657863656564204d6178526573657276657304ad010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f7273290a0909096f6620746869732070616c6c65742e0a09090979020c3473705f61726974686d657469632c66697865645f706f696e7424466978656455313238000004001801107531323800007d02086870616c6c65745f7472616e73616374696f6e5f7061796d656e742052656c6561736573000108245631416e6369656e74000000085632000100008102102873705f72756e74696d651c626f756e6465642c626f756e6465645f76656328426f756e6465645665630804540185020453000004008d0201185665633c543e00008502084470616c6c65745f617574686f727368697038556e636c65456e7472794974656d0c2c426c6f636b4e756d62657201101048617368012418417574686f72010001083c496e636c7573696f6e486569676874040010012c426c6f636b4e756d62657200000014556e636c650800240110486173680000890201384f7074696f6e3c417574686f723e00010000890204184f7074696f6e04045401000108104e6f6e6500000010536f6d6504000000000100008d0200000285020091020c4470616c6c65745f617574686f72736869701870616c6c65741043616c6c040454000104287365745f756e636c65730401286e65775f756e636c6573950201385665633c543a3a4865616465723e0000046050726f76696465206120736574206f6620756e636c65732e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e95020000029902009902102873705f72756e74696d651c67656e65726963186865616465721848656164657208184e756d62657201101048617368019d020014012c706172656e745f68617368240130486173683a3a4f75747075740001186e756d626572550101184e756d62657200012873746174655f726f6f74240130486173683a3a4f757470757400013c65787472696e736963735f726f6f74240130486173683a3a4f75747075740001186469676573742c011844696765737400009d020c2873705f72756e74696d65187472616974732c426c616b6554776f32353600000000a1020c4470616c6c65745f617574686f72736869701870616c6c6574144572726f7204045400011c48496e76616c6964556e636c65506172656e740000048854686520756e636c6520706172656e74206e6f7420696e2074686520636861696e2e40556e636c6573416c726561647953657400010480556e636c657320616c72656164792073657420696e2074686520626c6f636b2e34546f6f4d616e79556e636c657300020440546f6f206d616e7920756e636c65732e3047656e65736973556e636c650003045454686520756e636c652069732067656e657369732e30546f6f48696768556e636c650004047c54686520756e636c6520697320746f6f206869676820696e20636861696e2e50556e636c65416c7265616479496e636c756465640005047854686520756e636c6520697320616c726561647920696e636c756465642e204f6c64556e636c65000604b454686520756e636c652069736e277420726563656e7420656e6f75676820746f20626520696e636c756465642e04ad010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f7273290a0909096f6620746869732070616c6c65742e0a090909a5020c4470617261636861696e5f7374616b696e6714747970657324526f756e64496e666f042c426c6f636b4e756d6265720110000c011c63757272656e741c013053657373696f6e496e646578000114666972737410012c426c6f636b4e756d6265720001186c656e67746810012c426c6f636b4e756d6265720000a9020c4470617261636861696e5f7374616b696e671474797065734444656c65676174696f6e436f756e7465720000080114726f756e641c013053657373696f6e496e64657800011c636f756e7465721c010c7533320000ad020c4470617261636861696e5f7374616b696e671474797065732444656c656761746f720c244163636f756e74496401001c42616c616e63650118604d6178436f6c6c61746f727350657244656c656761746f72000008012c64656c65676174696f6e73b10201fc4f7264657265645365743c5374616b653c4163636f756e7449642c2042616c616e63653e2c204d6178436f6c6c61746f727350657244656c656761746f723e000114746f74616c18011c42616c616e63650000b1020c4470617261636861696e5f7374616b696e670c736574284f72646572656453657408045401b502045300000400b9020140426f756e6465645665633c542c20533e0000b5020c4470617261636861696e5f7374616b696e67147479706573145374616b6508244163636f756e74496401001c42616c616e63650118000801146f776e65720001244163636f756e744964000118616d6f756e7418011c42616c616e63650000b902102873705f72756e74696d651c626f756e6465642c626f756e6465645f76656328426f756e64656456656308045401b502045300000400bd0201185665633c543e0000bd02000002b50200c1020c4470617261636861696e5f7374616b696e671474797065732443616e6469646174650c244163636f756e74496401001c42616c616e63650118644d617844656c656761746f727350657243616e646964617465000014010869640001244163636f756e7449640001147374616b6518011c42616c616e636500012864656c656761746f7273c5020101014f7264657265645365743c5374616b653c4163636f756e7449642c2042616c616e63653e2c204d617844656c656761746f727350657243616e6469646174653e000114746f74616c18011c42616c616e6365000118737461747573cd02013c43616e6469646174655374617475730000c5020c4470617261636861696e5f7374616b696e670c736574284f72646572656453657408045401b502045300000400c9020140426f756e6465645665633c542c20533e0000c902102873705f72756e74696d651c626f756e6465642c626f756e6465645f76656328426f756e64656456656308045401b502045300000400bd0201185665633c543e0000cd020c4470617261636861696e5f7374616b696e671474797065733c43616e646964617465537461747573000108184163746976650000001c4c656176696e6704001c013053657373696f6e496e64657800010000d1020c4470617261636861696e5f7374616b696e6714747970657328546f74616c5374616b65041c42616c616e6365011800080124636f6c6c61746f727318011c42616c616e636500012864656c656761746f727318011c42616c616e63650000d5020c4470617261636861696e5f7374616b696e670c736574284f72646572656453657408045401b502045300000400d9020140426f756e6465645665633c542c20533e0000d902102873705f72756e74696d651c626f756e6465642c626f756e6465645f76656328426f756e64656456656308045401b502045300000400bd0201185665633c543e0000dd020c4470617261636861696e5f7374616b696e6724696e666c6174696f6e34496e666c6174696f6e496e666f0000080120636f6c6c61746f72e102012c5374616b696e67496e666f00012464656c656761746f72e102012c5374616b696e67496e666f0000e1020c4470617261636861696e5f7374616b696e6724696e666c6174696f6e2c5374616b696e67496e666f00000801206d61785f7261746580012c5065727175696e74696c6c00012c7265776172645f72617465e5020128526577617264526174650000e5020c4470617261636861696e5f7374616b696e6724696e666c6174696f6e28526577617264526174650000080118616e6e75616c80012c5065727175696e74696c6c0001247065725f626c6f636b80012c5065727175696e74696c6c0000e902102873705f72756e74696d651c626f756e64656444626f756e6465645f62747265655f6d61703c426f756e64656442547265654d61700c044b011004560118045300000400ed02013842547265654d61703c4b2c20563e0000ed02042042547265654d617008044b011004560118000400f102000000f102000002f50200f50200000408101800f9020c4470617261636861696e5f7374616b696e671870616c6c65741043616c6c04045400014c3c666f7263655f6e65775f726f756e64000030d0466f7263657320746865207374617274206f6620746865206e657720726f756e6420696e20746865206e65787420626c6f636b2e00a0546865206e657720726f756e642077696c6c20626520656e666f7263656420766961203c54206173a453686f756c64456e6453657373696f6e3c5f3e3e3a3a73686f756c645f656e645f73657373696f6e2e0084546865206469737061746368206f726967696e206d75737420626520526f6f742e002823203c7765696768743e305765696768743a204f283129642d2052656164733a205b4f726967696e204163636f756e745d5c2d205772697465733a20466f7263654e6577526f756e642c23203c2f7765696768743e347365745f696e666c6174696f6e100170636f6c6c61746f725f6d61785f726174655f70657263656e7461676580012c5065727175696e74696c6c000198636f6c6c61746f725f616e6e75616c5f7265776172645f726174655f70657263656e7461676580012c5065727175696e74696c6c00017464656c656761746f725f6d61785f726174655f70657263656e7461676580012c5065727175696e74696c6c00019c64656c656761746f725f616e6e75616c5f7265776172645f726174655f70657263656e7461676580012c5065727175696e74696c6c000144f05365742074686520616e6e75616c20696e666c6174696f6e207261746520746f20646572697665207065722d726f756e6420696e666c6174696f6e2e00110154686520696e666c6174696f6e2064657461696c732061726520636f6e736964657265642076616c69642069662074686520616e6e75616c207265776172642072617465f0697320617070726f78696d6174656c7920746865207065722d626c6f636b207265776172642072617465206d756c7469706c69656420627920746865ac657374696d617465642a20746f74616c206e756d626572206f6620626c6f636b732070657220796561722e00cc54686520657374696d61746564206176657261676520626c6f636b2074696d65206973207477656c7665207365636f6e64732e0084546865206469737061746368206f726967696e206d75737420626520526f6f742e0068456d6974732060526f756e64496e666c6174696f6e536574602e002823203c7765696768743e305765696768743a204f283129642d2052656164733a205b4f726967696e204163636f756e745d642d205772697465733a20496e666c6174696f6e436f6e6669672c23203c2f7765696768743e6c7365745f6d61785f73656c65637465645f63616e6469646174657304010c6e65771c010c753332000264090153657420746865206d6178696d756d206e756d626572206f6620636f6c6c61746f722063616e6469646174657320746861742063616e2062652073656c6563746564a861742074686520626567696e6e696e67206f6620656163682076616c69646174696f6e20726f756e642e00e84368616e67657320617265206e6f74206170706c69656420756e74696c20746865207374617274206f6620746865206e65787420726f756e642e000d01546865206e65772076616c7565206d75737420626520686967686572207468616e20746865206d696e696d756d20616c6c6f7765642061732073657420696e207468655c70616c6c6574277320636f6e66696775726174696f6e2e0084546865206469737061746368206f726967696e206d75737420626520526f6f742e0084456d69747320604d617853656c656374656443616e64696461746573536574602e00002823203c7765696768743e09012d20546865207472616e73616374696f6e277320636f6d706c6578697479206973206d61696e6c7920646570656e64656e74206f6e207570646174696e6720746865090120206053656c656374656443616e64696461746573602073746f7261676520696e206073656c6563745f746f705f63616e646964617465736020776869636820696ef8202072657475726e20646570656e6473206f6e20746865206e756d626572206f6620604d617853656c656374656443616e646964617465736020284e292edc2d20466f722065616368204e2c2077652072656164206043616e646964617465506f6f6c602066726f6d207468652073746f726167652e242d2d2d2d2d2d2d2d2df85765696768743a204f284e202b204429207768657265204e20697320604d617853656c656374656443616e646964617465736020626f756e646564206279e4604d6178546f7043616e646964617465736020616e64204420697320746865206e756d626572206f662064656c656761746f7273206f662061c063616e64696461746520626f756e64656420627920604d617844656c656761746f7273506572436f6c6c61746f72602e01012d2052656164733a204d617853656c656374656443616e646964617465732c20546f7043616e646964617465732c204e202a2043616e646964617465506f6f6c7c2d205772697465733a204d617853656c656374656443616e646964617465732c23203c2f7765696768743e507365745f626c6f636b735f7065725f726f756e6404010c6e6577100138543a3a426c6f636b4e756d626572000344d453657420746865206e756d626572206f6620626c6f636b7320656163682076616c69646174696f6e20726f756e64206c617374732e000901496620746865206e65772076616c7565206973206c657373207468616e20746865206c656e677468206f66207468652063757272656e7420726f756e642c20746865050173797374656d2077696c6c20696d6d6564696174656c79206d6f766520746f20746865206e65787420726f756e6420696e20746865206e65787420626c6f636b2e000d01546865206e65772076616c7565206d75737420626520686967686572207468616e20746865206d696e696d756d20616c6c6f7765642061732073657420696e207468655c70616c6c6574277320636f6e66696775726174696f6e2e0084546865206469737061746368206f726967696e206d75737420626520526f6f742e0068456d6974732060426c6f636b73506572526f756e64536574602e002823203c7765696768743e305765696768743a204f283129802d2052656164733a205b4f726967696e204163636f756e745d2c20526f756e643c2d205772697465733a20526f756e642c23203c2f7765696768743e5c7365745f6d61785f63616e6469646174655f7374616b6504010c6e657718013042616c616e63654f663c543e000430110153657420746865206d6178696d616c20616d6f756e74206120636f6c6c61746f722063616e207374616b652e204578697374696e67207374616b657320617265206e6f74206368616e6765642e0084546865206469737061746368206f726967696e206d75737420626520526f6f742e0084456d69747320604d617843616e6469646174655374616b654368616e676564602e002823203c7765696768743e305765696768743a204f283129d02d2052656164733a205b4f726967696e204163636f756e745d2c204d6178436f6c6c61746f7243616e6469646174655374616b653c2d205772697465733a20526f756e642c23203c2f7765696768743e58666f7263655f72656d6f76655f63616e646964617465040120636f6c6c61746f726d02018c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263650005680101466f726365646c792072656d6f766573206120636f6c6c61746f722063616e6469646174652066726f6d2074686520546f7043616e6469646174657320616e64e4636c6561727320616c6c206173736f6369617465642073746f7261676520666f72207468652063616e64696461746520616e642074686569722c64656c656761746f72732e00fc507265706172657320756e7374616b696e67206f66207468652063616e6469646174657320616e642074686569722064656c656761746f7273207374616b65f077686963682063616e20626520756e6c6f636b6564207669612060756e6c6f636b5f756e7374616b6564602061667465722077616974696e67206174886c6561737420605374616b654475726174696f6e60206d616e7920626c6f636b732e0064456d697473206043616e64696461746552656d6f766564602e002823203c7765696768743e09012d20546865207472616e73616374696f6e277320636f6d706c6578697479206973206d61696e6c7920646570656e64656e74206f6e207570646174696e6720746865090120206053656c656374656443616e64696461746573602073746f7261676520696e206073656c6563745f746f705f63616e646964617465736020776869636820696ef8202072657475726e20646570656e6473206f6e20746865206e756d626572206f6620604d617853656c656374656443616e646964617465736020284e292edc2d20466f722065616368204e2c2077652072656164206043616e646964617465506f6f6c602066726f6d207468652073746f726167652e242d2d2d2d2d2d2d2d2df85765696768743a204f284e202b204429207768657265204e20697320604d617853656c656374656443616e646964617465736020626f756e646564206279ec604d6178546f7043616e646964617465736020616e64204420697320746865206e756d626572206f662064656c656761746f7273206f6620746865e4636f6c6c61746f722063616e64696461746520626f756e64656420627920604d617844656c656761746f7273506572436f6c6c61746f72602ee82d2052656164733a204d6178436f6c6c61746f7243616e6469646174655374616b652c2032202a204e202a2043616e646964617465506f6f6c2cfc2020546f7043616e646964617465732c20426c6f636b4e756d6265722c2044202a2044656c656761746f7253746174652c2044202a20556e7374616b696e67ec2d205772697465733a204d6178436f6c6c61746f7243616e6469646174655374616b652c204e202a2043616e646964617465506f6f6c2c2044202a94202044656c656761746f7253746174652c202844202b203129202a20556e7374616b696e6711012d204b696c6c733a2043616e646964617465506f6f6c2c2044656c656761746f72537461746520666f7220616c6c2064656c656761746f7273207768696368206f6e6c7970202064656c65676174656420746f207468652063616e6469646174652c23203c2f7765696768743e3c6a6f696e5f63616e646964617465730401147374616b6518013042616c616e63654f663c543e00066c904a6f696e2074686520736574206f6620636f6c6c61746f722063616e646964617465732e00f8496e20746865206e65787420626c6f636b732c2069662074686520636f6c6c61746f722063616e6469646174652068617320656e6f7567682066756e6473fc7374616b656420746f20626520696e636c7564656420696e20616e79206f662074686520746f7020604d617853656c656374656443616e64696461746573600d01706f736974696f6e732c2069742077696c6c20626520696e636c7564656420696e2074686520736574206f6620706f74656e7469616c20617574686f72732074686174050177696c6c2062652073656c656374656420627920746865207374616b652d77656967687465642072616e646f6d2073656c656374696f6e2066756e6374696f6e2e00fc546865207374616b65642066756e6473206f6620746865206e657720636f6c6c61746f722063616e6469646174652061726520616464656420746f2074686568746f74616c207374616b65206f66207468652073797374656d2e00110154686520746f74616c20616d6f756e74206f662066756e6473207374616b6564206d7573742062652077697468696e2074686520616c6c6f7765642072616e67652061738873657420696e207468652070616c6c6574277320636f6e66696775726174696f6e2e00f0546865206469737061746368206f726967696e206d757374206e6f7420626520616c72656164792070617274206f662074686520636f6c6c61746f729463616e64696461746573206e6f72206f66207468652064656c656761746f7273207365742e0084456d69747320604a6f696e6564436f6c6c61746f7243616e64696461746573602e002823203c7765696768743ef85765696768743a204f284e202b204429207768657265204e20697320604d617853656c656374656443616e646964617465736020626f756e646564206279f4604d6178546f7043616e646964617465736020616e64204420697320746865206e756d626572206f662064656c656761746f727320666f722074686973c063616e64696461746520626f756e64656420627920604d617844656c656761746f7273506572436f6c6c61746f72602ea82d2052656164733a205b4f726967696e204163636f756e745d2c2044656c656761746f7253746174652cdc20204d6178436f6c6c61746f7243616e6469646174655374616b652c204c6f636b732c20546f74616c436f6c6c61746f725374616b652cd82020546f7043616e646964617465732c204d617853656c656374656443616e646964617465732c2043616e646964617465506f6f6c2c09012d205772697465733a204c6f636b732c20546f74616c436f6c6c61746f725374616b652c2043616e646964617465506f6f6c2c20546f7043616e646964617465732c2c23203c2f7765696768743e54696e69745f6c656176655f63616e64696461746573000794c05265717565737420746f206c656176652074686520736574206f6620636f6c6c61746f722063616e646964617465732e0005014f6e20737563636573732c20746865206163636f756e7420697320696d6d6564696174656c792072656d6f7665642066726f6d207468652063616e6469646174651101706f6f6c20746f2070726576656e742073656c656374696f6e206173206120636f6c6c61746f7220696e206675747572652076616c69646174696f6e20726f756e64732cd862757420756e7374616b696e67206f66207468652066756e6473206973206578656375746564207769746820612064656c6179206f665c605374616b654475726174696f6e6020626c6f636b732e00ac546865206578697420726571756573742063616e2062652072657665727365642062792063616c6c696e67686063616e63656c5f6c656176655f63616e64696461746573602e00f454686973206f7065726174696f6e2061666665637473207468652070616c6c6574277320746f74616c207374616b6520616d6f756e742e204974206973110175706461746564206576656e2074686f756768207468652066756e6473206f66207468652063616e6469646174652077686f207369676e616c656420746f206c65617665fc617265207374696c6c206c6f636b656420666f7220604578697444656c617960202b20605374616b654475726174696f6e60206d6f726520626c6f636b732e0005014e4f54453a2055706f6e207374617274696e672061206e65772073657373696f6e5f6920696e20606e65775f73657373696f6e602c207468652063757272656e741101746f702063616e64696461746573206172652073656c656374656420746f20626520626c6f636b20617574686f727320666f722073657373696f6e5f692b312e20416e7905016368616e67657320746f2074686520746f702063616e64696461746573206166746572776172647320646f206e6f74206566666563742074686520736574206f6660617574686f727320666f722073657373696f6e5f692b312ed8546875732c207765206861766520746f206d616b652073757265206e6f6e65206f6620746865736520636f6c6c61746f72732063616ebc6c65617665206265666f72652073657373696f6e5f692b3120656e64732062792064656c6179696e67207468656972846578697420666f7220604578697444656c617960206d616e7920626c6f636b732e0078456d6974732060436f6c6c61746f725363686564756c656445786974602e002823203c7765696768743e09012d20546865207472616e73616374696f6e277320636f6d706c6578697479206973206d61696e6c7920646570656e64656e74206f6e207570646174696e6720746865090120206053656c656374656443616e64696461746573602073746f7261676520696e206073656c6563745f746f705f63616e646964617465736020776869636820696ef8202072657475726e20646570656e6473206f6e20746865206e756d626572206f6620604d617853656c656374656443616e646964617465736020284e292edc2d20466f722065616368204e2c2077652072656164206043616e646964617465506f6f6c602066726f6d207468652073746f726167652e242d2d2d2d2d2d2d2d2df85765696768743a204f284e202b204429207768657265204e20697320604d617853656c656374656443616e646964617465736020626f756e646564206279f4604d6178546f7043616e646964617465736020616e64204420697320746865206e756d626572206f662064656c656761746f727320666f722074686973c063616e64696461746520626f756e64656420627920604d617844656c656761746f7273506572436f6c6c61746f72602e09012d2052656164733a205b4f726967696e204163636f756e745d2c20546f7043616e646964617465732c20284e202b203129202a2043616e646964617465506f6f6c2c502020546f74616c436f6c6c61746f725374616b65e82d205772697465733a2043616e646964617465506f6f6c2c20546f7043616e646964617465732c20546f74616c436f6c6c61746f725374616b652c23203c2f7765696768743e60657865637574655f6c656176655f63616e64696461746573040120636f6c6c61746f726d02018c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f7572636500086005014578656375746520746865206e6574776f726b2065786974206f6620612063616e6469646174652077686f2072657175657374656420746f206c65617665206174f06c65617374206045786974517565756544656c61796020726f756e64732061676f2e20507265706172657320756e7374616b696e67206f6620746865fc63616e6469646174657320616e642074686569722064656c656761746f7273207374616b652077686963682063616e20626520756e6c6f636b656420766961f460756e6c6f636b5f756e7374616b6564602061667465722077616974696e67206174206c6561737420605374616b654475726174696f6e60206d616e791c626c6f636b732e00c05265717569726573207468652063616e64696461746520746f2070726576696f75736c7920686176652063616c6c65646060696e69745f6c656176655f63616e64696461746573602e00ac546865206578697420726571756573742063616e2062652072657665727365642062792063616c6c696e67686063616e63656c5f6c656176655f63616e64696461746573602e0054456d6974732060436f6c6c61746f724c656674602e002823203c7765696768743ef85765696768743a204f284e202b2044202b20552920776865726520207768657265204e20697320604d617853656c656374656443616e64696461746573600101626f756e64656420627920604d6178546f7043616e64696461746573602c204420697320746865206e756d626572206f662064656c656761746f727320666f720501746869732063616e64696461746520626f756e64656420627920604d617844656c656761746f7273506572436f6c6c61746f726020616e6420552069732074686511016e756d626572206f66206c6f636b656420756e7374616b696e6720726571756573747320626f756e64656420627920604d6178556e7374616b655265717565737473602ed02d2052656164733a2043616e646964617465506f6f6c2c20526f756e642c2044202a2044656c656761746f7253746174652c20447820202a20426c6f636b4e756d6265722c2044202a20556e7374616b696e67c82d205772697465733a2044202a20556e7374616b696e672c2044202a2044656c656761746f7253746174652c20546f74616c982d204b696c6c733a2043616e646964617465506f6f6c2c2044656c656761746f7253746174652c23203c2f7765696768743e5c63616e63656c5f6c656176655f63616e646964617465730009440501526576657274207468652070726576696f75736c79207265717565737465642065786974206f6620746865206e6574776f726b206f66206120636f6c6c61746f720d0163616e6469646174652e204f6e20737563636573732c2061646473206261636b207468652063616e64696461746520746f2074686520546f7043616e6469646174657368616e6420757064617465732074686520636f6c6c61746f72732e00c05265717569726573207468652063616e64696461746520746f2070726576696f75736c7920686176652063616c6c65646060696e69745f6c656176655f63616e64696461746573602e0074456d6974732060436f6c6c61746f7243616e63656c656445786974602e002823203c7765696768743ef85765696768743a204f284e202b204429207768657265204e20697320604d617853656c656374656443616e646964617465736020626f756e646564206279f4604d6178546f7043616e646964617465736020616e64204420697320746865206e756d626572206f662064656c656761746f727320666f722074686973c063616e64696461746520626f756e64656420627920604d617844656c656761746f7273506572436f6c6c61746f72602ef42d2052656164733a205b4f726967696e204163636f756e745d2c20546f74616c436f6c6c61746f725374616b652c20546f7043616e646964617465732c3c202043616e646964617465506f6f6ce82d205772697465733a20546f74616c436f6c6c61746f725374616b652c2043616e646964617465506f6f6c2c20546f7043616e646964617465732c23203c2f7765696768743e5063616e6469646174655f7374616b655f6d6f72650401106d6f726518013042616c616e63654f663c543e000a58a85374616b65206d6f72652066756e647320666f72206120636f6c6c61746f722063616e6469646174652e0001014966206e6f7420696e2074686520736574206f662063616e646964617465732c207374616b696e6720656e6f7567682066756e647320616c6c6f77732074686505016163636f756e7420746f20626520616464656420746f2069742e20546865206c617267657220616d6f756e74206f662066756e64732c2074686520686967686572dc6368616e63657320746f2062652073656c65637465642061732074686520617574686f72206f6620746865206e65787420626c6f636b2e00dc54686973206f7065726174696f6e2061666665637473207468652070616c6c6574277320746f74616c207374616b6520616d6f756e742e00f454686520726573756c74696e6720746f74616c20616d6f756e74206f662066756e6473207374616b6564206d7573742062652077697468696e20746865cc616c6c6f7765642072616e67652061732073657420696e207468652070616c6c6574277320636f6e66696775726174696f6e2e006c456d6974732060436f6c6c61746f725374616b65644d6f7265602e002823203c7765696768743ef85765696768743a204f284e202b2044202b20552920776865726520207768657265204e20697320604d617853656c656374656443616e64696461746573600101626f756e64656420627920604d6178546f7043616e64696461746573602c204420697320746865206e756d626572206f662064656c656761746f727320666f720501746869732063616e64696461746520626f756e64656420627920604d617844656c656761746f7273506572436f6c6c61746f726020616e6420552069732074686511016e756d626572206f66206c6f636b656420756e7374616b696e6720726571756573747320626f756e64656420627920604d6178556e7374616b655265717565737473602ed42d2052656164733a205b4f726967696e204163636f756e745d2c204c6f636b732c20546f74616c436f6c6c61746f725374616b652ce420204d6178436f6c6c61746f7243616e6469646174655374616b652c20546f7043616e646964617465732c2043616e646964617465506f6f6c05012d205772697465733a204c6f636b732c20546f74616c436f6c6c61746f725374616b652c2043616e646964617465506f6f6c2c20546f7043616e646964617465732c23203c2f7765696768743e5063616e6469646174655f7374616b655f6c6573730401106c65737318013042616c616e63654f663c543e000b60a85374616b65206c6573732066756e647320666f72206120636f6c6c61746f722063616e6469646174652e000501496620746865206e657720616d6f756e74206f66207374616b65642066756e64206973206e6f74206c6172676520656e6f7567682c20746865206163636f756e74fc636f756c642062652072656d6f7665642066726f6d2074686520736574206f6620636f6c6c61746f722063616e6469646174657320616e64206e6f74206265a4636f6e7369646572656420666f7220617574686f72696e6720746865206e65787420626c6f636b732e00dc54686973206f7065726174696f6e2061666665637473207468652070616c6c6574277320746f74616c207374616b6520616d6f756e742e000d0154686520756e7374616b65642066756e647320617265206e6f742072656c656173656420696d6d6564696174656c7920746f20746865206163636f756e742c20627574d0746865792077696c6c20626520617661696c61626c6520616674657220605374616b654475726174696f6e6020626c6f636b732e00f454686520726573756c74696e6720746f74616c20616d6f756e74206f662066756e6473207374616b6564206d7573742062652077697468696e20746865cc616c6c6f7765642072616e67652061732073657420696e207468652070616c6c6574277320636f6e66696775726174696f6e2e006c456d6974732060436f6c6c61746f725374616b65644c657373602e002823203c7765696768743ef85765696768743a204f284e202b204429207768657265204e20697320604d617853656c656374656443616e646964617465736020626f756e646564206279f4604d6178546f7043616e646964617465736020616e64204420697320746865206e756d626572206f662064656c656761746f727320666f722074686973c063616e64696461746520626f756e64656420627920604d617844656c656761746f7273506572436f6c6c61746f72602ed02d2052656164733a205b4f726967696e204163636f756e745d2c20556e7374616b696e672c20546f7043616e646964617465732c9820204d617853656c656374656443616e646964617465732c2043616e646964617465506f6f6cd82d205772697465733a20556e7374616b696e672c2043616e646964617465506f6f6c2c20546f74616c436f6c6c61746f725374616b652c23203c2f7765696768743e3c6a6f696e5f64656c656761746f7273080120636f6c6c61746f726d02018c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365000118616d6f756e7418013042616c616e63654f663c543e000c8005014a6f696e2074686520736574206f662064656c656761746f72732062792064656c65676174696e6720746f206120636f6c6c61746f722063616e6469646174652e000501546865206163636f756e7420746861742077616e747320746f2064656c65676174652063616e6e6f742062652070617274206f662074686520636f6c6c61746f725c63616e64696461746573207365742061732077656c6c2e00dc5468652063616c6c6572206d757374205f6e6f745f20686176652064656c656761746564206265666f72652e204f74686572776973652cb86064656c65676174655f616e6f746865725f63616e646964617465602073686f756c642062652063616c6c65642e00110154686520616d6f756e74207374616b6564206d757374206265206c6172676572207468616e20746865206d696e696d756d20726571756972656420746f206265636f6d65c4612064656c656761746f722061732073657420696e207468652070616c6c6574277320636f6e66696775726174696f6e2e0009014173206f6e6c7920604d617844656c656761746f7273506572436f6c6c61746f72602061726520616c6c6f77656420746f2064656c6567617465206120676976656e0501636f6c6c61746f722c2074686520616d6f756e74207374616b6564206d757374206265206c6172676572207468616e20746865206c6f77657374206f6e6520696e01017468652063757272656e7420736574206f662064656c656761746f7220666f7220746865206f7065726174696f6e20746f206265206d65616e696e6766756c2e00090154686520636f6c6c61746f72277320746f74616c207374616b652061732077656c6c206173207468652070616c6c6574277320746f74616c207374616b652061726558696e63726561736564206163636f7264696e676c792e004c456d697473206044656c65676174696f6e602ebc456d697473206044656c65676174696f6e5265706c6163656460206966207468652063616e64696461746520686173f8604d617844656c656761746f7273506572436f6c6c61746f7260206d616e792064656c65676174696f6e732062757420746869732064656c656761746f72fc7374616b6564206d6f7265207468616e206f6e65206f6620746865206f746865722064656c656761746f7273206f6620746869732063616e6469646174652e002823203c7765696768743ef85765696768743a204f284e202b204429207768657265204e20697320604d617853656c656374656443616e646964617465736020626f756e646564206279f4604d6178546f7043616e646964617465736020616e64204420697320746865206e756d626572206f662064656c656761746f727320666f722074686973c063616e64696461746520626f756e64656420627920604d617844656c656761746f7273506572436f6c6c61746f72602ee42d2052656164733a205b4f726967696e204163636f756e745d2c2044656c656761746f7253746174652c20546f7043616e646964617465732cf420204d617853656c656374656443616e646964617465732c2043616e646964617465506f6f6c2c204c61737444656c65676174696f6e2c20526f756e640d012d205772697465733a204c6f636b732c2043616e646964617465506f6f6c2c2044656c656761746f7253746174652c20546f74616c436f6c6c61746f725374616b652c4020204c61737444656c65676174696f6e2c23203c2f7765696768743e6864656c65676174655f616e6f746865725f63616e646964617465080120636f6c6c61746f726d02018c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365000118616d6f756e7418013042616c616e63654f663c543e000da0fc44656c656761746520616e6f7468657220636f6c6c61746f7227732063616e646964617465206279207374616b696e6720736f6d652066756e647320616e64f8696e6372656173696e67207468652070616c6c657427732061732077656c6c2061732074686520636f6c6c61746f72277320746f74616c207374616b652e000501546865206163636f756e7420746861742077616e747320746f2064656c65676174652063616e6e6f742062652070617274206f662074686520636f6c6c61746f725c63616e64696461746573207365742061732077656c6c2e00cc5468652063616c6c6572205f6d7573745f20686176652064656c656761746564206265666f72652e204f74686572776973652c8c606a6f696e5f64656c656761746f7273602073686f756c642062652063616c6c65642e00f04966207468652064656c656761746f722068617320616c72656164792064656c65676174656420746865206d6178696d756d206e756d626572206f66b8636f6c6c61746f722063616e646964617465732c2074686973206f7065726174696f6e2077696c6c206661696c2e00110154686520616d6f756e74207374616b6564206d757374206265206c6172676572207468616e20746865206d696e696d756d20726571756972656420746f206265636f6d65c4612064656c656761746f722061732073657420696e207468652070616c6c6574277320636f6e66696775726174696f6e2e0009014173206f6e6c7920604d617844656c656761746f7273506572436f6c6c61746f72602061726520616c6c6f77656420746f2064656c6567617465206120676976656e0501636f6c6c61746f722c2074686520616d6f756e74207374616b6564206d757374206265206c6172676572207468616e20746865206c6f77657374206f6e6520696e01017468652063757272656e7420736574206f662064656c656761746f7220666f7220746865206f7065726174696f6e20746f206265206d65616e696e6766756c2e00090154686520636f6c6c61746f72277320746f74616c207374616b652061732077656c6c206173207468652070616c6c6574277320746f74616c207374616b652061726558696e63726561736564206163636f7264696e676c792e00f44e4f54453a2054686973207472616e73616374696f6e20697320657870656374656420746f207468726f7720756e74696c20776520696e6372656173650501604d6178436f6c6c61746f727350657244656c656761746f7260206279206174206c65617374206f6e652c2073696e63652069742069732063757272656e746c792c73657420746f206f6e652e004c456d697473206044656c65676174696f6e602ebc456d697473206044656c65676174696f6e5265706c6163656460206966207468652063616e64696461746520686173f8604d617844656c656761746f7273506572436f6c6c61746f7260206d616e792064656c65676174696f6e732062757420746869732064656c656761746f72fc7374616b6564206d6f7265207468616e206f6e65206f6620746865206f746865722064656c656761746f7273206f6620746869732063616e6469646174652e002823203c7765696768743ef85765696768743a204f284e202b204429207768657265204e20697320604d617853656c656374656443616e646964617465736020626f756e646564206279f4604d6178546f7043616e646964617465736020616e64204420697320746865206e756d626572206f662064656c656761746f727320666f722074686973c063616e64696461746520626f756e64656420627920604d617844656c656761746f7273506572436f6c6c61746f72602ee42d2052656164733a205b4f726967696e204163636f756e745d2c2044656c656761746f7253746174652c20546f7043616e646964617465732cf420204d617853656c656374656443616e646964617465732c2043616e646964617465506f6f6c2c204c61737444656c65676174696f6e2c20526f756e640d012d205772697465733a204c6f636b732c2043616e646964617465506f6f6c2c2044656c656761746f7253746174652c20546f74616c436f6c6c61746f725374616b652c4020204c61737444656c65676174696f6e2c23203c2f7765696768743e406c656176655f64656c656761746f7273000e580d014c656176652074686520736574206f662064656c656761746f727320616e642c20627920696d706c69636174696f6e2c207265766f6b6520616c6c206f6e676f696e673064656c65676174696f6e732e001101416c6c207374616b65642066756e647320617265206e6f7420756e6c6f636b656420696d6d6564696174656c792c2062757420746865792061726520616464656420746f0101746865207175657565206f662070656e64696e6720756e7374616b696e672c20616e642077696c6c206566666563746976656c792062652072656c65617365640901616674657220605374616b654475726174696f6e6020626c6f636b732066726f6d20746865206d6f6d656e74207468652064656c656761746f72206c65617665732e000d0154686973206f7065726174696f6e20726564756365732074686520746f74616c207374616b65206f66207468652070616c6c65742061732077656c6c2061732074686509017374616b6573206f6620616c6c20636f6c6c61746f7273207468617420776572652064656c6567617465642c20706f74656e7469616c6c7920616666656374696e6705017468656972206368616e63657320746f20626520696e636c7564656420696e2074686520736574206f662063616e6469646174657320696e20746865206e6578741c726f756e64732e0058456d697473206044656c656761746f724c656674602e002823203c7765696768743e11015765696768743a204f284329207768657265204320697320746865206e756d626572206f662064656c65676174696f6e7320666f7220746869732064656c656761746f72c8776869636820697320626f756e64656420627920627920604d6178436f6c6c61746f727350657244656c656761746f72602e09012d2052656164733a205b4f726967696e204163636f756e745d2c2044656c656761746f7253746174652c20426c6f636b4e756d6265722c20556e7374616b696e672ce82020546f7043616e646964617465732c204d617853656c656374656443616e646964617465732c2043202a2043616e646964617465506f6f6c2cdc2d205772697465733a20556e7374616b696e672c2043616e646964617465506f6f6c2c20546f74616c436f6c6c61746f725374616b652c5c2d204b696c6c733a2044656c656761746f7253746174652c23203c2f7765696768743e447265766f6b655f64656c65676174696f6e040120636f6c6c61746f726d02018c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365000f5c01015465726d696e6174657320616e206f6e676f696e672064656c65676174696f6e20666f72206120676976656e20636f6c6c61746f722063616e6469646174652e001101546865207374616b65642066756e647320617265206e6f7420756e6c6f636b656420696d6d6564696174656c792c2062757420746865792061726520616464656420746f0101746865207175657565206f662070656e64696e6720756e7374616b696e672c20616e642077696c6c206566666563746976656c792062652072656c6561736564f8616674657220605374616b654475726174696f6e6020626c6f636b732066726f6d20746865206d6f6d656e74207468652064656c65676174696f6e2069732c7465726d696e617465642e000d0154686973206f7065726174696f6e20726564756365732074686520746f74616c207374616b65206f66207468652070616c6c65742061732077656c6c2061732074686509017374616b6573206f662074686520636f6c6c61746f7220696e766f6c7665642c20706f74656e7469616c6c7920616666656374696e6720697473206368616e636573ec746f20626520696e636c7564656420696e2074686520736574206f662063616e6469646174657320696e20746865206e65787420726f756e64732e0058456d697473206044656c656761746f724c656674602e002823203c7765696768743e11015765696768743a204f284329207768657265204320697320746865206e756d626572206f662064656c65676174696f6e7320666f7220746869732064656c656761746f72c8776869636820697320626f756e64656420627920627920604d6178436f6c6c61746f727350657244656c656761746f72602e09012d2052656164733a205b4f726967696e204163636f756e745d2c2044656c656761746f7253746174652c20426c6f636b4e756d6265722c20556e7374616b696e672cf020204c6f636b732c20546f7043616e646964617465732c2043616e646964617465506f6f6c2c204d617853656c656374656443616e64696461746573e82d205772697465733a20556e7374616b696e672c204c6f636b732c2044656c656761746f7253746174652c2043616e646964617465506f6f6c2c502020546f74616c436f6c6c61746f725374616b65f42d204b696c6c733a2044656c656761746f725374617465206966207468652064656c656761746f7220686173206e6f742064656c65676174656420746f482020616e6f7468657220636f6c6c61746f722c23203c2f7765696768743e5064656c656761746f725f7374616b655f6d6f726508012463616e6469646174656d02018c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263650001106d6f726518013042616c616e63654f663c543e001044dc496e63726561736520746865207374616b6520666f722064656c65676174696e67206120636f6c6c61746f722063616e6469646174652e0001014966206e6f7420696e2074686520736574206f662063616e646964617465732c207374616b696e6720656e6f7567682066756e647320616c6c6f77732074686594636f6c6c61746f722063616e64696461746520746f20626520616464656420746f2069742e0070456d697473206044656c656761746f725374616b65644d6f7265602e002823203c7765696768743ef85765696768743a204f284e29202b204f284429207768657265204e20697320604d617853656c656374656443616e646964617465736020626f756e646564f8627920604d6178546f7043616e646964617465736020616e64204420746865206e756d626572206f6620746f74616c2064656c656761746f727320666f72d07468697320636f6c6c61746f7220626f756e64656420627920604d6178436f6c6c61746f727350657244656c656761746f72602e80626f756e64656420627920604d6178556e7374616b655265717565737473602e09012d2052656164733a205b4f726967696e204163636f756e745d2c2044656c656761746f7253746174652c20426c6f636b4e756d6265722c20556e7374616b696e672cf020204c6f636b732c20546f7043616e646964617465732c2043616e646964617465506f6f6c2c204d617853656c656374656443616e64696461746573e82d205772697465733a20556e7374616b696e672c204c6f636b732c2044656c656761746f7253746174652c2043616e646964617465506f6f6c2c502020546f74616c436f6c6c61746f725374616b652c23203c2f7765696768743e5064656c656761746f725f7374616b655f6c65737308012463616e6469646174656d02018c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263650001106c65737318013042616c616e63654f663c543e001160d452656475636520746865207374616b6520666f722064656c65676174696e67206120636f6c6c61746f722063616e6469646174652e000901496620746865206e657720616d6f756e74206f66207374616b65642066756e64206973206e6f74206c6172676520656e6f7567682c2074686520636f6c6c61746f72fc636f756c642062652072656d6f7665642066726f6d2074686520736574206f6620636f6c6c61746f722063616e6469646174657320616e64206e6f74206265a4636f6e7369646572656420666f7220617574686f72696e6720746865206e65787420626c6f636b732e00090154686520756e7374616b65642066756e647320617265206e6f742072656c6561736520696d6d6564696174656c7920746f20746865206163636f756e742c20627574d0746865792077696c6c20626520617661696c61626c6520616674657220605374616b654475726174696f6e6020626c6f636b732e0001015468652072656d61696e696e67207374616b65642066756e6473206d757374207374696c6c206265206c6172676572207468616e20746865206d696e696d756df0726571756972656420627920746869732070616c6c657420746f206d61696e7461696e2074686520737461747573206f662064656c656761746f722e00f454686520726573756c74696e6720746f74616c20616d6f756e74206f662066756e6473207374616b6564206d7573742062652077697468696e20746865cc616c6c6f7765642072616e67652061732073657420696e207468652070616c6c6574277320636f6e66696775726174696f6e2e0070456d697473206044656c656761746f725374616b65644c657373602e002823203c7765696768743e305765696768743a204f28312909012d2052656164733a205b4f726967696e204163636f756e745d2c2044656c656761746f7253746174652c20426c6f636b4e756d6265722c20556e7374616b696e672cd42020546f7043616e646964617465732c2043616e646964617465506f6f6c2c204d617853656c656374656443616e64696461746573cc2d205772697465733a20556e7374616b696e672c2044656c656761746f7253746174652c2043616e646964617465506f6f6c2c502020546f74616c436f6c6c61746f725374616b652c23203c2f7765696768743e3c756e6c6f636b5f756e7374616b65640401187461726765746d02018c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365001228f4556e6c6f636b20616c6c2070726576696f75736c79207374616b65642066756e6473207468617420617265206e6f7720617661696c61626c6520666f720501756e6c6f636b696e6720627920746865206f726967696e206163636f756e7420616674657220605374616b654475726174696f6e6020626c6f636b73206861766520656c61707365642e00fc5765696768743a204f285529207768657265205520697320746865206e756d626572206f66206c6f636b656420756e7374616b696e6720726571756573747380626f756e64656420627920604d6178556e7374616b655265717565737473602eac2d2052656164733a205b4f726967696e204163636f756e745d2c20556e7374616b696e672c204c6f636b73682d205772697465733a20556e7374616b696e672c204c6f636b73e82d204b696c6c733a20556e7374616b696e672026204c6f636b73206966206e6f2062616c616e6365206973206c6f636b656420616e796d6f72652c23203c2f7765696768743e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632efd020c4470617261636861696e5f7374616b696e671870616c6c6574144572726f720404540001784444656c656761746f724e6f74466f756e64000004b8546865206163636f756e74206973206e6f742070617274206f66207468652064656c656761746f7273207365742e4443616e6469646174654e6f74466f756e64000104dc546865206163636f756e74206973206e6f742070617274206f662074686520636f6c6c61746f722063616e64696461746573207365742e3c44656c656761746f72457869737473000204c8546865206163636f756e7420697320616c72656164792070617274206f66207468652064656c656761746f7273207365742e3c43616e646964617465457869737473000304ec546865206163636f756e7420697320616c72656164792070617274206f662074686520636f6c6c61746f722063616e64696461746573207365742e3056616c5374616b655a65726f000404e4546865206163636f756e7420747269656420746f207374616b65206d6f7265206f72206c657373207769746820616d6f756e74207a65726f2e4056616c5374616b6542656c6f774d696e0005080d01546865206163636f756e7420686173206e6f74207374616b656420656e6f7567682066756e647320746f20626520616464656420746f2074686520636f6c6c61746f723c63616e64696461746573207365742e4056616c5374616b6541626f76654d61780006041101546865206163636f756e742068617320616c7265616479207374616b656420746865206d6178696d756d20616d6f756e74206f662066756e647320706f737369626c652e404e6f6d5374616b6542656c6f774d696e000704f8546865206163636f756e7420686173206e6f74207374616b656420656e6f7567682066756e647320746f206265636f6d6520612064656c656761746f722e4844656c65676174696f6e42656c6f774d696e000808f8546865206163636f756e7420686173206e6f74207374616b656420656e6f7567682066756e647320746f2064656c6567617465206120636f6c6c61746f722863616e6469646174652e38416c72656164794c656176696e670009080d0154686520636f6c6c61746f722063616e6469646174652068617320616c72656164792074726967676572207468652070726f6365737320746f206c65617665207468656c736574206f6620636f6c6c61746f722063616e646964617465732e284e6f744c656176696e67000a08f454686520636f6c6c61746f722063616e6469646174652077616e74656420746f20657865637574652074686520657869742062757420686173206e6f74f472657175657374656420746f206c65617665206265666f72652062792063616c6c696e672060696e69745f6c656176655f63616e64696461746573602e3843616e6e6f744c65617665596574000b08dc54686520636f6c6c61746f7220747269656420746f206c65617665206265666f72652077616974696e67206174206c6561737420666f72746045786974517565756544656c617960206d616e7920726f756e64732e6443616e6e6f744a6f696e4265666f7265556e6c6f636b696e67000c10f8546865206163636f756e742068617320612066756c6c206c697374206f6620756e7374616b696e6720726571756573747320616e64206e6565647320746ffc756e6c6f636b206174206c65617374206f6e65206f66207468657365206265666f7265206265696e672061626c6520746f206a6f696e2028616761696e292edc4e4f54453a2043616e206f6e6c792068617070656e20696620746865206163636f756e742077617320612063616e646964617465206f72f464656c656761746f72206265666f726520616e642065697468657220676f74206b69636b6564206f722065786974656420766f6c756e746172696c792e44416c726561647944656c65676174696e67000d04e4546865206163636f756e7420697320616c72656164792064656c65676174696e672074686520636f6c6c61746f722063616e6469646174652e404e6f7459657444656c65676174696e67000e080901546865206163636f756e7420686173206e6f742064656c65676174656420616e7920636f6c6c61746f722063616e646964617465207965742c2068656e6365206974806973206e6f7420696e2074686520736574206f662064656c656761746f72732e6c44656c65676174696f6e73506572526f756e644578636565646564000f1811015468652064656c656761746f722068617320657863656564656420746865206e756d626572206f662064656c65676174696f6e732070657220726f756e6420776869636894697320657175616c20746f204d617844656c656761746f7273506572436f6c6c61746f722e000901546869732070726f746563747320616761696e73742061747461636b7320696e20776869636820612064656c656761746f722063616e2072652d64656c6567617465010166726f6d206120636f6c6c61746f722077686f2068617320616c726561647920617574686f726564206120626c6f636b2c20746f20616e6f74686572206f6e6570776869636820686173206e6f7420696e207468697320726f756e642e44546f6f4d616e7944656c656761746f7273001014010154686520636f6c6c61746f722063616e6469646174652068617320616c7265616479207265616368656420746865206d6178696d756d206e756d626572206f662c64656c656761746f72732e00050154686973206572726f722069732067656e65726174656420696e20636173652061206e65772064656c65676174696f6e207265717565737420646f6573206e6f74f47374616b6520656e6f7567682066756e647320746f207265706c61636520736f6d65206f74686572206578697374696e672064656c65676174696f6e2e60546f6f466577436f6c6c61746f7243616e64696461746573001108110154686520736574206f6620636f6c6c61746f722063616e6469646174657320776f756c642066616c6c2062656c6f7720746865207265717569726564206d696e696d756d5469662074686520636f6c6c61746f72206c6566742e5043616e6e6f745374616b6549664c656176696e67001208f854686520636f6c6c61746f722063616e64696461746520697320696e207468652070726f63657373206f66206c656176696e672074686520736574206f66010163616e6469646174657320616e642063616e6e6f7420706572666f726d20616e79206f7468657220616374696f6e7320696e20746865206d65616e74696d652e5c43616e6e6f7444656c656761746549664c656176696e67001308f854686520636f6c6c61746f722063616e64696461746520697320696e207468652070726f63657373206f66206c656176696e672074686520736574206f66ac63616e6469646174657320616e6420746875732063616e6e6f742062652064656c65676174656420746f2e804d6178436f6c6c61746f727350657244656c656761746f72457863656564656400140811015468652064656c656761746f722068617320616c72656164792064656c65676174656420746865206d6178696d756d206e756d626572206f662063616e6469646174657320616c6c6f7765642e60416c726561647944656c656761746564436f6c6c61746f72001508ec5468652064656c656761746f722068617320616c72656164792070726576696f75736c792064656c6567617465642074686520636f6c6c61746f722863616e6469646174652e4844656c65676174696f6e4e6f74466f756e64001604f854686520676976656e2064656c65676174696f6e20646f6573206e6f7420657869737420696e2074686520736574206f662064656c65676174696f6e732e24556e646572666c6f77001708050154686520636f6c6c61746f722064656c6567617465206f72207468652064656c656761746f7220697320747279696e6720746f20756e2d7374616b65206d6f72658066756e64732074686174206172652063757272656e746c79207374616b65642e4443616e6e6f7453657441626f76654d6178001808d8546865206e756d626572206f662073656c65637465642063616e6469646174657320706572207374616b696e6720726f756e642069738061626f766520746865206d6178696d756d2076616c756520616c6c6f7765642e4443616e6e6f7453657442656c6f774d696e001908d8546865206e756d626572206f662073656c65637465642063616e6469646174657320706572207374616b696e6720726f756e642069738062656c6f7720746865206d696e696d756d2076616c756520616c6c6f7765642e3c496e76616c69645363686564756c65001a04dc416e20696e76616c696420696e666c6174696f6e20636f6e66696775726174696f6e20697320747279696e6720746f206265207365742e3c4e6f4d6f7265556e7374616b696e67001b08c4546865207374616b696e6720726577617264206265696e6720756e6c6f636b656420646f6573206e6f742065786973742e7c4d617820756e6c6f636b696e6720726571756573747320726561636865642e345374616b654e6f74466f756e64001c04d850726f7669646564207374616b65642076616c7565206973207a65726f2e2053686f756c64206e65766572206265207468726f776e2e40556e7374616b696e674973456d707479001d049443616e6e6f7420756e6c6f636b207768656e20556e7374616b656420697320656d7074792e04ad010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f7273290a0909096f6620746869732070616c6c65742e0a090909010300000205030005030000040800090300090308447370697269746e65745f72756e74696d652c53657373696f6e4b6579730000040110617572610d0301c43c41757261206173202463726174653a3a426f756e64546f52756e74696d654170705075626c69633e3a3a5075626c696300000d03104473705f636f6e73656e7375735f617572611c737232353531392c6170705f73723235353139185075626c6963000004001103013c737232353531393a3a5075626c6963000011030c1c73705f636f72651c73723235353139185075626c6963000004000401205b75383b2033325d000015030000021c001903000004081d0328001d030c1c73705f636f72651863727970746f244b65795479706549640000040038011c5b75383b20345d000021030c3870616c6c65745f73657373696f6e1870616c6c65741043616c6c040454000108207365745f6b6579730801106b6579730903011c543a3a4b65797300011470726f6f6628011c5665633c75383e000038e453657473207468652073657373696f6e206b6579287329206f66207468652066756e6374696f6e2063616c6c657220746f20606b657973602e1d01416c6c6f777320616e206163636f756e7420746f20736574206974732073657373696f6e206b6579207072696f7220746f206265636f6d696e6720612076616c696461746f722ec05468697320646f65736e27742074616b652065666665637420756e74696c20746865206e6578742073657373696f6e2e00d0546865206469737061746368206f726967696e206f6620746869732066756e6374696f6e206d757374206265207369676e65642e002823203c7765696768743e11012d20436f6d706c65786974793a20604f283129602e2041637475616c20636f737420646570656e6473206f6e20746865206e756d626572206f66206c656e677468206f6698202060543a3a4b6579733a3a6b65795f6964732829602077686963682069732066697865642eec2d20446252656164733a20606f726967696e206163636f756e74602c2060543a3a56616c696461746f7249644f66602c20604e6578744b65797360a02d2044625772697465733a20606f726967696e206163636f756e74602c20604e6578744b65797360802d204462526561647320706572206b65792069643a20604b65794f776e657260842d20446257726974657320706572206b65792069643a20604b65794f776e6572602c23203c2f7765696768743e2870757267655f6b657973000140c852656d6f76657320616e792073657373696f6e206b6579287329206f66207468652066756e6374696f6e2063616c6c65722e00c05468697320646f65736e27742074616b652065666665637420756e74696c20746865206e6578742073657373696f6e2e005501546865206469737061746368206f726967696e206f6620746869732066756e6374696f6e206d757374206265205369676e656420616e6420746865206163636f756e74206d757374206265206569746865722062655d01636f6e7665727469626c6520746f20612076616c696461746f72204944207573696e672074686520636861696e2773207479706963616c2061646472657373696e672073797374656d20287468697320757375616c6c7951016d65616e73206265696e67206120636f6e74726f6c6c6572206163636f756e7429206f72206469726563746c7920636f6e7665727469626c6520696e746f20612076616c696461746f722049442028776869636894757375616c6c79206d65616e73206265696e672061207374617368206163636f756e74292e002823203c7765696768743e61012d20436f6d706c65786974793a20604f2831296020696e206e756d626572206f66206b65792074797065732e2041637475616c20636f737420646570656e6473206f6e20746865206e756d626572206f66206c656e677468a420206f662060543a3a4b6579733a3a6b65795f6964732829602077686963682069732066697865642eec2d20446252656164733a2060543a3a56616c696461746f7249644f66602c20604e6578744b657973602c20606f726967696e206163636f756e7460a02d2044625772697465733a20604e6578744b657973602c20606f726967696e206163636f756e7460842d20446257726974657320706572206b65792069643a20604b65794f776e6572602c23203c2f7765696768743e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e25030c3870616c6c65745f73657373696f6e1870616c6c6574144572726f7204045400011430496e76616c696450726f6f6600000460496e76616c6964206f776e6572736869702070726f6f662e5c4e6f4173736f63696174656456616c696461746f7249640001049c4e6f206173736f6369617465642076616c696461746f7220494420666f72206163636f756e742e344475706c6963617465644b65790002046452656769737465726564206475706c6963617465206b65792e184e6f4b657973000304a44e6f206b65797320617265206173736f63696174656420776974682074686973206163636f756e742e244e6f4163636f756e7400040419014b65792073657474696e67206163636f756e74206973206e6f74206c6976652c20736f206974277320696d706f737369626c6520746f206173736f6369617465206b6579732e04744572726f7220666f72207468652073657373696f6e2070616c6c65742e2903102873705f72756e74696d651c626f756e6465642c626f756e6465645f76656328426f756e646564566563080454010d030453000004002d0301185665633c543e00002d030000020d03003103084873705f636f6e73656e7375735f736c6f747310536c6f740000040010010c7536340000350300000239030039030000040c1c2400003d03000004088c18004103084070616c6c65745f64656d6f637261637938507265696d6167655374617475730c244163636f756e74496401001c42616c616e636501182c426c6f636b4e756d626572011001081c4d697373696e67040010012c426c6f636b4e756d62657200000024417661696c61626c651401106461746128011c5665633c75383e00012070726f76696465720001244163636f756e74496400011c6465706f73697418011c42616c616e636500011473696e636510012c426c6f636b4e756d6265720001186578706972791102014c4f7074696f6e3c426c6f636b4e756d6265723e0001000045030c4070616c6c65745f64656d6f6372616379147479706573385265666572656e64756d496e666f0c2c426c6f636b4e756d6265720110104861736801241c42616c616e6365011801081c4f6e676f696e670400490301b05265666572656e64756d5374617475733c426c6f636b4e756d6265722c20486173682c2042616c616e63653e0000002046696e6973686564080120617070726f766564a80110626f6f6c00010c656e6410012c426c6f636b4e756d6265720001000049030c4070616c6c65745f64656d6f6372616379147479706573405265666572656e64756d5374617475730c2c426c6f636b4e756d6265720110104861736801241c42616c616e636501180014010c656e6410012c426c6f636b4e756d62657200013470726f706f73616c5f68617368240110486173680001247468726573686f6c64900134566f74655468726573686f6c6400011464656c617910012c426c6f636b4e756d62657200011474616c6c794d03013854616c6c793c42616c616e63653e00004d030c4070616c6c65745f64656d6f63726163791474797065731454616c6c79041c42616c616e63650118000c01106179657318011c42616c616e63650001106e61797318011c42616c616e636500011c7475726e6f757418011c42616c616e6365000051030c4070616c6c65745f64656d6f637261637910766f746518566f74696e670c1c42616c616e63650118244163636f756e74496401002c426c6f636b4e756d62657201100108184469726563740c0114766f746573550301b05665633c285265666572656e64756d496e6465782c204163636f756e74566f74653c42616c616e63653e293e00012c64656c65676174696f6e735d03015044656c65676174696f6e733c42616c616e63653e0001147072696f726103017c5072696f724c6f636b3c426c6f636b4e756d6265722c2042616c616e63653e0000002844656c65676174696e6714011c62616c616e636518011c42616c616e63650001187461726765740001244163636f756e744964000128636f6e76696374696f6e65030128436f6e76696374696f6e00012c64656c65676174696f6e735d03015044656c65676174696f6e733c42616c616e63653e0001147072696f726103017c5072696f724c6f636b3c426c6f636b4e756d6265722c2042616c616e63653e0001000055030000025903005903000004081c9c005d030c4070616c6c65745f64656d6f63726163791474797065732c44656c65676174696f6e73041c42616c616e6365011800080114766f74657318011c42616c616e636500011c6361706974616c18011c42616c616e6365000061030c4070616c6c65745f64656d6f637261637910766f7465245072696f724c6f636b082c426c6f636b4e756d62657201101c42616c616e6365011800080010012c426c6f636b4e756d626572000018011c42616c616e6365000065030c4070616c6c65745f64656d6f637261637928636f6e76696374696f6e28436f6e76696374696f6e00011c104e6f6e65000000204c6f636b65643178000100204c6f636b65643278000200204c6f636b65643378000300204c6f636b65643478000400204c6f636b65643578000500204c6f636b65643678000600006903000004082490006d0300000408108c007103084070616c6c65745f64656d6f63726163792052656c65617365730001040856310000000075030c4070616c6c65745f64656d6f63726163791870616c6c65741043616c6c0404540001641c70726f706f736508013470726f706f73616c5f6861736824011c543a3a4861736800011476616c75655d01013042616c616e63654f663c543e00002c9c50726f706f736520612073656e73697469766520616374696f6e20746f2062652074616b656e2e001501546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737480686176652066756e647320746f20636f76657220746865206465706f7369742e00d42d206070726f706f73616c5f68617368603a205468652068617368206f66207468652070726f706f73616c20707265696d6167652e15012d206076616c7565603a2054686520616d6f756e74206f66206465706f73697420286d757374206265206174206c6561737420604d696e696d756d4465706f73697460292e0044456d697473206050726f706f736564602e00385765696768743a20604f28702960187365636f6e6408012070726f706f73616c4901012450726f70496e64657800014c7365636f6e64735f75707065725f626f756e644901010c753332000128b45369676e616c732061677265656d656e742077697468206120706172746963756c61722070726f706f73616c2e000101546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e64657211016d75737420686176652066756e647320746f20636f76657220746865206465706f7369742c20657175616c20746f20746865206f726967696e616c206465706f7369742e00c82d206070726f706f73616c603a2054686520696e646578206f66207468652070726f706f73616c20746f207365636f6e642e41012d20607365636f6e64735f75707065725f626f756e64603a20616e20757070657220626f756e64206f6e207468652063757272656e74206e756d626572206f66207365636f6e6473206f6e20746869732501202070726f706f73616c2e2045787472696e736963206973207765696768746564206163636f7264696e6720746f20746869732076616c75652077697468206e6f20726566756e642e001d015765696768743a20604f28532960207768657265205320697320746865206e756d626572206f66207365636f6e647320612070726f706f73616c20616c7265616479206861732e10766f74650801247265665f696e6465784901013c5265666572656e64756d496e646578000110766f74659c01644163636f756e74566f74653c42616c616e63654f663c543e3e0002243101566f746520696e2061207265666572656e64756d2e2049662060766f74652e69735f6179652829602c2074686520766f746520697320746f20656e616374207468652070726f706f73616c3bb86f7468657277697365206974206973206120766f746520746f206b65657020746865207374617475732071756f2e00c8546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2e00dc2d20607265665f696e646578603a2054686520696e646578206f6620746865207265666572656e64756d20746f20766f746520666f722e842d2060766f7465603a2054686520766f746520636f6e66696775726174696f6e2e002d015765696768743a20604f28522960207768657265205220697320746865206e756d626572206f66207265666572656e64756d732074686520766f7465722068617320766f746564206f6e2e40656d657267656e63795f63616e63656c0401247265665f696e6465781c013c5265666572656e64756d496e6465780003204d015363686564756c6520616e20656d657267656e63792063616e63656c6c6174696f6e206f662061207265666572656e64756d2e2043616e6e6f742068617070656e20747769636520746f207468652073616d652c7265666572656e64756d2e00f8546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265206043616e63656c6c6174696f6e4f726967696e602e00d02d607265665f696e646578603a2054686520696e646578206f6620746865207265666572656e64756d20746f2063616e63656c2e003c5765696768743a20604f283129602e4065787465726e616c5f70726f706f736504013470726f706f73616c5f6861736824011c543a3a486173680004242d015363686564756c652061207265666572656e64756d20746f206265207461626c6564206f6e6365206974206973206c6567616c20746f207363686564756c6520616e2065787465726e616c2c7265666572656e64756d2e00e8546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265206045787465726e616c4f726967696e602e00d42d206070726f706f73616c5f68617368603a2054686520707265696d6167652068617368206f66207468652070726f706f73616c2e0015015765696768743a20604f2856296020776974682056206e756d626572206f66207665746f65727320696e2074686520626c61636b6c697374206f662070726f706f73616c2eb820204465636f64696e6720766563206f66206c656e67746820562e2043686172676564206173206d6178696d756d6465787465726e616c5f70726f706f73655f6d616a6f7269747904013470726f706f73616c5f6861736824011c543a3a4861736800052c55015363686564756c652061206d616a6f726974792d63617272696573207265666572656e64756d20746f206265207461626c6564206e657874206f6e6365206974206973206c6567616c20746f207363686564756c655c616e2065787465726e616c207265666572656e64756d2e00ec546865206469737061746368206f6620746869732063616c6c206d757374206265206045787465726e616c4d616a6f726974794f726967696e602e00d42d206070726f706f73616c5f68617368603a2054686520707265696d6167652068617368206f66207468652070726f706f73616c2e004901556e6c696b65206065787465726e616c5f70726f706f7365602c20626c61636b6c697374696e6720686173206e6f20656666656374206f6e207468697320616e64206974206d6179207265706c6163652061987072652d7363686564756c6564206065787465726e616c5f70726f706f7365602063616c6c2e00385765696768743a20604f283129606065787465726e616c5f70726f706f73655f64656661756c7404013470726f706f73616c5f6861736824011c543a3a4861736800062c45015363686564756c652061206e656761746976652d7475726e6f75742d62696173207265666572656e64756d20746f206265207461626c6564206e657874206f6e6365206974206973206c6567616c20746f807363686564756c6520616e2065787465726e616c207265666572656e64756d2e00e8546865206469737061746368206f6620746869732063616c6c206d757374206265206045787465726e616c44656661756c744f726967696e602e00d42d206070726f706f73616c5f68617368603a2054686520707265696d6167652068617368206f66207468652070726f706f73616c2e004901556e6c696b65206065787465726e616c5f70726f706f7365602c20626c61636b6c697374696e6720686173206e6f20656666656374206f6e207468697320616e64206974206d6179207265706c6163652061987072652d7363686564756c6564206065787465726e616c5f70726f706f7365602063616c6c2e00385765696768743a20604f2831296028666173745f747261636b0c013470726f706f73616c5f6861736824011c543a3a48617368000134766f74696e675f706572696f64100138543a3a426c6f636b4e756d62657200011464656c6179100138543a3a426c6f636b4e756d6265720007404d015363686564756c65207468652063757272656e746c792065787465726e616c6c792d70726f706f736564206d616a6f726974792d63617272696573207265666572656e64756d20746f206265207461626c65646101696d6d6564696174656c792e204966207468657265206973206e6f2065787465726e616c6c792d70726f706f736564207265666572656e64756d2063757272656e746c792c206f72206966207468657265206973206f6e65e8627574206974206973206e6f742061206d616a6f726974792d63617272696573207265666572656e64756d207468656e206974206661696c732e00d0546865206469737061746368206f6620746869732063616c6c206d757374206265206046617374547261636b4f726967696e602e00f42d206070726f706f73616c5f68617368603a205468652068617368206f66207468652063757272656e742065787465726e616c2070726f706f73616c2e29012d2060766f74696e675f706572696f64603a2054686520706572696f64207468617420697320616c6c6f77656420666f7220766f74696e67206f6e20746869732070726f706f73616c2e88094d75737420626520616c776179732067726561746572207468616e207a65726f2e350109466f72206046617374547261636b4f726967696e60206d75737420626520657175616c206f722067726561746572207468616e206046617374547261636b566f74696e67506572696f64602e51012d206064656c6179603a20546865206e756d626572206f6620626c6f636b20616674657220766f74696e672068617320656e64656420696e20617070726f76616c20616e6420746869732073686f756c64206265b82020656e61637465642e205468697320646f65736e277420686176652061206d696e696d756d20616d6f756e742e0040456d697473206053746172746564602e00385765696768743a20604f28312960347665746f5f65787465726e616c04013470726f706f73616c5f6861736824011c543a3a48617368000824b85665746f20616e6420626c61636b6c697374207468652065787465726e616c2070726f706f73616c20686173682e00d8546865206469737061746368206f726967696e206f6620746869732063616c6c206d75737420626520605665746f4f726967696e602e002d012d206070726f706f73616c5f68617368603a2054686520707265696d6167652068617368206f66207468652070726f706f73616c20746f207665746f20616e6420626c61636b6c6973742e003c456d69747320605665746f6564602e00fc5765696768743a20604f2856202b206c6f6728562929602077686572652056206973206e756d626572206f6620606578697374696e67207665746f657273604463616e63656c5f7265666572656e64756d0401247265665f696e6465784901013c5265666572656e64756d496e64657800091c5052656d6f76652061207265666572656e64756d2e00c0546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f526f6f745f2e00d42d20607265665f696e646578603a2054686520696e646578206f6620746865207265666572656e64756d20746f2063616e63656c2e004423205765696768743a20604f283129602e3463616e63656c5f71756575656404011477686963681c013c5265666572656e64756d496e646578000a1c9c43616e63656c20612070726f706f73616c2071756575656420666f7220656e6163746d656e742e00c0546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f526f6f745f2e00c42d20607768696368603a2054686520696e646578206f6620746865207265666572656e64756d20746f2063616e63656c2e0049015765696768743a20604f284429602077686572652060446020697320746865206974656d7320696e207468652064697370617463682071756575652e205765696768746564206173206044203d203130602e2064656c65676174650c0108746f000130543a3a4163636f756e744964000128636f6e76696374696f6e65030128436f6e76696374696f6e00011c62616c616e636518013042616c616e63654f663c543e000b50390144656c65676174652074686520766f74696e6720706f77657220287769746820736f6d6520676976656e20636f6e76696374696f6e29206f66207468652073656e64696e67206163636f756e742e0055015468652062616c616e63652064656c656761746564206973206c6f636b656420666f72206173206c6f6e6720617320697427732064656c6567617465642c20616e64207468657265616674657220666f7220746865c874696d6520617070726f70726961746520666f722074686520636f6e76696374696f6e2773206c6f636b20706572696f642e005d01546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2c20616e6420746865207369676e696e67206163636f756e74206d757374206569746865723a7420202d2062652064656c65676174696e6720616c72656164793b206f72590120202d2068617665206e6f20766f74696e67206163746976697479202869662074686572652069732c207468656e2069742077696c6c206e65656420746f2062652072656d6f7665642f636f6e736f6c69646174656494202020207468726f7567682060726561705f766f746560206f722060756e766f746560292e0045012d2060746f603a20546865206163636f756e742077686f736520766f74696e6720746865206074617267657460206163636f756e74277320766f74696e6720706f7765722077696c6c20666f6c6c6f772e55012d2060636f6e76696374696f6e603a2054686520636f6e76696374696f6e20746861742077696c6c20626520617474616368656420746f207468652064656c65676174656420766f7465732e205768656e20746865410120206163636f756e7420697320756e64656c6567617465642c207468652066756e64732077696c6c206265206c6f636b656420666f722074686520636f72726573706f6e64696e6720706572696f642e61012d206062616c616e6365603a2054686520616d6f756e74206f6620746865206163636f756e7427732062616c616e636520746f206265207573656420696e2064656c65676174696e672e2054686973206d757374206e6f74b420206265206d6f7265207468616e20746865206163636f756e7427732063757272656e742062616c616e63652e0048456d697473206044656c656761746564602e003d015765696768743a20604f28522960207768657265205220697320746865206e756d626572206f66207265666572656e64756d732074686520766f7465722064656c65676174696e6720746f20686173c82020766f746564206f6e2e205765696768742069732063686172676564206173206966206d6178696d756d20766f7465732e28756e64656c6567617465000c30cc556e64656c65676174652074686520766f74696e6720706f776572206f66207468652073656e64696e67206163636f756e742e005d01546f6b656e73206d617920626520756e6c6f636b656420666f6c6c6f77696e67206f6e636520616e20616d6f756e74206f662074696d6520636f6e73697374656e74207769746820746865206c6f636b20706572696f64dc6f662074686520636f6e76696374696f6e2077697468207768696368207468652064656c65676174696f6e20776173206973737565642e004501546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f20616e6420746865207369676e696e67206163636f756e74206d7573742062655463757272656e746c792064656c65676174696e672e0050456d6974732060556e64656c656761746564602e003d015765696768743a20604f28522960207768657265205220697320746865206e756d626572206f66207265666572656e64756d732074686520766f7465722064656c65676174696e6720746f20686173c82020766f746564206f6e2e205765696768742069732063686172676564206173206966206d6178696d756d20766f7465732e58636c6561725f7075626c69635f70726f706f73616c73000d1470436c6561727320616c6c207075626c69632070726f706f73616c732e00c0546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f526f6f745f2e003c5765696768743a20604f283129602e346e6f74655f707265696d616765040140656e636f6465645f70726f706f73616c28011c5665633c75383e000e285d0152656769737465722074686520707265696d61676520666f7220616e207570636f6d696e672070726f706f73616c2e205468697320646f65736e27742072657175697265207468652070726f706f73616c20746f2062652101696e207468652064697370617463682071756575652062757420646f657320726571756972652061206465706f7369742c2072657475726e6564206f6e636520656e61637465642e00c8546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2e00c42d2060656e636f6465645f70726f706f73616c603a2054686520707265696d616765206f6620612070726f706f73616c2e0058456d6974732060507265696d6167654e6f746564602e004d015765696768743a20604f28452960207769746820452073697a65206f662060656e636f6465645f70726f706f73616c60202870726f7465637465642062792061207265717569726564206465706f736974292e646e6f74655f707265696d6167655f6f7065726174696f6e616c040140656e636f6465645f70726f706f73616c28011c5665633c75383e000f04090153616d6520617320606e6f74655f707265696d6167656020627574206f726967696e20697320604f7065726174696f6e616c507265696d6167654f726967696e602e586e6f74655f696d6d696e656e745f707265696d616765040140656e636f6465645f70726f706f73616c28011c5665633c75383e001030410152656769737465722074686520707265696d61676520666f7220616e207570636f6d696e672070726f706f73616c2e2054686973207265717569726573207468652070726f706f73616c20746f2062653d01696e207468652064697370617463682071756575652e204e6f206465706f736974206973206e65656465642e205768656e20746869732063616c6c206973207375636365737366756c2c20692e652e350174686520707265696d61676520686173206e6f74206265656e2075706c6f61646564206265666f726520616e64206d61746368657320736f6d6520696d6d696e656e742070726f706f73616c2c3c6e6f2066656520697320706169642e00c8546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2e00c42d2060656e636f6465645f70726f706f73616c603a2054686520707265696d616765206f6620612070726f706f73616c2e0058456d6974732060507265696d6167654e6f746564602e004d015765696768743a20604f28452960207769746820452073697a65206f662060656e636f6465645f70726f706f73616c60202870726f7465637465642062792061207265717569726564206465706f736974292e886e6f74655f696d6d696e656e745f707265696d6167655f6f7065726174696f6e616c040140656e636f6465645f70726f706f73616c28011c5665633c75383e0011042d0153616d6520617320606e6f74655f696d6d696e656e745f707265696d6167656020627574206f726967696e20697320604f7065726174696f6e616c507265696d6167654f726967696e602e34726561705f707265696d61676508013470726f706f73616c5f6861736824011c543a3a4861736800016070726f706f73616c5f6c656e5f75707065725f626f756e644901010c75333200123cf052656d6f766520616e20657870697265642070726f706f73616c20707265696d61676520616e6420636f6c6c65637420746865206465706f7369742e00c8546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2e00cc2d206070726f706f73616c5f68617368603a2054686520707265696d6167652068617368206f6620612070726f706f73616c2e5d012d206070726f706f73616c5f6c656e6774685f75707065725f626f756e64603a20616e20757070657220626f756e64206f6e206c656e677468206f66207468652070726f706f73616c2e2045787472696e736963206973c820207765696768746564206163636f7264696e6720746f20746869732076616c75652077697468206e6f20726566756e642e004d01546869732077696c6c206f6e6c7920776f726b2061667465722060566f74696e67506572696f646020626c6f636b732066726f6d207468652074696d6520746861742074686520707265696d6167652077617359016e6f7465642c2069662069742773207468652073616d65206163636f756e7420646f696e672069742e2049662069742773206120646966666572656e74206163636f756e742c207468656e206974276c6c206f6e6c79ac776f726b20616e206164646974696f6e616c2060456e6163746d656e74506572696f6460206c617465722e005c456d6974732060507265696d616765526561706564602e00b45765696768743a20604f284429602077686572652044206973206c656e677468206f662070726f706f73616c2e18756e6c6f636b040118746172676574000130543a3a4163636f756e74496400131ca0556e6c6f636b20746f6b656e732074686174206861766520616e2065787069726564206c6f636b2e00c8546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2e00b82d2060746172676574603a20546865206163636f756e7420746f2072656d6f766520746865206c6f636b206f6e2e00bc5765696768743a20604f2852296020776974682052206e756d626572206f6620766f7465206f66207461726765742e2c72656d6f76655f766f7465040114696e6465781c013c5265666572656e64756d496e64657800146c7c52656d6f7665206120766f746520666f722061207265666572656e64756d2e000c49663a882d20746865207265666572656e64756d207761732063616e63656c6c65642c206f727c2d20746865207265666572656e64756d206973206f6e676f696e672c206f72902d20746865207265666572656e64756d2068617320656e64656420737563682074686174fc20202d2074686520766f7465206f6620746865206163636f756e742077617320696e206f70706f736974696f6e20746f2074686520726573756c743b206f72d420202d20746865726520776173206e6f20636f6e76696374696f6e20746f20746865206163636f756e74277320766f74653b206f728420202d20746865206163636f756e74206d61646520612073706c697420766f74655d012e2e2e7468656e2074686520766f74652069732072656d6f76656420636c65616e6c7920616e64206120666f6c6c6f77696e672063616c6c20746f2060756e6c6f636b60206d617920726573756c7420696e206d6f72655866756e6473206265696e6720617661696c61626c652e00a849662c20686f77657665722c20746865207265666572656e64756d2068617320656e64656420616e643aec2d2069742066696e697368656420636f72726573706f6e64696e6720746f2074686520766f7465206f6620746865206163636f756e742c20616e64dc2d20746865206163636f756e74206d6164652061207374616e6461726420766f7465207769746820636f6e76696374696f6e2c20616e64bc2d20746865206c6f636b20706572696f64206f662074686520636f6e76696374696f6e206973206e6f74206f76657259012e2e2e7468656e20746865206c6f636b2077696c6c206265206167677265676174656420696e746f20746865206f766572616c6c206163636f756e742773206c6f636b2c207768696368206d617920696e766f6c766559012a6f7665726c6f636b696e672a20287768657265207468652074776f206c6f636b732061726520636f6d62696e656420696e746f20612073696e676c65206c6f636b207468617420697320746865206d6178696d756de46f6620626f74682074686520616d6f756e74206c6f636b656420616e64207468652074696d65206973206974206c6f636b656420666f72292e004901546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2c20616e6420746865207369676e6572206d7573742068617665206120766f7465887265676973746572656420666f72207265666572656e64756d2060696e646578602e00f42d2060696e646578603a2054686520696e646578206f66207265666572656e64756d206f662074686520766f746520746f2062652072656d6f7665642e0055015765696768743a20604f2852202b206c6f6720522960207768657265205220697320746865206e756d626572206f66207265666572656e646120746861742060746172676574602068617320766f746564206f6e2ed820205765696768742069732063616c63756c6174656420666f7220746865206d6178696d756d206e756d626572206f6620766f74652e4472656d6f76655f6f746865725f766f7465080118746172676574000130543a3a4163636f756e744964000114696e6465781c013c5265666572656e64756d496e64657800153c7c52656d6f7665206120766f746520666f722061207265666572656e64756d2e004d0149662074686520607461726765746020697320657175616c20746f20746865207369676e65722c207468656e20746869732066756e6374696f6e2069732065786163746c79206571756976616c656e7420746f2d016072656d6f76655f766f7465602e204966206e6f7420657175616c20746f20746865207369676e65722c207468656e2074686520766f7465206d757374206861766520657870697265642c5501656974686572206265636175736520746865207265666572656e64756d207761732063616e63656c6c65642c20626563617573652074686520766f746572206c6f737420746865207265666572656e64756d206f7298626563617573652074686520636f6e76696374696f6e20706572696f64206973206f7665722e00c8546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2e004d012d2060746172676574603a20546865206163636f756e74206f662074686520766f746520746f2062652072656d6f7665643b2074686973206163636f756e74206d757374206861766520766f74656420666f725420207265666572656e64756d2060696e646578602ef42d2060696e646578603a2054686520696e646578206f66207265666572656e64756d206f662074686520766f746520746f2062652072656d6f7665642e0055015765696768743a20604f2852202b206c6f6720522960207768657265205220697320746865206e756d626572206f66207265666572656e646120746861742060746172676574602068617320766f746564206f6e2ed820205765696768742069732063616c63756c6174656420666f7220746865206d6178696d756d206e756d626572206f6620766f74652e38656e6163745f70726f706f73616c08013470726f706f73616c5f6861736824011c543a3a48617368000114696e6465781c013c5265666572656e64756d496e6465780016044d01456e61637420612070726f706f73616c2066726f6d2061207265666572656e64756d2e20466f72206e6f77207765206a757374206d616b65207468652077656967687420626520746865206d6178696d756d2e24626c61636b6c69737408013470726f706f73616c5f6861736824011c543a3a4861736800013c6d617962655f7265665f696e6465787903015c4f7074696f6e3c5265666572656e64756d496e6465783e00173c45015065726d616e656e746c7920706c61636520612070726f706f73616c20696e746f2074686520626c61636b6c6973742e20546869732070726576656e74732069742066726f6d2065766572206265696e673c70726f706f73656420616761696e2e00510149662063616c6c6564206f6e206120717565756564207075626c6963206f722065787465726e616c2070726f706f73616c2c207468656e20746869732077696c6c20726573756c7420696e206974206265696e67510172656d6f7665642e2049662074686520607265665f696e6465786020737570706c69656420697320616e20616374697665207265666572656e64756d2077697468207468652070726f706f73616c20686173682c687468656e2069742077696c6c2062652063616e63656c6c65642e00ec546865206469737061746368206f726967696e206f6620746869732063616c6c206d7573742062652060426c61636b6c6973744f726967696e602e00f82d206070726f706f73616c5f68617368603a205468652070726f706f73616c206861736820746f20626c61636b6c697374207065726d616e656e746c792e45012d20607265665f696e646578603a20416e206f6e676f696e67207265666572656e64756d2077686f73652068617368206973206070726f706f73616c5f68617368602c2077686963682077696c6c2062652863616e63656c6c65642e0041015765696768743a20604f28702960202874686f756768206173207468697320697320616e20686967682d70726976696c6567652064697370617463682c20776520617373756d65206974206861732061502020726561736f6e61626c652076616c7565292e3c63616e63656c5f70726f706f73616c04012870726f705f696e6465784901012450726f70496e64657800181c4852656d6f766520612070726f706f73616c2e000101546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265206043616e63656c50726f706f73616c4f726967696e602e00d02d206070726f705f696e646578603a2054686520696e646578206f66207468652070726f706f73616c20746f2063616e63656c2e00e45765696768743a20604f28702960207768657265206070203d205075626c696350726f70733a3a3c543e3a3a6465636f64655f6c656e282960042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e790304184f7074696f6e040454011c0108104e6f6e6500000010536f6d6504001c00000100007d030c4070616c6c65745f64656d6f63726163791870616c6c6574144572726f720404540001742056616c75654c6f770000043456616c756520746f6f206c6f773c50726f706f73616c4d697373696e670001045c50726f706f73616c20646f6573206e6f742065786973743c416c726561647943616e63656c65640002049443616e6e6f742063616e63656c207468652073616d652070726f706f73616c207477696365444475706c696361746550726f706f73616c0003045450726f706f73616c20616c7265616479206d6164654c50726f706f73616c426c61636b6c69737465640004046850726f706f73616c207374696c6c20626c61636b6c6973746564444e6f7453696d706c654d616a6f72697479000504a84e6578742065787465726e616c2070726f706f73616c206e6f742073696d706c65206d616a6f726974792c496e76616c69644861736800060430496e76616c69642068617368284e6f50726f706f73616c000704504e6f2065787465726e616c2070726f706f73616c34416c72656164795665746f6564000804984964656e74697479206d6179206e6f74207665746f20612070726f706f73616c207477696365444475706c6963617465507265696d61676500090458507265696d61676520616c7265616479206e6f7465642c4e6f74496d6d696e656e74000a04304e6f7420696d6d696e656e7420546f6f4561726c79000b0424546f6f206561726c7920496d6d696e656e74000c0420496d6d696e656e743c507265696d6167654d697373696e67000d0448507265696d616765206e6f7420666f756e64445265666572656e64756d496e76616c6964000e0484566f746520676976656e20666f7220696e76616c6964207265666572656e64756d3c507265696d616765496e76616c6964000f0440496e76616c696420707265696d6167652c4e6f6e6557616974696e67001004504e6f2070726f706f73616c732077616974696e67204e6f74566f746572001104c454686520676976656e206163636f756e7420646964206e6f7420766f7465206f6e20746865207265666572656e64756d2e304e6f5065726d697373696f6e001204c8546865206163746f7220686173206e6f207065726d697373696f6e20746f20636f6e647563742074686520616374696f6e2e44416c726561647944656c65676174696e6700130488546865206163636f756e7420697320616c72656164792064656c65676174696e672e44496e73756666696369656e7446756e6473001404fc546f6f206869676820612062616c616e6365207761732070726f7669646564207468617420746865206163636f756e742063616e6e6f74206166666f72642e344e6f7444656c65676174696e67001504a0546865206163636f756e74206973206e6f742063757272656e746c792064656c65676174696e672e28566f74657345786973740016085501546865206163636f756e742063757272656e746c792068617320766f74657320617474616368656420746f20697420616e6420746865206f7065726174696f6e2063616e6e6f74207375636365656420756e74696ce87468657365206172652072656d6f7665642c20656974686572207468726f7567682060756e766f746560206f722060726561705f766f7465602e44496e7374616e744e6f74416c6c6f776564001704d854686520696e7374616e74207265666572656e64756d206f726967696e2069732063757272656e746c7920646973616c6c6f7765642e204e6f6e73656e73650018049444656c65676174696f6e20746f206f6e6573656c66206d616b6573206e6f2073656e73652e3c57726f6e675570706572426f756e6400190450496e76616c696420757070657220626f756e642e3c4d6178566f74657352656163686564001a04804d6178696d756d206e756d626572206f6620766f74657320726561636865642e40546f6f4d616e7950726f706f73616c73001b04904d6178696d756d206e756d626572206f662070726f706f73616c7320726561636865642e3c566f74696e67506572696f644c6f77001c0454566f74696e6720706572696f6420746f6f206c6f7704ad010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f7273290a0909096f6620746869732070616c6c65742e0a0909098103102873705f72756e74696d651c626f756e6465642c626f756e6465645f76656328426f756e6465645665630804540124045300000400e10101185665633c543e0000850308447370697269746e65745f72756e74696d651043616c6c00017c1853797374656d0400f10101ad0173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c53797374656d2c2052756e74696d653e0000002454696d657374616d700400390201b90173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c54696d657374616d702c2052756e74696d653e0002001c496e64696365730400410201b10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c496e64696365732c2052756e74696d653e0005002042616c616e6365730400690201b50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c42616c616e6365732c2052756e74696d653e00060028417574686f72736869700400910201bd0173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c417574686f72736869702c2052756e74696d653e0014004050617261636861696e5374616b696e670400f90201d50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c50617261636861696e5374616b696e672c2052756e74696d653e0015001c53657373696f6e0400210301b10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c53657373696f6e2c2052756e74696d653e0016002444656d6f63726163790400750301b90173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c44656d6f63726163792c2052756e74696d653e001e001c436f756e63696c0400890301b10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c436f756e63696c2c2052756e74696d653e001f0048546563686e6963616c436f6d6d697474656504008d0301dd0173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c546563686e6963616c436f6d6d69747465652c2052756e74696d653e0020004c546563686e6963616c4d656d626572736869700400910301e10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c546563686e6963616c4d656d626572736869702c2052756e74696d653e0022002054726561737572790400950301b50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c54726561737572792c2052756e74696d653e0023003852656c61794d6967726174696f6e0400990301cd0173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c52656c61794d6967726174696f6e2c2052756e74696d653e0024002444796e46696c74657204009d0301b90173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c44796e46696c7465722c2052756e74696d653e0025001c5574696c6974790400a10301b10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c5574696c6974792c2052756e74696d653e0028001c56657374696e670400c90301b10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c56657374696e672c2052756e74696d653e002900245363686564756c65720400d10301b90173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c5363686564756c65722c2052756e74696d653e002a001450726f78790400dd0301a90173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c50726f78792c2052756e74696d653e002b0020507265696d6167650400e50301b50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c507265696d6167652c2052756e74696d653e002c0038546970734d656d626572736869700400e90301cd0173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c546970734d656d626572736869702c2052756e74696d653e002d0010546970730400ed0301a50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c546970732c2052756e74696d653e002e001443747970650400f10301a90173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c43747970652c2052756e74696d653e003d002c4174746573746174696f6e0400f50301c10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c4174746573746174696f6e2c2052756e74696d653e003e002844656c65676174696f6e0400090401bd0173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c44656c65676174696f6e2c2052756e74696d653e003f000c4469640400250401a10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c4469642c2052756e74696d653e004000244469644c6f6f6b75700400790401b90173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c4469644c6f6f6b75702c2052756e74696d653e00430024576562334e616d65730400810401b90173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c576562334e616d65732c2052756e74696d653e0044003c50617261636861696e53797374656d0400850401d10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c50617261636861696e53797374656d2c2052756e74696d653e0050002458636d7051756575650400b90401b90173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c58636d7051756575652c2052756e74696d653e0052002c506f6c6b61646f7458636d0400bd0401c10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c506f6c6b61646f7458636d2c2052756e74696d653e00530020446d7051756575650400210501b50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c446d7051756575652c2052756e74696d653e0055000089030c4470616c6c65745f636f6c6c6563746976651870616c6c65741043616c6c0804540004490001182c7365745f6d656d626572730c012c6e65775f6d656d626572738c01445665633c543a3a4163636f756e7449643e0001147072696d65890201504f7074696f6e3c543a3a4163636f756e7449643e0001246f6c645f636f756e741c012c4d656d626572436f756e74000080805365742074686520636f6c6c6563746976652773206d656d626572736869702e0045012d20606e65775f6d656d62657273603a20546865206e6577206d656d626572206c6973742e204265206e69636520746f2074686520636861696e20616e642070726f7669646520697420736f727465642ee02d20607072696d65603a20546865207072696d65206d656d6265722077686f736520766f74652073657473207468652064656661756c742e59012d20606f6c645f636f756e74603a2054686520757070657220626f756e6420666f72207468652070726576696f7573206e756d626572206f66206d656d6265727320696e2073746f726167652e205573656420666f7250202077656967687420657374696d6174696f6e2e0054526571756972657320726f6f74206f726967696e2e0051014e4f54453a20446f6573206e6f7420656e666f7263652074686520657870656374656420604d61784d656d6265727360206c696d6974206f6e2074686520616d6f756e74206f66206d656d626572732c2062757421012020202020207468652077656967687420657374696d6174696f6e732072656c79206f6e20697420746f20657374696d61746520646973706174636861626c65207765696768742e002823205741524e494e473a005901546865206070616c6c65742d636f6c6c656374697665602063616e20616c736f206265206d616e61676564206279206c6f676963206f757473696465206f66207468652070616c6c6574207468726f75676820746865b8696d706c656d656e746174696f6e206f6620746865207472616974205b604368616e67654d656d62657273605d2e5501416e792063616c6c20746f20607365745f6d656d6265727360206d757374206265206361726566756c207468617420746865206d656d6265722073657420646f65736e277420676574206f7574206f662073796e63a477697468206f74686572206c6f676963206d616e6167696e6720746865206d656d626572207365742e002823203c7765696768743e24232320576569676874502d20604f284d50202b204e29602077686572653ae020202d20604d60206f6c642d6d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e64656429e020202d20604e60206e65772d6d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e646564299820202d206050602070726f706f73616c732d636f756e742028636f64652d626f756e64656429142d2044423a510120202d20312073746f72616765206d75746174696f6e2028636f64656320604f284d296020726561642c20604f284e29602077726974652920666f722072656164696e6720616e642077726974696e67207468652c202020206d656d62657273ec20202d20312073746f7261676520726561642028636f64656320604f285029602920666f722072656164696e67207468652070726f706f73616c73450120202d206050602073746f72616765206d75746174696f6e732028636f64656320604f284d29602920666f72207570646174696e672074686520766f74657320666f7220656163682070726f706f73616c5d0120202d20312073746f726167652077726974652028636f64656320604f283129602920666f722064656c6574696e6720746865206f6c6420607072696d656020616e642073657474696e6720746865206e6577206f6e652c23203c2f7765696768743e1c6578656375746508012070726f706f73616c8503017c426f783c3c5420617320436f6e6669673c493e3e3a3a50726f706f73616c3e0001306c656e6774685f626f756e644901010c75333200012cf0446973706174636820612070726f706f73616c2066726f6d2061206d656d626572207573696e672074686520604d656d62657260206f726967696e2e00a84f726967696e206d7573742062652061206d656d626572206f662074686520636f6c6c6563746976652e002823203c7765696768743e2423232057656967687455012d20604f284d202b2050296020776865726520604d60206d656d626572732d636f756e742028636f64652d626f756e6465642920616e642060506020636f6d706c6578697479206f66206469737061746368696e673020206070726f706f73616c60d42d2044423a203120726561642028636f64656320604f284d296029202b20444220616363657373206f66206070726f706f73616c60242d2031206576656e742c23203c2f7765696768743e1c70726f706f73650c01247468726573686f6c644901012c4d656d626572436f756e7400012070726f706f73616c8503017c426f783c3c5420617320436f6e6669673c493e3e3a3a50726f706f73616c3e0001306c656e6774685f626f756e644901010c75333200026cf84164642061206e65772070726f706f73616c20746f2065697468657220626520766f746564206f6e206f72206578656375746564206469726563746c792e00845265717569726573207468652073656e64657220746f206265206d656d6265722e004101607468726573686f6c64602064657465726d696e65732077686574686572206070726f706f73616c60206973206578656375746564206469726563746c792028607468726573686f6c64203c20326029546f722070757420757020666f7220766f74696e672e002823203c7765696768743e24232320576569676874ac2d20604f2842202b204d202b2050312960206f7220604f2842202b204d202b20503229602077686572653ae020202d20604260206973206070726f706f73616c602073697a6520696e20627974657320286c656e6774682d6665652d626f756e64656429dc20202d20604d60206973206d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e64656429c420202d206272616e6368696e6720697320696e666c75656e63656420627920607468726573686f6c64602077686572653af4202020202d20605031602069732070726f706f73616c20657865637574696f6e20636f6d706c65786974792028607468726573686f6c64203c20326029fc202020202d20605032602069732070726f706f73616c732d636f756e742028636f64652d626f756e646564292028607468726573686f6c64203e3d20326029142d2044423ab420202d20312073746f726167652072656164206069735f6d656d626572602028636f64656320604f284d296029f020202d20312073746f726167652072656164206050726f706f73616c4f663a3a636f6e7461696e735f6b6579602028636f64656320604f2831296029a820202d20444220616363657373657320696e666c75656e63656420627920607468726573686f6c64603a0901202020202d204549544845522073746f7261676520616363657373657320646f6e65206279206070726f706f73616c602028607468726573686f6c64203c20326029b8202020202d204f522070726f706f73616c20696e73657274696f6e2028607468726573686f6c64203c3d20326029d82020202020202d20312073746f72616765206d75746174696f6e206050726f706f73616c73602028636f64656320604f285032296029e42020202020202d20312073746f72616765206d75746174696f6e206050726f706f73616c436f756e74602028636f64656320604f2831296029cc2020202020202d20312073746f72616765207772697465206050726f706f73616c4f66602028636f64656320604f2842296029bc2020202020202d20312073746f726167652077726974652060566f74696e67602028636f64656320604f284d2960292c20202d2031206576656e742c23203c2f7765696768743e10766f74650c012070726f706f73616c24011c543a3a48617368000114696e6465784901013450726f706f73616c496e64657800011c617070726f7665a80110626f6f6c00033cf041646420616e20617965206f72206e617920766f746520666f72207468652073656e64657220746f2074686520676976656e2070726f706f73616c2e008c5265717569726573207468652073656e64657220746f2062652061206d656d6265722e0049015472616e73616374696f6e20666565732077696c6c2062652077616976656420696620746865206d656d62657220697320766f74696e67206f6e20616e7920706172746963756c61722070726f706f73616c5101666f72207468652066697273742074696d6520616e64207468652063616c6c206973207375636365737366756c2e2053756273657175656e7420766f7465206368616e6765732077696c6c206368617267652061106665652e2823203c7765696768743e2423232057656967687409012d20604f284d296020776865726520604d60206973206d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e64656429142d2044423aac20202d20312073746f72616765207265616420604d656d62657273602028636f64656320604f284d296029b820202d20312073746f72616765206d75746174696f6e2060566f74696e67602028636f64656320604f284d296029242d2031206576656e742c23203c2f7765696768743e14636c6f736510013470726f706f73616c5f6861736824011c543a3a48617368000114696e6465784901013450726f706f73616c496e64657800015470726f706f73616c5f7765696768745f626f756e64550101185765696768740001306c656e6774685f626f756e644901010c7533320004804d01436c6f7365206120766f746520746861742069732065697468657220617070726f7665642c20646973617070726f766564206f722077686f736520766f74696e6720706572696f642068617320656e6465642e0055014d61792062652063616c6c656420627920616e79207369676e6564206163636f756e7420696e206f7264657220746f2066696e69736820766f74696e6720616e6420636c6f7365207468652070726f706f73616c2e00490149662063616c6c6564206265666f72652074686520656e64206f662074686520766f74696e6720706572696f642069742077696c6c206f6e6c7920636c6f73652074686520766f7465206966206974206973bc68617320656e6f75676820766f74657320746f20626520617070726f766564206f7220646973617070726f7665642e00490149662063616c6c65642061667465722074686520656e64206f662074686520766f74696e6720706572696f642061627374656e74696f6e732061726520636f756e7465642061732072656a656374696f6e732501756e6c6573732074686572652069732061207072696d65206d656d6265722073657420616e6420746865207072696d65206d656d626572206361737420616e20617070726f76616c2e00610149662074686520636c6f7365206f7065726174696f6e20636f6d706c65746573207375636365737366756c6c79207769746820646973617070726f76616c2c20746865207472616e73616374696f6e206665652077696c6c5d016265207761697665642e204f746865727769736520657865637574696f6e206f662074686520617070726f766564206f7065726174696f6e2077696c6c206265206368617267656420746f207468652063616c6c65722e0061012b206070726f706f73616c5f7765696768745f626f756e64603a20546865206d6178696d756d20616d6f756e74206f662077656967687420636f6e73756d656420627920657865637574696e672074686520636c6f7365642470726f706f73616c2e61012b20606c656e6774685f626f756e64603a2054686520757070657220626f756e6420666f7220746865206c656e677468206f66207468652070726f706f73616c20696e2073746f726167652e20436865636b65642076696135016073746f726167653a3a726561646020736f206974206973206073697a655f6f663a3a3c7533323e2829203d3d203460206c6172676572207468616e207468652070757265206c656e6774682e002823203c7765696768743e24232320576569676874742d20604f2842202b204d202b205031202b20503229602077686572653ae020202d20604260206973206070726f706f73616c602073697a6520696e20627974657320286c656e6774682d6665652d626f756e64656429dc20202d20604d60206973206d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e64656429c820202d20605031602069732074686520636f6d706c6578697479206f66206070726f706f73616c6020707265696d6167652ea420202d20605032602069732070726f706f73616c2d636f756e742028636f64652d626f756e64656429142d2044423a0d01202d20322073746f726167652072656164732028604d656d62657273603a20636f64656320604f284d29602c20605072696d65603a20636f64656320604f28312960295901202d2033206d75746174696f6e73202860566f74696e67603a20636f64656320604f284d29602c206050726f706f73616c4f66603a20636f64656320604f284229602c206050726f706f73616c73603a20636f6465632c202020604f285032296029dc202d20616e79206d75746174696f6e7320646f6e65207768696c6520657865637574696e67206070726f706f73616c6020286050316029402d20757020746f2033206576656e74732c23203c2f7765696768743e4c646973617070726f76655f70726f706f73616c04013470726f706f73616c5f6861736824011c543a3a486173680005385901446973617070726f766520612070726f706f73616c2c20636c6f73652c20616e642072656d6f76652069742066726f6d207468652073797374656d2c207265676172646c657373206f66206974732063757272656e741873746174652e00884d7573742062652063616c6c65642062792074686520526f6f74206f726967696e2e002c506172616d65746572733a1d012a206070726f706f73616c5f68617368603a205468652068617368206f66207468652070726f706f73616c20746861742073686f756c6420626520646973617070726f7665642e002823203c7765696768743edc436f6d706c65786974793a204f285029207768657265205020697320746865206e756d626572206f66206d61782070726f706f73616c73284442205765696768743a482a2052656164733a2050726f706f73616c739c2a205772697465733a20566f74696e672c2050726f706f73616c732c2050726f706f73616c4f662c23203c2f7765696768743e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e8d030c4470616c6c65745f636f6c6c6563746976651870616c6c65741043616c6c0804540004490001182c7365745f6d656d626572730c012c6e65775f6d656d626572738c01445665633c543a3a4163636f756e7449643e0001147072696d65890201504f7074696f6e3c543a3a4163636f756e7449643e0001246f6c645f636f756e741c012c4d656d626572436f756e74000080805365742074686520636f6c6c6563746976652773206d656d626572736869702e0045012d20606e65775f6d656d62657273603a20546865206e6577206d656d626572206c6973742e204265206e69636520746f2074686520636861696e20616e642070726f7669646520697420736f727465642ee02d20607072696d65603a20546865207072696d65206d656d6265722077686f736520766f74652073657473207468652064656661756c742e59012d20606f6c645f636f756e74603a2054686520757070657220626f756e6420666f72207468652070726576696f7573206e756d626572206f66206d656d6265727320696e2073746f726167652e205573656420666f7250202077656967687420657374696d6174696f6e2e0054526571756972657320726f6f74206f726967696e2e0051014e4f54453a20446f6573206e6f7420656e666f7263652074686520657870656374656420604d61784d656d6265727360206c696d6974206f6e2074686520616d6f756e74206f66206d656d626572732c2062757421012020202020207468652077656967687420657374696d6174696f6e732072656c79206f6e20697420746f20657374696d61746520646973706174636861626c65207765696768742e002823205741524e494e473a005901546865206070616c6c65742d636f6c6c656374697665602063616e20616c736f206265206d616e61676564206279206c6f676963206f757473696465206f66207468652070616c6c6574207468726f75676820746865b8696d706c656d656e746174696f6e206f6620746865207472616974205b604368616e67654d656d62657273605d2e5501416e792063616c6c20746f20607365745f6d656d6265727360206d757374206265206361726566756c207468617420746865206d656d6265722073657420646f65736e277420676574206f7574206f662073796e63a477697468206f74686572206c6f676963206d616e6167696e6720746865206d656d626572207365742e002823203c7765696768743e24232320576569676874502d20604f284d50202b204e29602077686572653ae020202d20604d60206f6c642d6d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e64656429e020202d20604e60206e65772d6d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e646564299820202d206050602070726f706f73616c732d636f756e742028636f64652d626f756e64656429142d2044423a510120202d20312073746f72616765206d75746174696f6e2028636f64656320604f284d296020726561642c20604f284e29602077726974652920666f722072656164696e6720616e642077726974696e67207468652c202020206d656d62657273ec20202d20312073746f7261676520726561642028636f64656320604f285029602920666f722072656164696e67207468652070726f706f73616c73450120202d206050602073746f72616765206d75746174696f6e732028636f64656320604f284d29602920666f72207570646174696e672074686520766f74657320666f7220656163682070726f706f73616c5d0120202d20312073746f726167652077726974652028636f64656320604f283129602920666f722064656c6574696e6720746865206f6c6420607072696d656020616e642073657474696e6720746865206e6577206f6e652c23203c2f7765696768743e1c6578656375746508012070726f706f73616c8503017c426f783c3c5420617320436f6e6669673c493e3e3a3a50726f706f73616c3e0001306c656e6774685f626f756e644901010c75333200012cf0446973706174636820612070726f706f73616c2066726f6d2061206d656d626572207573696e672074686520604d656d62657260206f726967696e2e00a84f726967696e206d7573742062652061206d656d626572206f662074686520636f6c6c6563746976652e002823203c7765696768743e2423232057656967687455012d20604f284d202b2050296020776865726520604d60206d656d626572732d636f756e742028636f64652d626f756e6465642920616e642060506020636f6d706c6578697479206f66206469737061746368696e673020206070726f706f73616c60d42d2044423a203120726561642028636f64656320604f284d296029202b20444220616363657373206f66206070726f706f73616c60242d2031206576656e742c23203c2f7765696768743e1c70726f706f73650c01247468726573686f6c644901012c4d656d626572436f756e7400012070726f706f73616c8503017c426f783c3c5420617320436f6e6669673c493e3e3a3a50726f706f73616c3e0001306c656e6774685f626f756e644901010c75333200026cf84164642061206e65772070726f706f73616c20746f2065697468657220626520766f746564206f6e206f72206578656375746564206469726563746c792e00845265717569726573207468652073656e64657220746f206265206d656d6265722e004101607468726573686f6c64602064657465726d696e65732077686574686572206070726f706f73616c60206973206578656375746564206469726563746c792028607468726573686f6c64203c20326029546f722070757420757020666f7220766f74696e672e002823203c7765696768743e24232320576569676874ac2d20604f2842202b204d202b2050312960206f7220604f2842202b204d202b20503229602077686572653ae020202d20604260206973206070726f706f73616c602073697a6520696e20627974657320286c656e6774682d6665652d626f756e64656429dc20202d20604d60206973206d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e64656429c420202d206272616e6368696e6720697320696e666c75656e63656420627920607468726573686f6c64602077686572653af4202020202d20605031602069732070726f706f73616c20657865637574696f6e20636f6d706c65786974792028607468726573686f6c64203c20326029fc202020202d20605032602069732070726f706f73616c732d636f756e742028636f64652d626f756e646564292028607468726573686f6c64203e3d20326029142d2044423ab420202d20312073746f726167652072656164206069735f6d656d626572602028636f64656320604f284d296029f020202d20312073746f726167652072656164206050726f706f73616c4f663a3a636f6e7461696e735f6b6579602028636f64656320604f2831296029a820202d20444220616363657373657320696e666c75656e63656420627920607468726573686f6c64603a0901202020202d204549544845522073746f7261676520616363657373657320646f6e65206279206070726f706f73616c602028607468726573686f6c64203c20326029b8202020202d204f522070726f706f73616c20696e73657274696f6e2028607468726573686f6c64203c3d20326029d82020202020202d20312073746f72616765206d75746174696f6e206050726f706f73616c73602028636f64656320604f285032296029e42020202020202d20312073746f72616765206d75746174696f6e206050726f706f73616c436f756e74602028636f64656320604f2831296029cc2020202020202d20312073746f72616765207772697465206050726f706f73616c4f66602028636f64656320604f2842296029bc2020202020202d20312073746f726167652077726974652060566f74696e67602028636f64656320604f284d2960292c20202d2031206576656e742c23203c2f7765696768743e10766f74650c012070726f706f73616c24011c543a3a48617368000114696e6465784901013450726f706f73616c496e64657800011c617070726f7665a80110626f6f6c00033cf041646420616e20617965206f72206e617920766f746520666f72207468652073656e64657220746f2074686520676976656e2070726f706f73616c2e008c5265717569726573207468652073656e64657220746f2062652061206d656d6265722e0049015472616e73616374696f6e20666565732077696c6c2062652077616976656420696620746865206d656d62657220697320766f74696e67206f6e20616e7920706172746963756c61722070726f706f73616c5101666f72207468652066697273742074696d6520616e64207468652063616c6c206973207375636365737366756c2e2053756273657175656e7420766f7465206368616e6765732077696c6c206368617267652061106665652e2823203c7765696768743e2423232057656967687409012d20604f284d296020776865726520604d60206973206d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e64656429142d2044423aac20202d20312073746f72616765207265616420604d656d62657273602028636f64656320604f284d296029b820202d20312073746f72616765206d75746174696f6e2060566f74696e67602028636f64656320604f284d296029242d2031206576656e742c23203c2f7765696768743e14636c6f736510013470726f706f73616c5f6861736824011c543a3a48617368000114696e6465784901013450726f706f73616c496e64657800015470726f706f73616c5f7765696768745f626f756e64550101185765696768740001306c656e6774685f626f756e644901010c7533320004804d01436c6f7365206120766f746520746861742069732065697468657220617070726f7665642c20646973617070726f766564206f722077686f736520766f74696e6720706572696f642068617320656e6465642e0055014d61792062652063616c6c656420627920616e79207369676e6564206163636f756e7420696e206f7264657220746f2066696e69736820766f74696e6720616e6420636c6f7365207468652070726f706f73616c2e00490149662063616c6c6564206265666f72652074686520656e64206f662074686520766f74696e6720706572696f642069742077696c6c206f6e6c7920636c6f73652074686520766f7465206966206974206973bc68617320656e6f75676820766f74657320746f20626520617070726f766564206f7220646973617070726f7665642e00490149662063616c6c65642061667465722074686520656e64206f662074686520766f74696e6720706572696f642061627374656e74696f6e732061726520636f756e7465642061732072656a656374696f6e732501756e6c6573732074686572652069732061207072696d65206d656d6265722073657420616e6420746865207072696d65206d656d626572206361737420616e20617070726f76616c2e00610149662074686520636c6f7365206f7065726174696f6e20636f6d706c65746573207375636365737366756c6c79207769746820646973617070726f76616c2c20746865207472616e73616374696f6e206665652077696c6c5d016265207761697665642e204f746865727769736520657865637574696f6e206f662074686520617070726f766564206f7065726174696f6e2077696c6c206265206368617267656420746f207468652063616c6c65722e0061012b206070726f706f73616c5f7765696768745f626f756e64603a20546865206d6178696d756d20616d6f756e74206f662077656967687420636f6e73756d656420627920657865637574696e672074686520636c6f7365642470726f706f73616c2e61012b20606c656e6774685f626f756e64603a2054686520757070657220626f756e6420666f7220746865206c656e677468206f66207468652070726f706f73616c20696e2073746f726167652e20436865636b65642076696135016073746f726167653a3a726561646020736f206974206973206073697a655f6f663a3a3c7533323e2829203d3d203460206c6172676572207468616e207468652070757265206c656e6774682e002823203c7765696768743e24232320576569676874742d20604f2842202b204d202b205031202b20503229602077686572653ae020202d20604260206973206070726f706f73616c602073697a6520696e20627974657320286c656e6774682d6665652d626f756e64656429dc20202d20604d60206973206d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e64656429c820202d20605031602069732074686520636f6d706c6578697479206f66206070726f706f73616c6020707265696d6167652ea420202d20605032602069732070726f706f73616c2d636f756e742028636f64652d626f756e64656429142d2044423a0d01202d20322073746f726167652072656164732028604d656d62657273603a20636f64656320604f284d29602c20605072696d65603a20636f64656320604f28312960295901202d2033206d75746174696f6e73202860566f74696e67603a20636f64656320604f284d29602c206050726f706f73616c4f66603a20636f64656320604f284229602c206050726f706f73616c73603a20636f6465632c202020604f285032296029dc202d20616e79206d75746174696f6e7320646f6e65207768696c6520657865637574696e67206070726f706f73616c6020286050316029402d20757020746f2033206576656e74732c23203c2f7765696768743e4c646973617070726f76655f70726f706f73616c04013470726f706f73616c5f6861736824011c543a3a486173680005385901446973617070726f766520612070726f706f73616c2c20636c6f73652c20616e642072656d6f76652069742066726f6d207468652073797374656d2c207265676172646c657373206f66206974732063757272656e741873746174652e00884d7573742062652063616c6c65642062792074686520526f6f74206f726967696e2e002c506172616d65746572733a1d012a206070726f706f73616c5f68617368603a205468652068617368206f66207468652070726f706f73616c20746861742073686f756c6420626520646973617070726f7665642e002823203c7765696768743edc436f6d706c65786974793a204f285029207768657265205020697320746865206e756d626572206f66206d61782070726f706f73616c73284442205765696768743a482a2052656164733a2050726f706f73616c739c2a205772697465733a20566f74696e672c2050726f706f73616c732c2050726f706f73616c4f662c23203c2f7765696768743e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e91030c4470616c6c65745f6d656d626572736869701870616c6c65741043616c6c08045400044900011c286164645f6d656d62657204010c77686f000130543a3a4163636f756e74496400000c784164642061206d656d626572206077686f6020746f20746865207365742e009c4d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a4164644f726967696e602e3472656d6f76655f6d656d62657204010c77686f000130543a3a4163636f756e74496400010c8c52656d6f76652061206d656d626572206077686f602066726f6d20746865207365742e00a84d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a52656d6f76654f726967696e602e2c737761705f6d656d62657208011872656d6f7665000130543a3a4163636f756e74496400010c616464000130543a3a4163636f756e744964000214bc53776170206f7574206f6e65206d656d626572206072656d6f76656020666f7220616e6f746865722060616464602e00a04d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a537761704f726967696e602e000d015072696d65206d656d62657273686970206973202a6e6f742a207061737365642066726f6d206072656d6f76656020746f2060616464602c20696620657874616e742e3472657365745f6d656d6265727304011c6d656d626572738c01445665633c543a3a4163636f756e7449643e00031055014368616e676520746865206d656d6265727368697020746f2061206e6577207365742c20646973726567617264696e6720746865206578697374696e67206d656d626572736869702e204265206e69636520616e64687061737320606d656d6265727360207072652d736f727465642e00a44d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a52657365744f726967696e602e286368616e67655f6b657904010c6e6577000130543a3a4163636f756e744964000414d453776170206f7574207468652073656e64696e67206d656d62657220666f7220736f6d65206f74686572206b657920606e6577602e00f04d6179206f6e6c792062652063616c6c65642066726f6d20605369676e656460206f726967696e206f6620612063757272656e74206d656d6265722e001d015072696d65206d656d62657273686970206973207061737365642066726f6d20746865206f726967696e206163636f756e7420746f20606e6577602c20696620657874616e742e247365745f7072696d6504010c77686f000130543a3a4163636f756e74496400050cbc53657420746865207072696d65206d656d6265722e204d75737420626520612063757272656e74206d656d6265722e00a44d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a5072696d654f726967696e602e2c636c6561725f7072696d6500060c9452656d6f766520746865207072696d65206d656d626572206966206974206578697374732e00a44d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a5072696d654f726967696e602e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e95030c3c70616c6c65745f74726561737572791870616c6c65741043616c6c0804540004490001143470726f706f73655f7370656e6408011476616c75655d01013c42616c616e63654f663c542c20493e00012c62656e65666963696172796d02018c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365000024290150757420666f727761726420612073756767657374696f6e20666f72207370656e64696e672e2041206465706f7369742070726f706f7274696f6e616c20746f207468652076616c75653101697320726573657276656420616e6420736c6173686564206966207468652070726f706f73616c2069732072656a65637465642e2049742069732072657475726e6564206f6e6365207468655070726f706f73616c20697320617761726465642e002823203c7765696768743e482d20436f6d706c65786974793a204f283129b02d20446252656164733a206050726f706f73616c436f756e74602c20606f726967696e206163636f756e7460e82d2044625772697465733a206050726f706f73616c436f756e74602c206050726f706f73616c73602c20606f726967696e206163636f756e74602c23203c2f7765696768743e3c72656a6563745f70726f706f73616c04012c70726f706f73616c5f69644901013450726f706f73616c496e646578000124f852656a65637420612070726f706f736564207370656e642e20546865206f726967696e616c206465706f7369742077696c6c20626520736c61736865642e00a84d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a52656a6563744f726967696e602e002823203c7765696768743e482d20436f6d706c65786974793a204f283129cc2d20446252656164733a206050726f706f73616c73602c206072656a65637465642070726f706f736572206163636f756e7460d02d2044625772697465733a206050726f706f73616c73602c206072656a65637465642070726f706f736572206163636f756e74602c23203c2f7765696768743e40617070726f76655f70726f706f73616c04012c70726f706f73616c5f69644901013450726f706f73616c496e6465780002285901417070726f766520612070726f706f73616c2e2041742061206c617465722074696d652c207468652070726f706f73616c2077696c6c20626520616c6c6f636174656420746f207468652062656e6566696369617279a8616e6420746865206f726967696e616c206465706f7369742077696c6c2062652072657475726e65642e00ac4d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a417070726f76654f726967696e602e002823203c7765696768743e4c2d20436f6d706c65786974793a204f2831292e8c2d20446252656164733a206050726f706f73616c73602c2060417070726f76616c7360582d20446257726974653a2060417070726f76616c73602c23203c2f7765696768743e147370656e64080118616d6f756e745d01013c42616c616e63654f663c542c20493e00012c62656e65666963696172796d02018c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365000320b850726f706f736520616e6420617070726f76652061207370656e64206f662074726561737572792066756e64732e004d012d20606f726967696e603a204d75737420626520605370656e644f726967696e60207769746820746865206053756363657373602076616c7565206265696e67206174206c656173742060616d6f756e74602e41012d2060616d6f756e74603a2054686520616d6f756e7420746f206265207472616e736665727265642066726f6d2074686520747265617375727920746f20746865206062656e6566696369617279602ee82d206062656e6566696369617279603a205468652064657374696e6174696f6e206163636f756e7420666f7220746865207472616e736665722e0045014e4f54453a20466f72207265636f72642d6b656570696e6720707572706f7365732c207468652070726f706f736572206973206465656d656420746f206265206571756976616c656e7420746f207468653062656e65666963696172792e3c72656d6f76655f617070726f76616c04012c70726f706f73616c5f69644901013450726f706f73616c496e64657800043c2d01466f72636520612070726576696f75736c7920617070726f7665642070726f706f73616c20746f2062652072656d6f7665642066726f6d2074686520617070726f76616c2071756575652ec0546865206f726967696e616c206465706f7369742077696c6c206e6f206c6f6e6765722062652072657475726e65642e00a84d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a52656a6563744f726967696e602ea02d206070726f706f73616c5f6964603a2054686520696e646578206f6620612070726f706f73616c002823203c7765696768743edc2d20436f6d706c65786974793a204f2841292077686572652060416020697320746865206e756d626572206f6620617070726f76616c73882d20446220726561647320616e64207772697465733a2060417070726f76616c73602c23203c2f7765696768743e001c4572726f72733a61012d206050726f706f73616c4e6f74417070726f766564603a20546865206070726f706f73616c5f69646020737570706c69656420776173206e6f7420666f756e6420696e2074686520617070726f76616c2071756575652c5101692e652e2c207468652070726f706f73616c20686173206e6f74206265656e20617070726f7665642e205468697320636f756c6420616c736f206d65616e207468652070726f706f73616c20646f6573206e6f745901657869737420616c746f6765746865722c2074687573207468657265206973206e6f2077617920697420776f756c642068617665206265656e20617070726f76656420696e2074686520666972737420706c6163652e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e99030c5870616c6c65745f72656c61795f6d6967726174696f6e1870616c6c65741043616c6c04045400010c5073656e645f737761705f63616c6c5f62797465730c012872656c61795f63616c6c28011c5665633c75383e00013472656c61795f62616c616e6365180110753132380001286d61785f77656967687410010c75363400000c8c53657420616e2058434d2063616c6c20746f207468652072656c617920636861696e2e007448617320746f20626520646f6e6520707265206d6967726174696f6e2e80656e61626c655f7374726963745f72656c61795f6e756d6265725f636865636b000110ac53657420746865206173736f6369617465642072656c617920626c6f636b206e756d62657220746f2062657452656c61794e756d6265725374726963746c79496e637265617365732e007848617320746f20626520646f6e6520706f7374206d6967726174696f6e2e8464697361626c655f7374726963745f72656c61795f6e756d6265725f636865636b00020cec53657420746865206173736f6369617465642072656c617920626c6f636b206e756d62657220746f20626520416e7952656c61794e756d6265722e007448617320746f20626520646f6e6520707265206d6967726174696f6e2e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e9d030c4470616c6c65745f64796e5f66696c7465721870616c6c65741043616c6c040454000104287365745f66696c74657204011866696c746572c0013846696c74657253657474696e6773000000042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ea1030c3870616c6c65745f7574696c6974791870616c6c65741043616c6c04045400011414626174636804011463616c6c73a50301605665633c3c5420617320436f6e6669673e3a3a43616c6c3e00004c7c53656e642061206261746368206f662064697370617463682063616c6c732e00784d61792062652063616c6c65642066726f6d20616e79206f726967696e2e005d012d206063616c6c73603a205468652063616c6c7320746f20626520646973706174636865642066726f6d207468652073616d65206f726967696e2e20546865206e756d626572206f662063616c6c206d757374206e6f74390120206578636565642074686520636f6e7374616e743a2060626174636865645f63616c6c735f6c696d6974602028617661696c61626c6520696e20636f6e7374616e74206d65746164617461292e005d014966206f726967696e20697320726f6f74207468656e2063616c6c2061726520646973706174636820776974686f757420636865636b696e67206f726967696e2066696c7465722e20285468697320696e636c75646573c8627970617373696e6720606672616d655f73797374656d3a3a436f6e6669673a3a4261736543616c6c46696c74657260292e002823203c7765696768743e01012d20436f6d706c65786974793a204f284329207768657265204320697320746865206e756d626572206f662063616c6c7320746f20626520626174636865642e2c23203c2f7765696768743e005501546869732077696c6c2072657475726e20604f6b6020696e20616c6c2063697263756d7374616e6365732e20546f2064657465726d696e65207468652073756363657373206f66207468652062617463682c20616e31016576656e74206973206465706f73697465642e20496620612063616c6c206661696c656420616e64207468652062617463682077617320696e7465727275707465642c207468656e207468655501604261746368496e74657272757074656460206576656e74206973206465706f73697465642c20616c6f6e67207769746820746865206e756d626572206f66207375636365737366756c2063616c6c73206d6164654d01616e6420746865206572726f72206f6620746865206661696c65642063616c6c2e20496620616c6c2077657265207375636365737366756c2c207468656e2074686520604261746368436f6d706c65746564604c6576656e74206973206465706f73697465642e3461735f64657269766174697665080114696e646578e4010c75313600011063616c6c85030160426f783c3c5420617320436f6e6669673e3a3a43616c6c3e000134dc53656e6420612063616c6c207468726f75676820616e20696e64657865642070736575646f6e796d206f66207468652073656e6465722e00550146696c7465722066726f6d206f726967696e206172652070617373656420616c6f6e672e205468652063616c6c2077696c6c2062652064697370617463686564207769746820616e206f726967696e207768696368bc757365207468652073616d652066696c74657220617320746865206f726967696e206f6620746869732063616c6c2e0045014e4f54453a20496620796f75206e65656420746f20656e73757265207468617420616e79206163636f756e742d62617365642066696c746572696e67206973206e6f7420686f6e6f7265642028692e652e61016265636175736520796f7520657870656374206070726f78796020746f2068617665206265656e2075736564207072696f7220696e207468652063616c6c20737461636b20616e6420796f7520646f206e6f742077616e7451017468652063616c6c207265737472696374696f6e7320746f206170706c7920746f20616e79207375622d6163636f756e7473292c207468656e20757365206061735f6d756c74695f7468726573686f6c645f31607c696e20746865204d756c74697369672070616c6c657420696e73746561642e00f44e4f54453a205072696f7220746f2076657273696f6e202a31322c2074686973207761732063616c6c6564206061735f6c696d697465645f737562602e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e2462617463685f616c6c04011463616c6c73a50301605665633c3c5420617320436f6e6669673e3a3a43616c6c3e000238ec53656e642061206261746368206f662064697370617463682063616c6c7320616e642061746f6d6963616c6c792065786563757465207468656d2e21015468652077686f6c65207472616e73616374696f6e2077696c6c20726f6c6c6261636b20616e64206661696c20696620616e79206f66207468652063616c6c73206661696c65642e00784d61792062652063616c6c65642066726f6d20616e79206f726967696e2e005d012d206063616c6c73603a205468652063616c6c7320746f20626520646973706174636865642066726f6d207468652073616d65206f726967696e2e20546865206e756d626572206f662063616c6c206d757374206e6f74390120206578636565642074686520636f6e7374616e743a2060626174636865645f63616c6c735f6c696d6974602028617661696c61626c6520696e20636f6e7374616e74206d65746164617461292e005d014966206f726967696e20697320726f6f74207468656e2063616c6c2061726520646973706174636820776974686f757420636865636b696e67206f726967696e2066696c7465722e20285468697320696e636c75646573c8627970617373696e6720606672616d655f73797374656d3a3a436f6e6669673a3a4261736543616c6c46696c74657260292e002823203c7765696768743e01012d20436f6d706c65786974793a204f284329207768657265204320697320746865206e756d626572206f662063616c6c7320746f20626520626174636865642e2c23203c2f7765696768743e2c64697370617463685f617308012461735f6f726967696ea9030154426f783c543a3a50616c6c6574734f726967696e3e00011063616c6c85030160426f783c3c5420617320436f6e6669673e3a3a43616c6c3e000328c84469737061746368657320612066756e6374696f6e2063616c6c207769746820612070726f7669646564206f726967696e2e00c4546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f526f6f745f2e002823203c7765696768743e1c2d204f2831292e602d204c696d697465642073746f726167652072656164732e5c2d204f6e6520444220777269746520286576656e74292e1d012d20576569676874206f662064657269766174697665206063616c6c6020657865637574696f6e202b20543a3a576569676874496e666f3a3a64697370617463685f617328292e2c23203c2f7765696768743e2c666f7263655f626174636804011463616c6c73a50301605665633c3c5420617320436f6e6669673e3a3a43616c6c3e0004387c53656e642061206261746368206f662064697370617463682063616c6c732ed4556e6c696b6520606261746368602c20697420616c6c6f7773206572726f727320616e6420776f6e277420696e746572727570742e00784d61792062652063616c6c65642066726f6d20616e79206f726967696e2e005d012d206063616c6c73603a205468652063616c6c7320746f20626520646973706174636865642066726f6d207468652073616d65206f726967696e2e20546865206e756d626572206f662063616c6c206d757374206e6f74390120206578636565642074686520636f6e7374616e743a2060626174636865645f63616c6c735f6c696d6974602028617661696c61626c6520696e20636f6e7374616e74206d65746164617461292e005d014966206f726967696e20697320726f6f74207468656e2063616c6c2061726520646973706174636820776974686f757420636865636b696e67206f726967696e2066696c7465722e20285468697320696e636c75646573c8627970617373696e6720606672616d655f73797374656d3a3a436f6e6669673a3a4261736543616c6c46696c74657260292e002823203c7765696768743e01012d20436f6d706c65786974793a204f284329207768657265204320697320746865206e756d626572206f662063616c6c7320746f20626520626174636865642e2c23203c2f7765696768743e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ea503000002850300a90308447370697269746e65745f72756e74696d65304f726967696e43616c6c657200011c1873797374656d0400ad0301746672616d655f73797374656d3a3a4f726967696e3c52756e74696d653e0000001c436f756e63696c0400b10301010170616c6c65745f636f6c6c6563746976653a3a4f726967696e3c52756e74696d652c2070616c6c65745f636f6c6c6563746976653a3a496e7374616e6365313e001f0048546563686e6963616c436f6d6d69747465650400b50301010170616c6c65745f636f6c6c6563746976653a3a4f726967696e3c52756e74696d652c2070616c6c65745f636f6c6c6563746976653a3a496e7374616e6365323e0020000c4469640400b90301506469643a3a4f726967696e3c52756e74696d653e0040002c506f6c6b61646f7458636d0400bd03014870616c6c65745f78636d3a3a4f726967696e0053002843756d756c757358636d0400c103016863756d756c75735f70616c6c65745f78636d3a3a4f726967696e00540010566f69640400c50301110173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a566f696400060000ad030c346672616d655f737570706f7274206469737061746368245261774f726967696e04244163636f756e7449640100010c10526f6f74000000185369676e656404000001244163636f756e744964000100104e6f6e6500020000b103084470616c6c65745f636f6c6c656374697665245261774f726967696e08244163636f756e7449640100044900010c1c4d656d6265727308001c012c4d656d626572436f756e7400001c012c4d656d626572436f756e74000000184d656d62657204000001244163636f756e744964000100205f5068616e746f6d00020000b503084470616c6c65745f636f6c6c656374697665245261774f726967696e08244163636f756e7449640100044900010c1c4d656d6265727308001c012c4d656d626572436f756e7400001c012c4d656d626572436f756e74000000184d656d62657204000001244163636f756e744964000100205f5068616e746f6d00020000b9030c0c646964186f726967696e304469645261774f726967696e08344469644964656e7469666965720100244163636f756e74496401000008010869640001344469644964656e7469666965720001247375626d69747465720001244163636f756e7449640000bd030c2870616c6c65745f78636d1870616c6c6574184f726967696e0001080c58636d04003d0101344d756c74694c6f636174696f6e00000020526573706f6e736504003d0101344d756c74694c6f636174696f6e00010000c1030c4863756d756c75735f70616c6c65745f78636d1870616c6c6574184f726967696e0001081452656c6179000000405369626c696e6750617261636861696e04003101011850617261496400010000c503081c73705f636f726510566f696400010000c9030c3870616c6c65745f76657374696e671870616c6c65741043616c6c0404540001141076657374000034b8556e6c6f636b20616e79207665737465642066756e6473206f66207468652073656e646572206163636f756e742e005d01546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420686176652066756e6473207374696c6c646c6f636b656420756e64657220746869732070616c6c65742e00d0456d69747320656974686572206056657374696e67436f6d706c6574656460206f72206056657374696e6755706461746564602e002823203c7765696768743e242d20604f283129602e742d2044625765696768743a20322052656164732c203220577269746573f8202020202d2052656164733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c205b53656e646572204163636f756e745dfc202020202d205772697465733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c205b53656e646572204163636f756e745d2c23203c2f7765696768743e28766573745f6f746865720401187461726765746d02018c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f7572636500013cb8556e6c6f636b20616e79207665737465642066756e6473206f662061206074617267657460206163636f756e742e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e0051012d2060746172676574603a20546865206163636f756e742077686f7365207665737465642066756e64732073686f756c6420626520756e6c6f636b65642e204d75737420686176652066756e6473207374696c6c646c6f636b656420756e64657220746869732070616c6c65742e00d0456d69747320656974686572206056657374696e67436f6d706c6574656460206f72206056657374696e6755706461746564602e002823203c7765696768743e242d20604f283129602e742d2044625765696768743a20332052656164732c203320577269746573f0202020202d2052656164733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c20546172676574204163636f756e74f4202020202d205772697465733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c20546172676574204163636f756e742c23203c2f7765696768743e3c7665737465645f7472616e736665720801187461726765746d02018c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263650001207363686564756c65cd0301a456657374696e67496e666f3c42616c616e63654f663c543e2c20543a3a426c6f636b4e756d6265723e00024464437265617465206120766573746564207472616e736665722e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e00cc2d2060746172676574603a20546865206163636f756e7420726563656976696e6720746865207665737465642066756e64732ef02d20607363686564756c65603a205468652076657374696e67207363686564756c6520617474616368656420746f20746865207472616e736665722e005c456d697473206056657374696e6743726561746564602e00fc4e4f54453a20546869732077696c6c20756e6c6f636b20616c6c207363686564756c6573207468726f756768207468652063757272656e7420626c6f636b2e002823203c7765696768743e242d20604f283129602e742d2044625765696768743a20332052656164732c2033205772697465733901202020202d2052656164733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c20546172676574204163636f756e742c205b53656e646572204163636f756e745d3d01202020202d205772697465733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c20546172676574204163636f756e742c205b53656e646572204163636f756e745d2c23203c2f7765696768743e54666f7263655f7665737465645f7472616e736665720c0118736f757263656d02018c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263650001187461726765746d02018c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263650001207363686564756c65cd0301a456657374696e67496e666f3c42616c616e63654f663c543e2c20543a3a426c6f636b4e756d6265723e00034860466f726365206120766573746564207472616e736665722e00c4546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f526f6f745f2e00e82d2060736f75726365603a20546865206163636f756e742077686f73652066756e64732073686f756c64206265207472616e736665727265642e11012d2060746172676574603a20546865206163636f756e7420746861742073686f756c64206265207472616e7366657272656420746865207665737465642066756e64732ef02d20607363686564756c65603a205468652076657374696e67207363686564756c6520617474616368656420746f20746865207472616e736665722e005c456d697473206056657374696e6743726561746564602e00fc4e4f54453a20546869732077696c6c20756e6c6f636b20616c6c207363686564756c6573207468726f756768207468652063757272656e7420626c6f636b2e002823203c7765696768743e242d20604f283129602e742d2044625765696768743a20342052656164732c2034205772697465733101202020202d2052656164733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c20546172676574204163636f756e742c20536f75726365204163636f756e743501202020202d205772697465733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c20546172676574204163636f756e742c20536f75726365204163636f756e742c23203c2f7765696768743e3c6d657267655f7363686564756c657308013c7363686564756c65315f696e6465781c010c75333200013c7363686564756c65325f696e6465781c010c7533320004545d014d657267652074776f2076657374696e67207363686564756c657320746f6765746865722c206372656174696e672061206e65772076657374696e67207363686564756c65207468617420756e6c6f636b73206f7665725501746865206869676865737420706f737369626c6520737461727420616e6420656e6420626c6f636b732e20496620626f7468207363686564756c6573206861766520616c7265616479207374617274656420746865590163757272656e7420626c6f636b2077696c6c206265207573656420617320746865207363686564756c652073746172743b207769746820746865206361766561742074686174206966206f6e65207363686564756c655d0169732066696e6973686564206279207468652063757272656e7420626c6f636b2c20746865206f746865722077696c6c206265207472656174656420617320746865206e6577206d6572676564207363686564756c652c2c756e6d6f6469666965642e00f84e4f54453a20496620607363686564756c65315f696e646578203d3d207363686564756c65325f696e6465786020746869732069732061206e6f2d6f702e41014e4f54453a20546869732077696c6c20756e6c6f636b20616c6c207363686564756c6573207468726f756768207468652063757272656e7420626c6f636b207072696f7220746f206d657267696e672e61014e4f54453a20496620626f7468207363686564756c6573206861766520656e646564206279207468652063757272656e7420626c6f636b2c206e6f206e6577207363686564756c652077696c6c206265206372656174656464616e6420626f74682077696c6c2062652072656d6f7665642e006c4d6572676564207363686564756c6520617474726962757465733a35012d20607374617274696e675f626c6f636b603a20604d4158287363686564756c65312e7374617274696e675f626c6f636b2c207363686564756c6564322e7374617274696e675f626c6f636b2c48202063757272656e745f626c6f636b29602e21012d2060656e64696e675f626c6f636b603a20604d4158287363686564756c65312e656e64696e675f626c6f636b2c207363686564756c65322e656e64696e675f626c6f636b29602e59012d20606c6f636b6564603a20607363686564756c65312e6c6f636b65645f61742863757272656e745f626c6f636b29202b207363686564756c65322e6c6f636b65645f61742863757272656e745f626c6f636b29602e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e00e82d20607363686564756c65315f696e646578603a20696e646578206f6620746865206669727374207363686564756c6520746f206d657267652eec2d20607363686564756c65325f696e646578603a20696e646578206f6620746865207365636f6e64207363686564756c6520746f206d657267652e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ecd030c3870616c6c65745f76657374696e673076657374696e675f696e666f2c56657374696e67496e666f081c42616c616e636501182c426c6f636b4e756d6265720110000c01186c6f636b656418011c42616c616e63650001247065725f626c6f636b18011c42616c616e63650001387374617274696e675f626c6f636b10012c426c6f636b4e756d6265720000d1030c4070616c6c65745f7363686564756c65721870616c6c65741043616c6c040454000118207363686564756c651001107768656e100138543a3a426c6f636b4e756d6265720001386d617962655f706572696f646963d50301a04f7074696f6e3c7363686564756c653a3a506572696f643c543a3a426c6f636b4e756d6265723e3e0001207072696f726974790801487363686564756c653a3a5072696f7269747900011063616c6cd9030150426f783c43616c6c4f72486173684f663c543e3e00000470416e6f6e796d6f75736c79207363686564756c652061207461736b2e1863616e63656c0801107768656e100138543a3a426c6f636b4e756d626572000114696e6465781c010c7533320001049443616e63656c20616e20616e6f6e796d6f75736c79207363686564756c6564207461736b2e387363686564756c655f6e616d6564140108696428011c5665633c75383e0001107768656e100138543a3a426c6f636b4e756d6265720001386d617962655f706572696f646963d50301a04f7074696f6e3c7363686564756c653a3a506572696f643c543a3a426c6f636b4e756d6265723e3e0001207072696f726974790801487363686564756c653a3a5072696f7269747900011063616c6cd9030150426f783c43616c6c4f72486173684f663c543e3e000204585363686564756c652061206e616d6564207461736b2e3063616e63656c5f6e616d6564040108696428011c5665633c75383e0003047843616e63656c2061206e616d6564207363686564756c6564207461736b2e387363686564756c655f61667465721001146166746572100138543a3a426c6f636b4e756d6265720001386d617962655f706572696f646963d50301a04f7074696f6e3c7363686564756c653a3a506572696f643c543a3a426c6f636b4e756d6265723e3e0001207072696f726974790801487363686564756c653a3a5072696f7269747900011063616c6cd9030150426f783c43616c6c4f72486173684f663c543e3e000414a8416e6f6e796d6f75736c79207363686564756c652061207461736b20616674657220612064656c61792e002823203c7765696768743e5453616d65206173205b607363686564756c65605d2e2c23203c2f7765696768743e507363686564756c655f6e616d65645f6166746572140108696428011c5665633c75383e0001146166746572100138543a3a426c6f636b4e756d6265720001386d617962655f706572696f646963d50301a04f7074696f6e3c7363686564756c653a3a506572696f643c543a3a426c6f636b4e756d6265723e3e0001207072696f726974790801487363686564756c653a3a5072696f7269747900011063616c6cd9030150426f783c43616c6c4f72486173684f663c543e3e000514905363686564756c652061206e616d6564207461736b20616674657220612064656c61792e002823203c7765696768743ec453616d65206173205b607363686564756c655f6e616d6564605d2853656c663a3a7363686564756c655f6e616d6564292e2c23203c2f7765696768743e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ed50304184f7074696f6e04045401d00108104e6f6e6500000010536f6d650400d00000010000d90310346672616d655f737570706f727418747261697473207363686564756c652c4d617962654861736865640804540185031048617368012401081456616c756504008503010454000000104861736804002401104861736800010000dd030c3070616c6c65745f70726f78791870616c6c65741043616c6c0404540001281470726f78790c01107265616c000130543a3a4163636f756e744964000140666f7263655f70726f78795f74797065e10301504f7074696f6e3c543a3a50726f7879547970653e00011063616c6c85030160426f783c3c5420617320436f6e6669673e3a3a43616c6c3e00003c4d0144697370617463682074686520676976656e206063616c6c602066726f6d20616e206163636f756e742074686174207468652073656e64657220697320617574686f726973656420666f72207468726f75676830606164645f70726f7879602e00a852656d6f76657320616e7920636f72726573706f6e64696e6720616e6e6f756e63656d656e742873292e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e002c506172616d65746572733a0d012d20607265616c603a20546865206163636f756e742074686174207468652070726f78792077696c6c206d616b6520612063616c6c206f6e20626568616c66206f662e61012d2060666f7263655f70726f78795f74797065603a2053706563696679207468652065786163742070726f7879207479706520746f206265207573656420616e6420636865636b656420666f7220746869732063616c6c2ed02d206063616c6c603a205468652063616c6c20746f206265206d6164652062792074686520607265616c60206163636f756e742e002823203c7765696768743efc57656967687420697320612066756e6374696f6e206f6620746865206e756d626572206f662070726f7869657320746865207573657220686173202850292e2c23203c2f7765696768743e246164645f70726f78790c012064656c6567617465000130543a3a4163636f756e74496400012870726f78795f74797065e00130543a3a50726f78795479706500011464656c6179100138543a3a426c6f636b4e756d6265720001344501526567697374657220612070726f7879206163636f756e7420666f72207468652073656e64657220746861742069732061626c6520746f206d616b652063616c6c73206f6e2069747320626568616c662e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e002c506172616d65746572733a11012d206070726f7879603a20546865206163636f756e74207468617420746865206063616c6c65726020776f756c64206c696b6520746f206d616b6520612070726f78792efc2d206070726f78795f74797065603a20546865207065726d697373696f6e7320616c6c6f77656420666f7220746869732070726f7879206163636f756e742e4d012d206064656c6179603a2054686520616e6e6f756e63656d656e7420706572696f64207265717569726564206f662074686520696e697469616c2070726f78792e2057696c6c2067656e6572616c6c79206265147a65726f2e002823203c7765696768743efc57656967687420697320612066756e6374696f6e206f6620746865206e756d626572206f662070726f7869657320746865207573657220686173202850292e2c23203c2f7765696768743e3072656d6f76655f70726f78790c012064656c6567617465000130543a3a4163636f756e74496400012870726f78795f74797065e00130543a3a50726f78795479706500011464656c6179100138543a3a426c6f636b4e756d62657200022ca8556e726567697374657220612070726f7879206163636f756e7420666f72207468652073656e6465722e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e002c506172616d65746572733a25012d206070726f7879603a20546865206163636f756e74207468617420746865206063616c6c65726020776f756c64206c696b6520746f2072656d6f766520617320612070726f78792e41012d206070726f78795f74797065603a20546865207065726d697373696f6e732063757272656e746c7920656e61626c656420666f72207468652072656d6f7665642070726f7879206163636f756e742e002823203c7765696768743efc57656967687420697320612066756e6374696f6e206f6620746865206e756d626572206f662070726f7869657320746865207573657220686173202850292e2c23203c2f7765696768743e3872656d6f76655f70726f78696573000328b4556e726567697374657220616c6c2070726f7879206163636f756e747320666f72207468652073656e6465722e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e0055015741524e494e473a2054686973206d61792062652063616c6c6564206f6e206163636f756e747320637265617465642062792060616e6f6e796d6f7573602c20686f776576657220696620646f6e652c207468656e590174686520756e726573657276656420666565732077696c6c20626520696e61636365737369626c652e202a2a416c6c2061636365737320746f2074686973206163636f756e742077696c6c206265206c6f73742e2a2a002823203c7765696768743efc57656967687420697320612066756e6374696f6e206f6620746865206e756d626572206f662070726f7869657320746865207573657220686173202850292e2c23203c2f7765696768743e24616e6f6e796d6f75730c012870726f78795f74797065e00130543a3a50726f78795479706500011464656c6179100138543a3a426c6f636b4e756d626572000114696e646578e4010c75313600045c3901537061776e2061206672657368206e6577206163636f756e7420746861742069732067756172616e7465656420746f206265206f746865727769736520696e61636365737369626c652c20616e64fc696e697469616c697a65206974207769746820612070726f7879206f66206070726f78795f747970656020666f7220606f726967696e602073656e6465722e006c5265717569726573206120605369676e656460206f726967696e2e0051012d206070726f78795f74797065603a205468652074797065206f66207468652070726f78792074686174207468652073656e6465722077696c6c2062652072656769737465726564206173206f766572207468654d016e6577206163636f756e742e20546869732077696c6c20616c6d6f737420616c7761797320626520746865206d6f7374207065726d697373697665206050726f7879547970656020706f737369626c6520746f78616c6c6f7720666f72206d6178696d756d20666c65786962696c6974792e51012d2060696e646578603a204120646973616d626967756174696f6e20696e6465782c20696e206361736520746869732069732063616c6c6564206d756c7469706c652074696d657320696e207468652073616d655d017472616e73616374696f6e2028652e672e207769746820607574696c6974793a3a626174636860292e20556e6c65737320796f75277265207573696e67206062617463686020796f752070726f6261626c79206a7573744077616e7420746f20757365206030602e4d012d206064656c6179603a2054686520616e6e6f756e63656d656e7420706572696f64207265717569726564206f662074686520696e697469616c2070726f78792e2057696c6c2067656e6572616c6c79206265147a65726f2e0051014661696c73207769746820604475706c69636174656020696620746869732068617320616c7265616479206265656e2063616c6c656420696e2074686973207472616e73616374696f6e2c2066726f6d207468659873616d652073656e6465722c2077697468207468652073616d6520706172616d65746572732e00e44661696c732069662074686572652061726520696e73756666696369656e742066756e647320746f2070617920666f72206465706f7369742e002823203c7765696768743efc57656967687420697320612066756e6374696f6e206f6620746865206e756d626572206f662070726f7869657320746865207573657220686173202850292e2c23203c2f7765696768743e8c544f444f3a204d69676874206265206f76657220636f756e74696e6720312072656164386b696c6c5f616e6f6e796d6f757314011c737061776e6572000130543a3a4163636f756e74496400012870726f78795f74797065e00130543a3a50726f787954797065000114696e646578e4010c75313600011868656967687455010138543a3a426c6f636b4e756d6265720001246578745f696e6465784901010c753332000550b452656d6f76657320612070726576696f75736c7920737061776e656420616e6f6e796d6f75732070726f78792e0049015741524e494e473a202a2a416c6c2061636365737320746f2074686973206163636f756e742077696c6c206265206c6f73742e2a2a20416e792066756e64732068656c6420696e2069742077696c6c20626534696e61636365737369626c652e0059015265717569726573206120605369676e656460206f726967696e2c20616e64207468652073656e646572206163636f756e74206d7573742068617665206265656e206372656174656420627920612063616c6c20746fa860616e6f6e796d6f757360207769746820636f72726573706f6e64696e6720706172616d65746572732e004d012d2060737061776e6572603a20546865206163636f756e742074686174206f726967696e616c6c792063616c6c65642060616e6f6e796d6f75736020746f206372656174652074686973206163636f756e742e4d012d2060696e646578603a2054686520646973616d626967756174696f6e20696e646578206f726967696e616c6c792070617373656420746f2060616e6f6e796d6f7573602e2050726f6261626c79206030602e01012d206070726f78795f74797065603a205468652070726f78792074797065206f726967696e616c6c792070617373656420746f2060616e6f6e796d6f7573602e3d012d2060686569676874603a2054686520686569676874206f662074686520636861696e207768656e207468652063616c6c20746f2060616e6f6e796d6f757360207761732070726f6365737365642e49012d20606578745f696e646578603a205468652065787472696e73696320696e64657820696e207768696368207468652063616c6c20746f2060616e6f6e796d6f757360207761732070726f6365737365642e0049014661696c73207769746820604e6f5065726d697373696f6e6020696e2063617365207468652063616c6c6572206973206e6f7420612070726576696f75736c79206372656174656420616e6f6e796d6f7573f06163636f756e742077686f73652060616e6f6e796d6f7573602063616c6c2068617320636f72726573706f6e64696e6720706172616d65746572732e002823203c7765696768743efc57656967687420697320612066756e6374696f6e206f6620746865206e756d626572206f662070726f7869657320746865207573657220686173202850292e2c23203c2f7765696768743e20616e6e6f756e63650801107265616c000130543a3a4163636f756e74496400012463616c6c5f6861736824013443616c6c486173684f663c543e00065405015075626c697368207468652068617368206f6620612070726f78792d63616c6c20746861742077696c6c206265206d61646520696e20746865206675747572652e005d0154686973206d7573742062652063616c6c656420736f6d65206e756d626572206f6620626c6f636b73206265666f72652074686520636f72726573706f6e64696e67206070726f78796020697320617474656d7074656425016966207468652064656c6179206173736f6369617465642077697468207468652070726f78792072656c6174696f6e736869702069732067726561746572207468616e207a65726f2e0011014e6f206d6f7265207468616e20604d617850656e64696e676020616e6e6f756e63656d656e7473206d6179206265206d61646520617420616e79206f6e652074696d652e000901546869732077696c6c2074616b652061206465706f736974206f662060416e6e6f756e63656d656e744465706f736974466163746f72602061732077656c6c206173190160416e6e6f756e63656d656e744465706f736974426173656020696620746865726520617265206e6f206f746865722070656e64696e6720616e6e6f756e63656d656e74732e002501546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e6420612070726f7879206f6620607265616c602e002c506172616d65746572733a0d012d20607265616c603a20546865206163636f756e742074686174207468652070726f78792077696c6c206d616b6520612063616c6c206f6e20626568616c66206f662e15012d206063616c6c5f68617368603a205468652068617368206f66207468652063616c6c20746f206265206d6164652062792074686520607265616c60206163636f756e742e002823203c7765696768743e6057656967687420697320612066756e6374696f6e206f663a982d20413a20746865206e756d626572206f6620616e6e6f756e63656d656e7473206d6164652ea02d20503a20746865206e756d626572206f662070726f78696573207468652075736572206861732e2c23203c2f7765696768743e4c72656d6f76655f616e6e6f756e63656d656e740801107265616c000130543a3a4163636f756e74496400012463616c6c5f6861736824013443616c6c486173684f663c543e0007407052656d6f7665206120676976656e20616e6e6f756e63656d656e742e0059014d61792062652063616c6c656420627920612070726f7879206163636f756e7420746f2072656d6f766520612063616c6c20746865792070726576696f75736c7920616e6e6f756e63656420616e642072657475726e30746865206465706f7369742e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e002c506172616d65746572733a0d012d20607265616c603a20546865206163636f756e742074686174207468652070726f78792077696c6c206d616b6520612063616c6c206f6e20626568616c66206f662e15012d206063616c6c5f68617368603a205468652068617368206f66207468652063616c6c20746f206265206d6164652062792074686520607265616c60206163636f756e742e002823203c7765696768743e6057656967687420697320612066756e6374696f6e206f663a982d20413a20746865206e756d626572206f6620616e6e6f756e63656d656e7473206d6164652ea02d20503a20746865206e756d626572206f662070726f78696573207468652075736572206861732e2c23203c2f7765696768743e4c72656a6563745f616e6e6f756e63656d656e7408012064656c6567617465000130543a3a4163636f756e74496400012463616c6c5f6861736824013443616c6c486173684f663c543e000840b052656d6f76652074686520676976656e20616e6e6f756e63656d656e74206f6620612064656c65676174652e0061014d61792062652063616c6c6564206279206120746172676574202870726f7869656429206163636f756e7420746f2072656d6f766520612063616c6c2074686174206f6e65206f662074686569722064656c6567617465732501286064656c656761746560292068617320616e6e6f756e63656420746865792077616e7420746f20657865637574652e20546865206465706f7369742069732072657475726e65642e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e002c506172616d65746572733af42d206064656c6567617465603a20546865206163636f756e7420746861742070726576696f75736c7920616e6e6f756e636564207468652063616c6c2ebc2d206063616c6c5f68617368603a205468652068617368206f66207468652063616c6c20746f206265206d6164652e002823203c7765696768743e6057656967687420697320612066756e6374696f6e206f663a982d20413a20746865206e756d626572206f6620616e6e6f756e63656d656e7473206d6164652ea02d20503a20746865206e756d626572206f662070726f78696573207468652075736572206861732e2c23203c2f7765696768743e3c70726f78795f616e6e6f756e63656410012064656c6567617465000130543a3a4163636f756e7449640001107265616c000130543a3a4163636f756e744964000140666f7263655f70726f78795f74797065e10301504f7074696f6e3c543a3a50726f7879547970653e00011063616c6c85030160426f783c3c5420617320436f6e6669673e3a3a43616c6c3e0009444d0144697370617463682074686520676976656e206063616c6c602066726f6d20616e206163636f756e742074686174207468652073656e64657220697320617574686f72697a656420666f72207468726f75676830606164645f70726f7879602e00a852656d6f76657320616e7920636f72726573706f6e64696e6720616e6e6f756e63656d656e742873292e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e002c506172616d65746572733a0d012d20607265616c603a20546865206163636f756e742074686174207468652070726f78792077696c6c206d616b6520612063616c6c206f6e20626568616c66206f662e61012d2060666f7263655f70726f78795f74797065603a2053706563696679207468652065786163742070726f7879207479706520746f206265207573656420616e6420636865636b656420666f7220746869732063616c6c2ed02d206063616c6c603a205468652063616c6c20746f206265206d6164652062792074686520607265616c60206163636f756e742e002823203c7765696768743e6057656967687420697320612066756e6374696f6e206f663a982d20413a20746865206e756d626572206f6620616e6e6f756e63656d656e7473206d6164652ea02d20503a20746865206e756d626572206f662070726f78696573207468652075736572206861732e2c23203c2f7765696768743e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ee10304184f7074696f6e04045401e00108104e6f6e6500000010536f6d650400e00000010000e5030c3c70616c6c65745f707265696d6167651870616c6c65741043616c6c040454000110346e6f74655f707265696d616765040114627974657328011c5665633c75383e000010745265676973746572206120707265696d616765206f6e2d636861696e2e00550149662074686520707265696d616765207761732070726576696f75736c79207265717565737465642c206e6f2066656573206f72206465706f73697473206172652074616b656e20666f722070726f766964696e67550174686520707265696d6167652e204f74686572776973652c2061206465706f7369742069732074616b656e2070726f706f7274696f6e616c20746f207468652073697a65206f662074686520707265696d6167652e3c756e6e6f74655f707265696d6167650401106861736824011c543a3a48617368000104dc436c65617220616e20756e72657175657374656420707265696d6167652066726f6d207468652072756e74696d652073746f726167652e40726571756573745f707265696d6167650401106861736824011c543a3a48617368000210410152657175657374206120707265696d6167652062652075706c6f6164656420746f2074686520636861696e20776974686f757420706179696e6720616e792066656573206f72206465706f736974732e00550149662074686520707265696d6167652072657175657374732068617320616c7265616479206265656e2070726f7669646564206f6e2d636861696e2c20776520756e7265736572766520616e79206465706f7369743901612075736572206d6179206861766520706169642c20616e642074616b652074686520636f6e74726f6c206f662074686520707265696d616765206f7574206f662074686569722068616e64732e48756e726571756573745f707265696d6167650401106861736824011c543a3a4861736800030cbc436c65617220612070726576696f75736c79206d616465207265717565737420666f72206120707265696d6167652e002d014e4f54453a2054484953204d555354204e4f542042452043414c4c4544204f4e20606861736860204d4f52452054494d4553205448414e2060726571756573745f707265696d616765602e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ee9030c4470616c6c65745f6d656d626572736869701870616c6c65741043616c6c08045400044900011c286164645f6d656d62657204010c77686f000130543a3a4163636f756e74496400000c784164642061206d656d626572206077686f6020746f20746865207365742e009c4d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a4164644f726967696e602e3472656d6f76655f6d656d62657204010c77686f000130543a3a4163636f756e74496400010c8c52656d6f76652061206d656d626572206077686f602066726f6d20746865207365742e00a84d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a52656d6f76654f726967696e602e2c737761705f6d656d62657208011872656d6f7665000130543a3a4163636f756e74496400010c616464000130543a3a4163636f756e744964000214bc53776170206f7574206f6e65206d656d626572206072656d6f76656020666f7220616e6f746865722060616464602e00a04d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a537761704f726967696e602e000d015072696d65206d656d62657273686970206973202a6e6f742a207061737365642066726f6d206072656d6f76656020746f2060616464602c20696620657874616e742e3472657365745f6d656d6265727304011c6d656d626572738c01445665633c543a3a4163636f756e7449643e00031055014368616e676520746865206d656d6265727368697020746f2061206e6577207365742c20646973726567617264696e6720746865206578697374696e67206d656d626572736869702e204265206e69636520616e64687061737320606d656d6265727360207072652d736f727465642e00a44d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a52657365744f726967696e602e286368616e67655f6b657904010c6e6577000130543a3a4163636f756e744964000414d453776170206f7574207468652073656e64696e67206d656d62657220666f7220736f6d65206f74686572206b657920606e6577602e00f04d6179206f6e6c792062652063616c6c65642066726f6d20605369676e656460206f726967696e206f6620612063757272656e74206d656d6265722e001d015072696d65206d656d62657273686970206973207061737365642066726f6d20746865206f726967696e206163636f756e7420746f20606e6577602c20696620657874616e742e247365745f7072696d6504010c77686f000130543a3a4163636f756e74496400050cbc53657420746865207072696d65206d656d6265722e204d75737420626520612063757272656e74206d656d6265722e00a44d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a5072696d654f726967696e602e2c636c6561725f7072696d6500060c9452656d6f766520746865207072696d65206d656d626572206966206974206578697374732e00a44d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a5072696d654f726967696e602e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632eed030c2c70616c6c65745f746970731870616c6c65741043616c6c080454000449000118387265706f72745f617765736f6d65080118726561736f6e28011c5665633c75383e00010c77686f000130543a3a4163636f756e74496400004c59015265706f727420736f6d657468696e672060726561736f6e60207468617420646573657276657320612074697020616e6420636c61696d20616e79206576656e7475616c207468652066696e6465722773206665652e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e0051015061796d656e743a20605469705265706f72744465706f73697442617365602077696c6c2062652072657365727665642066726f6d20746865206f726967696e206163636f756e742c2061732077656c6c206173bc60446174614465706f736974506572427974656020666f722065616368206279746520696e2060726561736f6e602e005d012d2060726561736f6e603a2054686520726561736f6e20666f722c206f7220746865207468696e6720746861742064657365727665732c20746865207469703b2067656e6572616c6c7920746869732077696c6c20626558202061205554462d382d656e636f6465642055524c2ee82d206077686f603a20546865206163636f756e742077686963682073686f756c6420626520637265646974656420666f7220746865207469702e0074456d69747320604e657754697060206966207375636365737366756c2e002823203c7765696768743ec82d20436f6d706c65786974793a20604f2852296020776865726520605260206c656e677468206f662060726561736f6e602e9020202d20656e636f64696e6720616e642068617368696e67206f662027726561736f6e27702d20446252656164733a2060526561736f6e73602c20605469707360742d2044625772697465733a2060526561736f6e73602c206054697073602c23203c2f7765696768743e2c726574726163745f7469700401106861736824011c543a3a4861736800014c5101526574726163742061207072696f72207469702d7265706f72742066726f6d20607265706f72745f617765736f6d65602c20616e642063616e63656c207468652070726f63657373206f662074697070696e672e00dc4966207375636365737366756c2c20746865206f726967696e616c206465706f7369742077696c6c20626520756e72657365727665642e004d01546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e642074686520746970206964656e7469666965642062792060686173686041016d7573742068617665206265656e207265706f7274656420627920746865207369676e696e67206163636f756e74207468726f75676820607265706f72745f617765736f6d65602028616e64206e6f744c7468726f75676820607469705f6e657760292e0061012d206068617368603a20546865206964656e74697479206f6620746865206f70656e2074697020666f722077686963682061207469702076616c7565206973206465636c617265642e205468697320697320666f726d65645d0120206173207468652068617368206f6620746865207475706c65206f6620746865206f726967696e616c207469702060726561736f6e6020616e64207468652062656e6566696369617279206163636f756e742049442e008c456d697473206054697052657472616374656460206966207375636365737366756c2e002823203c7765696768743e502d20436f6d706c65786974793a20604f28312960d820202d20446570656e6473206f6e20746865206c656e677468206f662060543a3a48617368602077686963682069732066697865642e8c2d20446252656164733a206054697073602c20606f726967696e206163636f756e7460bc2d2044625772697465733a2060526561736f6e73602c206054697073602c20606f726967696e206163636f756e74602c23203c2f7765696768743e1c7469705f6e65770c0118726561736f6e28011c5665633c75383e00010c77686f000130543a3a4163636f756e7449640001247469705f76616c75655d01013c42616c616e63654f663c542c20493e000258f04769766520612074697020666f7220736f6d657468696e67206e65773b206e6f2066696e6465722773206665652077696c6c2062652074616b656e2e005101546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e6420746865207369676e696e67206163636f756e74206d7573742062652061706d656d626572206f662074686520605469707065727360207365742e005d012d2060726561736f6e603a2054686520726561736f6e20666f722c206f7220746865207468696e6720746861742064657365727665732c20746865207469703b2067656e6572616c6c7920746869732077696c6c20626558202061205554462d382d656e636f6465642055524c2ee82d206077686f603a20546865206163636f756e742077686963682073686f756c6420626520637265646974656420666f7220746865207469702e4d012d20607469705f76616c7565603a2054686520616d6f756e74206f66207469702074686174207468652073656e64657220776f756c64206c696b6520746f20676976652e20546865206d656469616e20746970d4202076616c7565206f662061637469766520746970706572732077696c6c20626520676976656e20746f20746865206077686f602e0074456d69747320604e657754697060206966207375636365737366756c2e002823203c7765696768743e51012d20436f6d706c65786974793a20604f2852202b2054296020776865726520605260206c656e677468206f662060726561736f6e602c2060546020697320746865206e756d626572206f6620746970706572732e5d0120202d20604f285429603a206465636f64696e6720605469707065726020766563206f66206c656e677468206054602e20605460206973206368617267656420617320757070657220626f756e6420676976656e2062792d012020202060436f6e7461696e734c656e677468426f756e64602e205468652061637475616c20636f737420646570656e6473206f6e2074686520696d706c656d656e746174696f6e206f66442020202060543a3a54697070657273602ee020202d20604f285229603a2068617368696e6720616e6420656e636f64696e67206f6620726561736f6e206f66206c656e677468206052607c2d20446252656164733a206054697070657273602c2060526561736f6e7360742d2044625772697465733a2060526561736f6e73602c206054697073602c23203c2f7765696768743e0c7469700801106861736824011c543a3a486173680001247469705f76616c75655d01013c42616c616e63654f663c542c20493e000360b04465636c6172652061207469702076616c756520666f7220616e20616c72656164792d6f70656e207469702e005101546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e6420746865207369676e696e67206163636f756e74206d7573742062652061706d656d626572206f662074686520605469707065727360207365742e0061012d206068617368603a20546865206964656e74697479206f6620746865206f70656e2074697020666f722077686963682061207469702076616c7565206973206465636c617265642e205468697320697320666f726d65645d0120206173207468652068617368206f6620746865207475706c65206f66207468652068617368206f6620746865206f726967696e616c207469702060726561736f6e6020616e64207468652062656e65666963696172793420206163636f756e742049442e4d012d20607469705f76616c7565603a2054686520616d6f756e74206f66207469702074686174207468652073656e64657220776f756c64206c696b6520746f20676976652e20546865206d656469616e20746970d4202076616c7565206f662061637469766520746970706572732077696c6c20626520676976656e20746f20746865206077686f602e006101456d6974732060546970436c6f73696e676020696620746865207468726573686f6c64206f66207469707065727320686173206265656e207265616368656420616e642074686520636f756e74646f776e20706572696f643068617320737461727465642e002823203c7765696768743e61012d20436f6d706c65786974793a20604f285429602077686572652060546020697320746865206e756d626572206f6620746970706572732e206465636f64696e6720605469707065726020766563206f66206c656e6774682d0120206054602c20696e736572742074697020616e6420636865636b20636c6f73696e672c20605460206973206368617267656420617320757070657220626f756e6420676976656e2062795d01202060436f6e7461696e734c656e677468426f756e64602e205468652061637475616c20636f737420646570656e6473206f6e2074686520696d706c656d656e746174696f6e206f662060543a3a54697070657273602e005d01202041637475616c6c792077656967687420636f756c64206265206c6f77657220617320697420646570656e6473206f6e20686f77206d616e7920746970732061726520696e20604f70656e5469706020627574206974d02020697320776569676874656420617320696620616c6d6f73742066756c6c20692e65206f66206c656e6774682060542d31602e702d20446252656164733a206054697070657273602c20605469707360482d2044625772697465733a206054697073602c23203c2f7765696768743e24636c6f73655f7469700401106861736824011c543a3a486173680004405c436c6f736520616e64207061796f75742061207469702e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e00150154686520746970206964656e74696669656420627920606861736860206d75737420686176652066696e69736865642069747320636f756e74646f776e20706572696f642e0061012d206068617368603a20546865206964656e74697479206f6620746865206f70656e2074697020666f722077686963682061207469702076616c7565206973206465636c617265642e205468697320697320666f726d65645d0120206173207468652068617368206f6620746865207475706c65206f6620746865206f726967696e616c207469702060726561736f6e6020616e64207468652062656e6566696369617279206163636f756e742049442e002823203c7765696768743e61012d20436f6d706c65786974793a20604f285429602077686572652060546020697320746865206e756d626572206f6620746970706572732e206465636f64696e6720605469707065726020766563206f66206c656e677468510120206054602e20605460206973206368617267656420617320757070657220626f756e6420676976656e2062792060436f6e7461696e734c656e677468426f756e64602e205468652061637475616c20636f7374c02020646570656e6473206f6e2074686520696d706c656d656e746174696f6e206f662060543a3a54697070657273602ea82d20446252656164733a206054697073602c206054697070657273602c20607469702066696e64657260d82d2044625772697465733a2060526561736f6e73602c206054697073602c206054697070657273602c20607469702066696e646572602c23203c2f7765696768743e24736c6173685f7469700401106861736824011c543a3a486173680005309452656d6f766520616e6420736c61736820616e20616c72656164792d6f70656e207469702e00a84d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a52656a6563744f726967696e602e00f44173206120726573756c742c207468652066696e64657220697320736c617368656420616e6420746865206465706f7369747320617265206c6f73742e0084456d6974732060546970536c617368656460206966207375636365737366756c2e002823203c7765696768743efc2020605460206973206368617267656420617320757070657220626f756e6420676976656e2062792060436f6e7461696e734c656e677468426f756e64602e010120205468652061637475616c20636f737420646570656e6473206f6e2074686520696d706c656d656e746174696f6e206f662060543a3a54697070657273602e2c23203c2f7765696768743e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ef1030c1463747970651870616c6c65741043616c6c0404540001040c616464040114637479706528011c5665633c75383e00003009014372656174652061206e65772043547970652066726f6d2074686520676976656e20756e69717565204354797065206861736820616e64206173736f6369617465735069742077697468206974732063726561746f722e00dc412043547970652077697468207468652073616d652068617368206d757374206e6f742062652073746f726564206f6e20636861696e2e0054456d6974732060435479706543726561746564602e002823203c7765696768743e305765696768743a204f283129602d2052656164733a204374797065732c2042616c616e6365642d205772697465733a204374797065732c2042616c616e63652c23203c2f7765696768743e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ef5030c2c6174746573746174696f6e1870616c6c65741043616c6c0404540001100c6164640c0128636c61696d5f68617368240138436c61696d486173684f663c543e00012863747970655f686173682401384374797065486173684f663c543e000134617574686f72697a6174696f6ef90301604f7074696f6e3c543a3a416363657373436f6e74726f6c3e000054644372656174652061206e6577206174746573746174696f6e2e00f85468652061747465737465722063616e206f7074696f6e616c6c792070726f766964652061207265666572656e636520746f20616e206578697374696e67090164656c65676174696f6e20746861742077696c6c20626520736176656420616c6f6e67207769746820746865206174746573746174696f6e20697473656c6620696e8c74686520666f726d206f6620616e2061747465737465642064656c65676174696f6e2e00ec546865207265666572656e6365642043547970652068617368206d75737420616c72656164792062652070726573656e74206f6e20636861696e2e000901496620616e206f7074696f6e616c2064656c65676174696f6e2069642069732070726f76696465642c20746865206469737061746368206f726967696e206d757374e8626520746865206f776e6572206f66207468652064656c65676174696f6e2e204f74686572776973652c20697420636f756c6420626520616e79546044656c65676174696f6e456e746974794964602e006c456d69747320604174746573746174696f6e43726561746564602e002823203c7765696768743e305765696768743a204f283129b82d2052656164733a205b4f726967696e204163636f756e745d2c2043747970652c204174746573746174696f6e73e42d2052656164732069662064656c65676174696f6e2069642069732070726f76696465643a2044656c65676174696f6e732c20526f6f74732c5c202044656c6567617465644174746573746174696f6e73bc2d205772697465733a204174746573746174696f6e732c202844656c6567617465644174746573746174696f6e73292c23203c2f7765696768743e187265766f6b65080128636c61696d5f68617368240138436c61696d486173684f663c543e000134617574686f72697a6174696f6ef90301604f7074696f6e3c543a3a416363657373436f6e74726f6c3e0001447c5265766f6b6520616e206578697374696e67206174746573746174696f6e2e00fc546865207265766f6b6572206d75737420626520656974686572207468652063726561746f72206f6620746865206174746573746174696f6e206265696e6709017265766f6b6564206f7220616e20656e74697479207468617420696e207468652064656c65676174696f6e207472656520697320616e20616e636573746f72206f6609017468652061747465737465722c20692e652e2c2069742077617320656974686572207468652064656c656761746f72206f6620746865206174746573746572206f7250616e20616e636573746f722074686572656f662e006c456d69747320604174746573746174696f6e5265766f6b6564602e002823203c7765696768743e0d015765696768743a204f285029207768657265205020697320746865206e756d626572206f6620737465707320726571756972656420746f2076657269667920746861740901746865206469737061746368204f726967696e20636f6e74726f6c73207468652064656c65676174696f6e20656e7469746c656420746f207265766f6b6520746865c86174746573746174696f6e2e20497420697320626f756e64656420627920606d61785f706172656e745f636865636b73602ee82d2052656164733a205b4f726967696e204163636f756e745d2c204174746573746174696f6e732c2064656c65676174696f6e3a3a526f6f7473d82d205265616473207065722064656c65676174696f6e207374657020503a2064656c65676174696f6e3a3a44656c65676174696f6e73b42d205772697465733a204174746573746174696f6e732c2044656c6567617465644174746573746174696f6e732c23203c2f7765696768743e1872656d6f7665080128636c61696d5f68617368240138436c61696d486173684f663c543e000134617574686f72697a6174696f6ef90301604f7074696f6e3c543a3a416363657373436f6e74726f6c3e0002445852656d6f766520616e206174746573746174696f6e2e00f8546865206f726967696e206d75737420626520656974686572207468652063726561746f72206f6620746865206174746573746174696f6e206f7220616e0d01656e7469747920776869636820697320616e20616e636573746f72206f662074686520617474657374657220696e207468652064656c65676174696f6e20747265652c0101692e652e2c2069742077617320656974686572207468652064656c656761746f72206f6620746865206174746573746572206f7220616e20616e636573746f722074686572656f662e006c456d69747320604174746573746174696f6e52656d6f766564602e002823203c7765696768743e0d015765696768743a204f285029207768657265205020697320746865206e756d626572206f6620737465707320726571756972656420746f2076657269667920746861740901746865206469737061746368204f726967696e20636f6e74726f6c73207468652064656c65676174696f6e20656e7469746c656420746f207265766f6b6520746865c86174746573746174696f6e2e20497420697320626f756e64656420627920606d61785f706172656e745f636865636b73602ee82d2052656164733a205b4f726967696e204163636f756e745d2c204174746573746174696f6e732c2064656c65676174696f6e3a3a526f6f7473d82d205265616473207065722064656c65676174696f6e207374657020503a2064656c65676174696f6e3a3a44656c65676174696f6e73b42d205772697465733a204174746573746174696f6e732c2044656c6567617465644174746573746174696f6e732c23203c2f7765696768743e3c7265636c61696d5f6465706f736974040128636c61696d5f68617368240138436c61696d486173684f663c543e000324d05265636c61696d20612073746f72616765206465706f7369742062792072656d6f76696e6720616e206174746573746174696f6e0064456d69747320604465706f7369745265636c61696d6564602e002823203c7765696768743e305765696768743a204f283129f82d2052656164733a205b4f726967696e204163636f756e745d2c204174746573746174696f6e732c2044656c6567617465644174746573746174696f6e73b42d205772697465733a204174746573746174696f6e732c2044656c6567617465644174746573746174696f6e732c23203c2f7765696768743e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ef90304184f7074696f6e04045401fd030108104e6f6e6500000010536f6d650400fd030000010000fd030c3872756e74696d655f636f6d6d6f6e34617574686f72697a6174696f6e3c50616c6c6574417574686f72697a65043044656c65676174696f6e416301010401042844656c65676174696f6e04000104013044656c65676174696f6e41630000000001040c2864656c65676174696f6e386163636573735f636f6e74726f6c3044656c65676174696f6e41630404540105040008013c7375626a6563745f6e6f64655f696424015444656c65676174696f6e4e6f646549644f663c543e0001286d61785f636865636b731c010c7533320000050408447370697269746e65745f72756e74696d651c52756e74696d650000000009040c2864656c65676174696f6e1870616c6c65741043616c6c040454000114406372656174655f686965726172636879080130726f6f745f6e6f64655f696424015444656c65676174696f6e4e6f646549644f663c543e00012863747970655f686173682401384374797065486173684f663c543e00006401014372656174652061206e65772064656c65676174696f6e20726f6f74206173736f6369617465642077697468206120676976656e20435479706520686173682e00f8546865206e657720726f6f742077696c6c20616c6c6f772061206e65772074727573742068696572617263687920746f2062652063726561746564206279a0616464696e67206368696c6472656e2064656c65676174696f6e7320746f2074686520726f6f742e000d015468657265206d757374206265206e6f2064656c65676174696f6e2077697468207468652073616d652049442073746f726564206f6e20636861696e2c207768696c65fc7468657265206d75737420626520616c7265616479206120435479706520776974682074686520676976656e20686173682073746f72656420696e207468653443547970652070616c6c65742e0098546865206469737061746368206f726967696e206d7573742062652073706c697420696e746f0d012a2061207375626d6974746572206f66207479706520604163636f756e744964602077686f20697320726573706f6e7369626c6520666f7220706179696e67207468655420207472616e73616374696f6e2066656520616e6409012a206120444944207375626a656374206f662074797065206044656c65676174696f6e456e746974794964602077686f20637265617465732c206f776e7320616e6470202063616e207265766f6b65207468652064656c65676174696f6e2e000d015265717569726573207468652073656e646572206f6620746865207472616e73616374696f6e20746f206861766520612072657365727661626c652062616c616e6365886f66206174206c6561737420604465706f73697460206d616e7920746f6b656e732e0050456d6974732060526f6f7443726561746564602e002823203c7765696768743e305765696768743a204f283129a02d2052656164733a205b4f726967696e204163636f756e745d2c20526f6f74732c204354797065733c2d205772697465733a20526f6f74732c23203c2f7765696768743e386164645f64656c65676174696f6e14013464656c65676174696f6e5f696424015444656c65676174696f6e4e6f646549644f663c543e000124706172656e745f696424015444656c65676174696f6e4e6f646549644f663c543e00012064656c656761746500014044656c656761746f7249644f663c543e00012c7065726d697373696f6e730901012c5065726d697373696f6e7300014864656c65676174655f7369676e61747572650d04016844656c65676174655369676e6174757265547970654f663c543e000180744372656174652061206e65772064656c65676174696f6e206e6f64652e00f4546865206e65772064656c65676174696f6e206e6f646520726570726573656e74732061206e65772074727573742068696572617263687920746861740d01636f6e73696465727320746865206e6577206e6f64652061732069747320726f6f742e20546865206f776e6572206f662074686973206e6f6465206861732066756c6ce0636f6e74726f6c206f76657220616e79206f66206974732064697265637420616e6420696e6469726563742064657363656e64616e74732e00fc466f7220746865206372656174696f6e20746f20737563636565642c207468652064656c656761746565206d7573742070726f7669646520612076616c696411017369676e6174757265206f766572207468652028626c616b65323536292068617368206f6620746865206372656174696f6e206f7065726174696f6e2064657461696c731101776869636820696e636c7564652028696e206f72646572292064656c65676174696f6e2069642c20726f6f74206e6f64652069642c20706172656e742069642c20616e64707065726d697373696f6e73206f6620746865206e6577206e6f64652e00f45468657265206d757374206265206e6f2064656c65676174696f6e2077697468207468652073616d652069642073746f726564206f6e20636861696e2e0501467572746865726d6f72652c20746865207265666572656e63656420726f6f7420616e6420706172656e74206e6f646573206d75737420616c7265616479206265050170726573656e74206f6e20636861696e20616e6420636f6e7461696e207468652076616c6964207065726d697373696f6e7320616e64207265766f636174696f6e6c7374617475732028692e652e2c206e6f74207265766f6b6564292e0098546865206469737061746368206f726967696e206d7573742062652073706c697420696e746f0d012a2061207375626d6974746572206f66207479706520604163636f756e744964602077686f20697320726573706f6e7369626c6520666f7220706179696e67207468655420207472616e73616374696f6e2066656520616e6409012a206120444944207375626a656374206f662074797065206044656c65676174696f6e456e746974794964602077686f20637265617465732c206f776e7320616e6470202063616e207265766f6b65207468652064656c65676174696f6e2e000d015265717569726573207468652073656e646572206f6620746865207472616e73616374696f6e20746f206861766520612072657365727661626c652062616c616e6365886f66206174206c6561737420604465706f73697460206d616e7920746f6b656e732e0068456d697473206044656c65676174696f6e43726561746564602e002823203c7765696768743e305765696768743a204f283129b42d2052656164733a205b4f726967696e204163636f756e745d2c20526f6f74732c2044656c65676174696f6e73542d205772697465733a2044656c65676174696f6e732c23203c2f7765696768743e447265766f6b655f64656c65676174696f6e0c013464656c65676174696f6e5f696424015444656c65676174696f6e4e6f646549644f663c543e0001446d61785f706172656e745f636865636b731c010c75333200013c6d61785f7265766f636174696f6e731c010c753332000274f85265766f6b6520612064656c65676174696f6e206e6f64652028706f74656e7469616c6c79206120726f6f74206e6f64652920616e6420616c6c20697473246368696c6472656e2e00fc446f6573206e6f7420726566756e64207468652064656c65676174696f6e206261636b20746f20746865206465706f736974206f776e657220617320746865f06e6f6465206973207374696c6c2073746f726564206f6e20636861696e2e20526571756972657320746f206164646974696f6e616c6c792063616c6cb46072656d6f76655f64656c65676174696f6e6020746f20756e7265736572766520746865206465706f7369742e0009015265766f6b696e6720612064656c65676174696f6e206e6f646520726573756c747320696e2074686520747275737420686965726172636879207374617274696e67090166726f6d2074686520676976656e206e6f6465206265696e67207265766f6b65642e204e657665727468656c6573732c207265766f636174696f6e20737461727473090166726f6d20746865206c65617665206e6f64657320757077617264732c20736f20696620746865206f7065726174696f6e20656e6473207072656d61747572656c791101626563617573652069742072756e73206f7574206f66206761732c207468652064656c65676174696f6e20737461746520776f756c6420626520636f6e73697374656e7401016173206e6f206368696c6420776f756c64202273757276697665222069747320706172656e742e204173206120636f6e73657175656e63652c206966207468650d01676976656e206e6f6465206973207265766f6b65642c2074686520747275737420686965726172636879207769746820746865206e6f646520617320726f6f7420697364746f20626520636f6e73696465726564207265766f6b65642e0098546865206469737061746368206f726967696e206d7573742062652073706c697420696e746f0d012a2061207375626d6974746572206f66207479706520604163636f756e744964602077686f20697320726573706f6e7369626c6520666f7220706179696e67207468655420207472616e73616374696f6e2066656520616e6409012a206120444944207375626a656374206f662074797065206044656c65676174696f6e456e746974794964602077686f20637265617465732c206f776e7320616e6470202063616e207265766f6b65207468652064656c65676174696f6e2e0078456d6974732043202a206044656c65676174696f6e5265766f6b6564602e002823203c7765696768743e01015765696768743a204f284329207768657265204320697320746865206e756d626572206f66206368696c6472656e206f66207468652064656c65676174696f6ea06e6f646520776869636820697320626f756e64656420627920606d61785f6368696c6472656e602e01012d2052656164733a205b4f726967696e204163636f756e745d2c20526f6f74732c2043202a2044656c65676174696f6e732c2043202a204368696c6472656e2e802d205772697465733a20526f6f74732c2043202a2044656c65676174696f6e732c23203c2f7765696768743e4472656d6f76655f64656c65676174696f6e08013464656c65676174696f6e5f696424015444656c65676174696f6e4e6f646549644f663c543e0001306d61785f72656d6f76616c731c010c753332000370f852656d6f766520612064656c65676174696f6e206e6f64652028706f74656e7469616c6c79206120726f6f74206e6f64652920616e6420616c6c20697473246368696c6472656e2e00f052657475726e73207468652064656c65676174696f6e206465706f73697420746f20746865206465706f736974206f776e657220666f722065616368a472656d6f7665642044656c65676174696f6e4e6f646520627920756e726573657276696e672069742e00090152656d6f76696e6720612064656c65676174696f6e206e6f646520726573756c747320696e2074686520747275737420686965726172636879207374617274696e67fc66726f6d2074686520676976656e206e6f6465206265696e672072656d6f7665642e204e657665727468656c6573732c2072656d6f76616c20737461727473090166726f6d20746865206c65617665206e6f64657320757077617264732c20736f20696620746865206f7065726174696f6e20656e6473207072656d61747572656c791101626563617573652069742072756e73206f7574206f66206761732c207468652064656c65676174696f6e20737461746520776f756c6420626520636f6e73697374656e7401016173206e6f206368696c6420776f756c64202273757276697665222069747320706172656e742e204173206120636f6e73657175656e63652c206966207468650d01676976656e206e6f64652069732072656d6f7665642c2074686520747275737420686965726172636879207769746820746865206e6f646520617320726f6f7420697364746f20626520636f6e736964657265642072656d6f7665642e0098546865206469737061746368206f726967696e206d7573742062652073706c697420696e746f0d012a2061207375626d6974746572206f66207479706520604163636f756e744964602077686f20697320726573706f6e7369626c6520666f7220706179696e67207468655420207472616e73616374696f6e2066656520616e6409012a206120444944207375626a656374206f662074797065206044656c65676174696f6e456e746974794964602077686f20637265617465732c206f776e7320616e6470202063616e207265766f6b65207468652064656c65676174696f6e2e0078456d6974732043202a206044656c65676174696f6e52656d6f766564602e002823203c7765696768743e01015765696768743a204f284329207768657265204320697320746865206e756d626572206f66206368696c6472656e206f66207468652064656c65676174696f6ea06e6f646520776869636820697320626f756e64656420627920606d61785f6368696c6472656e602e01012d2052656164733a205b4f726967696e204163636f756e745d2c20526f6f74732c2043202a2044656c65676174696f6e732c2043202a204368696c6472656e2e902d205772697465733a20526f6f74732c2032202a2043202a2044656c65676174696f6e732c23203c2f7765696768743e3c7265636c61696d5f6465706f73697408013464656c65676174696f6e5f696424015444656c65676174696f6e4e6f646549644f663c543e0001306d61785f72656d6f76616c731c010c753332000460f45265636c61696d20746865206465706f73697420666f7220612064656c65676174696f6e206e6f64652028706f74656e7469616c6c79206120726f6f74b86e6f6465292c2072656d6f76696e6720746865206e6f646520616e6420616c6c20697473206368696c6472656e2e00f052657475726e73207468652064656c65676174696f6e206465706f73697420746f20746865206465706f736974206f776e657220666f722065616368a472656d6f7665642044656c65676174696f6e4e6f646520627920756e726573657276696e672069742e00090152656d6f76696e6720612064656c65676174696f6e206e6f646520726573756c747320696e2074686520747275737420686965726172636879207374617274696e67fc66726f6d2074686520676976656e206e6f6465206265696e672072656d6f7665642e204e657665727468656c6573732c2072656d6f76616c20737461727473090166726f6d20746865206c65617665206e6f64657320757077617264732c20736f20696620746865206f7065726174696f6e20656e6473207072656d61747572656c791101626563617573652069742072756e73206f7574206f66206761732c207468652064656c65676174696f6e20737461746520776f756c6420626520636f6e73697374656e7401016173206e6f206368696c6420776f756c64202273757276697665222069747320706172656e742e204173206120636f6e73657175656e63652c206966207468650d01676976656e206e6f64652069732072656d6f7665642c2074686520747275737420686965726172636879207769746820746865206e6f646520617320726f6f7420697364746f20626520636f6e736964657265642072656d6f7665642e000d01546865206469737061746368206f726967696e206d757374206265207369676e6564206279207468652064656c65676174696f6e206465706f736974206f776e65722e004c604465706f7369745265636c61696d6564602e002823203c7765696768743e01015765696768743a204f284329207768657265204320697320746865206e756d626572206f66206368696c6472656e206f66207468652064656c65676174696f6ea06e6f646520776869636820697320626f756e64656420627920606d61785f72656d6f76616c73602e01012d2052656164733a205b4f726967696e204163636f756e745d2c20526f6f74732c2043202a2044656c65676174696f6e732c2043202a204368696c6472656e2e902d205772697465733a20526f6f74732c2032202a2043202a2044656c65676174696f6e732c23203c2f7765696768743e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e0d040c0c6469642c6469645f64657461696c73304469645369676e617475726500010c1c45643235353139040011040148656432353531393a3a5369676e61747572650000001c53723235353139040019040148737232353531393a3a5369676e617475726500010014456364736104001d04014065636473613a3a5369676e61747572650002000011040c1c73705f636f72651c65643235353139245369676e617475726500000400150401205b75383b2036345d0000150400000340000000080019040c1c73705f636f72651c73723235353139245369676e617475726500000400150401205b75383b2036345d00001d040c1c73705f636f7265146563647361245369676e617475726500000400210401205b75383b2036355d0000210400000341000000080025040c0c6469641870616c6c65741043616c6c0404540001341863726561746508011c64657461696c7329040168426f783c4469644372656174696f6e44657461696c733c543e3e0001247369676e61747572650d0401304469645369676e617475726500007cec53746f72652061206e657720444944206f6e20636861696e2c20616674657220766572696679696e67207468617420746865206372656174696f6e05016f7065726174696f6e20686173206265656e207369676e656420627920746865204b494c54206163636f756e74206173736f63696174656420776974682074686501016964656e746966696572206f662074686520444944206265696e67206372656174656420616e6420746861742061204449442077697468207468652073616d6511016964656e74696669657220686173206e6f742070726576696f75736c792065786973746564206f6e2028616e64207468656e2064656c657465642066726f6d292074686518636861696e2e000d015468657265206d757374206265206e6f2044494420696e666f726d6174696f6e2073746f726564206f6e20636861696e20756e646572207468652073616d65204449442c6964656e7469666965722e00fc546865206e6577206b65797320616464656420776974682074686973206f7065726174696f6e206172652073746f72656420756e646572207468652044494405016964656e74696669657220616c6f6e6720776974682074686520626c6f636b206e756d62657220696e20776869636820746865206f7065726174696f6e207761732465786563757465642e000101546865206469737061746368206f726967696e2063616e20626520616e79204b494c54206163636f756e74207769746820656e6f7567682066756e647320746f0d0165786563757465207468652065787472696e73696320616e6420697420646f6573206e6f74206861766520746f206265207469656420696e20616e792077617920746fb4746865204b494c54206163636f756e74206964656e74696679696e672074686520444944207375626a6563742e004c456d697473206044696443726561746564602e002823203c7765696768743e0d012d20546865207472616e73616374696f6e277320636f6d706c6578697479206973206d61696e6c7920646570656e64656e74206f6e20746865206e756d626572206f66010120206e6577206b65792061677265656d656e74206b65797320616e6420746865206e756d626572206f66206e6577207365727669636520656e64706f696e7473702020696e636c7564656420696e20746865206f7065726174696f6e2e242d2d2d2d2d2d2d2d2df85765696768743a204f284b29202b204f284e29207768657265204b20697320746865206e756d626572206f66206e6577206b65792061677265656d656e7409016b65797320626f756e64656420627920604d61784e65774b657941677265656d656e744b657973602c207768696c65204e20697320746865206e756d626572206f66f46e6577207365727669636520656e64706f696e747320626f756e64656420627920604d61784e756d6265724f665365727669636573506572446964602eb02d2052656164733a205b4f726967696e204163636f756e745d2c204469642c20446964426c61636b6c697374fc2d205772697465733a20446964202877697468204b206e6577206b65792061677265656d656e74206b657973292c2053657276696365456e64706f696e7473cc20202877697468204e206e6577207365727669636520656e64706f696e7473292c20446964456e64706f696e7473436f756e742c23203c2f7765696768743e587365745f61757468656e7469636174696f6e5f6b657904011c6e65775f6b657941040148446964566572696669636174696f6e4b65790001408855706461746520746865204449442061757468656e7469636174696f6e206b65792e00ec546865206f6c64206b65792069732064656c657465642066726f6d2074686520736574206f66207075626c6963206b65797320696620697420697309016e6f74207573656420696e20616e79206f746865722070617274206f6620746865204449442e20546865206e6577206b657920697320616464656420746f207468654c736574206f66207075626c6963206b6579732e00e0546865206469737061746368206f726967696e206d757374206265206120444944206f726967696e2070726f78696564207669612074686570607375626d69745f6469645f63616c6c602065787472696e7369632e004c456d697473206044696455706461746564602e002823203c7765696768743e305765696768743a204f283129782d2052656164733a205b4f726967696e204163636f756e745d2c20446964342d205772697465733a204469642c23203c2f7765696768743e487365745f64656c65676174696f6e5f6b657904011c6e65775f6b657941040148446964566572696669636174696f6e4b657900024094536574206f722075706461746520746865204449442064656c65676174696f6e206b65792e000d01496620616e206f6c64206b657920657869737465642c2069742069732064656c657465642066726f6d2074686520736574206f66207075626c6963206b65797320696611016974206973206e6f74207573656420696e20616e79206f746865722070617274206f6620746865204449442e20546865206e6577206b657920697320616464656420746f5c74686520736574206f66207075626c6963206b6579732e00e0546865206469737061746368206f726967696e206d757374206265206120444944206f726967696e2070726f78696564207669612074686570607375626d69745f6469645f63616c6c602065787472696e7369632e004c456d697473206044696455706461746564602e002823203c7765696768743e305765696768743a204f283129782d2052656164733a205b4f726967696e204163636f756e745d2c20446964342d205772697465733a204469642c23203c2f7765696768743e5472656d6f76655f64656c65676174696f6e5f6b657900033c7852656d6f766520746865204449442064656c65676174696f6e206b65792e00d4546865206f6c64206b65792069732064656c657465642066726f6d2074686520736574206f66207075626c6963206b657973206966b06974206973206e6f74207573656420696e20616e79206f746865722070617274206f6620746865204449442e00e0546865206469737061746368206f726967696e206d757374206265206120444944206f726967696e2070726f78696564207669612074686570607375626d69745f6469645f63616c6c602065787472696e7369632e004c456d697473206044696455706461746564602e002823203c7765696768743e305765696768743a204f283129782d2052656164733a205b4f726967696e204163636f756e745d2c20446964342d205772697465733a204469642c23203c2f7765696768743e4c7365745f6174746573746174696f6e5f6b657904011c6e65775f6b657941040148446964566572696669636174696f6e4b657900044098536574206f72207570646174652074686520444944206174746573746174696f6e206b65792e000d01496620616e206f6c64206b657920657869737465642c2069742069732064656c657465642066726f6d2074686520736574206f66207075626c6963206b65797320696611016974206973206e6f74207573656420696e20616e79206f746865722070617274206f6620746865204449442e20546865206e6577206b657920697320616464656420746f5c74686520736574206f66207075626c6963206b6579732e00e0546865206469737061746368206f726967696e206d757374206265206120444944206f726967696e2070726f78696564207669612074686570607375626d69745f6469645f63616c6c602065787472696e7369632e004c456d697473206044696455706461746564602e002823203c7765696768743e305765696768743a204f283129782d2052656164733a205b4f726967696e204163636f756e745d2c20446964342d205772697465733a204469642c23203c2f7765696768743e5872656d6f76655f6174746573746174696f6e5f6b657900053c7c52656d6f76652074686520444944206174746573746174696f6e206b65792e00d4546865206f6c64206b65792069732064656c657465642066726f6d2074686520736574206f66207075626c6963206b657973206966b06974206973206e6f74207573656420696e20616e79206f746865722070617274206f6620746865204449442e00e0546865206469737061746368206f726967696e206d757374206265206120444944206f726967696e2070726f78696564207669612074686570607375626d69745f6469645f63616c6c602065787472696e7369632e004c456d697473206044696455706461746564602e002823203c7765696768743e305765696768743a204f283129782d2052656164733a205b4f726967696e204163636f756e745d2c20446964342d205772697465733a204469642c23203c2f7765696768743e546164645f6b65795f61677265656d656e745f6b657904011c6e65775f6b657931040140446964456e6372797074696f6e4b6579000638b841646420612073696e676c65206e6577206b65792061677265656d656e74206b657920746f20746865204449442e00bc546865206e6577206b657920697320616464656420746f2074686520736574206f66207075626c6963206b6579732e00e0546865206469737061746368206f726967696e206d757374206265206120444944206f726967696e2070726f78696564207669612074686570607375626d69745f6469645f63616c6c602065787472696e7369632e004c456d697473206044696455706461746564602e002823203c7765696768743e305765696768743a204f283129782d2052656164733a205b4f726967696e204163636f756e745d2c20446964342d205772697465733a204469642c23203c2f7765696768743e6072656d6f76655f6b65795f61677265656d656e745f6b65790401186b65795f69642401284b657949644f663c543e000734050152656d6f7665206120444944206b65792061677265656d656e74206b65792066726f6d20626f74682069747320736574206f66206b65792061677265656d656e74906b65797320616e642061732077656c6c20617320697473207075626c6963206b6579732e00e0546865206469737061746368206f726967696e206d757374206265206120444944206f726967696e2070726f78696564207669612074686570607375626d69745f6469645f63616c6c602065787472696e7369632e004c456d697473206044696455706461746564602e002823203c7765696768743e305765696768743a204f283129782d2052656164733a205b4f726967696e204163636f756e745d2c20446964342d205772697465733a204469642c23203c2f7765696768743e506164645f736572766963655f656e64706f696e74040140736572766963655f656e64706f696e7455040138446964456e64706f696e743c543e000830bc4164642061206e6577207365727669636520656e64706f696e7420756e6465722074686520676976656e204449442e00e0546865206469737061746368206f726967696e206d757374206265206120444944206f726967696e2070726f78696564207669612074686570607375626d69745f6469645f63616c6c602065787472696e7369632e004c456d697473206044696455706461746564602e002823203c7765696768743e305765696768743a204f2831290d012d2052656164733a205b4f726967696e204163636f756e745d2c204469642c2053657276696365456e64706f696e74732c20446964456e64706f696e7473436f756e74c82d205772697465733a204469642c2053657276696365456e64706f696e74732c20446964456e64706f696e7473436f756e742c23203c2f7765696768743e5c72656d6f76655f736572766963655f656e64706f696e74040128736572766963655f69645904015053657276696365456e64706f696e7449643c543e000930d452656d6f76652074686520736572766963652077697468207468652070726f76696465642049442066726f6d20746865204449442e00e0546865206469737061746368206f726967696e206d757374206265206120444944206f726967696e2070726f78696564207669612074686570607375626d69745f6469645f63616c6c602065787472696e7369632e004c456d697473206044696455706461746564602e002823203c7765696768743e305765696768743a204f283129f82d2052656164733a205b4f726967696e204163636f756e745d2c2053657276696365456e64706f696e74732c20446964456e64706f696e7473436f756e74c82d205772697465733a204469642c2053657276696365456e64706f696e74732c20446964456e64706f696e7473436f756e742c23203c2f7765696768743e1864656c65746504014c656e64706f696e74735f746f5f72656d6f76651c010c753332000a600d0144656c6574652061204449442066726f6d2074686520636861696e20616e6420616c6c20696e666f726d6174696f6e206173736f63696174656420776974682069742c1101616674657220766572696679696e672074686174207468652064656c657465206f7065726174696f6e20686173206265656e207369676e65642062792074686520444944fc7375626a656374207573696e67207468652061757468656e7469636174696f6e206b65792063757272656e746c792073746f726564206f6e20636861696e2e000501546865207265666572656e63656420444944206964656e746966696572206d7573742062652070726573656e74206f6e20636861696e206265666f7265207468657864656c657465206f7065726174696f6e206973206576616c75617465642e00f441667465722069742069732064656c657465642c2061204449442077697468207468652073616d65206964656e7469666965722063616e6e6f742062655872652d63726561746564206576657220616761696e2e00010141732074686520726573756c74206f66207468652064656c6574696f6e2c20616c6c20747261636573206f662074686520444944206172652072656d6f766564e866726f6d207468652073746f726167652c20776869636820726573756c747320696e2074686520696e76616c69646174696f6e206f6620616c6c9c6174746573746174696f6e73206973737565642062792074686520444944207375626a6563742e00e0546865206469737061746368206f726967696e206d757374206265206120444944206f726967696e2070726f78696564207669612074686570607375626d69745f6469645f63616c6c602065787472696e7369632e004c456d697473206044696444656c65746564602e002823203c7765696768743e305765696768743a204f283129782d2052656164733a205b4f726967696e204163636f756e745d2c20446964cc2d204b696c6c733a2044696420656e747279206173736f63696174656420746f2074686520444944206964656e7469666965722c23203c2f7765696768743e3c7265636c61696d5f6465706f73697408012c6469645f7375626a6563740001484469644964656e7469666965724f663c543e00014c656e64706f696e74735f746f5f72656d6f76651c010c753332000b54f45265636c61696d2061206465706f73697420666f722061204449442e20546869732077696c6c2064656c657465207468652044494420616e6420616c6c0901696e666f726d6174696f6e206173736f63696174656420776974682069742c20616674657220766572696679696e672074686174207468652063616c6c657220697364746865206f776e6572206f6620746865206465706f7369742e000501546865207265666572656e63656420444944206964656e746966696572206d7573742062652070726573656e74206f6e20636861696e206265666f7265207468657864656c657465206f7065726174696f6e206973206576616c75617465642e00f441667465722069742069732064656c657465642c2061204449442077697468207468652073616d65206964656e7469666965722063616e6e6f742062655872652d63726561746564206576657220616761696e2e00010141732074686520726573756c74206f66207468652064656c6574696f6e2c20616c6c20747261636573206f662074686520444944206172652072656d6f766564e866726f6d207468652073746f726167652c20776869636820726573756c747320696e2074686520696e76616c69646174696f6e206f6620616c6c9c6174746573746174696f6e73206973737565642062792074686520444944207375626a6563742e004c456d697473206044696444656c65746564602e002823203c7765696768743e305765696768743a204f283129782d2052656164733a205b4f726967696e204163636f756e745d2c20446964cc2d204b696c6c733a2044696420656e747279206173736f63696174656420746f2074686520444944206964656e7469666965722c23203c2f7765696768743e3c7375626d69745f6469645f63616c6c0801206469645f63616c6c75040188426f783c446964417574686f72697a656443616c6c4f7065726174696f6e3c543e3e0001247369676e61747572650d0401304469645369676e6174757265000c8cec50726f7879206120646973706174636861626c652063616c6c206f6620616e6f746865722072756e74696d652065787472696e736963207468617458737570706f727473206120444944206f726967696e2e000501546865207265666572656e63656420444944206964656e746966696572206d7573742062652070726573656e74206f6e20636861696e206265666f726520746865606f7065726174696f6e20697320646973706174636865642e00fc412063616c6c207375626d6974746564207468726f75676820746869732065787472696e736963206d757374206265207369676e65642077697468207468650901726967687420444944206b65792c20646570656e64696e67206f6e207468652063616c6c2e205468697320696e666f726d6174696f6e2069732070726f766964656409016279207468652060446964417574686f72697a656443616c6c4f7065726174696f6e6020706172616d657465722c20776869636820737065636966696573207468650901444944207375626a65637420616374696e6720617320746865206f726967696e206f66207468652063616c6c2c2074686520444944277320747820636f756e7465720101286e6f6e6365292c2074686520646973706174636861626c6520746f2063616c6c20696e2063617365207369676e617475726520766572696669636174696f6ef073756363656564732c207468652074797065206f6620444944206b657920746f2075736520746f2076657269667920746865206f7065726174696f6efc7369676e61747572652c20616e642074686520626c6f636b206e756d62657220746865206f7065726174696f6e2077617320746172676574696e6720666f72a8696e636c7573696f6e2c207768656e20697420776173206372656174656420616e64207369676e65642e00fc496e206361736520746865207369676e617475726520697320696e636f72726563742c20746865206e6f6e6365206973206e6f742076616c69642c20746865fc7265717569726564206b6579206973206e6f742070726573656e7420666f722074686520737065636966696564204449442c206f722074686520626c6f636bfc73706563696669656420697320746f6f206f6c642074686520766572696669636174696f6e206661696c7320616e64207468652063616c6c206973206e6f74f4646973706174636865642e204f74686572776973652c207468652063616c6c2069732070726f7065726c79206469737061746368656420776974682061b8604469644f726967696e60206f726967696e20696e6469636174696e672074686520444944207375626a6563742e00110141207375636365737366756c206469737061746368206f7065726174696f6e20726573756c747320696e2074686520747820636f756e746572206173736f6369617465640501776974682074686520676976656e2044494420746f20626520696e6372656d656e7465642c20746f206d69746967617465207265706c61792061747461636b732e000101546865206469737061746368206f726967696e2063616e20626520616e79204b494c54206163636f756e74207769746820656e6f7567682066756e647320746f0d0165786563757465207468652065787472696e73696320616e6420697420646f6573206e6f74206861766520746f206265207469656420696e20616e792077617920746fb4746865204b494c54206163636f756e74206964656e74696679696e672074686520444944207375626a6563742e0068456d697473206044696443616c6c44697370617463686564602e002823203c7765696768743eb05765696768743a204f283129202b20776569676874206f662074686520646973706174636865642063616c6c782d2052656164733a205b4f726967696e204163636f756e745d2c20446964342d205772697465733a204469642c23203c2f7765696768743e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e29040c0c6469642c6469645f64657461696c73484469644372656174696f6e44657461696c73040454000018010c6469640001484469644964656e7469666965724f663c543e0001247375626d69747465720001384163636f756e7449644f663c543e0001586e65775f6b65795f61677265656d656e745f6b6579732d04016c4469644e65774b657941677265656d656e744b65795365743c543e00014c6e65775f6174746573746174696f6e5f6b65793d0401684f7074696f6e3c446964566572696669636174696f6e4b65793e0001486e65775f64656c65676174696f6e5f6b65793d0401684f7074696f6e3c446964566572696669636174696f6e4b65793e00014c6e65775f736572766963655f64657461696c735104014c5665633c446964456e64706f696e743c543e3e00002d04102873705f72756e74696d651c626f756e64656444626f756e6465645f62747265655f7365743c426f756e64656442547265655365740804540131040453000004003504012c42547265655365743c543e000031040c0c6469642c6469645f64657461696c7340446964456e6372797074696f6e4b65790001041858323535313904000401205b75383b2033325d00000000350404204254726565536574040454013104000400390400000039040000023104003d0404184f7074696f6e0404540141040108104e6f6e6500000010536f6d6504004104000001000041040c0c6469642c6469645f64657461696c7348446964566572696669636174696f6e4b657900010c1c4564323535313904004504013c656432353531393a3a5075626c69630000001c5372323535313904001103013c737232353531393a3a5075626c696300010014456364736104004904013465636473613a3a5075626c69630002000045040c1c73705f636f72651c65643235353139185075626c6963000004000401205b75383b2033325d000049040c1c73705f636f7265146563647361185075626c6963000004004d0401205b75383b2033335d00004d04000003210000000800510400000255040055040c0c64696444736572766963655f656e64706f696e74732c446964456e64706f696e7404045400000c010869645904015053657276696365456e64706f696e7449643c543e000134736572766963655f74797065735d04017453657276696365456e64706f696e7454797065456e74726965733c543e00011075726c736904017053657276696365456e64706f696e7455726c456e74726965733c543e00005904102873705f72756e74696d651c626f756e6465642c626f756e6465645f76656328426f756e64656456656308045401080453000004002801185665633c543e00005d04102873705f72756e74696d651c626f756e6465642c626f756e6465645f76656328426f756e646564566563080454016104045300000400650401185665633c543e00006104102873705f72756e74696d651c626f756e6465642c626f756e6465645f76656328426f756e64656456656308045401080453000004002801185665633c543e000065040000026104006904102873705f72756e74696d651c626f756e6465642c626f756e6465645f76656328426f756e646564566563080454016d04045300000400710401185665633c543e00006d04102873705f72756e74696d651c626f756e6465642c626f756e6465645f76656328426f756e64656456656308045401080453000004002801185665633c543e000071040000026d040075040c0c6469642c6469645f64657461696c7368446964417574686f72697a656443616c6c4f7065726174696f6e040454000014010c6469640001484469644964656e7469666965724f663c543e00012874785f636f756e74657210010c75363400011063616c6c8503014044696443616c6c61626c654f663c543e000130626c6f636b5f6e756d626572100140426c6f636b4e756d6265724f663c543e0001247375626d69747465720001384163636f756e7449644f663c543e000079040c4470616c6c65745f6469645f6c6f6f6b75701870616c6c65741043616c6c040454000114446173736f63696174655f6163636f756e740c011c6163636f756e740001384163636f756e7449644f663c543e00012865787069726174696f6e1001a03c54206173206672616d655f73797374656d3a3a436f6e6669673e3a3a426c6f636b4e756d62657200011470726f6f667d0401385369676e61747572654f663c543e00004405014173736f63696174652074686520676976656e206163636f756e7420746f2074686520444944207468617420617574686f72697a656420746869732063616c6c2e000501546865206163636f756e742068617320746f207369676e207468652044494420616e64206120626c6f636b6e756d62657220616674657220776869636820746865e07369676e6174757265206578706972657320696e206f7264657220746f20617574686f72697a6520746865206173736f63696174696f6e2e001101546865207369676e61747572652077696c6c20626520636865636b656420616761696e737420746865207363616c6520656e636f646564207475706c65206f66207468650d016d6574686f64207370656369666963206964206f662074686520646964206964656e74696669657220616e642074686520626c6f636b206e756d626572206166746572bc776869636820746865207369676e61747572652073686f756c6420626520726567617264656420696e76616c69642e001101456d69747320604173736f63696174696f6e45737461626c69736865646020616e642c206f7074696f6e616c6c792c20604173736f63696174696f6e52656d6f76656460d069662074686572652077617320612070726576696f7573206173736f63696174696f6e20666f7220746865206163636f756e742e002823203c7765696768743e305765696768743a204f283129f42d2052656164733a20436f6e6e656374656444696473202b20436f6e6e65637465644163636f756e7473202b20444944204f726967696e20436865636bac2d205772697465733a20436f6e6e656374656444696473202b20436f6e6e65637465644163636f756e74732c23203c2f7765696768743e406173736f63696174655f73656e64657200012c01014173736f6369617465207468652073656e646572206f66207468652063616c6c20746f2074686520444944207468617420617574686f72697a656420746869731463616c6c2e001101456d69747320604173736f63696174696f6e45737461626c69736865646020616e642c206f7074696f6e616c6c792c20604173736f63696174696f6e52656d6f76656460d069662074686572652077617320612070726576696f7573206173736f63696174696f6e20666f7220746865206163636f756e742e002823203c7765696768743e305765696768743a204f283129f42d2052656164733a20436f6e6e656374656444696473202b20436f6e6e65637465644163636f756e7473202b20444944204f726967696e20436865636bac2d205772697465733a20436f6e6e656374656444696473202b20436f6e6e65637465644163636f756e74732c23203c2f7765696768743e6472656d6f76655f73656e6465725f6173736f63696174696f6e000228fc52656d6f766520746865206173736f63696174696f6e206f66207468652073656e646572206163636f756e742e20546869732063616c6c20646f65736e27740d01726571756972652074686520617574686f72697a6174696f6e206f6620746865204449442c206275742072657175697265732061207369676e6564206f726967696e2e006c456d69747320604173736f63696174696f6e52656d6f766564602e002823203c7765696768743e305765696768743a204f283129f42d2052656164733a20436f6e6e656374656444696473202b20436f6e6e65637465644163636f756e7473202b20444944204f726967696e20436865636bac2d205772697465733a20436f6e6e656374656444696473202b20436f6e6e65637465644163636f756e74732c23203c2f7765696768743e6872656d6f76655f6163636f756e745f6173736f63696174696f6e04011c6163636f756e740001384163636f756e7449644f663c543e00032c110152656d6f766520746865206173736f63696174696f6e206f66207468652070726f7669646564206163636f756e742049442e20546869732063616c6c20646f65736e27740d01726571756972652074686520617574686f72697a6174696f6e206f6620746865206163636f756e742049442c2062757420746865206173736f63696174656420444944c46e6565647320746f206d617463682074686520444944207468617420617574686f72697a656420746869732063616c6c2e006c456d69747320604173736f63696174696f6e52656d6f766564602e002823203c7765696768743e305765696768743a204f283129f42d2052656164733a20436f6e6e656374656444696473202b20436f6e6e65637465644163636f756e7473202b20444944204f726967696e20436865636bac2d205772697465733a20436f6e6e656374656444696473202b20436f6e6e65637465644163636f756e74732c23203c2f7765696768743e3c7265636c61696d5f6465706f73697404011c6163636f756e740001384163636f756e7449644f663c543e00042c090152656d6f766520746865206173736f63696174696f6e206f66207468652070726f7669646564206163636f756e742e20546869732063616c6c2063616e206f6e6c79f862652063616c6c65642066726f6d20746865206465706f736974206f776e65722e20546865207265736572766564206465706f7369742077696c6c2062651866726565642e006c456d69747320604173736f63696174696f6e52656d6f766564602e002823203c7765696768743e305765696768743a204f283129582d2052656164733a20436f6e6e6563746564446964735c2d205772697465733a20436f6e6e6563746564446964732c23203c2f7765696768743e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e7d04082873705f72756e74696d65384d756c74695369676e617475726500010c1c45643235353139040011040148656432353531393a3a5369676e61747572650000001c53723235353139040019040148737232353531393a3a5369676e617475726500010014456364736104001d04014065636473613a3a5369676e61747572650002000081040c4470616c6c65745f776562335f6e616d65731870616c6c65741043616c6c04045400011414636c61696d0401106e616d651d010140576562334e616d65496e7075743c543e00003ce841737369676e2074686520737065636966696564206e616d6520746f20746865206f776e65722061732073706563696669656420696e207468651c6f726967696e2e000d01546865206e616d65206d757374206e6f74206861766520616c7265616479206265656e20636c61696d656420627920736f6d656f6e6520656c736520616e6420746865a06f776e6572206d757374206e6f7420616c7265616479206f776e20616e6f74686572206e616d652e00dc456d6974732060576562334e616d65436c61696d65646020696620746865206f7065726174696f6e2069732063617272696564206f7574347375636365737366756c6c792e002823203c7765696768743e305765696768743a204f28312909012d2052656164733a204e616d65732c204f776e65722c2042616e6e65642073746f7261676520656e7472696573202b20617661696c61626c652063757272656e6379582020636865636b202b206f726967696e20636865636b05012d205772697465733a204e616d65732c204f776e65722073746f7261676520656e7472696573202b2063757272656e6379206465706f73697420726573657276652c23203c2f7765696768743e4072656c656173655f62795f6f776e6572000130a452656c65617365207468652070726f7669646564206e616d652066726f6d20697473206f776e65722e00cc546865206f726967696e206d75737420626520746865206f776e6572206f662074686520737065636966696564206e616d652e00e0456d6974732060576562334e616d6552656c65617365646020696620746865206f7065726174696f6e2069732063617272696564206f7574347375636365737366756c6c792e002823203c7765696768743e305765696768743a204f283129ac2d2052656164733a204e616d65732073746f7261676520656e747279202b206f726967696e20636865636b05012d205772697465733a204e616d65732c204f776e65722073746f7261676520656e7472696573202b2063757272656e6379206465706f7369742072656c656173652c23203c2f7765696768743e3c7265636c61696d5f6465706f7369740401106e616d651d010140576562334e616d65496e7075743c543e000230a452656c65617365207468652070726f7669646564206e616d652066726f6d20697473206f776e65722e000101546865206f726967696e206d75737420626520746865206163636f756e742074686174207061696420666f7220746865206e616d652773206465706f7369742e00e0456d6974732060576562334e616d6552656c65617365646020696620746865206f7065726174696f6e2069732063617272696564206f7574347375636365737366756c6c792e002823203c7765696768743e305765696768743a204f283129ac2d2052656164733a204f776e65722073746f7261676520656e747279202b206f726967696e20636865636b05012d205772697465733a204e616d65732c204f776e65722073746f7261676520656e7472696573202b2063757272656e6379206465706f7369742072656c656173652c23203c2f7765696768743e0c62616e0401106e616d651d010140576562334e616d65496e7075743c543e0003402c42616e2061206e616d652e00f4412062616e6e6564206e616d652063616e6e6f7420626520636c61696d656420627920616e796f6e652e20546865206e616d652773206465706f7369748869732072657475726e656420746f20746865206f726967696e616c2070617965722e0088546865206f726967696e206d757374206265207468652062616e206f726967696e2e00d8456d6974732060576562334e616d6542616e6e65646020696620746865206f7065726174696f6e2069732063617272696564206f7574347375636365737366756c6c792e002823203c7765696768743e305765696768743a204f283129f02d2052656164733a2042616e6e65642c204f776e65722c204e616d65732073746f7261676520656e7472696573202b206f726967696e20636865636b05012d205772697465733a204e616d65732c204f776e65722c2042616e6e65642073746f7261676520656e7472696573202b2063757272656e6379206465706f73697424202072656c656173652c23203c2f7765696768743e14756e62616e0401106e616d651d010140576562334e616d65496e7075743c543e00043834556e62616e2061206e616d652e00704d616b652061206e616d6520636c61696d61626c6520616761696e2e0088546865206f726967696e206d757374206265207468652062616e206f726967696e2e00e0456d6974732060576562334e616d65556e62616e6e65646020696620746865206f7065726174696f6e2069732063617272696564206f7574347375636365737366756c6c792e002823203c7765696768743e305765696768743a204f283129b02d2052656164733a2042616e6e65642073746f7261676520656e747279202b206f726967696e20636865636bb82d205772697465733a2042616e6e65642073746f7261676520656e747279206465706f7369742072656c656173652c23203c2f7765696768743e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e85040c7c63756d756c75735f70616c6c65745f70617261636861696e5f73797374656d1870616c6c65741043616c6c0404540001104c7365745f76616c69646174696f6e5f64617461040110646174618904015450617261636861696e496e686572656e744461746100002480536574207468652063757272656e742076616c69646174696f6e20646174612e004101546869732073686f756c6420626520696e766f6b65642065786163746c79206f6e63652070657220626c6f636b2e2049742077696c6c2070616e6963206174207468652066696e616c697a6174696f6e887068617365206966207468652063616c6c20776173206e6f7420696e766f6b65642e00d0546865206469737061746368206f726967696e20666f7220746869732063616c6c206d7573742062652060496e686572656e7460002101417320612073696465206566666563742c20746869732066756e6374696f6e207570677261646573207468652063757272656e742076616c69646174696f6e2066756e6374696f6e8469662074686520617070726f7072696174652074696d652068617320636f6d652e607375646f5f73656e645f7570776172645f6d65737361676504011c6d6573736167652801345570776172644d65737361676500010044617574686f72697a655f75706772616465040124636f64655f6861736824011c543a3a4861736800020060656e6163745f617574686f72697a65645f75706772616465040110636f646528011c5665633c75383e000300042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e8904089463756d756c75735f7072696d6974697665735f70617261636861696e5f696e686572656e745450617261636861696e496e686572656e7444617461000010013c76616c69646174696f6e5f646174618d04015c50657273697374656456616c69646174696f6e4461746100014472656c61795f636861696e5f73746174659504015473705f747269653a3a53746f7261676550726f6f66000144646f776e776172645f6d657373616765739d04016c5665633c496e626f756e64446f776e776172644d6573736167653e00014c686f72697a6f6e74616c5f6d65737361676573a50401a442547265654d61703c5061726149642c205665633c496e626f756e6448726d704d6573736167653e3e00008d040c4c706f6c6b61646f745f7072696d6974697665730876325c50657273697374656456616c69646174696f6e446174610804480124044e011c0010012c706172656e745f6865616491040120486561644461746100014c72656c61795f706172656e745f6e756d6265721c01044e00016472656c61795f706172656e745f73746f726167655f726f6f74240104480001306d61785f706f765f73697a651c010c753332000091040c48706f6c6b61646f745f70617261636861696e287072696d6974697665732048656164446174610000040028011c5665633c75383e000095040c1c73705f747269653473746f726167655f70726f6f663053746f7261676550726f6f660000040128747269655f6e6f6465739904014442547265655365743c5665633c75383e3e0000990404204254726565536574040454012800040001020000009d04000002a10400a1040860706f6c6b61646f745f636f72655f7072696d69746976657358496e626f756e64446f776e776172644d657373616765042c426c6f636b4e756d626572011c0008011c73656e745f61741c012c426c6f636b4e756d62657200010c6d736728013c446f776e776172644d6573736167650000a504042042547265654d617008044b013101045601a904000400b104000000a904000002ad0400ad040860706f6c6b61646f745f636f72655f7072696d69746976657348496e626f756e6448726d704d657373616765042c426c6f636b4e756d626572011c0008011c73656e745f61741c012c426c6f636b4e756d6265720001106461746128015073705f7374643a3a7665633a3a5665633c75383e0000b104000002b50400b504000004083101a90400b9040c6463756d756c75735f70616c6c65745f78636d705f71756575651870616c6c65741043616c6c04045400012448736572766963655f6f766572776569676874080114696e64657810013c4f766572776569676874496e6465780001307765696768745f6c696d697410011857656967687400003484536572766963657320612073696e676c65206f7665727765696768742058434d2e00c02d20606f726967696e603a204d75737420706173732060457865637574654f7665727765696768744f726967696e602ed42d2060696e646578603a2054686520696e646578206f6620746865206f7665727765696768742058434d20746f20736572766963650d012d20607765696768745f6c696d6974603a2054686520616d6f756e74206f662077656967687420746861742058434d20657865637574696f6e206d61792074616b652e001c4572726f72733a5d012d20604261644f766572776569676874496e646578603a2058434d20756e6465722060696e64657860206973206e6f7420666f756e6420696e2074686520604f766572776569676874602073746f72616765206d61702e45012d206042616458636d603a2058434d20756e6465722060696e646578602063616e6e6f742062652070726f7065726c79206465636f64656420696e746f20612076616c69642058434d20666f726d61742e09012d20605765696768744f7665724c696d6974603a2058434d20657865637574696f6e206d617920757365206772656174657220607765696768745f6c696d6974602e001c4576656e74733a8c2d20604f7665727765696768745365727669636564603a204f6e20737563636573732e5473757370656e645f78636d5f657865637574696f6e00010c490153757370656e647320616c6c2058434d20657865637574696f6e7320666f72207468652058434d502071756575652c207265676172646c657373206f66207468652073656e6465722773206f726967696e2e00a42d20606f726967696e603a204d75737420706173732060436f6e74726f6c6c65724f726967696e602e50726573756d655f78636d5f657865637574696f6e000214b8526573756d657320616c6c2058434d20657865637574696f6e7320666f72207468652058434d502071756575652e003d014e6f7465207468617420746869732066756e6374696f6e20646f65736e2774206368616e67652074686520737461747573206f662074686520696e2f6f757420626f756e64206368616e6e656c732e00a42d20606f726967696e603a204d75737420706173732060436f6e74726f6c6c65724f726967696e602e607570646174655f73757370656e645f7468726573686f6c6404010c6e65771c010c75333200031499014f76657277726974657320746865206e756d626572206f66207061676573206f66206d65737361676573207768696368206d75737420626520696e2074686520717565756520666f7220746865206f74686572207369646520746f20626520746f6c6420746f5873757370656e642074686569722073656e64696e672e00742d20606f726967696e603a204d75737420706173732060526f6f74602ee82d20606e6577603a20446573697265642076616c756520666f7220605175657565436f6e666967446174612e73757370656e645f76616c756560547570646174655f64726f705f7468726573686f6c6404010c6e65771c010c75333200041495014f76657277726974657320746865206e756d626572206f66207061676573206f66206d65737361676573207768696368206d75737420626520696e207468652071756575652061667465722077686963682077652064726f7020616e792066757274686572686d657373616765732066726f6d20746865206368616e6e656c2e00742d20606f726967696e603a204d75737420706173732060526f6f74602eec2d20606e6577603a20446573697265642076616c756520666f7220605175657565436f6e666967446174612e64726f705f7468726573686f6c64605c7570646174655f726573756d655f7468726573686f6c6404010c6e65771c010c75333200051491014f76657277726974657320746865206e756d626572206f66207061676573206f66206d6573736167657320776869636820746865207175657565206d757374206265207265647563656420746f206265666f7265206974207369676e616c732074686174ec6d6573736167652073656e64696e67206d6179207265636f6d6d656e636520616674657220697420686173206265656e2073757370656e6465642e00742d20606f726967696e603a204d75737420706173732060526f6f74602ef42d20606e6577603a20446573697265642076616c756520666f7220605175657565436f6e666967446174612e726573756d655f7468726573686f6c64605c7570646174655f7468726573686f6c645f77656967687404010c6e657710011857656967687400061049014f7665727772697465732074686520616d6f756e74206f662072656d61696e696e672077656967687420756e6465722077686963682077652073746f702070726f63657373696e67206d657373616765732e00742d20606f726967696e603a204d75737420706173732060526f6f74602ef42d20606e6577603a20446573697265642076616c756520666f7220605175657565436f6e666967446174612e7468726573686f6c645f77656967687460707570646174655f7765696768745f72657374726963745f646563617904010c6e657710011857656967687400071445014f7665727772697465732074686520737065656420746f2077686963682074686520617661696c61626c652077656967687420617070726f616368657320746865206d6178696d756d207765696768742ea50141206c6f776572206e756d62657220726573756c747320696e2061206661737465722070726f6772657373696f6e2e20412076616c7565206f662031206d616b65732074686520656e746972652077656967687420617661696c61626c6520696e697469616c6c792e00742d20606f726967696e603a204d75737420706173732060526f6f74602e0d012d20606e6577603a20446573697265642076616c756520666f7220605175657565436f6e666967446174612e7765696768745f72657374726963745f6465636179602e847570646174655f78636d705f6d61785f696e646976696475616c5f77656967687404010c6e657710011857656967687400081429014f766572777269746520746865206d6178696d756d20616d6f756e74206f662077656967687420616e7920696e646976696475616c206d657373616765206d617920636f6e73756d652e71014d657373616765732061626f766520746869732077656967687420676f20696e746f20746865206f76657277656967687420717565756520616e64206d6179206f6e6c79206265207365727669636564206578706c696369746c792e00742d20606f726967696e603a204d75737420706173732060526f6f74602e21012d20606e6577603a20446573697265642076616c756520666f7220605175657565436f6e666967446174612e78636d705f6d61785f696e646976696475616c5f776569676874602e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ebd040c2870616c6c65745f78636d1870616c6c65741043616c6c0404540001281073656e6408011064657374d101016c426f783c56657273696f6e65644d756c74694c6f636174696f6e3e00011c6d657373616765c1040154426f783c56657273696f6e656458636d3c28293e3e0000003c74656c65706f72745f61737365747310011064657374d101016c426f783c56657273696f6e65644d756c74694c6f636174696f6e3e00012c62656e6566696369617279d101016c426f783c56657273696f6e65644d756c74694c6f636174696f6e3e000118617373657473bd010164426f783c56657273696f6e65644d756c74694173736574733e0001386665655f61737365745f6974656d1c010c75333200013c110154656c65706f727420736f6d65206173736574732066726f6d20746865206c6f63616c20636861696e20746f20736f6d652064657374696e6174696f6e20636861696e2e005101466565207061796d656e74206f6e207468652064657374696e6174696f6e2073696465206973206d6164652066726f6d2074686520617373657420696e2074686520606173736574736020766563746f72206f666101696e64657820606665655f61737365745f6974656d602e2054686520776569676874206c696d697420666f722066656573206973206e6f742070726f766964656420616e64207468757320697320756e6c696d697465642cb47769746820616c6c20666565732074616b656e206173206e65656465642066726f6d207468652061737365742e0029012d20606f726967696e603a204d7573742062652063617061626c65206f66207769746864726177696e672074686520606173736574736020616e6420657865637574696e672058434d2e8d012d206064657374603a2044657374696e6174696f6e20636f6e7465787420666f7220746865206173736574732e2057696c6c207479706963616c6c792062652060583228506172656e742c2050617261636861696e282e2e29296020746f2073656e645901202066726f6d2070617261636861696e20746f2070617261636861696e2c206f72206058312850617261636861696e282e2e29296020746f2073656e642066726f6d2072656c617920746f2070617261636861696e2e89012d206062656e6566696369617279603a20412062656e6566696369617279206c6f636174696f6e20666f72207468652061737365747320696e2074686520636f6e74657874206f66206064657374602e2057696c6c2067656e6572616c6c79206265642020616e20604163636f756e7449643332602076616c75652ead012d2060617373657473603a205468652061737365747320746f2062652077697468647261776e2e20546865206669727374206974656d2073686f756c64206265207468652063757272656e6379207573656420746f20746f207061792074686520666565206f6e2074686580202060646573746020736964652e204d6179206e6f7420626520656d7074792e4d012d20606665655f61737365745f6974656d603a2054686520696e64657820696e746f206061737365747360206f6620746865206974656d2077686963682073686f756c64206265207573656420746f207061791c2020666565732e5c726573657276655f7472616e736665725f61737365747310011064657374d101016c426f783c56657273696f6e65644d756c74694c6f636174696f6e3e00012c62656e6566696369617279d101016c426f783c56657273696f6e65644d756c74694c6f636174696f6e3e000118617373657473bd010164426f783c56657273696f6e65644d756c74694173736574733e0001386665655f61737365745f6974656d1c010c7533320002404d015472616e7366657220736f6d65206173736574732066726f6d20746865206c6f63616c20636861696e20746f2074686520736f7665726569676e206163636f756e74206f6620612064657374696e6174696f6e94636861696e20616e6420666f72776172642061206e6f74696669636174696f6e2058434d2e005101466565207061796d656e74206f6e207468652064657374696e6174696f6e2073696465206973206d6164652066726f6d2074686520617373657420696e2074686520606173736574736020766563746f72206f666101696e64657820606665655f61737365745f6974656d602e2054686520776569676874206c696d697420666f722066656573206973206e6f742070726f766964656420616e64207468757320697320756e6c696d697465642cb47769746820616c6c20666565732074616b656e206173206e65656465642066726f6d207468652061737365742e0029012d20606f726967696e603a204d7573742062652063617061626c65206f66207769746864726177696e672074686520606173736574736020616e6420657865637574696e672058434d2e8d012d206064657374603a2044657374696e6174696f6e20636f6e7465787420666f7220746865206173736574732e2057696c6c207479706963616c6c792062652060583228506172656e742c2050617261636861696e282e2e29296020746f2073656e645901202066726f6d2070617261636861696e20746f2070617261636861696e2c206f72206058312850617261636861696e282e2e29296020746f2073656e642066726f6d2072656c617920746f2070617261636861696e2e89012d206062656e6566696369617279603a20412062656e6566696369617279206c6f636174696f6e20666f72207468652061737365747320696e2074686520636f6e74657874206f66206064657374602e2057696c6c2067656e6572616c6c79206265642020616e20604163636f756e7449643332602076616c75652e85012d2060617373657473603a205468652061737365747320746f2062652077697468647261776e2e20546869732073686f756c6420696e636c7564652074686520617373657473207573656420746f207061792074686520666565206f6e2074686538202060646573746020736964652e4d012d20606665655f61737365745f6974656d603a2054686520696e64657820696e746f206061737365747360206f6620746865206974656d2077686963682073686f756c64206265207573656420746f207061791c2020666565732e1c6578656375746508011c6d657373616765ed0401a4426f783c56657273696f6e656458636d3c3c5420617320537973436f6e6669673e3a3a43616c6c3e3e0001286d61785f77656967687410011857656967687400032cd04578656375746520616e2058434d206d6573736167652066726f6d2061206c6f63616c2c207369676e65642c206f726967696e2e004d01416e206576656e74206973206465706f736974656420696e6469636174696e67207768657468657220606d73676020636f756c6420626520657865637574656420636f6d706c6574656c79206f72206f6e6c79287061727469616c6c792e006d014e6f206d6f7265207468616e20606d61785f776569676874602077696c6c206265207573656420696e2069747320617474656d7074656420657865637574696f6e2e2049662074686973206973206c657373207468616e2074686559016d6178696d756d20616d6f756e74206f6620776569676874207468617420746865206d65737361676520636f756c642074616b6520746f2062652065786563757465642c207468656e206e6f20657865637574696f6e54617474656d70742077696c6c206265206d6164652e006d014e4f54453a2041207375636365737366756c2072657475726e20746f207468697320646f6573202a6e6f742a20696d706c7920746861742074686520606d73676020776173206578656375746564207375636365737366756c6c79cc746f20636f6d706c6574696f6e3b206f6e6c792074686174202a736f6d652a206f66206974207761732065786563757465642e44666f7263655f78636d5f76657273696f6e0801206c6f636174696f6e3d010148426f783c4d756c74694c6f636174696f6e3e00012c78636d5f76657273696f6e1c012858636d56657273696f6e00041849014578746f6c6c2074686174206120706172746963756c61722064657374696e6174696f6e2063616e20626520636f6d6d756e6963617465642077697468207468726f756768206120706172746963756c61723c76657273696f6e206f662058434d2e00642d20606f726967696e603a204d75737420626520526f6f742ed82d20606c6f636174696f6e603a205468652064657374696e6174696f6e2074686174206973206265696e67206465736372696265642e11012d206078636d5f76657273696f6e603a20546865206c61746573742076657273696f6e206f662058434d207468617420606c6f636174696f6e6020737570706f7274732e64666f7263655f64656661756c745f78636d5f76657273696f6e0401446d617962655f78636d5f76657273696f6e790301484f7074696f6e3c58636d56657273696f6e3e0005145901536574206120736166652058434d2076657273696f6e20287468652076657273696f6e20746861742058434d2073686f756c6420626520656e636f646564207769746820696620746865206d6f737420726563656e74b476657273696f6e20612064657374696e6174696f6e2063616e2061636365707420697320756e6b6e6f776e292e00642d20606f726967696e603a204d75737420626520526f6f742e39012d20606d617962655f78636d5f76657273696f6e603a205468652064656661756c742058434d20656e636f64696e672076657273696f6e2c206f7220604e6f6e656020746f2064697361626c652e78666f7263655f7375627363726962655f76657273696f6e5f6e6f746966790401206c6f636174696f6ed101016c426f783c56657273696f6e65644d756c74694c6f636174696f6e3e000610390141736b2061206c6f636174696f6e20746f206e6f7469667920757320726567617264696e672074686569722058434d2076657273696f6e20616e6420616e79206368616e67657320746f2069742e00642d20606f726967696e603a204d75737420626520526f6f742e59012d20606c6f636174696f6e603a20546865206c6f636174696f6e20746f2077686963682077652073686f756c642073756273637269626520666f722058434d2076657273696f6e206e6f74696669636174696f6e732e80666f7263655f756e7375627363726962655f76657273696f6e5f6e6f746966790401206c6f636174696f6ed101016c426f783c56657273696f6e65644d756c74694c6f636174696f6e3e0007184901526571756972652074686174206120706172746963756c61722064657374696e6174696f6e2073686f756c64206e6f206c6f6e676572206e6f7469667920757320726567617264696e6720616e792058434d4076657273696f6e206368616e6765732e00642d20606f726967696e603a204d75737420626520526f6f742e3d012d20606c6f636174696f6e603a20546865206c6f636174696f6e20746f207768696368207765206172652063757272656e746c79207375627363726962656420666f722058434d2076657273696f6ea820206e6f74696669636174696f6e73207768696368207765206e6f206c6f6e676572206465736972652e7c6c696d697465645f726573657276655f7472616e736665725f61737365747314011064657374d101016c426f783c56657273696f6e65644d756c74694c6f636174696f6e3e00012c62656e6566696369617279d101016c426f783c56657273696f6e65644d756c74694c6f636174696f6e3e000118617373657473bd010164426f783c56657273696f6e65644d756c74694173736574733e0001386665655f61737365745f6974656d1c010c7533320001307765696768745f6c696d6974b501012c5765696768744c696d69740008484d015472616e7366657220736f6d65206173736574732066726f6d20746865206c6f63616c20636861696e20746f2074686520736f7665726569676e206163636f756e74206f6620612064657374696e6174696f6e94636861696e20616e6420666f72776172642061206e6f74696669636174696f6e2058434d2e005101466565207061796d656e74206f6e207468652064657374696e6174696f6e2073696465206973206d6164652066726f6d2074686520617373657420696e2074686520606173736574736020766563746f72206f666101696e64657820606665655f61737365745f6974656d602c20757020746f20656e6f75676820746f2070617920666f7220607765696768745f6c696d697460206f66207765696768742e204966206d6f72652077656967687459016973206e6565646564207468616e20607765696768745f6c696d6974602c207468656e20746865206f7065726174696f6e2077696c6c206661696c20616e6420746865206173736574732073656e64206d6179206265206174207269736b2e0029012d20606f726967696e603a204d7573742062652063617061626c65206f66207769746864726177696e672074686520606173736574736020616e6420657865637574696e672058434d2e8d012d206064657374603a2044657374696e6174696f6e20636f6e7465787420666f7220746865206173736574732e2057696c6c207479706963616c6c792062652060583228506172656e742c2050617261636861696e282e2e29296020746f2073656e645901202066726f6d2070617261636861696e20746f2070617261636861696e2c206f72206058312850617261636861696e282e2e29296020746f2073656e642066726f6d2072656c617920746f2070617261636861696e2e89012d206062656e6566696369617279603a20412062656e6566696369617279206c6f636174696f6e20666f72207468652061737365747320696e2074686520636f6e74657874206f66206064657374602e2057696c6c2067656e6572616c6c79206265642020616e20604163636f756e7449643332602076616c75652e85012d2060617373657473603a205468652061737365747320746f2062652077697468647261776e2e20546869732073686f756c6420696e636c7564652074686520617373657473207573656420746f207061792074686520666565206f6e2074686538202060646573746020736964652e4d012d20606665655f61737365745f6974656d603a2054686520696e64657820696e746f206061737365747360206f6620746865206974656d2077686963682073686f756c64206265207573656420746f207061791c2020666565732e45012d20607765696768745f6c696d6974603a205468652072656d6f74652d7369646520776569676874206c696d69742c20696620616e792c20666f72207468652058434d206665652070757263686173652e5c6c696d697465645f74656c65706f72745f61737365747314011064657374d101016c426f783c56657273696f6e65644d756c74694c6f636174696f6e3e00012c62656e6566696369617279d101016c426f783c56657273696f6e65644d756c74694c6f636174696f6e3e000118617373657473bd010164426f783c56657273696f6e65644d756c74694173736574733e0001386665655f61737365745f6974656d1c010c7533320001307765696768745f6c696d6974b501012c5765696768744c696d6974000944110154656c65706f727420736f6d65206173736574732066726f6d20746865206c6f63616c20636861696e20746f20736f6d652064657374696e6174696f6e20636861696e2e005101466565207061796d656e74206f6e207468652064657374696e6174696f6e2073696465206973206d6164652066726f6d2074686520617373657420696e2074686520606173736574736020766563746f72206f666101696e64657820606665655f61737365745f6974656d602c20757020746f20656e6f75676820746f2070617920666f7220607765696768745f6c696d697460206f66207765696768742e204966206d6f72652077656967687459016973206e6565646564207468616e20607765696768745f6c696d6974602c207468656e20746865206f7065726174696f6e2077696c6c206661696c20616e6420746865206173736574732073656e64206d6179206265206174207269736b2e0029012d20606f726967696e603a204d7573742062652063617061626c65206f66207769746864726177696e672074686520606173736574736020616e6420657865637574696e672058434d2e8d012d206064657374603a2044657374696e6174696f6e20636f6e7465787420666f7220746865206173736574732e2057696c6c207479706963616c6c792062652060583228506172656e742c2050617261636861696e282e2e29296020746f2073656e645901202066726f6d2070617261636861696e20746f2070617261636861696e2c206f72206058312850617261636861696e282e2e29296020746f2073656e642066726f6d2072656c617920746f2070617261636861696e2e89012d206062656e6566696369617279603a20412062656e6566696369617279206c6f636174696f6e20666f72207468652061737365747320696e2074686520636f6e74657874206f66206064657374602e2057696c6c2067656e6572616c6c79206265642020616e20604163636f756e7449643332602076616c75652ead012d2060617373657473603a205468652061737365747320746f2062652077697468647261776e2e20546865206669727374206974656d2073686f756c64206265207468652063757272656e6379207573656420746f20746f207061792074686520666565206f6e2074686580202060646573746020736964652e204d6179206e6f7420626520656d7074792e4d012d20606665655f61737365745f6974656d603a2054686520696e64657820696e746f206061737365747360206f6620746865206974656d2077686963682073686f756c64206265207573656420746f207061791c2020666565732e45012d20607765696768745f6c696d6974603a205468652072656d6f74652d7369646520776569676874206c696d69742c20696620616e792c20666f72207468652058434d206665652070757263686173652e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ec104080c78636d3056657273696f6e656458636d041043616c6c00010c0856300400c504013476303a3a58636d3c43616c6c3e0000000856310400d904013476313a3a58636d3c43616c6c3e00010008563204006901013476323a3a58636d3c43616c6c3e00020000c5040c0c78636d0876300c58636d041043616c6c00012c3457697468647261774173736574080118617373657473c101013c5665633c4d756c746941737365743e00011c65666665637473c90401405665633c4f726465723c43616c6c3e3e0000004c5265736572766541737365744465706f736974080118617373657473c101013c5665633c4d756c746941737365743e00011c65666665637473c90401405665633c4f726465723c43616c6c3e3e0001003454656c65706f72744173736574080118617373657473c101013c5665633c4d756c746941737365743e00011c65666665637473c90401405665633c4f726465723c43616c6c3e3e000200345175657279526573706f6e736508012071756572795f69645501010c753634000120726573706f6e7365d5040120526573706f6e7365000300345472616e736665724173736574080118617373657473c101013c5665633c4d756c746941737365743e00011064657374c90101344d756c74694c6f636174696f6e000400505472616e736665725265736572766541737365740c0118617373657473c101013c5665633c4d756c746941737365743e00011064657374c90101344d756c74694c6f636174696f6e00011c65666665637473c90401385665633c4f726465723c28293e3e000500205472616e736163740c012c6f726967696e5f74797065a10101284f726967696e4b696e64000158726571756972655f7765696768745f61745f6d6f737410010c75363400011063616c6ca501014c446f75626c65456e636f6465643c43616c6c3e0006006448726d704e65774368616e6e656c4f70656e526571756573740c011873656e6465724901010c7533320001406d61785f6d6573736167655f73697a654901010c7533320001306d61785f63617061636974794901010c7533320007004c48726d704368616e6e656c4163636570746564040124726563697069656e744901010c7533320008004848726d704368616e6e656c436c6f73696e670c0124696e69746961746f724901010c75333200011873656e6465724901010c753332000124726563697069656e744901010c7533320009002c52656c6179656446726f6d08010c77686fc90101344d756c74694c6f636174696f6e00011c6d657373616765c5040170616c6c6f633a3a626f7865643a3a426f783c58636d3c43616c6c3e3e000a0000c904000002cd0400cd04100c78636d087630146f72646572144f72646572041043616c6c000120104e756c6c000000304465706f7369744173736574080118617373657473c101013c5665633c4d756c746941737365743e00011064657374c90101344d756c74694c6f636174696f6e0001004c4465706f7369745265736572766541737365740c0118617373657473c101013c5665633c4d756c746941737365743e00011064657374c90101344d756c74694c6f636174696f6e00011c65666665637473c90401385665633c4f726465723c28293e3e0002003445786368616e6765417373657408011067697665c101013c5665633c4d756c746941737365743e00011c72656365697665c101013c5665633c4d756c746941737365743e0003005c496e6974696174655265736572766557697468647261770c0118617373657473c101013c5665633c4d756c746941737365743e00011c72657365727665c90101344d756c74694c6f636174696f6e00011c65666665637473c90401385665633c4f726465723c28293e3e00040040496e69746961746554656c65706f72740c0118617373657473c101013c5665633c4d756c746941737365743e00011064657374c90101344d756c74694c6f636174696f6e00011c65666665637473c90401385665633c4f726465723c28293e3e000500305175657279486f6c64696e670c012071756572795f69645501010c75363400011064657374c90101344d756c74694c6f636174696f6e000118617373657473c101013c5665633c4d756c746941737365743e00060030427579457865637574696f6e14011066656573c50101284d756c7469417373657400011877656967687410010c7536340001106465627410010c75363400013468616c745f6f6e5f6572726f72a80110626f6f6c00010c78636dd10401385665633c58636d3c43616c6c3e3e00070000d104000002c50400d5040c0c78636d08763020526573706f6e7365000104184173736574730400c101013c5665633c4d756c746941737365743e00000000d9040c0c78636d0876310c58636d041043616c6c00013434576974686472617741737365740801186173736574737501012c4d756c746941737365747300011c65666665637473dd0401405665633c4f726465723c43616c6c3e3e000000545265736572766541737365744465706f73697465640801186173736574737501012c4d756c746941737365747300011c65666665637473dd0401405665633c4f726465723c43616c6c3e3e000100585265636569766554656c65706f7274656441737365740801186173736574737501012c4d756c746941737365747300011c65666665637473dd0401405665633c4f726465723c43616c6c3e3e000200345175657279526573706f6e736508012071756572795f69645501010c753634000120726573706f6e7365e9040120526573706f6e7365000300345472616e7366657241737365740801186173736574737501012c4d756c746941737365747300012c62656e65666963696172793d0101344d756c74694c6f636174696f6e000400505472616e736665725265736572766541737365740c01186173736574737501012c4d756c7469417373657473000110646573743d0101344d756c74694c6f636174696f6e00011c65666665637473dd0401385665633c4f726465723c28293e3e000500205472616e736163740c012c6f726967696e5f74797065a10101284f726967696e4b696e64000158726571756972655f7765696768745f61745f6d6f737410010c75363400011063616c6ca501014c446f75626c65456e636f6465643c43616c6c3e0006006448726d704e65774368616e6e656c4f70656e526571756573740c011873656e6465724901010c7533320001406d61785f6d6573736167655f73697a654901010c7533320001306d61785f63617061636974794901010c7533320007004c48726d704368616e6e656c4163636570746564040124726563697069656e744901010c7533320008004848726d704368616e6e656c436c6f73696e670c0124696e69746961746f724901010c75333200011873656e6465724901010c753332000124726563697069656e744901010c7533320009002c52656c6179656446726f6d08010c77686f41010154496e746572696f724d756c74694c6f636174696f6e00011c6d657373616765d9040170616c6c6f633a3a626f7865643a3a426f783c58636d3c43616c6c3e3e000a004053756273637269626556657273696f6e08012071756572795f69645501010c75363400014c6d61785f726573706f6e73655f7765696768745501010c753634000b0048556e73756273637269626556657273696f6e000c0000dd04000002e10400e104100c78636d087631146f72646572144f72646572041043616c6c000120104e6f6f70000000304465706f73697441737365740c0118617373657473a90101404d756c7469417373657446696c7465720001286d61785f6173736574731c010c75333200012c62656e65666963696172793d0101344d756c74694c6f636174696f6e0001004c4465706f736974526573657276654173736574100118617373657473a90101404d756c7469417373657446696c7465720001286d61785f6173736574731c010c753332000110646573743d0101344d756c74694c6f636174696f6e00011c65666665637473dd0401385665633c4f726465723c28293e3e0002003445786368616e6765417373657408011067697665a90101404d756c7469417373657446696c74657200011c726563656976657501012c4d756c74694173736574730003005c496e6974696174655265736572766557697468647261770c0118617373657473a90101404d756c7469417373657446696c74657200011c726573657276653d0101344d756c74694c6f636174696f6e00011c65666665637473dd0401385665633c4f726465723c28293e3e00040040496e69746961746554656c65706f72740c0118617373657473a90101404d756c7469417373657446696c746572000110646573743d0101344d756c74694c6f636174696f6e00011c65666665637473dd0401385665633c4f726465723c28293e3e000500305175657279486f6c64696e670c012071756572795f69645501010c753634000110646573743d0101344d756c74694c6f636174696f6e000118617373657473a90101404d756c7469417373657446696c74657200060030427579457865637574696f6e140110666565737d0101284d756c7469417373657400011877656967687410010c7536340001106465627410010c75363400013468616c745f6f6e5f6572726f72a80110626f6f6c000130696e737472756374696f6e73e50401385665633c58636d3c43616c6c3e3e00070000e504000002d90400e9040c0c78636d08763120526573706f6e73650001081841737365747304007501012c4d756c74694173736574730000001c56657273696f6e04001c013873757065723a3a56657273696f6e00010000ed04080c78636d3056657273696f6e656458636d041043616c6c00010c0856300400f104013476303a3a58636d3c43616c6c3e00000008563104000505013476313a3a58636d3c43616c6c3e00010008563204001505013476323a3a58636d3c43616c6c3e00020000f1040c0c78636d0876300c58636d041043616c6c00012c3457697468647261774173736574080118617373657473c101013c5665633c4d756c746941737365743e00011c65666665637473f50401405665633c4f726465723c43616c6c3e3e0000004c5265736572766541737365744465706f736974080118617373657473c101013c5665633c4d756c746941737365743e00011c65666665637473f50401405665633c4f726465723c43616c6c3e3e0001003454656c65706f72744173736574080118617373657473c101013c5665633c4d756c746941737365743e00011c65666665637473f50401405665633c4f726465723c43616c6c3e3e000200345175657279526573706f6e736508012071756572795f69645501010c753634000120726573706f6e7365d5040120526573706f6e7365000300345472616e736665724173736574080118617373657473c101013c5665633c4d756c746941737365743e00011064657374c90101344d756c74694c6f636174696f6e000400505472616e736665725265736572766541737365740c0118617373657473c101013c5665633c4d756c746941737365743e00011064657374c90101344d756c74694c6f636174696f6e00011c65666665637473c90401385665633c4f726465723c28293e3e000500205472616e736163740c012c6f726967696e5f74797065a10101284f726967696e4b696e64000158726571756972655f7765696768745f61745f6d6f737410010c75363400011063616c6c0105014c446f75626c65456e636f6465643c43616c6c3e0006006448726d704e65774368616e6e656c4f70656e526571756573740c011873656e6465724901010c7533320001406d61785f6d6573736167655f73697a654901010c7533320001306d61785f63617061636974794901010c7533320007004c48726d704368616e6e656c4163636570746564040124726563697069656e744901010c7533320008004848726d704368616e6e656c436c6f73696e670c0124696e69746961746f724901010c75333200011873656e6465724901010c753332000124726563697069656e744901010c7533320009002c52656c6179656446726f6d08010c77686fc90101344d756c74694c6f636174696f6e00011c6d657373616765f1040170616c6c6f633a3a626f7865643a3a426f783c58636d3c43616c6c3e3e000a0000f504000002f90400f904100c78636d087630146f72646572144f72646572041043616c6c000120104e756c6c000000304465706f7369744173736574080118617373657473c101013c5665633c4d756c746941737365743e00011064657374c90101344d756c74694c6f636174696f6e0001004c4465706f7369745265736572766541737365740c0118617373657473c101013c5665633c4d756c746941737365743e00011064657374c90101344d756c74694c6f636174696f6e00011c65666665637473c90401385665633c4f726465723c28293e3e0002003445786368616e6765417373657408011067697665c101013c5665633c4d756c746941737365743e00011c72656365697665c101013c5665633c4d756c746941737365743e0003005c496e6974696174655265736572766557697468647261770c0118617373657473c101013c5665633c4d756c746941737365743e00011c72657365727665c90101344d756c74694c6f636174696f6e00011c65666665637473c90401385665633c4f726465723c28293e3e00040040496e69746961746554656c65706f72740c0118617373657473c101013c5665633c4d756c746941737365743e00011064657374c90101344d756c74694c6f636174696f6e00011c65666665637473c90401385665633c4f726465723c28293e3e000500305175657279486f6c64696e670c012071756572795f69645501010c75363400011064657374c90101344d756c74694c6f636174696f6e000118617373657473c101013c5665633c4d756c746941737365743e00060030427579457865637574696f6e14011066656573c50101284d756c7469417373657400011877656967687410010c7536340001106465627410010c75363400013468616c745f6f6e5f6572726f72a80110626f6f6c00010c78636dfd0401385665633c58636d3c43616c6c3e3e00070000fd04000002f1040001050c0c78636d38646f75626c655f656e636f64656434446f75626c65456e636f646564040454000004011c656e636f64656428011c5665633c75383e000005050c0c78636d0876310c58636d041043616c6c00013434576974686472617741737365740801186173736574737501012c4d756c746941737365747300011c65666665637473090501405665633c4f726465723c43616c6c3e3e000000545265736572766541737365744465706f73697465640801186173736574737501012c4d756c746941737365747300011c65666665637473090501405665633c4f726465723c43616c6c3e3e000100585265636569766554656c65706f7274656441737365740801186173736574737501012c4d756c746941737365747300011c65666665637473090501405665633c4f726465723c43616c6c3e3e000200345175657279526573706f6e736508012071756572795f69645501010c753634000120726573706f6e7365e9040120526573706f6e7365000300345472616e7366657241737365740801186173736574737501012c4d756c746941737365747300012c62656e65666963696172793d0101344d756c74694c6f636174696f6e000400505472616e736665725265736572766541737365740c01186173736574737501012c4d756c7469417373657473000110646573743d0101344d756c74694c6f636174696f6e00011c65666665637473dd0401385665633c4f726465723c28293e3e000500205472616e736163740c012c6f726967696e5f74797065a10101284f726967696e4b696e64000158726571756972655f7765696768745f61745f6d6f737410010c75363400011063616c6c0105014c446f75626c65456e636f6465643c43616c6c3e0006006448726d704e65774368616e6e656c4f70656e526571756573740c011873656e6465724901010c7533320001406d61785f6d6573736167655f73697a654901010c7533320001306d61785f63617061636974794901010c7533320007004c48726d704368616e6e656c4163636570746564040124726563697069656e744901010c7533320008004848726d704368616e6e656c436c6f73696e670c0124696e69746961746f724901010c75333200011873656e6465724901010c753332000124726563697069656e744901010c7533320009002c52656c6179656446726f6d08010c77686f41010154496e746572696f724d756c74694c6f636174696f6e00011c6d65737361676505050170616c6c6f633a3a626f7865643a3a426f783c58636d3c43616c6c3e3e000a004053756273637269626556657273696f6e08012071756572795f69645501010c75363400014c6d61785f726573706f6e73655f7765696768745501010c753634000b0048556e73756273637269626556657273696f6e000c000009050000020d05000d05100c78636d087631146f72646572144f72646572041043616c6c000120104e6f6f70000000304465706f73697441737365740c0118617373657473a90101404d756c7469417373657446696c7465720001286d61785f6173736574731c010c75333200012c62656e65666963696172793d0101344d756c74694c6f636174696f6e0001004c4465706f736974526573657276654173736574100118617373657473a90101404d756c7469417373657446696c7465720001286d61785f6173736574731c010c753332000110646573743d0101344d756c74694c6f636174696f6e00011c65666665637473dd0401385665633c4f726465723c28293e3e0002003445786368616e6765417373657408011067697665a90101404d756c7469417373657446696c74657200011c726563656976657501012c4d756c74694173736574730003005c496e6974696174655265736572766557697468647261770c0118617373657473a90101404d756c7469417373657446696c74657200011c726573657276653d0101344d756c74694c6f636174696f6e00011c65666665637473dd0401385665633c4f726465723c28293e3e00040040496e69746961746554656c65706f72740c0118617373657473a90101404d756c7469417373657446696c746572000110646573743d0101344d756c74694c6f636174696f6e00011c65666665637473dd0401385665633c4f726465723c28293e3e000500305175657279486f6c64696e670c012071756572795f69645501010c753634000110646573743d0101344d756c74694c6f636174696f6e000118617373657473a90101404d756c7469417373657446696c74657200060030427579457865637574696f6e140110666565737d0101284d756c7469417373657400011877656967687410010c7536340001106465627410010c75363400013468616c745f6f6e5f6572726f72a80110626f6f6c000130696e737472756374696f6e73110501385665633c58636d3c43616c6c3e3e00070000110500000205050015050c0c78636d0876320c58636d041043616c6c00000400190501585665633c496e737472756374696f6e3c43616c6c3e3e000019050000021d05001d050c0c78636d0876322c496e737472756374696f6e041043616c6c000170345769746864726177417373657404007501012c4d756c7469417373657473000000545265736572766541737365744465706f736974656404007501012c4d756c7469417373657473000100585265636569766554656c65706f72746564417373657404007501012c4d756c7469417373657473000200345175657279526573706f6e73650c012071756572795f69645501011c51756572794964000120726573706f6e736595010120526573706f6e73650001286d61785f7765696768745501010c753634000300345472616e7366657241737365740801186173736574737501012c4d756c746941737365747300012c62656e65666963696172793d0101344d756c74694c6f636174696f6e000400505472616e736665725265736572766541737365740c01186173736574737501012c4d756c7469417373657473000110646573743d0101344d756c74694c6f636174696f6e00010c78636d6901011c58636d3c28293e000500205472616e736163740c012c6f726967696e5f74797065a10101284f726967696e4b696e64000158726571756972655f7765696768745f61745f6d6f73745501010c75363400011063616c6c0105014c446f75626c65456e636f6465643c43616c6c3e0006006448726d704e65774368616e6e656c4f70656e526571756573740c011873656e6465724901010c7533320001406d61785f6d6573736167655f73697a654901010c7533320001306d61785f63617061636974794901010c7533320007004c48726d704368616e6e656c4163636570746564040124726563697069656e744901010c7533320008004848726d704368616e6e656c436c6f73696e670c0124696e69746961746f724901010c75333200011873656e6465724901010c753332000124726563697069656e744901010c7533320009002c436c6561724f726967696e000a003444657363656e644f726967696e040041010154496e746572696f724d756c74694c6f636174696f6e000b002c5265706f72744572726f720c012071756572795f69645501011c51756572794964000110646573743d0101344d756c74694c6f636174696f6e00014c6d61785f726573706f6e73655f7765696768745501010c753634000c00304465706f73697441737365740c0118617373657473a90101404d756c7469417373657446696c7465720001286d61785f6173736574734901010c75333200012c62656e65666963696172793d0101344d756c74694c6f636174696f6e000d004c4465706f736974526573657276654173736574100118617373657473a90101404d756c7469417373657446696c7465720001286d61785f6173736574734901010c753332000110646573743d0101344d756c74694c6f636174696f6e00010c78636d6901011c58636d3c28293e000e003445786368616e6765417373657408011067697665a90101404d756c7469417373657446696c74657200011c726563656976657501012c4d756c7469417373657473000f005c496e6974696174655265736572766557697468647261770c0118617373657473a90101404d756c7469417373657446696c74657200011c726573657276653d0101344d756c74694c6f636174696f6e00010c78636d6901011c58636d3c28293e00100040496e69746961746554656c65706f72740c0118617373657473a90101404d756c7469417373657446696c746572000110646573743d0101344d756c74694c6f636174696f6e00010c78636d6901011c58636d3c28293e001100305175657279486f6c64696e6710012071756572795f69645501011c51756572794964000110646573743d0101344d756c74694c6f636174696f6e000118617373657473a90101404d756c7469417373657446696c74657200014c6d61785f726573706f6e73655f7765696768745501010c75363400120030427579457865637574696f6e080110666565737d0101284d756c746941737365740001307765696768745f6c696d6974b501012c5765696768744c696d697400130034526566756e64537572706c75730014003c5365744572726f7248616e646c657204001505012458636d3c43616c6c3e0015002c536574417070656e64697804001505012458636d3c43616c6c3e00160028436c6561724572726f7200170028436c61696d41737365740801186173736574737501012c4d756c74694173736574730001187469636b65743d0101344d756c74694c6f636174696f6e001800105472617004005501010c7536340019004053756273637269626556657273696f6e08012071756572795f69645501011c5175657279496400014c6d61785f726573706f6e73655f7765696768745501010c753634001a0048556e73756273637269626556657273696f6e001b000021050c6063756d756c75735f70616c6c65745f646d705f71756575651870616c6c65741043616c6c04045400010448736572766963655f6f766572776569676874080114696e64657810013c4f766572776569676874496e6465780001307765696768745f6c696d6974100118576569676874000030905365727669636520612073696e676c65206f766572776569676874206d6573736167652e00c02d20606f726967696e603a204d75737420706173732060457865637574654f7665727765696768744f726967696e602ee82d2060696e646578603a2054686520696e646578206f6620746865206f766572776569676874206d65737361676520746f20736572766963652e1d012d20607765696768745f6c696d6974603a2054686520616d6f756e74206f66207765696768742074686174206d65737361676520657865637574696f6e206d61792074616b652e001c4572726f72733aac2d2060556e6b6e6f776e603a204d657373616765206f662060696e6465786020697320756e6b6e6f776e2e15012d20604f7665724c696d6974603a204d65737361676520657865637574696f6e206d6179207573652067726561746572207468616e20607765696768745f6c696d6974602e001c4576656e74733a8c2d20604f7665727765696768745365727669636564603a204f6e20737563636573732e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e2505084470616c6c65745f636f6c6c65637469766514566f74657308244163636f756e74496401002c426c6f636b4e756d626572011000140114696e6465781c013450726f706f73616c496e6465780001247468726573686f6c641c012c4d656d626572436f756e74000110617965738c01385665633c4163636f756e7449643e0001106e6179738c01385665633c4163636f756e7449643e00010c656e6410012c426c6f636b4e756d626572000029050c4470616c6c65745f636f6c6c6563746976651870616c6c6574144572726f72080454000449000128244e6f744d656d6265720000045c4163636f756e74206973206e6f742061206d656d626572444475706c696361746550726f706f73616c0001047c4475706c69636174652070726f706f73616c73206e6f7420616c6c6f7765643c50726f706f73616c4d697373696e670002044c50726f706f73616c206d7573742065786973742857726f6e67496e646578000304404d69736d61746368656420696e646578344475706c6963617465566f7465000404584475706c696361746520766f74652069676e6f72656448416c7265616479496e697469616c697a6564000504804d656d626572732061726520616c726561647920696e697469616c697a65642120546f6f4561726c79000604010154686520636c6f73652063616c6c20776173206d61646520746f6f206561726c792c206265666f72652074686520656e64206f662074686520766f74696e672e40546f6f4d616e7950726f706f73616c73000704fc54686572652063616e206f6e6c792062652061206d6178696d756d206f6620604d617850726f706f73616c7360206163746976652070726f706f73616c732e4c57726f6e6750726f706f73616c576569676874000804d054686520676976656e2077656967687420626f756e6420666f72207468652070726f706f73616c2077617320746f6f206c6f772e4c57726f6e6750726f706f73616c4c656e677468000904d054686520676976656e206c656e67746820626f756e6420666f72207468652070726f706f73616c2077617320746f6f206c6f772e04ad010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f7273290a0909096f6620746869732070616c6c65742e0a0909092d05102873705f72756e74696d651c626f756e6465642c626f756e6465645f76656328426f756e6465645665630804540124045300000400e10101185665633c543e000031050c4470616c6c65745f636f6c6c6563746976651870616c6c6574144572726f72080454000449000128244e6f744d656d6265720000045c4163636f756e74206973206e6f742061206d656d626572444475706c696361746550726f706f73616c0001047c4475706c69636174652070726f706f73616c73206e6f7420616c6c6f7765643c50726f706f73616c4d697373696e670002044c50726f706f73616c206d7573742065786973742857726f6e67496e646578000304404d69736d61746368656420696e646578344475706c6963617465566f7465000404584475706c696361746520766f74652069676e6f72656448416c7265616479496e697469616c697a6564000504804d656d626572732061726520616c726561647920696e697469616c697a65642120546f6f4561726c79000604010154686520636c6f73652063616c6c20776173206d61646520746f6f206561726c792c206265666f72652074686520656e64206f662074686520766f74696e672e40546f6f4d616e7950726f706f73616c73000704fc54686572652063616e206f6e6c792062652061206d6178696d756d206f6620604d617850726f706f73616c7360206163746976652070726f706f73616c732e4c57726f6e6750726f706f73616c576569676874000804d054686520676976656e2077656967687420626f756e6420666f72207468652070726f706f73616c2077617320746f6f206c6f772e4c57726f6e6750726f706f73616c4c656e677468000904d054686520676976656e206c656e67746820626f756e6420666f72207468652070726f706f73616c2077617320746f6f206c6f772e04ad010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f7273290a0909096f6620746869732070616c6c65742e0a0909093505102873705f72756e74696d651c626f756e6465642c626f756e6465645f76656328426f756e64656456656308045401000453000004008c01185665633c543e000039050c4470616c6c65745f6d656d626572736869701870616c6c6574144572726f7208045400044900010c34416c72656164794d656d62657200000444416c72656164792061206d656d6265722e244e6f744d656d626572000104344e6f742061206d656d6265722e38546f6f4d616e794d656d6265727300020444546f6f206d616e79206d656d626572732e04ad010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f7273290a0909096f6620746869732070616c6c65742e0a0909093d05083c70616c6c65745f74726561737572792050726f706f73616c08244163636f756e74496401001c42616c616e636501180010012070726f706f7365720001244163636f756e74496400011476616c756518011c42616c616e636500012c62656e65666963696172790001244163636f756e744964000110626f6e6418011c42616c616e636500004105102873705f72756e74696d651c626f756e6465642c626f756e6465645f76656328426f756e646564566563080454011c045300000400150301185665633c543e000045050c3473705f61726974686d65746963287065725f7468696e67731c5065726d696c6c000004001c010c7533320000490504184f7074696f6e04045401180108104e6f6e6500000010536f6d6504001800000100004d0508346672616d655f737570706f72742050616c6c65744964000004008d01011c5b75383b20385d000051050c3c70616c6c65745f74726561737572791870616c6c6574144572726f7208045400044900011470496e73756666696369656e7450726f706f7365727342616c616e63650000047850726f706f73657227732062616c616e636520697320746f6f206c6f772e30496e76616c6964496e646578000104904e6f2070726f706f73616c206f7220626f756e7479206174207468617420696e6465782e40546f6f4d616e79417070726f76616c7300020480546f6f206d616e7920617070726f76616c7320696e207468652071756575652e58496e73756666696369656e745065726d697373696f6e0003084501546865207370656e64206f726967696e2069732076616c6964206275742074686520616d6f756e7420697420697320616c6c6f77656420746f207370656e64206973206c6f776572207468616e207468654c616d6f756e7420746f206265207370656e742e4c50726f706f73616c4e6f74417070726f7665640004047c50726f706f73616c20686173206e6f74206265656e20617070726f7665642e04784572726f7220666f72207468652074726561737572792070616c6c65742e55050c5870616c6c65745f72656c61795f6d6967726174696f6e1870616c6c6574144572726f7204045400010004ad010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f7273290a0909096f6620746869732070616c6c65742e0a09090959050c4470616c6c65745f64796e5f66696c7465721870616c6c6574144572726f7204045400010004ad010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f7273290a0909096f6620746869732070616c6c65742e0a0909095d050c3870616c6c65745f7574696c6974791870616c6c6574144572726f7204045400010430546f6f4d616e7943616c6c730000045c546f6f206d616e792063616c6c7320626174636865642e04ad010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f7273290a0909096f6620746869732070616c6c65742e0a0909096105102873705f72756e74696d651c626f756e6465642c626f756e6465645f76656328426f756e64656456656308045401cd03045300000400650501185665633c543e00006505000002cd03006905083870616c6c65745f76657374696e672052656c6561736573000108085630000000085631000100006d050c3870616c6c65745f76657374696e671870616c6c6574144572726f72040454000114284e6f7456657374696e6700000484546865206163636f756e7420676976656e206973206e6f742076657374696e672e5441744d617856657374696e675363686564756c65730001082501546865206163636f756e7420616c72656164792068617320604d617856657374696e675363686564756c65736020636f756e74206f66207363686564756c657320616e642074687573510163616e6e6f742061646420616e6f74686572206f6e652e20436f6e7369646572206d657267696e67206578697374696e67207363686564756c657320696e206f7264657220746f2061646420616e6f746865722e24416d6f756e744c6f770002040501416d6f756e74206265696e67207472616e7366657272656420697320746f6f206c6f7720746f2063726561746520612076657374696e67207363686564756c652e605363686564756c65496e6465784f75744f66426f756e6473000304d0416e20696e64657820776173206f7574206f6620626f756e6473206f66207468652076657374696e67207363686564756c65732e54496e76616c69645363686564756c65506172616d730004040d014661696c656420746f206372656174652061206e6577207363686564756c65206265636175736520736f6d6520706172616d657465722077617320696e76616c69642e04744572726f7220666f72207468652076657374696e672070616c6c65742e7105000002750500750504184f7074696f6e0404540179050108104e6f6e6500000010536f6d650400790500000100007905084070616c6c65745f7363686564756c65722c5363686564756c65645633101043616c6c01d9032c426c6f636b4e756d62657201103450616c6c6574734f726967696e01a903244163636f756e7449640100001401206d617962655f6964d4013c4f7074696f6e3c5665633c75383e3e0001207072696f726974790801487363686564756c653a3a5072696f7269747900011063616c6cd903011043616c6c0001386d617962655f706572696f646963d50301944f7074696f6e3c7363686564756c653a3a506572696f643c426c6f636b4e756d6265723e3e0001186f726967696ea903013450616c6c6574734f726967696e00007d050c4070616c6c65745f7363686564756c65721870616c6c6574144572726f72040454000110404661696c6564546f5363686564756c65000004644661696c656420746f207363686564756c6520612063616c6c204e6f74466f756e640001047c43616e6e6f742066696e6420746865207363686564756c65642063616c6c2e5c546172676574426c6f636b4e756d626572496e50617374000204a4476976656e2074617267657420626c6f636b206e756d62657220697320696e2074686520706173742e4852657363686564756c654e6f4368616e6765000304f052657363686564756c65206661696c6564206265636175736520697420646f6573206e6f74206368616e6765207363686564756c65642074696d652e04ad010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f7273290a0909096f6620746869732070616c6c65742e0a090909810500000408850518008505102873705f72756e74696d651c626f756e6465642c626f756e6465645f76656328426f756e6465645665630804540189050453000004008d0501185665633c543e00008905083070616c6c65745f70726f78793c50726f7879446566696e6974696f6e0c244163636f756e74496401002450726f78795479706501e02c426c6f636b4e756d6265720110000c012064656c65676174650001244163636f756e74496400012870726f78795f74797065e0012450726f78795479706500011464656c617910012c426c6f636b4e756d62657200008d05000002890500910500000408950518009505102873705f72756e74696d651c626f756e6465642c626f756e6465645f76656328426f756e6465645665630804540199050453000004009d0501185665633c543e00009905083070616c6c65745f70726f787930416e6e6f756e63656d656e740c244163636f756e7449640100104861736801242c426c6f636b4e756d6265720110000c01107265616c0001244163636f756e74496400012463616c6c5f686173682401104861736800011868656967687410012c426c6f636b4e756d62657200009d05000002990500a1050c3070616c6c65745f70726f78791870616c6c6574144572726f720404540001201c546f6f4d616e79000004210154686572652061726520746f6f206d616e792070726f786965732072656769737465726564206f7220746f6f206d616e7920616e6e6f756e63656d656e74732070656e64696e672e204e6f74466f756e640001047450726f787920726567697374726174696f6e206e6f7420666f756e642e204e6f7450726f7879000204cc53656e646572206973206e6f7420612070726f7879206f6620746865206163636f756e7420746f2062652070726f786965642e2c556e70726f787961626c650003042101412063616c6c20776869636820697320696e636f6d70617469626c652077697468207468652070726f7879207479706527732066696c7465722077617320617474656d707465642e244475706c69636174650004046c4163636f756e7420697320616c726561647920612070726f78792e304e6f5065726d697373696f6e000504150143616c6c206d6179206e6f74206265206d6164652062792070726f78792062656361757365206974206d617920657363616c617465206974732070726976696c656765732e2c556e616e6e6f756e636564000604d0416e6e6f756e63656d656e742c206966206d61646520617420616c6c2c20776173206d61646520746f6f20726563656e746c792e2c4e6f53656c6650726f78790007046443616e6e6f74206164642073656c662061732070726f78792e04ad010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f7273290a0909096f6620746869732070616c6c65742e0a090909a505083c70616c6c65745f707265696d616765345265717565737453746174757308244163636f756e74496401001c42616c616e6365011801082c556e7265717565737465640400a90501704f7074696f6e3c284163636f756e7449642c2042616c616e6365293e0000002452657175657374656404001c010c75333200010000a90504184f7074696f6e04045401ad050108104e6f6e6500000010536f6d650400ad050000010000ad0500000408001800b105102873705f72756e74696d651c626f756e6465642c626f756e6465645f76656328426f756e64656456656308045401080453000004002801185665633c543e0000b5050c3c70616c6c65745f707265696d6167651870616c6c6574144572726f7204045400011820546f6f4c61726765000004a0507265696d61676520697320746f6f206c6172676520746f2073746f7265206f6e2d636861696e2e30416c72656164794e6f746564000104a4507265696d6167652068617320616c7265616479206265656e206e6f746564206f6e2d636861696e2e344e6f74417574686f72697a6564000204c85468652075736572206973206e6f7420617574686f72697a656420746f20706572666f726d207468697320616374696f6e2e204e6f744e6f746564000304fc54686520707265696d6167652063616e6e6f742062652072656d6f7665642073696e636520697420686173206e6f7420796574206265656e206e6f7465642e2452657175657374656400040409014120707265696d616765206d6179206e6f742062652072656d6f766564207768656e20746865726520617265206f75747374616e64696e672072657175657374732e304e6f745265717565737465640005042d0154686520707265696d61676520726571756573742063616e6e6f742062652072656d6f7665642073696e6365206e6f206f75747374616e64696e672072657175657374732065786973742e04ad010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f7273290a0909096f6620746869732070616c6c65742e0a090909b9050c4470616c6c65745f6d656d626572736869701870616c6c6574144572726f7208045400044900010c34416c72656164794d656d62657200000444416c72656164792061206d656d6265722e244e6f744d656d626572000104344e6f742061206d656d6265722e38546f6f4d616e794d656d6265727300020444546f6f206d616e79206d656d626572732e04ad010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f7273290a0909096f6620746869732070616c6c65742e0a090909bd05082c70616c6c65745f746970731c4f70656e54697010244163636f756e74496401001c42616c616e636501182c426c6f636b4e756d626572011010486173680124001c0118726561736f6e2401104861736800010c77686f0001244163636f756e74496400011866696e6465720001244163636f756e74496400011c6465706f73697418011c42616c616e6365000118636c6f7365731102014c4f7074696f6e3c426c6f636b4e756d6265723e00011074697073c10501645665633c284163636f756e7449642c2042616c616e6365293e00012c66696e646572735f666565a80110626f6f6c0000c105000002ad0500c5050c3473705f61726974686d65746963287065725f7468696e67731c50657263656e740000040008010875380000c9050c2c70616c6c65745f746970731870616c6c6574144572726f7208045400044900011830526561736f6e546f6f4269670000048454686520726561736f6e20676976656e206973206a75737420746f6f206269672e30416c72656164794b6e6f776e00010488546865207469702077617320616c726561647920666f756e642f737461727465642e28556e6b6e6f776e5469700002046054686520746970206861736820697320756e6b6e6f776e2e244e6f7446696e6465720003041d01546865206163636f756e7420617474656d7074696e6720746f20726574726163742074686520746970206973206e6f74207468652066696e646572206f6620746865207469702e245374696c6c4f70656e0004042901546865207469702063616e6e6f7420626520636c61696d65642f636c6f736564206265636175736520746865726520617265206e6f7420656e6f7567682074697070657273207965742e245072656d61747572650005043101546865207469702063616e6e6f7420626520636c61696d65642f636c6f73656420626563617573652069742773207374696c6c20696e2074686520636f756e74646f776e20706572696f642e04ad010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f7273290a0909096f6620746869732070616c6c65742e0a090909cd050c1463747970651870616c6c6574144572726f7204045400010c3443547970654e6f74466f756e64000004985468657265206973206e6f20435479706520776974682074686520676976656e20686173682e484354797065416c72656164794578697374730001046454686520435479706520616c7265616479206578697374732e3c556e61626c65546f506179466565730002040d0154686520706179696e67206163636f756e742077617320756e61626c6520746f2070617920746865206665657320666f72206372656174696e6720612063747970652e04ad010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f7273290a0909096f6620746869732070616c6c65742e0a090909d1050c2c6174746573746174696f6e306174746573746174696f6e73484174746573746174696f6e44657461696c73040454000014012863747970655f686173682401384374797065486173684f663c543e000120617474657374657200013441747465737465724f663c543e000140617574686f72697a6174696f6e5f6964fc01704f7074696f6e3c417574686f72697a6174696f6e49644f663c543e3e00011c7265766f6b6564a80110626f6f6c00011c6465706f736974d50501944465706f7369743c4163636f756e7449644f663c543e2c2042616c616e63654f663c543e3e0000d5050c306b696c745f737570706f72741c6465706f7369741c4465706f736974081c4163636f756e7401001c42616c616e63650118000801146f776e657200011c4163636f756e74000118616d6f756e7418011c42616c616e63650000d9050000040801012400dd050c2c6174746573746174696f6e1870616c6c6574144572726f720404540001183c416c726561647941747465737465640000080901546865726520697320616c726561647920616e206174746573746174696f6e2077697468207468652073616d6520636c61696d20686173682073746f726564206f6e18636861696e2e38416c72656164795265766f6b6564000104a4546865206174746573746174696f6e2068617320616c7265616479206265656e207265766f6b65642e4c4174746573746174696f6e4e6f74466f756e64000204c04e6f206174746573746174696f6e206f6e20636861696e206d61746368696e672074686520636c61696d20686173682e3443547970654d69736d61746368000308fc546865206174746573746174696f6e20435479706520646f6573206e6f74206d61746368207468652043547970652073706563696669656420696e207468656864656c65676174696f6e2068696572617263687920726f6f742e30556e617574686f72697a6564000404f05468652063616c6c206f726967696e206973206e6f7420617574686f72697a656420746f206368616e676520746865206174746573746174696f6e2e804d617844656c6567617465644174746573746174696f6e73457863656564656400050cf4546865206d6178696d756d206e756d626572206f662064656c656761746564206174746573746174696f6e732068617320616c7265616479206265656e05017265616368656420666f722074686520636f72726573706f6e64696e672064656c65676174696f6e2069642073756368207468617420616e6f74686572206f6e654063616e6e6f742062652061646465642e04ad010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f7273290a0909096f6620746869732070616c6c65742e0a090909e1050c2864656c65676174696f6e5064656c65676174696f6e5f6869657261726368793844656c65676174696f6e4e6f646504045400001401446869657261726368795f726f6f745f696424015444656c65676174696f6e4e6f646549644f663c543e000118706172656e74290101744f7074696f6e3c44656c65676174696f6e4e6f646549644f663c543e3e0001206368696c6472656ee50501d8426f756e64656442547265655365743c44656c65676174696f6e4e6f646549644f663c543e2c20543a3a4d61784368696c6472656e3e00011c64657461696c73ed05015044656c65676174696f6e44657461696c733c543e00011c6465706f736974d50501944465706f7369743c4163636f756e7449644f663c543e2c2042616c616e63654f663c543e3e0000e505102873705f72756e74696d651c626f756e64656444626f756e6465645f62747265655f7365743c426f756e64656442547265655365740804540124045300000400e905012c42547265655365743c543e0000e905042042547265655365740404540124000400e101000000ed050c2864656c65676174696f6e5064656c65676174696f6e5f6869657261726368794444656c65676174696f6e44657461696c7304045400000c01146f776e657200014044656c656761746f7249644f663c543e00011c7265766f6b6564a80110626f6f6c00012c7065726d697373696f6e730901012c5065726d697373696f6e730000f1050c2864656c65676174696f6e5064656c65676174696f6e5f6869657261726368796844656c65676174696f6e48696572617263687944657461696c73040454000004012863747970655f686173682401384374797065486173684f663c543e0000f5050c2864656c65676174696f6e1870616c6c6574144572726f720404540001585c44656c65676174696f6e416c72656164794578697374730000041101546865726520697320616c726561647920612064656c65676174696f6e206e6f64652077697468207468652073616d652049442073746f726564206f6e20636861696e2e60496e76616c696444656c65676174655369676e617475726500010805015468652064656c65676174652773207369676e617475726520666f72207468652064656c65676174696f6e206372656174696f6e206f7065726174696f6e20697320696e76616c69642e4844656c65676174696f6e4e6f74466f756e64000204c04e6f2064656c65676174696f6e20776974682074686520676976656e2049442073746f726564206f6e20636861696e2e4044656c65676174654e6f74466f756e64000304b84e6f2064656c656761746520776974682074686520676976656e2049442073746f726564206f6e20636861696e2e58486965726172636879416c7265616479457869737473000404f8546865726520697320616c72656164792061206869657261726368792077697468207468652073616d652049442073746f726564206f6e20636861696e2e444869657261726368794e6f74466f756e64000504bc4e6f2068696572617263687920776974682074686520676976656e2049442073746f726564206f6e20636861696e2e544d617853656172636844657074685265616368656400060409014d6178206e756d626572206f66206e6f64657320636865636b656420776974686f757420766572696679696e672074686520676976656e20636f6e646974696f6e2e684e6f744f776e65724f66506172656e7444656c65676174696f6e000708f45468652064656c65676174696f6e2063726561746f72206973206e6f7420616c6c6f77656420746f207772697465207468652064656c65676174696f6ef462656361757365207468657920617265206e6f7420746865206f776e6572206f66207468652064656c65676174696f6e20706172656e74206e6f64652e744e6f744f776e65724f6644656c65676174696f6e486965726172636879000808f45468652064656c65676174696f6e2063726561746f72206973206e6f7420616c6c6f77656420746f207772697465207468652064656c65676174696f6eec62656361757365207468657920617265206e6f7420746865206f776e6572206f66207468652064656c65676174696f6e20726f6f74206e6f64652e60506172656e7444656c65676174696f6e4e6f74466f756e64000904dc4e6f20706172656e742064656c65676174696f6e20776974682074686520676976656e2049442073746f726564206f6e20636861696e2e5c506172656e7444656c65676174696f6e5265766f6b6564000a04c854686520706172656e742064656c65676174696f6e206861732070726576696f75736c79206265656e207265766f6b65642e58556e617574686f72697a65645265766f636174696f6e000b04fc5468652064656c65676174696f6e207265766f6b6572206973206e6f7420616c6c6f77656420746f207265766f6b65207468652064656c65676174696f6e2e4c556e617574686f72697a656452656d6f76616c000c04ec5468652063616c6c206f726967696e206973206e6f7420617574686f72697a656420746f2072656d6f7665207468652064656c65676174696f6e2e58556e617574686f72697a656444656c65676174696f6e000d04fc5468652064656c65676174696f6e2063726561746f72206973206e6f7420616c6c6f77656420746f20637265617465207468652064656c65676174696f6e2e3041636365737344656e696564000e04f0546865206f7065726174696f6e207761736e277420616c6c6f7765642062656361757365206f6620696e73756666696369656e74207269676874732e6045786365656465645265766f636174696f6e426f756e6473000f080d014d6178206e756d626572206f66207265766f636174696f6e7320666f722064656c65676174696f6e206e6f64657320686173206265656e207265616368656420666f7238746865206f7065726174696f6e2e54457863656564656452656d6f76616c426f756e647300100811014d6178206e756d626572206f662072656d6f76616c7320666f722064656c65676174696f6e206e6f64657320686173206265656e207265616368656420666f7220746865286f7065726174696f6e2e584d61785265766f636174696f6e73546f6f4c61726765001104f8546865206d6178206e756d626572206f66207265766f636174696f6e206578636565647320746865206c696d697420666f72207468652070616c6c65742e4c4d617852656d6f76616c73546f6f4c61726765001204f0546865206d6178206e756d626572206f662072656d6f76616c73206578636565647320746865206c696d697420666f72207468652070616c6c65742e5c4d6178506172656e74436865636b73546f6f4c617267650013040501546865206d6178206e756d626572206f6620706172656e7420636865636b73206578636565647320746865206c696d697420666f72207468652070616c6c65742e34496e7465726e616c4572726f72001404f4416e206572726f722074686174206973206e6f7420737570706f73656420746f2074616b6520706c6163652c207965742069742068617070656e65642e4c4d61784368696c6472656e4578636565646564001508dc546865206d6178206e756d626572206f6620616c6c206368696c6472656e20686173206265656e207265616368656420666f722074686578636f72726573706f6e64696e672064656c65676174696f6e206e6f64652e04ad010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f7273290a0909096f6620746869732070616c6c65742e0a090909f9050c0c6469642c6469645f64657461696c732844696444657461696c7304045400001c014861757468656e7469636174696f6e5f6b65792401284b657949644f663c543e0001486b65795f61677265656d656e745f6b657973fd0501604469644b657941677265656d656e744b65795365743c543e00013864656c65676174696f6e5f6b6579290101484f7074696f6e3c4b657949644f663c543e3e00013c6174746573746174696f6e5f6b6579290101484f7074696f6e3c4b657949644f663c543e3e00012c7075626c69635f6b657973010601484469645075626c69634b65794d61703c543e00013c6c6173745f74785f636f756e74657210010c75363400011c6465706f736974d50501944465706f7369743c4163636f756e7449644f663c543e2c2042616c616e63654f663c543e3e0000fd05102873705f72756e74696d651c626f756e64656444626f756e6465645f62747265655f7365743c426f756e64656442547265655365740804540124045300000400e905012c42547265655365743c543e00000106102873705f72756e74696d651c626f756e64656444626f756e6465645f62747265655f6d61703c426f756e64656442547265654d61700c044b012404560105060453000004000d06013842547265654d61703c4b2c20563e000005060c0c6469642c6469645f64657461696c734c4469645075626c69634b657944657461696c73042c426c6f636b4e756d62657201100008010c6b6579090601304469645075626c69634b6579000130626c6f636b5f6e756d62657210012c426c6f636b4e756d626572000009060c0c6469642c6469645f64657461696c73304469645075626c69634b6579000108545075626c6963566572696669636174696f6e4b6579040041040148446964566572696669636174696f6e4b65790000004c5075626c6963456e6372797074696f6e4b6579040031040140446964456e6372797074696f6e4b6579000100000d06042042547265654d617008044b012404560105060004001106000000110600000215060015060000040824050600190600000408005904001d060c0c6469641870616c6c6574144572726f7204045400016c58496e76616c69645369676e6174757265466f726d6174000008050154686520444944206f7065726174696f6e207369676e6174757265206973206e6f7420696e2074686520666f726d61742074686520766572696669636174696f6e306b657920657870656374732e40496e76616c69645369676e6174757265000108f854686520444944206f7065726174696f6e207369676e617475726520697320696e76616c696420666f7220746865207061796c6f616420616e642074686568766572696669636174696f6e206b65792070726f76696465642e44446964416c726561647950726573656e74000204f85468652044494420776974682074686520676976656e206964656e74696669657220697320616c72656164792070726573656e74206f6e20636861696e2e344469644e6f7450726573656e74000304d44e6f2044494420776974682074686520676976656e206964656e7469666965722069732070726573656e74206f6e20636861696e2e64566572696669636174696f6e4b65794e6f7450726573656e7400040809014f6e65206f72206d6f726520766572696669636174696f6e206b657973207265666572656e63656420617265206e6f742073746f72656420696e2074686520736574546f6620766572696669636174696f6e206b6579732e30496e76616c69644e6f6e6365000504090154686520444944206f7065726174696f6e206e6f6e6365206973206e6f7420657175616c20746f207468652063757272656e7420444944206e6f6e6365202b20312e7c556e737570706f72746564446964417574686f72697a6174696f6e43616c6c000604e05468652063616c6c65642065787472696e73696320646f6573206e6f7420737570706f72742044494420617574686f7269736174696f6e2e6c496e76616c6964446964417574686f72697a6174696f6e43616c6c000708dc5468652063616c6c2068616420706172616d6574657273207468617420636f6e666c696374656420776974682065616368206f74686572406f72207765726520696e76616c69642e804d61784b657941677265656d656e744b6579734c696d697445786365656465640008080d0141206e756d626572206f66206e6577206b65792061677265656d656e74206b6579732067726561746572207468616e20746865206d6178696d756d20616c6c6f77656448686173206265656e2070726f76696465642e6c4d61785075626c69634b65797350657244696445786365656465640009080501546865206d6178696d756d206e756d626572206f66207075626c6963206b65797320666f72207468697320444944206b6579206964656e74696669657220686173346265656e20726561636865642e804d6178546f74616c4b657941677265656d656e744b6579734578636565646564000a080501546865206d6178696d756d206e756d626572206f66206b65792061677265656d656e747320686173206265656e207265616368656420666f722074686520444944207375626a6563742e304261644469644f726967696e000b04bc546865204449442063616c6c20776173207375626d6974746564206279207468652077726f6e67206163636f756e74485472616e73616374696f6e45787069726564000c040d0154686520626c6f636b206e756d6265722070726f766964656420696e2061204449442d617574686f72697a6564206f7065726174696f6e20697320696e76616c69642e44446964416c726561647944656c65746564000d04b0546865204449442068617320616c7265616479206265656e2070726576696f75736c792064656c657465642e444e6f744f776e65724f664465706f736974000e04fc4f6e6c7920746865206f776e6572206f6620746865206465706f7369742063616e207265636c61696d206974732072657365727665642062616c616e63652e3c556e61626c65546f50617946656573000f04f0546865206f726967696e20697320756e61626c6520746f207265736572766520746865206465706f73697420616e642070617920746865206665652e844d61784e756d6265724f66536572766963657350657244696445786365656465640010041101546865206d6178696d756d206e756d626572206f66207365727669636520656e64706f696e747320666f7220612044494420686173206265656e2065786365656465642e684d61785365727669636549644c656e6774684578636565646564001104f0546865207365727669636520656e64706f696e7420494420657863656564656420746865206d6178696d756d20616c6c6f776564206c656e6774682e704d617853657276696365547970654c656e6774684578636565646564001208f84f6e65206f6620746865207365727669636520656e64706f696e7420747970657320657863656564656420746865206d6178696d756d20616c6c6f7765641c6c656e6774682e884d61784e756d6265724f665479706573506572536572766963654578636565646564001308ec546865206d6178696d756d206e756d626572206f6620747970657320666f722061207365727669636520656e64706f696e7420686173206265656e2465786365656465642e6c4d61785365727669636555726c4c656e6774684578636565646564001408f44f6e65206f6620746865207365727669636520656e64706f696e742055524c7320657863656564656420746865206d6178696d756d20616c6c6f7765641c6c656e6774682e844d61784e756d6265724f6655726c735065725365727669636545786365656465640015041101546865206d6178696d756d206e756d626572206f662055524c7320666f722061207365727669636520656e64706f696e7420686173206265656e2065786365656465642e5453657276696365416c726561647950726573656e7400160411014120736572766963652077697468207468652070726f766964656420494420697320616c72656164792070726573656e7420666f722074686520676976656e204449442e44536572766963654e6f7450726573656e7400170409014120736572766963652077697468207468652070726f7669646564204944206973206e6f742070726573656e7420756e6465722074686520676976656e204449442e58496e76616c696453657276696365456e636f64696e6700180409014f6e65206f6620746865207365727669636520656e64706f696e742064657461696c7320636f6e7461696e73206e6f6e2d415343494920636861726163746572732e7053746f726564456e64706f696e7473436f756e74546f6f4c617267650019080d01546865206e756d626572206f66207365727669636520656e64706f696e74732073746f72656420756e6465722074686520444944206973206c6172676572207468616e88746865206e756d626572206f6620656e64706f696e747320746f2064656c6574652e34496e7465726e616c4572726f72001a04f4416e206572726f722074686174206973206e6f7420737570706f73656420746f2074616b6520706c6163652c207965742069742068617070656e65642e04ad010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f7273290a0909096f6620746869732070616c6c65742e0a09090921060c4470616c6c65745f6469645f6c6f6f6b757044636f6e6e656374696f6e5f7265636f726440436f6e6e656374696f6e5265636f72640c344469644964656e74696669657201001c4163636f756e7401001c42616c616e636501180008010c6469640001344469644964656e74696669657200011c6465706f736974d50501644465706f7369743c4163636f756e742c2042616c616e63653e000025060000040800000029060c4470616c6c65745f6469645f6c6f6f6b75701870616c6c6574144572726f720404540001104c4173736f63696174696f6e4e6f74466f756e640000047c546865206173736f63696174696f6e20646f6573206e6f742065786973742e344e6f74417574686f72697a65640001081101546865206f726967696e20776173206e6f7420616c6c6f77656420746f206d616e61676520746865206173736f63696174696f6e206265747765656e20746865204449444c616e6420746865206163636f756e742049442e344f7574646174656450726f6f66000204b454686520737570706c6965642070726f6f66206f66206f776e65727368697020776173206f757464617465642e44496e73756666696369656e7446756e64730003081101546865206163636f756e742068617320696e73756666696369656e742066756e647320616e642063616e277420706179207468652066656573206f72207265736572766530746865206465706f7369742e04ad010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f7273290a0909096f6620746869732070616c6c65742e0a0909092d060c4470616c6c65745f776562335f6e616d657324776562335f6e616d6544576562334e616d654f776e6572736869700c144f776e657201001c4465706f73697401d5052c426c6f636b4e756d6265720110000c01146f776e65720001144f776e6572000128636c61696d65645f617410012c426c6f636b4e756d62657200011c6465706f736974d505011c4465706f736974000031060c4470616c6c65745f776562335f6e616d65731870616c6c6574144572726f7204045400013044496e73756666696369656e7446756e64730000040d01546865207478207375626d697474657220646f6573206e6f74206861766520656e6f7567682066756e647320746f2070617920666f7220746865206465706f7369742e58576562334e616d65416c7265616479436c61696d6564000104dc54686520737065636966696564206e616d652068617320616c7265616479206265656e2070726576696f75736c7920636c61696d65642e40576562334e616d654e6f74466f756e640002048854686520737065636966696564206e616d6520646f6573206e6f742065786973742e484f776e6572416c7265616479457869737473000304a054686520737065636966696564206f776e657220616c7265616479206f776e732061206e616d652e344f776e65724e6f74466f756e64000404ac54686520737065636966696564206f776e657220646f6573206e6f74206f776e20616e79206e616d65732e38576562334e616d6542616e6e6564000508ec54686520737065636966696564206e616d6520686173206265656e2062616e6e656420616e642063616e6e6f7420626520696e746572616374656414776974682e44576562334e616d654e6f7442616e6e6564000604ac54686520737065636966696564206e616d65206973206e6f742063757272656e746c792062616e6e65642e54576562334e616d65416c726561647942616e6e6564000704d854686520737065636966696564206e616d652068617320616c7265616479206265656e2070726576696f75736c792062616e6e65642e344e6f74417574686f72697a6564000804cc546865206163746f722063616e6e6f7420706572666f726d65642074686520737065636966696564206f7065726174696f6e2e40576562334e616d65546f6f53686f7274000904a841206e616d65207468617420697320746f6f2073686f7274206973206265696e6720636c61696d65642e3c576562334e616d65546f6f4c6f6e67000a04a441206e616d65207468617420697320746f6f206c6f6e67206973206265696e6720636c61696d65642e60496e76616c6964576562334e616d65436861726163746572000b04f441206e616d65207468617420636f6e7461696e73206e6f7420616c6c6f7765642063686172616374657273206973206265696e6720636c61696d65642e04ad010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f7273290a0909096f6620746869732070616c6c65742e0a090909350604184f7074696f6e0404540139060108104e6f6e6500000010536f6d6504003906000001000039060c4c706f6c6b61646f745f7072696d69746976657308763248557067726164655265737472696374696f6e0001041c50726573656e74000000003d060c7c63756d756c75735f70616c6c65745f70617261636861696e5f73797374656d5072656c61795f73746174655f736e617073686f74584d6573736167696e675374617465536e617073686f740000100130646d715f6d71635f6865616424014472656c61795f636861696e3a3a4861736800016472656c61795f64697370617463685f71756575655f73697a6541060128287533322c2075333229000140696e67726573735f6368616e6e656c73450601885665633c285061726149642c20416272696467656448726d704368616e6e656c293e00013c6567726573735f6368616e6e656c73450601885665633c285061726149642c20416272696467656448726d704368616e6e656c293e00004106000004081c1c00450600000249060049060000040831014d06004d060c4c706f6c6b61646f745f7072696d6974697665730876324c416272696467656448726d704368616e6e656c00001801306d61785f63617061636974791c010c7533320001386d61785f746f74616c5f73697a651c010c7533320001406d61785f6d6573736167655f73697a651c010c7533320001246d73675f636f756e741c010c753332000128746f74616c5f73697a651c010c7533320001206d71635f68656164290101304f7074696f6e3c486173683e000051060c4c706f6c6b61646f745f7072696d697469766573087632644162726964676564486f7374436f6e66696775726174696f6e00002401346d61785f636f64655f73697a651c010c7533320001486d61785f686561645f646174615f73697a651c010c7533320001586d61785f7570776172645f71756575655f636f756e741c010c7533320001546d61785f7570776172645f71756575655f73697a651c010c75333200015c6d61785f7570776172645f6d6573736167655f73697a651c010c7533320001906d61785f7570776172645f6d6573736167655f6e756d5f7065725f63616e6469646174651c010c75333200018868726d705f6d61785f6d6573736167655f6e756d5f7065725f63616e6469646174651c010c75333200016c76616c69646174696f6e5f757067726164655f636f6f6c646f776e1c012c426c6f636b4e756d62657200016076616c69646174696f6e5f757067726164655f64656c61791c012c426c6f636b4e756d62657200005506089463756d756c75735f7072696d6974697665735f70617261636861696e5f696e686572656e74444d6573736167655175657565436861696e0000040024012452656c61794861736800005906042042547265654d617008044b01310104560155060004005d060000005d060000026106006106000004083101550600650600000269060069060860706f6c6b61646f745f636f72655f7072696d6974697665734c4f7574626f756e6448726d704d6573736167650408496401310100080124726563697069656e743101010849640001106461746128015073705f7374643a3a7665633a3a5665633c75383e00006d060c7c63756d756c75735f70616c6c65745f70617261636861696e5f73797374656d1870616c6c6574144572726f720404540001204c4f7665726c617070696e6755706772616465730000041501417474656d707420746f20757067726164652076616c69646174696f6e2066756e6374696f6e207768696c65206578697374696e6720757067726164652070656e64696e675050726f686962697465644279506f6c6b61646f740001044901506f6c6b61646f742063757272656e746c792070726f68696269747320746869732070617261636861696e2066726f6d20757067726164696e67206974732076616c69646174696f6e2066756e6374696f6e18546f6f426967000208450154686520737570706c6965642076616c69646174696f6e2066756e6374696f6e2068617320636f6d70696c656420696e746f206120626c6f62206c6172676572207468616e20506f6c6b61646f742069733877696c6c696e6720746f2072756e6856616c69646174696f6e446174614e6f74417661696c61626c65000304190154686520696e686572656e7420776869636820737570706c696573207468652076616c69646174696f6e206461746120646964206e6f742072756e207468697320626c6f636b74486f7374436f6e66696775726174696f6e4e6f74417661696c61626c65000404250154686520696e686572656e7420776869636820737570706c6965732074686520686f737420636f6e66696775726174696f6e20646964206e6f742072756e207468697320626c6f636b304e6f745363686564756c6564000504d84e6f2076616c69646174696f6e2066756e6374696f6e20757067726164652069732063757272656e746c79207363686564756c65642e444e6f7468696e67417574686f72697a6564000604904e6f20636f6465207570677261646520686173206265656e20617574686f72697a65642e30556e617574686f72697a6564000704bc54686520676976656e20636f6465207570677261646520686173206e6f74206265656e20617574686f72697a65642e04ad010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f7273290a0909096f6620746869732070616c6c65742e0a09090971060000027506007506086463756d756c75735f70616c6c65745f78636d705f717565756554496e626f756e644368616e6e656c44657461696c7300000c011873656e64657231010118506172614964000114737461746579060130496e626f756e6453746174650001406d6573736167655f6d657461646174617d0601a85665633c2852656c6179426c6f636b4e756d6265722c2058636d704d657373616765466f726d6174293e00007906086463756d756c75735f70616c6c65745f78636d705f717565756530496e626f756e645374617465000108084f6b0000002453757370656e646564000100007d060000028106008106000004081c85060085060c48706f6c6b61646f745f70617261636861696e287072696d6974697665734458636d704d657373616765466f726d617400010c60436f6e636174656e6174656456657273696f6e656458636d0000005c436f6e636174656e61746564456e636f646564426c6f620001001c5369676e616c730002000089060000040831011c008d060000029106009106086463756d756c75735f70616c6c65745f78636d705f7175657565584f7574626f756e644368616e6e656c44657461696c730000140124726563697069656e74310101185061726149640001147374617465950601344f7574626f756e6453746174650001347369676e616c735f6578697374a80110626f6f6c00012c66697273745f696e646578e4010c7531360001286c6173745f696e646578e4010c75313600009506086463756d756c75735f70616c6c65745f78636d705f7175657565344f7574626f756e645374617465000108084f6b0000002453757370656e646564000100009906000004083101e4009d06086463756d756c75735f70616c6c65745f78636d705f71756575653c5175657565436f6e66696744617461000018014473757370656e645f7468726573686f6c641c010c75333200013864726f705f7468726573686f6c641c010c753332000140726573756d655f7468726573686f6c641c010c7533320001407468726573686f6c645f7765696768741001185765696768740001547765696768745f72657374726963745f646563617910011857656967687400016878636d705f6d61785f696e646976696475616c5f7765696768741001185765696768740000a1060000040c31011c2800a5060c6463756d756c75735f70616c6c65745f78636d705f71756575651870616c6c6574144572726f72040454000114304661696c6564546f53656e640000046c4661696c656420746f2073656e642058434d206d6573736167652e3042616458636d4f726967696e0001043c4261642058434d206f726967696e2e1842616458636d000204344261642058434d20646174612e484261644f766572776569676874496e64657800030454426164206f76657277656967687420696e6465782e3c5765696768744f7665724c696d6974000404f850726f76696465642077656967687420697320706f737369626c79206e6f7420656e6f75676820746f206578656375746520746865206d6573736167652e04ad010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f7273290a0909096f6620746869732070616c6c65742e0a090909a9060c2870616c6c65745f78636d1870616c6c6574144572726f720404540001342c556e726561636861626c650000085d0154686520646573697265642064657374696e6174696f6e2077617320756e726561636861626c652c2067656e6572616c6c7920626563617573652074686572652069732061206e6f20776179206f6620726f7574696e6718746f2069742e2c53656e644661696c757265000108610154686572652077617320736f6d65206f746865722069737375652028692e652e206e6f7420746f20646f207769746820726f7574696e672920696e2073656e64696e6720746865206d6573736167652e2050657268617073a861206c61636b206f6620737061636520666f7220627566666572696e6720746865206d6573736167652e2046696c74657265640002049c546865206d65737361676520657865637574696f6e206661696c73207468652066696c7465722e48556e776569676861626c654d657373616765000304b4546865206d65737361676527732077656967687420636f756c64206e6f742062652064657465726d696e65642e6044657374696e6174696f6e4e6f74496e7665727469626c65000404f05468652064657374696e6174696f6e20604d756c74694c6f636174696f6e602070726f76696465642063616e6e6f7420626520696e7665727465642e14456d707479000504805468652061737365747320746f2062652073656e742061726520656d7074792e3843616e6e6f745265616e63686f720006043501436f756c64206e6f742072652d616e63686f72207468652061737365747320746f206465636c61726520746865206665657320666f72207468652064657374696e6174696f6e20636861696e2e34546f6f4d616e79417373657473000704c4546f6f206d616e79206173736574732068617665206265656e20617474656d7074656420666f72207472616e736665722e34496e76616c69644f726967696e000804784f726967696e20697320696e76616c696420666f722073656e64696e672e2842616456657273696f6e00090421015468652076657273696f6e206f6620746865206056657273696f6e6564602076616c75652075736564206973206e6f742061626c6520746f20626520696e7465727072657465642e2c4261644c6f636174696f6e000a08410154686520676976656e206c6f636174696f6e20636f756c64206e6f7420626520757365642028652e672e20626563617573652069742063616e6e6f742062652065787072657373656420696e2074686560646573697265642076657273696f6e206f662058434d292e384e6f537562736372697074696f6e000b04bc546865207265666572656e63656420737562736372697074696f6e20636f756c64206e6f7420626520666f756e642e44416c726561647953756273637269626564000c041101546865206c6f636174696f6e20697320696e76616c69642073696e636520697420616c726561647920686173206120737562736372697074696f6e2066726f6d2075732e04ad010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f7273290a0909096f6620746869732070616c6c65742e0a090909ad060c4863756d756c75735f70616c6c65745f78636d1870616c6c6574144572726f7204045400010004ad010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f7273290a0909096f6620746869732070616c6c65742e0a090909b106086063756d756c75735f70616c6c65745f646d705f717565756528436f6e6669674461746100000401386d61785f696e646976696475616c1001185765696768740000b506086063756d756c75735f70616c6c65745f646d705f71756575653450616765496e6465784461746100000c0128626567696e5f757365641c012c50616765436f756e746572000120656e645f757365641c012c50616765436f756e7465720001406f7665727765696768745f636f756e7410013c4f766572776569676874496e6465780000b906000002bd0600bd06000004081c2800c1060c6063756d756c75735f70616c6c65745f646d705f71756575651870616c6c6574144572726f720404540001081c556e6b6e6f776e0000048c546865206d65737361676520696e64657820676976656e20697320756e6b6e6f776e2e244f7665724c696d6974000104310154686520616d6f756e74206f662077656967687420676976656e20697320706f737369626c79206e6f7420656e6f75676820666f7220657865637574696e6720746865206d6573736167652e04ad010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f7273290a0909096f6620746869732070616c6c65742e0a090909c506102873705f72756e74696d651c67656e657269634c756e636865636b65645f65787472696e73696348556e636865636b656445787472696e736963101c41646472657373016d021043616c6c018503245369676e6174757265017d0414457874726101c90600040028000000c90600000420cd06d106d506d906dd06e506e906ed0600cd0610306672616d655f73797374656d28657874656e73696f6e7354636865636b5f6e6f6e5f7a65726f5f73656e64657248436865636b4e6f6e5a65726f53656e64657204045400000000d10610306672616d655f73797374656d28657874656e73696f6e7348636865636b5f737065635f76657273696f6e40436865636b5370656356657273696f6e04045400000000d50610306672616d655f73797374656d28657874656e73696f6e7340636865636b5f74785f76657273696f6e38436865636b547856657273696f6e04045400000000d90610306672616d655f73797374656d28657874656e73696f6e7334636865636b5f67656e6573697330436865636b47656e6573697304045400000000dd0610306672616d655f73797374656d28657874656e73696f6e733c636865636b5f6d6f7274616c69747938436865636b4d6f7274616c69747904045400000400e106010c4572610000e106102873705f72756e74696d651c67656e657269630c6572610c4572610001010420496d6d6f7274616c0000001c4d6f7274616c31040008000001001c4d6f7274616c32040008000002001c4d6f7274616c33040008000003001c4d6f7274616c34040008000004001c4d6f7274616c35040008000005001c4d6f7274616c36040008000006001c4d6f7274616c37040008000007001c4d6f7274616c38040008000008001c4d6f7274616c3904000800000900204d6f7274616c313004000800000a00204d6f7274616c313104000800000b00204d6f7274616c313204000800000c00204d6f7274616c313304000800000d00204d6f7274616c313404000800000e00204d6f7274616c313504000800000f00204d6f7274616c313604000800001000204d6f7274616c313704000800001100204d6f7274616c313804000800001200204d6f7274616c313904000800001300204d6f7274616c323004000800001400204d6f7274616c323104000800001500204d6f7274616c323204000800001600204d6f7274616c323304000800001700204d6f7274616c323404000800001800204d6f7274616c323504000800001900204d6f7274616c323604000800001a00204d6f7274616c323704000800001b00204d6f7274616c323804000800001c00204d6f7274616c323904000800001d00204d6f7274616c333004000800001e00204d6f7274616c333104000800001f00204d6f7274616c333204000800002000204d6f7274616c333304000800002100204d6f7274616c333404000800002200204d6f7274616c333504000800002300204d6f7274616c333604000800002400204d6f7274616c333704000800002500204d6f7274616c333804000800002600204d6f7274616c333904000800002700204d6f7274616c343004000800002800204d6f7274616c343104000800002900204d6f7274616c343204000800002a00204d6f7274616c343304000800002b00204d6f7274616c343404000800002c00204d6f7274616c343504000800002d00204d6f7274616c343604000800002e00204d6f7274616c343704000800002f00204d6f7274616c343804000800003000204d6f7274616c343904000800003100204d6f7274616c353004000800003200204d6f7274616c353104000800003300204d6f7274616c353204000800003400204d6f7274616c353304000800003500204d6f7274616c353404000800003600204d6f7274616c353504000800003700204d6f7274616c353604000800003800204d6f7274616c353704000800003900204d6f7274616c353804000800003a00204d6f7274616c353904000800003b00204d6f7274616c363004000800003c00204d6f7274616c363104000800003d00204d6f7274616c363204000800003e00204d6f7274616c363304000800003f00204d6f7274616c363404000800004000204d6f7274616c363504000800004100204d6f7274616c363604000800004200204d6f7274616c363704000800004300204d6f7274616c363804000800004400204d6f7274616c363904000800004500204d6f7274616c373004000800004600204d6f7274616c373104000800004700204d6f7274616c373204000800004800204d6f7274616c373304000800004900204d6f7274616c373404000800004a00204d6f7274616c373504000800004b00204d6f7274616c373604000800004c00204d6f7274616c373704000800004d00204d6f7274616c373804000800004e00204d6f7274616c373904000800004f00204d6f7274616c383004000800005000204d6f7274616c383104000800005100204d6f7274616c383204000800005200204d6f7274616c383304000800005300204d6f7274616c383404000800005400204d6f7274616c383504000800005500204d6f7274616c383604000800005600204d6f7274616c383704000800005700204d6f7274616c383804000800005800204d6f7274616c383904000800005900204d6f7274616c393004000800005a00204d6f7274616c393104000800005b00204d6f7274616c393204000800005c00204d6f7274616c393304000800005d00204d6f7274616c393404000800005e00204d6f7274616c393504000800005f00204d6f7274616c393604000800006000204d6f7274616c393704000800006100204d6f7274616c393804000800006200204d6f7274616c393904000800006300244d6f7274616c31303004000800006400244d6f7274616c31303104000800006500244d6f7274616c31303204000800006600244d6f7274616c31303304000800006700244d6f7274616c31303404000800006800244d6f7274616c31303504000800006900244d6f7274616c31303604000800006a00244d6f7274616c31303704000800006b00244d6f7274616c31303804000800006c00244d6f7274616c31303904000800006d00244d6f7274616c31313004000800006e00244d6f7274616c31313104000800006f00244d6f7274616c31313204000800007000244d6f7274616c31313304000800007100244d6f7274616c31313404000800007200244d6f7274616c31313504000800007300244d6f7274616c31313604000800007400244d6f7274616c31313704000800007500244d6f7274616c31313804000800007600244d6f7274616c31313904000800007700244d6f7274616c31323004000800007800244d6f7274616c31323104000800007900244d6f7274616c31323204000800007a00244d6f7274616c31323304000800007b00244d6f7274616c31323404000800007c00244d6f7274616c31323504000800007d00244d6f7274616c31323604000800007e00244d6f7274616c31323704000800007f00244d6f7274616c31323804000800008000244d6f7274616c31323904000800008100244d6f7274616c31333004000800008200244d6f7274616c31333104000800008300244d6f7274616c31333204000800008400244d6f7274616c31333304000800008500244d6f7274616c31333404000800008600244d6f7274616c31333504000800008700244d6f7274616c31333604000800008800244d6f7274616c31333704000800008900244d6f7274616c31333804000800008a00244d6f7274616c31333904000800008b00244d6f7274616c31343004000800008c00244d6f7274616c31343104000800008d00244d6f7274616c31343204000800008e00244d6f7274616c31343304000800008f00244d6f7274616c31343404000800009000244d6f7274616c31343504000800009100244d6f7274616c31343604000800009200244d6f7274616c31343704000800009300244d6f7274616c31343804000800009400244d6f7274616c31343904000800009500244d6f7274616c31353004000800009600244d6f7274616c31353104000800009700244d6f7274616c31353204000800009800244d6f7274616c31353304000800009900244d6f7274616c31353404000800009a00244d6f7274616c31353504000800009b00244d6f7274616c31353604000800009c00244d6f7274616c31353704000800009d00244d6f7274616c31353804000800009e00244d6f7274616c31353904000800009f00244d6f7274616c3136300400080000a000244d6f7274616c3136310400080000a100244d6f7274616c3136320400080000a200244d6f7274616c3136330400080000a300244d6f7274616c3136340400080000a400244d6f7274616c3136350400080000a500244d6f7274616c3136360400080000a600244d6f7274616c3136370400080000a700244d6f7274616c3136380400080000a800244d6f7274616c3136390400080000a900244d6f7274616c3137300400080000aa00244d6f7274616c3137310400080000ab00244d6f7274616c3137320400080000ac00244d6f7274616c3137330400080000ad00244d6f7274616c3137340400080000ae00244d6f7274616c3137350400080000af00244d6f7274616c3137360400080000b000244d6f7274616c3137370400080000b100244d6f7274616c3137380400080000b200244d6f7274616c3137390400080000b300244d6f7274616c3138300400080000b400244d6f7274616c3138310400080000b500244d6f7274616c3138320400080000b600244d6f7274616c3138330400080000b700244d6f7274616c3138340400080000b800244d6f7274616c3138350400080000b900244d6f7274616c3138360400080000ba00244d6f7274616c3138370400080000bb00244d6f7274616c3138380400080000bc00244d6f7274616c3138390400080000bd00244d6f7274616c3139300400080000be00244d6f7274616c3139310400080000bf00244d6f7274616c3139320400080000c000244d6f7274616c3139330400080000c100244d6f7274616c3139340400080000c200244d6f7274616c3139350400080000c300244d6f7274616c3139360400080000c400244d6f7274616c3139370400080000c500244d6f7274616c3139380400080000c600244d6f7274616c3139390400080000c700244d6f7274616c3230300400080000c800244d6f7274616c3230310400080000c900244d6f7274616c3230320400080000ca00244d6f7274616c3230330400080000cb00244d6f7274616c3230340400080000cc00244d6f7274616c3230350400080000cd00244d6f7274616c3230360400080000ce00244d6f7274616c3230370400080000cf00244d6f7274616c3230380400080000d000244d6f7274616c3230390400080000d100244d6f7274616c3231300400080000d200244d6f7274616c3231310400080000d300244d6f7274616c3231320400080000d400244d6f7274616c3231330400080000d500244d6f7274616c3231340400080000d600244d6f7274616c3231350400080000d700244d6f7274616c3231360400080000d800244d6f7274616c3231370400080000d900244d6f7274616c3231380400080000da00244d6f7274616c3231390400080000db00244d6f7274616c3232300400080000dc00244d6f7274616c3232310400080000dd00244d6f7274616c3232320400080000de00244d6f7274616c3232330400080000df00244d6f7274616c3232340400080000e000244d6f7274616c3232350400080000e100244d6f7274616c3232360400080000e200244d6f7274616c3232370400080000e300244d6f7274616c3232380400080000e400244d6f7274616c3232390400080000e500244d6f7274616c3233300400080000e600244d6f7274616c3233310400080000e700244d6f7274616c3233320400080000e800244d6f7274616c3233330400080000e900244d6f7274616c3233340400080000ea00244d6f7274616c3233350400080000eb00244d6f7274616c3233360400080000ec00244d6f7274616c3233370400080000ed00244d6f7274616c3233380400080000ee00244d6f7274616c3233390400080000ef00244d6f7274616c3234300400080000f000244d6f7274616c3234310400080000f100244d6f7274616c3234320400080000f200244d6f7274616c3234330400080000f300244d6f7274616c3234340400080000f400244d6f7274616c3234350400080000f500244d6f7274616c3234360400080000f600244d6f7274616c3234370400080000f700244d6f7274616c3234380400080000f800244d6f7274616c3234390400080000f900244d6f7274616c3235300400080000fa00244d6f7274616c3235310400080000fb00244d6f7274616c3235320400080000fc00244d6f7274616c3235330400080000fd00244d6f7274616c3235340400080000fe00244d6f7274616c3235350400080000ff0000e50610306672616d655f73797374656d28657874656e73696f6e732c636865636b5f6e6f6e636528436865636b4e6f6e63650404540000040055010120543a3a496e6465780000e90610306672616d655f73797374656d28657874656e73696f6e7330636865636b5f7765696768742c436865636b57656967687404045400000000ed06086870616c6c65745f7472616e73616374696f6e5f7061796d656e74604368617267655472616e73616374696f6e5061796d656e74040454000004005d01013042616c616e63654f663c543e0000981853797374656d011853797374656d401c4163636f756e7401010402000c510100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004e8205468652066756c6c206163636f756e7420696e666f726d6174696f6e20666f72206120706172746963756c6172206163636f756e742049442e3845787472696e736963436f756e7400001c040004b820546f74616c2065787472696e7369637320636f756e7420666f72207468652063757272656e7420626c6f636b2e2c426c6f636b576569676874010020600000000000000000000000000000000000000000000000000488205468652063757272656e742077656967687420666f722074686520626c6f636b2e40416c6c45787472696e736963734c656e00001c040004410120546f74616c206c656e6774682028696e2062797465732920666f7220616c6c2065787472696e736963732070757420746f6765746865722c20666f72207468652063757272656e7420626c6f636b2e24426c6f636b486173680101040510248000000000000000000000000000000000000000000000000000000000000000000498204d6170206f6620626c6f636b206e756d6265727320746f20626c6f636b206861736865732e3445787472696e73696344617461010104051c280400043d012045787472696e73696373206461746120666f72207468652063757272656e7420626c6f636b20286d61707320616e2065787472696e736963277320696e64657820746f206974732064617461292e184e756d626572010010200000000000000000040901205468652063757272656e7420626c6f636b206e756d626572206265696e672070726f6365737365642e205365742062792060657865637574655f626c6f636b602e28506172656e744861736801002480000000000000000000000000000000000000000000000000000000000000000004702048617368206f66207468652070726576696f757320626c6f636b2e1844696765737401002c040004f020446967657374206f66207468652063757272656e7420626c6f636b2c20616c736f2070617274206f662074686520626c6f636b206865616465722e184576656e747301003c04001ca0204576656e7473206465706f736974656420666f72207468652063757272656e7420626c6f636b2e001d01204e4f54453a20546865206974656d20697320756e626f756e6420616e642073686f756c64207468657265666f7265206e657665722062652072656164206f6e20636861696e2ed020497420636f756c64206f746865727769736520696e666c6174652074686520506f562073697a65206f66206120626c6f636b2e002d01204576656e747320686176652061206c6172676520696e2d6d656d6f72792073697a652e20426f7820746865206576656e747320746f206e6f7420676f206f75742d6f662d6d656d6f7279fc206a75737420696e206361736520736f6d656f6e65207374696c6c207265616473207468656d2066726f6d2077697468696e207468652072756e74696d652e284576656e74436f756e7401001c100000000004b820546865206e756d626572206f66206576656e747320696e2074686520604576656e74733c543e60206c6973742e2c4576656e74546f706963730101040224e5010400282501204d617070696e67206265747765656e206120746f7069632028726570726573656e74656420627920543a3a486173682920616e64206120766563746f72206f6620696e646578657394206f66206576656e747320696e2074686520603c4576656e74733c543e3e60206c6973742e00510120416c6c20746f70696320766563746f727320686176652064657465726d696e69737469632073746f72616765206c6f636174696f6e7320646570656e64696e67206f6e2074686520746f7069632e2054686973450120616c6c6f7773206c696768742d636c69656e747320746f206c6576657261676520746865206368616e67657320747269652073746f7261676520747261636b696e67206d656368616e69736d20616e64e420696e2063617365206f66206368616e67657320666574636820746865206c697374206f66206576656e7473206f6620696e7465726573742e004d01205468652076616c756520686173207468652074797065206028543a3a426c6f636b4e756d6265722c204576656e74496e646578296020626563617573652069662077652075736564206f6e6c79206a7573744d012074686520604576656e74496e64657860207468656e20696e20636173652069662074686520746f70696320686173207468652073616d6520636f6e74656e7473206f6e20746865206e65787420626c6f636b0101206e6f206e6f74696669636174696f6e2077696c6c20626520747269676765726564207468757320746865206576656e74206d69676874206265206c6f73742e484c61737452756e74696d65557067726164650000e90104000455012053746f726573207468652060737065635f76657273696f6e6020616e642060737065635f6e616d6560206f66207768656e20746865206c6173742072756e74696d6520757067726164652068617070656e65642e545570677261646564546f553332526566436f756e740100a80400044d012054727565206966207765206861766520757067726164656420736f207468617420607479706520526566436f756e74602069732060753332602e2046616c7365202864656661756c7429206966206e6f742e605570677261646564546f547269706c65526566436f756e740100a80400085d012054727565206966207765206861766520757067726164656420736f2074686174204163636f756e74496e666f20636f6e7461696e73207468726565207479706573206f662060526566436f756e74602e2046616c736548202864656661756c7429206966206e6f742e38457865637574696f6e50686173650000dd01040004882054686520657865637574696f6e207068617365206f662074686520626c6f636b2e01f10101481830426c6f636b5765696768747305028501e0d1a93e010000000088526a7400000090cd2405000000000170a45da64b0000000100e6bd4f5700000001000000000000000090cd240500000000017046f2c068000000010088526a740000000100a2941a1d00000090cd24050000000000000004d020426c6f636b20262065787472696e7369637320776569676874733a20626173652076616c75657320616e64206c696d6974732e2c426c6f636b4c656e67746815023000003c00000050000000500004a820546865206d6178696d756d206c656e677468206f66206120626c6f636b2028696e206279746573292e38426c6f636b48617368436f756e7410206009000000000000045501204d6178696d756d206e756d626572206f6620626c6f636b206e756d62657220746f20626c6f636b2068617368206d617070696e677320746f206b65657020286f6c64657374207072756e6564206669727374292e2044625765696768741d024040787d010000000000e1f505000000000409012054686520776569676874206f662072756e74696d65206461746162617365206f7065726174696f6e73207468652072756e74696d652063616e20696e766f6b652e1c56657273696f6e2102d102386b696c742d7370697269746e6574386b696c742d7370697269746e657401000000e0290000000000002cdf6acb689907609b0400000037e397fc7c91f5e401000000bc9d89904f5b923f0100000037c8bb1350a9a2a80100000040fe3ad401f8959a06000000d2bc9897eed08f1503000000f78b278be53f454c02000000ab3c0572291feb8b01000000dd718d5cc53262d401000000ea93e3f16f3d696202000000a02708c798d60bce0100000003000000000484204765742074686520636861696e27732063757272656e742076657273696f6e2e2853533538507265666978e408260014a8205468652064657369676e61746564205353383520707265666978206f66207468697320636861696e2e0039012054686973207265706c6163657320746865202273733538466f726d6174222070726f7065727479206465636c6172656420696e2074686520636861696e20737065632e20526561736f6e20697331012074686174207468652072756e74696d652073686f756c64206b6e6f772061626f7574207468652070726566697820696e206f7264657220746f206d616b6520757365206f662069742061737020616e206964656e746966696572206f662074686520636861696e2e013102006052616e646f6d6e657373436f6c6c656374697665466c6970016052616e646f6d6e657373436f6c6c656374697665466c6970043852616e646f6d4d6174657269616c0100350204000c610120536572696573206f6620626c6f636b20686561646572732066726f6d20746865206c61737420383120626c6f636b73207468617420616374732061732072616e646f6d2073656564206d6174657269616c2e2054686973610120697320617272616e67656420617320612072696e672062756666657220776974682060626c6f636b5f6e756d626572202520383160206265696e672074686520696e64657820696e746f20746865206056656360206f664420746865206f6c6465737420686173682e00000000012454696d657374616d70012454696d657374616d70080c4e6f7701001020000000000000000004902043757272656e742074696d6520666f72207468652063757272656e7420626c6f636b2e244469645570646174650100a8040004b420446964207468652074696d657374616d7020676574207570646174656420696e207468697320626c6f636b3f0139020004344d696e696d756d506572696f6410207017000000000000104d0120546865206d696e696d756d20706572696f64206265747765656e20626c6f636b732e204265776172652074686174207468697320697320646966666572656e7420746f20746865202a65787065637465642a5d0120706572696f6420746861742074686520626c6f636b2070726f64756374696f6e206170706172617475732070726f76696465732e20596f75722063686f73656e20636f6e73656e7375732073797374656d2077696c6c5d012067656e6572616c6c7920776f726b2077697468207468697320746f2064657465726d696e6520612073656e7369626c6520626c6f636b2074696d652e20652e672e20466f7220417572612c2069742077696c6c206265a020646f75626c65207468697320706572696f64206f6e2064656661756c742073657474696e67732e00021c496e6469636573011c496e646963657304204163636f756e747300010402103d020400048820546865206c6f6f6b75702066726f6d20696e64657820746f206163636f756e742e014102016c041c4465706f736974184000b47cf328350000000000000000000004ac20546865206465706f736974206e656564656420666f7220726573657276696e6720616e20696e6465782e014502052042616c616e636573012042616c616e6365731434546f74616c49737375616e6365010018400000000000000000000000000000000004982054686520746f74616c20756e6974732069737375656420696e207468652073797374656d2e1c4163636f756e74010104020014010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600901205468652042616c616e6365732070616c6c6574206578616d706c65206f662073746f72696e67207468652062616c616e6365206f6620616e206163636f756e742e00282023204578616d706c650034206060606e6f636f6d70696c65b02020696d706c2070616c6c65745f62616c616e6365733a3a436f6e66696720666f722052756e74696d65207b19022020202074797065204163636f756e7453746f7265203d2053746f726167654d61705368696d3c53656c663a3a4163636f756e743c52756e74696d653e2c206672616d655f73797374656d3a3a50726f76696465723c52756e74696d653e2c204163636f756e7449642c2053656c663a3a4163636f756e74446174613c42616c616e63653e3e0c20207d102060606000150120596f752063616e20616c736f2073746f7265207468652062616c616e6365206f6620616e206163636f756e7420696e20746865206053797374656d602070616c6c65742e00282023204578616d706c650034206060606e6f636f6d70696c65b02020696d706c2070616c6c65745f62616c616e6365733a3a436f6e66696720666f722052756e74696d65207b7420202074797065204163636f756e7453746f7265203d2053797374656d0c20207d102060606000510120427574207468697320636f6d657320776974682074726164656f6666732c2073746f72696e67206163636f756e742062616c616e63657320696e207468652073797374656d2070616c6c65742073746f7265736d0120606672616d655f73797374656d60206461746120616c6f6e677369646520746865206163636f756e74206461746120636f6e747261727920746f2073746f72696e67206163636f756e742062616c616e63657320696e207468652901206042616c616e636573602070616c6c65742c20776869636820757365732061206053746f726167654d61706020746f2073746f72652062616c616e6365732064617461206f6e6c792e4101204e4f54453a2054686973206973206f6e6c79207573656420696e207468652063617365207468617420746869732070616c6c6574206973207573656420746f2073746f72652062616c616e6365732e144c6f636b7301010402004902040008b820416e79206c6971756964697479206c6f636b73206f6e20736f6d65206163636f756e742062616c616e6365732e2501204e4f54453a2053686f756c64206f6e6c79206265206163636573736564207768656e2073657474696e672c206368616e67696e6720616e642066726565696e672061206c6f636b2e20526573657276657301010402005902040004a4204e616d6564207265736572766573206f6e20736f6d65206163636f756e742062616c616e6365732e3853746f7261676556657273696f6e0100650204000c7c2053746f726167652076657273696f6e206f66207468652070616c6c65742e00a020546869732069732073657420746f2076322e302e3020666f72206e6577206e6574776f726b732e01690201700c484578697374656e7469616c4465706f736974184000a0724e18090000000000000000000004d420546865206d696e696d756d20616d6f756e7420726571756972656420746f206b65657020616e206163636f756e74206f70656e2e204d61784c6f636b731c103200000008f420546865206d6178696d756d206e756d626572206f66206c6f636b7320746861742073686f756c64206578697374206f6e20616e206163636f756e742edc204e6f74207374726963746c7920656e666f726365642c20627574207573656420666f722077656967687420657374696d6174696f6e2e2c4d617852657365727665731c1032000000040d0120546865206d6178696d756d206e756d626572206f66206e616d656420726573657276657320746861742063616e206578697374206f6e20616e206163636f756e742e01750206485472616e73616374696f6e5061796d656e7401485472616e73616374696f6e5061796d656e7408444e6578744665654d756c7469706c6965720100790240000064a7b3b6e00d0000000000000000003853746f7261676556657273696f6e01007d0204000000017804604f7065726174696f6e616c4665654d756c7469706c696572080405545901204120666565206d756c6974706c69657220666f7220604f7065726174696f6e616c602065787472696e7369637320746f20636f6d7075746520227669727475616c207469702220746f20626f6f73742074686569722c20607072696f7269747960004d0120546869732076616c7565206973206d756c7469706c656420627920746865206066696e616c5f6665656020746f206f627461696e206120227669727475616c20746970222074686174206973206c61746572f420616464656420746f20612074697020636f6d706f6e656e7420696e20726567756c617220607072696f72697479602063616c63756c6174696f6e732e4d01204974206d65616e732074686174206120604e6f726d616c60207472616e73616374696f6e2063616e2066726f6e742d72756e20612073696d696c61726c792d73697a656420604f7065726174696f6e616c6041012065787472696e736963202877697468206e6f20746970292c20627920696e636c7564696e672061207469702076616c75652067726561746572207468616e20746865207669727475616c207469702e003c20606060727573742c69676e6f726540202f2f20466f7220604e6f726d616c608c206c6574207072696f72697479203d207072696f726974795f63616c6328746970293b0054202f2f20466f7220604f7065726174696f6e616c601101206c6574207669727475616c5f746970203d2028696e636c7573696f6e5f666565202b2074697029202a204f7065726174696f6e616c4665654d756c7469706c6965723bc4206c6574207072696f72697479203d207072696f726974795f63616c6328746970202b207669727475616c5f746970293b1020606060005101204e6f746520746861742073696e636520776520757365206066696e616c5f6665656020746865206d756c7469706c696572206170706c69657320616c736f20746f2074686520726567756c61722060746970605d012073656e74207769746820746865207472616e73616374696f6e2e20536f2c206e6f74206f6e6c7920646f657320746865207472616e73616374696f6e206765742061207072696f726974792062756d702062617365646101206f6e207468652060696e636c7573696f6e5f666565602c2062757420776520616c736f20616d706c6966792074686520696d70616374206f662074697073206170706c69656420746f20604f7065726174696f6e616c6038207472616e73616374696f6e732e000728417574686f72736869700128417574686f72736869700c18556e636c6573010081020400041c20556e636c657318417574686f720000000400046420417574686f72206f662063757272656e7420626c6f636b2e30446964536574556e636c65730100a8040004bc205768657468657220756e636c6573207765726520616c72656164792073657420696e207468697320626c6f636b2e019102000440556e636c6547656e65726174696f6e73102000000000000000000ccc20546865206e756d626572206f6620626c6f636b73206261636b2077652073686f756c642061636365707420756e636c65732ee42054686973206d65616e7320746861742077652077696c6c206465616c207769746820756e636c652d706172656e7473207468617420617265942060556e636c6547656e65726174696f6e73202b203160206265666f726520606e6f77602e01a102144050617261636861696e5374616b696e67014050617261636861696e5374616b696e6734544d617853656c656374656443616e6469646174657301001c100000000004090120546865206d6178696d756d206e756d626572206f6620636f6c6c61746f722063616e646964617465732073656c6563746564206174206561636820726f756e642e14526f756e640100a50250000000000000000000000000140000000000000004e82043757272656e7420726f756e64206e756d62657220616e64206e65787420726f756e64207363686564756c6564207472616e736974696f6e2e384c61737444656c65676174696f6e0101040500a902200000000000000000140d012044656c65676174696f6e20696e666f726d6174696f6e20666f7220746865206c61746573742073657373696f6e20696e20776869636820612064656c656761746f722c2064656c6567617465642e000501204974206d6170732066726f6d20616e206163636f756e7420746f20746865206e756d626572206f662064656c65676174696f6e7320696e20746865206c617374982073657373696f6e20696e2077686963682074686579202872652d2964656c6567617465642e3844656c656761746f7253746174650001040500ad0204000c802044656c65676174696f6e207374616b696e6720696e666f726d6174696f6e2e00cc204974206d6170732066726f6d20616e206163636f756e7420746f206974732064656c65676174696f6e2064657461696c732e3443616e646964617465506f6f6c0001040500c102040010a420546865207374616b696e6720696e666f726d6174696f6e20666f7220612063616e6469646174652e00b0204974206d6170732066726f6d20616e206163636f756e7420746f2069747320696e666f726d6174696f6e2eb8204d6f72656f7665722c20697420636f756e747320746865206e756d626572206f662063616e646964617465732e5c436f756e746572466f7243616e646964617465506f6f6c01001c100000000004ac436f756e74657220666f72207468652072656c6174656420636f756e7465642073746f72616765206d617048546f74616c436f6c6c61746f725374616b650100d10280000000000000000000000000000000000000000000000000000000000000000014f420546f74616c2066756e6473206c6f636b656420746f206261636b207468652063757272656e746c792073656c656374656420636f6c6c61746f72732ed0205468652073756d206f6620616c6c20636f6c6c61746f7220616e642074686569722064656c656761746f72207374616b65732e002101204e6f74653a20546865726520617265206d6f72652066756e6473206c6f636b656420627920746869732070616c6c65742c2073696e636520746865206261636b696e6720666f720901206e6f6e20636f6c6c6174696e672063616e64696461746573206973206e6f7420696e636c7564656420696e205b546f74616c436f6c6c61746f725374616b655d2e34546f7043616e646964617465730100d502040028e82054686520636f6c6c61746f722063616e64696461746573207769746820746865206869676865737420616d6f756e74206f66207374616b652e00190120456163682074696d6520746865207374616b65206f66206120636f6c6c61746f7220697320696e637265617365642c20697420697320636865636b65642077686574686572050120746869732070757368657320616e6f746865722063616e646964617465206f7574206f6620746865206c6973742e205768656e20746865207374616b652069732101207265647563656420686f77657665722c206974206973206e6f7420636865636b656420696620616e6f746865722063616e64696461746520686173206d6f7265207374616b652c11012073696e6365207468697320776f756c64207265717569726520697465726174696e67206f7665722074686520656e74697265205b43616e646964617465506f6f6c5d2e001501205468657265206d75737420616c77617973206265206d6f72652063616e64696461746573207468616e205b4d617853656c656374656443616e646964617465735d20736f0d012074686174206120636f6c6c61746f722063616e2064726f70206f7574206f662074686520636f6c6c61746f7220736574206279207265647563696e672074686569721c207374616b652e3c496e666c6174696f6e436f6e6669670100dd02c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000046420496e666c6174696f6e20636f6e66696775726174696f6e2e24556e7374616b696e670101040500e90204001088205468652066756e64732077616974696e6720746f20626520756e7374616b65642e001d01204974206d6170732066726f6d206163636f756e747320746f20616c6c207468652066756e64732061646472657373656420746f207468656d20696e20746865206675747572652020626c6f636b732e644d6178436f6c6c61746f7243616e6469646174655374616b65010018400000000000000000000000000000000004cc20546865206d6178696d756d20616d6f756e74206120636f6c6c61746f722063616e6469646174652063616e207374616b652e4c4c617374526577617264526564756374696f6e010010200000000000000000140d0120546865207965617220696e20776869636820746865206c617374206175746f6d6174696320726564756374696f6e206f66207468652072657761726420726174657328206f636375727265642e00250120497420737461727473206174207a65726f2061742067656e6573697320616e6420696e6372656d656e7473206279206f6e6520657665727920424c4f434b535f5045525f5945415234206d616e7920626c6f636b732e34466f7263654e6577526f756e640100a804000001f902017c44444d696e426c6f636b73506572526f756e6410202c0100000000000004d4204d696e696d756d206e756d626572206f6620626c6f636b732076616c69646174696f6e20726f756e64732063616e206c6173742e5444656661756c74426c6f636b73506572526f756e641020580200000000000008fc2044656661756c74206e756d626572206f6620626c6f636b732076616c69646174696f6e20726f756e6473206c6173742c2061732073657420696e207468655c2067656e6573697320636f6e66696775726174696f6e2e345374616b654475726174696f6e1020e0c40000000000000c0501204e756d626572206f6620626c6f636b7320666f7220776869636820756e7374616b65642062616c616e63652077696c6c207374696c6c206265206c6f636b6564f0206265666f72652069742063616e20626520756e6c6f636b6564206279206163746976656c792063616c6c696e67207468652065787472696e7369634c2060756e6c6f636b5f756e7374616b6564602e3845786974517565756544656c61791c1002000000080901204e756d626572206f6620726f756e6473206120636f6c6c61746f722068617320746f207374617920616374697665206166746572207375626d697474696e672061c4207265717565737420746f206c656176652074686520736574206f6620636f6c6c61746f722063616e646964617465732e304d696e436f6c6c61746f72731c1010000000080d01204d696e696d756d206e756d626572206f6620636f6c6c61746f72732073656c65637465642066726f6d2074686520736574206f662063616e64696461746573206174602065766572792076616c69646174696f6e20726f756e642e504d696e5265717569726564436f6c6c61746f72731c1004000000081101204d696e696d756d206e756d626572206f6620636f6c6c61746f72732077686963682063616e6e6f74206c6561766520746865206e6574776f726b2069662074686572653c20617265206e6f206f74686572732e584d617844656c65676174696f6e73506572526f756e641c1001000000140101204d6178696d756d206e756d626572206f662064656c65676174696f6e732077686963682063616e206265206d6164652077697468696e207468652073616d651c20726f756e642e000d01204e4f54453a20546f2070726576656e742072652d64656c65676174696f6e2d7265776172642061747461636b732c2077652073686f756c64206b65657020746869732c20746f206265206f6e652e604d617844656c656761746f7273506572436f6c6c61746f721c102300000004e4204d6178696d756d206e756d626572206f662064656c656761746f727320612073696e676c6520636f6c6c61746f722063616e20686176652e604d6178436f6c6c61746f727350657244656c656761746f721c100100000004f4204d6178696d756d206e756d626572206f6620636f6c6c61746f727320612073696e676c652064656c656761746f722063616e2064656c65676174652e404d6178546f7043616e646964617465731c104b00000004a0204d6178696d756d2073697a65206f662074686520746f702063616e64696461746573207365742e404d696e436f6c6c61746f725374616b6518400000e8890423c78a0000000000000000080901204d696e696d756d207374616b6520726571756972656420666f7220616e79206163636f756e7420746f20626520656c65637465642061732076616c696461746f723420666f72206120726f756e642e644d696e436f6c6c61746f7243616e6469646174655374616b6518400000e8890423c78a0000000000000000080501204d696e696d756d207374616b6520726571756972656420666f7220616e79206163636f756e7420746f20626520616464656420746f2074686520736574206f66302063616e646964617465732e344d696e44656c65676174696f6e1840000082dfe40d4700000000000000000004fc204d696e696d756d207374616b6520726571756972656420666f7220616e79206163636f756e7420746f2062652061626c6520746f2064656c65676174652e444d696e44656c656761746f725374616b651840000082dfe40d4700000000000000000004f8204d696e696d756d207374616b6520726571756972656420666f7220616e79206163636f756e7420746f206265636f6d6520612064656c656761746f722e484d6178556e7374616b6552657175657374731c100a00000028e8204d6178206e756d626572206f6620636f6e63757272656e742061637469766520756e7374616b696e67207265717565737473206265666f72652c20756e6c6f636b696e672e001501204e4f54453a20546f2070726f7465637420616761696e737420697272656d6f766162696c697479206f6620612063616e646964617465206f722064656c656761746f722cf4207765206f6e6c7920616c6c6f7720666f72204d6178556e7374616b655265717565737473202d2031206d616e79206d616e75616c20756e7374616b6501012072657175657374732e20546865206c617374206f6e6520736572766573206173206120706c616365686f6c64657220666f7220746865206361736573206f66f02063616c6c696e672065697468657220606b69636b5f64656c656761746f72602c20666f7263655f72656d6f76655f63616e64696461746560206f7209012060657865637574655f6c656176655f63616e64696461746573602e204f74686572776973652c2061207573657220636f756c64206d6178206f75742074686569720d0120756e7374616b6520726571756573747320616e642070726576656e74207468656d73656c7665732066726f6d206265696e67206b69636b65642066726f6d20746865f020736574206f662063616e646964617465732f64656c656761746f727320756e74696c207468657920756e6c6f636b2074686569722066756e64732e484e6574776f726b5265776172645374617274102048a3c800000000000c110120546865207374617274696e6720626c6f636b206e756d62657220666f7220746865206e6574776f726b20726577617264732e204f6e6365207468652063757272656e74090120626c6f636b206e756d626572206578636565647320746869732073746172742c207468652062656e65666963696172792077696c6c2072656365697665207468658420636f6e666967757265642072657761726420696e206561636820626c6f636b2e444e6574776f726b52657761726452617465802000008a5d784563010c0d0120546865207261746520696e2070657263656e7420666f7220746865206e6574776f726b207265776172647320776869636820617265206261736564206f6e207468650901206d6178696d756d206e756d626572206f6620636f6c6c61746f727320616e6420746865206d6178696d756d20616d6f756e74206120636f6c6c61746f722063616e1c207374616b652e01fd02151c53657373696f6e011c53657373696f6e1c2856616c696461746f727301008c0400047c205468652063757272656e7420736574206f662076616c696461746f72732e3043757272656e74496e64657801001c100000000004782043757272656e7420696e646578206f66207468652073657373696f6e2e345175657565644368616e6765640100a8040008390120547275652069662074686520756e6465726c79696e672065636f6e6f6d6963206964656e746974696573206f7220776569676874696e6720626568696e64207468652076616c696461746f7273a420686173206368616e67656420696e20746865207175657565642076616c696461746f72207365742e285175657565644b657973010001030400083d012054686520717565756564206b65797320666f7220746865206e6578742073657373696f6e2e205768656e20746865206e6578742073657373696f6e20626567696e732c207468657365206b657973e02077696c6c206265207573656420746f2064657465726d696e65207468652076616c696461746f7227732073657373696f6e206b6579732e4844697361626c656456616c696461746f7273010015030400148020496e6469636573206f662064697361626c65642076616c696461746f72732e003d01205468652076656320697320616c77617973206b65707420736f7274656420736f20746861742077652063616e2066696e642077686574686572206120676976656e2076616c696461746f722069733d012064697361626c6564207573696e672062696e617279207365617263682e204974206765747320636c6561726564207768656e20606f6e5f73657373696f6e5f656e64696e67602072657475726e73642061206e657720736574206f66206964656e7469746965732e204e6578744b657973000104050009030400049c20546865206e6578742073657373696f6e206b65797320666f7220612076616c696461746f722e204b65794f776e657200010405190300040004090120546865206f776e6572206f662061206b65792e20546865206b65792069732074686520604b657954797065496460202b2074686520656e636f646564206b65792e012103018400012503161041757261011041757261082c417574686f726974696573010029030400046c205468652063757272656e7420617574686f72697479207365742e2c43757272656e74536c6f74010031032000000000000000000c80205468652063757272656e7420736c6f74206f66207468697320626c6f636b2e009420546869732077696c6c2062652073657420696e20606f6e5f696e697469616c697a65602e00000000171c41757261457874011c41757261457874042c417574686f72697469657301002903040014942053657276657320617320636163686520666f722074686520617574686f7269746965732e0071012054686520617574686f72697469657320696e204175526120617265206f7665727772697474656e20696e20606f6e5f696e697469616c697a6560207768656e2077652073776974636820746f2061206e65772073657373696f6e2c790120627574207765207265717569726520746865206f6c6420617574686f72697469657320746f2076657269667920746865207365616c207768656e2076616c69646174696e67206120506f562e20546869732077696c6c20616c77617973f0206265207570646174656420746f20746865206c6174657374204175526120617574686f72697469657320696e20606f6e5f66696e616c697a65602e00000000182444656d6f6372616379012444656d6f6372616379343c5075626c696350726f70436f756e7401001c100000000004f420546865206e756d626572206f6620287075626c6963292070726f706f73616c7320746861742068617665206265656e206d61646520736f206661722e2c5075626c696350726f707301003503040004210120546865207075626c69632070726f706f73616c732e20556e736f727465642e20546865207365636f6e64206974656d206973207468652070726f706f73616c277320686173682e244465706f7369744f66000104051c3d0304000c842054686f73652077686f2068617665206c6f636b65642061206465706f7369742e00d82054574f582d4e4f54453a20536166652c20617320696e6372656173696e6720696e7465676572206b6579732061726520736166652e24507265696d61676573000104062441030400086101204d6170206f662068617368657320746f207468652070726f706f73616c20707265696d6167652c20616c6f6e6720776974682077686f207265676973746572656420697420616e64207468656972206465706f7369742ee42054686520626c6f636b206e756d6265722069732074686520626c6f636b20617420776869636820697420776173206465706f73697465642e3c5265666572656e64756d436f756e7401001c100000000004310120546865206e6578742066726565207265666572656e64756d20696e6465782c20616b6120746865206e756d626572206f66207265666572656e6461207374617274656420736f206661722e344c6f77657374556e62616b656401001c100000000008250120546865206c6f77657374207265666572656e64756d20696e64657820726570726573656e74696e6720616e20756e62616b6564207265666572656e64756d2e20457175616c20746fdc20605265666572656e64756d436f756e74602069662074686572652069736e2774206120756e62616b6564207265666572656e64756d2e405265666572656e64756d496e666f4f66000104051c450304000cb420496e666f726d6174696f6e20636f6e6365726e696e6720616e7920676976656e207265666572656e64756d2e0009012054574f582d4e4f54453a205341464520617320696e646578657320617265206e6f7420756e64657220616e2061747461636b6572e280997320636f6e74726f6c2e20566f74696e674f6601010405005103e800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000105d0120416c6c20766f74657320666f72206120706172746963756c617220766f7465722e2057652073746f7265207468652062616c616e636520666f7220746865206e756d626572206f6620766f74657320746861742077655d012068617665207265636f726465642e20546865207365636f6e64206974656d2069732074686520746f74616c20616d6f756e74206f662064656c65676174696f6e732c20746861742077696c6c2062652061646465642e00e82054574f582d4e4f54453a205341464520617320604163636f756e7449646073206172652063727970746f2068617368657320616e797761792e544c6173745461626c656457617345787465726e616c0100a80400085901205472756520696620746865206c617374207265666572656e64756d207461626c656420776173207375626d69747465642065787465726e616c6c792e2046616c7365206966206974207761732061207075626c6963282070726f706f73616c2e304e65787445787465726e616c00006903040010590120546865207265666572656e64756d20746f206265207461626c6564207768656e6576657220697420776f756c642062652076616c696420746f207461626c6520616e2065787465726e616c2070726f706f73616c2e550120546869732068617070656e73207768656e2061207265666572656e64756d206e6565647320746f206265207461626c656420616e64206f6e65206f662074776f20636f6e646974696f6e7320617265206d65743aa4202d20604c6173745461626c656457617345787465726e616c60206973206066616c7365603b206f7268202d20605075626c696350726f70736020697320656d7074792e24426c61636b6c69737400010406246d0304000851012041207265636f7264206f662077686f207665746f656420776861742e204d6170732070726f706f73616c206861736820746f206120706f737369626c65206578697374656e7420626c6f636b206e756d626572e82028756e74696c207768656e206974206d6179206e6f742062652072657375626d69747465642920616e642077686f207665746f65642069742e3443616e63656c6c6174696f6e730101040624a80400042901205265636f7264206f6620616c6c2070726f706f73616c7320746861742068617665206265656e207375626a65637420746f20656d657267656e63792063616e63656c6c6174696f6e2e3853746f7261676556657273696f6e0000710304000c7c2053746f726167652076657273696f6e206f66207468652070616c6c65742e0098204e6577206e6574776f726b732073746172742077697468206c6173742076657273696f6e2e01750301882c3c456e6163746d656e74506572696f641020201c00000000000014e82054686520706572696f64206265747765656e20612070726f706f73616c206265696e6720617070726f76656420616e6420656e61637465642e0031012049742073686f756c642067656e6572616c6c792062652061206c6974746c65206d6f7265207468616e2074686520756e7374616b6520706572696f6420746f20656e737572652074686174510120766f74696e67207374616b657273206861766520616e206f70706f7274756e69747920746f2072656d6f7665207468656d73656c7665732066726f6d207468652073797374656d20696e207468652063617365b4207768657265207468657920617265206f6e20746865206c6f73696e672073696465206f66206120766f74652e304c61756e6368506572696f641020e0c400000000000004e420486f77206f6674656e2028696e20626c6f636b7329206e6577207075626c6963207265666572656e646120617265206c61756e636865642e30566f74696e67506572696f641020e0c400000000000004b820486f77206f6674656e2028696e20626c6f636b732920746f20636865636b20666f72206e657720766f7465732e44566f74654c6f636b696e67506572696f641020e0c4000000000000109020546865206d696e696d756d20706572696f64206f6620766f7465206c6f636b696e672e0065012049742073686f756c64206265206e6f2073686f72746572207468616e20656e6163746d656e7420706572696f6420746f20656e73757265207468617420696e207468652063617365206f6620616e20617070726f76616c2c49012074686f7365207375636365737366756c20766f7465727320617265206c6f636b656420696e746f2074686520636f6e73657175656e636573207468617420746865697220766f74657320656e7461696c2e384d696e696d756d4465706f73697418400080c6a47e8d0300000000000000000004350120546865206d696e696d756d20616d6f756e7420746f20626520757365642061732061206465706f73697420666f722061207075626c6963207265666572656e64756d2070726f706f73616c2e38496e7374616e74416c6c6f776564a804010c550120496e64696361746f7220666f72207768657468657220616e20656d657267656e6379206f726967696e206973206576656e20616c6c6f77656420746f2068617070656e2e20536f6d6520636861696e73206d617961012077616e7420746f207365742074686973207065726d616e656e746c7920746f206066616c7365602c206f7468657273206d61792077616e7420746f20636f6e646974696f6e206974206f6e207468696e67732073756368a020617320616e207570677261646520686176696e672068617070656e656420726563656e746c792e5446617374547261636b566f74696e67506572696f641020840300000000000004ec204d696e696d756d20766f74696e6720706572696f6420616c6c6f77656420666f72206120666173742d747261636b207265666572656e64756d2e34436f6f6c6f6666506572696f641020e0c400000000000004610120506572696f6420696e20626c6f636b7320776865726520616e2065787465726e616c2070726f706f73616c206d6179206e6f742062652072652d7375626d6974746564206166746572206265696e67207665746f65642e4c507265696d616765427974654465706f736974184000743ba40b00000000000000000000000429012054686520616d6f756e74206f662062616c616e63652074686174206d757374206265206465706f7369746564207065722062797465206f6620707265696d6167652073746f7265642e204d6178566f7465731c106400000010b020546865206d6178696d756d206e756d626572206f6620766f74657320666f7220616e206163636f756e742e00d420416c736f207573656420746f20636f6d70757465207765696768742c20616e206f7665726c79206269672076616c75652063616e1501206c65616420746f2065787472696e7369632077697468207665727920626967207765696768743a20736565206064656c65676174656020666f7220696e7374616e63652e304d617850726f706f73616c731c1064000000040d0120546865206d6178696d756d206e756d626572206f66207075626c69632070726f706f73616c7320746861742063616e20657869737420617420616e792074696d652e017d031e1c436f756e63696c011c436f756e63696c182450726f706f73616c7301008103040004902054686520686173686573206f6620746865206163746976652070726f706f73616c732e2850726f706f73616c4f6600010406248503040004cc2041637475616c2070726f706f73616c20666f72206120676976656e20686173682c20696620697427732063757272656e742e18566f74696e6700010406242505040004b420566f746573206f6e206120676976656e2070726f706f73616c2c206966206974206973206f6e676f696e672e3450726f706f73616c436f756e7401001c100000000004482050726f706f73616c7320736f206661722e1c4d656d6265727301008c0400043901205468652063757272656e74206d656d62657273206f662074686520636f6c6c6563746976652e20546869732069732073746f72656420736f7274656420286a7573742062792076616c7565292e145072696d65000000040004650120546865207072696d65206d656d62657220746861742068656c70732064657465726d696e65207468652064656661756c7420766f7465206265686176696f7220696e2063617365206f6620616273656e746174696f6e732e01890301a4000129051f48546563686e6963616c436f6d6d69747465650148546563686e6963616c436f6d6d6974746565182450726f706f73616c7301002d05040004902054686520686173686573206f6620746865206163746976652070726f706f73616c732e2850726f706f73616c4f6600010406248503040004cc2041637475616c2070726f706f73616c20666f72206120676976656e20686173682c20696620697427732063757272656e742e18566f74696e6700010406242505040004b420566f746573206f6e206120676976656e2070726f706f73616c2c206966206974206973206f6e676f696e672e3450726f706f73616c436f756e7401001c100000000004482050726f706f73616c7320736f206661722e1c4d656d6265727301008c0400043901205468652063757272656e74206d656d62657273206f662074686520636f6c6c6563746976652e20546869732069732073746f72656420736f7274656420286a7573742062792076616c7565292e145072696d65000000040004650120546865207072696d65206d656d62657220746861742068656c70732064657465726d696e65207468652064656661756c7420766f7465206265686176696f7220696e2063617365206f6620616273656e746174696f6e732e018d0301ac00013105204c546563686e6963616c4d656d62657273686970014c546563686e6963616c4d656d62657273686970081c4d656d6265727301003505040004c8205468652063757272656e74206d656d626572736869702c2073746f72656420617320616e206f726465726564205665632e145072696d65000000040004a4205468652063757272656e74207072696d65206d656d6265722c206966206f6e65206578697374732e01910301b00001390522205472656173757279012054726561737572790c3450726f706f73616c436f756e7401001c100000000004a4204e756d626572206f662070726f706f73616c7320746861742068617665206265656e206d6164652e2450726f706f73616c73000104051c3d050400047c2050726f706f73616c7320746861742068617665206265656e206d6164652e24417070726f76616c7301004105040004f82050726f706f73616c20696e646963657320746861742068617665206265656e20617070726f76656420627574206e6f742079657420617761726465642e01950301b41c3050726f706f73616c426f6e6445051050c30000085501204672616374696f6e206f6620612070726f706f73616c27732076616c756520746861742073686f756c6420626520626f6e64656420696e206f7264657220746f20706c616365207468652070726f706f73616c2e110120416e2061636365707465642070726f706f73616c2067657473207468657365206261636b2e20412072656a65637465642070726f706f73616c20646f6573206e6f742e4c50726f706f73616c426f6e644d696e696d756d1840000082dfe40d47000000000000000000044901204d696e696d756d20616d6f756e74206f662066756e647320746861742073686f756c6420626520706c6163656420696e2061206465706f73697420666f72206d616b696e6720612070726f706f73616c2e4c50726f706f73616c426f6e644d6178696d756d49050400044901204d6178696d756d20616d6f756e74206f662066756e647320746861742073686f756c6420626520706c6163656420696e2061206465706f73697420666f72206d616b696e6720612070726f706f73616c2e2c5370656e64506572696f641020c0a8000000000000048820506572696f64206265747765656e2073756363657373697665207370656e64732e104275726e450510000000000411012050657263656e74616765206f662073706172652066756e64732028696620616e7929207468617420617265206275726e7420706572207370656e6420706572696f642e2050616c6c657449644d05206b696c742f7473790419012054686520747265617375727927732070616c6c65742069642c207573656420666f72206465726976696e672069747320736f7665726569676e206163636f756e742049442e304d6178417070726f76616c731c10640000000c150120546865206d6178696d756d206e756d626572206f6620617070726f76616c7320746861742063616e207761697420696e20746865207370656e64696e672071756575652e004d01204e4f54453a205468697320706172616d6574657220697320616c736f20757365642077697468696e2074686520426f756e746965732050616c6c657420657874656e73696f6e20696620656e61626c65642e015105233852656c61794d6967726174696f6e013852656c61794d6967726174696f6e047052656c61794e756d6265725374726963746c79496e637265617365730100a8040004010120537769746368206265747765656e2052656c61794e756d6265725374726963746c79496e6372656173657320616e6420416e7952656c61794e756d6265722e01990301b800015505242444796e46696c746572012444796e46696c746572041846696c7465720100c00c00000000019d0301bc00015905251c5574696c6974790001a10301c4044c626174636865645f63616c6c735f6c696d69741c10aa2a000004a820546865206c696d6974206f6e20746865206e756d626572206f6620626174636865642063616c6c732e015d05281c56657374696e67011c56657374696e67081c56657374696e6700010402006105040004d820496e666f726d6174696f6e20726567617264696e67207468652076657374696e67206f66206120676976656e206163636f756e742e3853746f7261676556657273696f6e0100690504000c7c2053746f726167652076657273696f6e206f66207468652070616c6c65742e003101204e6577206e6574776f726b732073746172742077697468206c61746573742076657273696f6e2c2061732064657465726d696e6564206279207468652067656e65736973206275696c642e01c90301c808444d696e5665737465645472616e73666572184000407a10f35a0000000000000000000004e820546865206d696e696d756d20616d6f756e74207472616e7366657272656420746f2063616c6c20607665737465645f7472616e73666572602e4c4d617856657374696e675363686564756c65731c101c00000000016d0529245363686564756c657201245363686564756c657208184167656e6461010104051071050400044d01204974656d7320746f2062652065786563757465642c20696e64657865642062792074686520626c6f636b206e756d626572207468617420746865792073686f756c64206265206578656375746564206f6e2e184c6f6f6b75700001040528d00400040101204c6f6f6b75702066726f6d206964656e7469747920746f2074686520626c6f636b206e756d62657220616e6420696e646578206f6620746865207461736b2e01d10301cc08344d6178696d756d576569676874102000a0db215d00000008450120546865206d6178696d756d207765696768742074686174206d6179206265207363686564756c65642070657220626c6f636b20666f7220616e7920646973706174636861626c6573206f66206c657373a4207072696f72697479207468616e20607363686564756c653a3a484152445f444541444c494e45602e504d61785363686564756c6564506572426c6f636b1c1032000000081d0120546865206d6178696d756d206e756d626572206f66207363686564756c65642063616c6c7320696e2074686520717565756520666f7220612073696e676c6520626c6f636b2edc204e6f74207374726963746c7920656e666f726365642c20627574207573656420666f722077656967687420657374696d6174696f6e2e017d052a1450726f7879011450726f7879081c50726f78696573010104050081054400000000000000000000000000000000000845012054686520736574206f66206163636f756e742070726f786965732e204d61707320746865206163636f756e74207768696368206861732064656c65676174656420746f20746865206163636f756e7473210120776869636820617265206265696e672064656c65676174656420746f2c20746f67657468657220776974682074686520616d6f756e742068656c64206f6e206465706f7369742e34416e6e6f756e63656d656e74730101040500910544000000000000000000000000000000000004ac2054686520616e6e6f756e63656d656e7473206d616465206279207468652070726f787920286b6579292e01dd0301dc184050726f78794465706f7369744261736518400020f7a54b330000000000000000000010110120546865206261736520616d6f756e74206f662063757272656e6379206e656564656420746f207265736572766520666f72206372656174696e6720612070726f78792e00010120546869732069732068656c6420666f7220616e206164646974696f6e616c2073746f72616765206974656d2077686f73652076616c75652073697a652069732501206073697a656f662842616c616e6365296020627974657320616e642077686f7365206b65792073697a65206973206073697a656f66284163636f756e74496429602062797465732e4850726f78794465706f736974466163746f72184000f4a92b80010000000000000000000014bc2054686520616d6f756e74206f662063757272656e6379206e6565646564207065722070726f78792061646465642e00350120546869732069732068656c6420666f7220616464696e6720333220627974657320706c757320616e20696e7374616e6365206f66206050726f78795479706560206d6f726520696e746f20616101207072652d6578697374696e672073746f726167652076616c75652e20546875732c207768656e20636f6e6669677572696e67206050726f78794465706f736974466163746f7260206f6e652073686f756c642074616b65f420696e746f206163636f756e7420603332202b2070726f78795f747970652e656e636f646528292e6c656e282960206279746573206f6620646174612e284d617850726f786965731c100a00000004f020546865206d6178696d756d20616d6f756e74206f662070726f7869657320616c6c6f77656420666f7220612073696e676c65206163636f756e742e284d617850656e64696e671c100a00000004450120546865206d6178696d756d20616d6f756e74206f662074696d652d64656c6179656420616e6e6f756e63656d656e747320746861742061726520616c6c6f77656420746f2062652070656e64696e672e5c416e6e6f756e63656d656e744465706f7369744261736518400020f7a54b330000000000000000000010310120546865206261736520616d6f756e74206f662063757272656e6379206e656564656420746f207265736572766520666f72206372656174696e6720616e20616e6e6f756e63656d656e742e00490120546869732069732068656c64207768656e2061206e65772073746f72616765206974656d20686f6c64696e672061206042616c616e636560206973206372656174656420287479706963616c6c7920313620206279746573292e64416e6e6f756e63656d656e744465706f736974466163746f72184000e8535700030000000000000000000010d42054686520616d6f756e74206f662063757272656e6379206e65656465642070657220616e6e6f756e63656d656e74206d6164652e00590120546869732069732068656c6420666f7220616464696e6720616e20604163636f756e744964602c2060486173686020616e642060426c6f636b4e756d6265726020287479706963616c6c79203638206279746573298c20696e746f2061207072652d6578697374696e672073746f726167652076616c75652e01a1052b20507265696d6167650120507265696d6167650824537461747573466f720001040624a5050400049020546865207265717565737420737461747573206f66206120676976656e20686173682e2c507265696d616765466f720001040624b105040004942054686520707265696d616765732073746f72656420627920746869732070616c6c65742e01e50301e80001b5052c38546970734d656d626572736869700138546970734d656d62657273686970081c4d656d6265727301003505040004c8205468652063757272656e74206d656d626572736869702c2073746f72656420617320616e206f726465726564205665632e145072696d65000000040004a4205468652063757272656e74207072696d65206d656d6265722c206966206f6e65206578697374732e01e90301ec0001b9052d10546970730110546970730810546970730001040524bd0504000c650120546970734d6170207468617420617265206e6f742079657420636f6d706c657465642e204b65796564206279207468652068617368206f66206028726561736f6e2c2077686f29602066726f6d207468652076616c75652e3d012054686973206861732074686520696e73656375726520656e756d657261626c6520686173682066756e6374696f6e2073696e636520746865206b657920697473656c6620697320616c7265616479802067756172616e7465656420746f20626520612073656375726520686173682e1c526561736f6e7300010406242804000849012053696d706c6520707265696d616765206c6f6f6b75702066726f6d2074686520726561736f6e2773206861736820746f20746865206f726967696e616c20646174612e20416761696e2c2068617320616e610120696e73656375726520656e756d657261626c6520686173682073696e636520746865206b65792069732067756172616e7465656420746f2062652074686520726573756c74206f6620612073656375726520686173682e01ed0301f0144c4d6178696d756d526561736f6e4c656e6774681c10004000000c88204d6178696d756d2061636365707461626c6520726561736f6e206c656e6774682e0065012042656e63686d61726b7320646570656e64206f6e20746869732076616c75652c206265207375726520746f2075706461746520776569676874732066696c65207768656e206368616e67696e6720746869732076616c756548446174614465706f73697450657242797465184000743ba40b00000000000000000000000461012054686520616d6f756e742068656c64206f6e206465706f7369742070657220627974652077697468696e2074686520746970207265706f727420726561736f6e206f7220626f756e7479206465736372697074696f6e2e30546970436f756e74646f776e1020201c0000000000000445012054686520706572696f6420666f722077686963682061207469702072656d61696e73206f70656e20616674657220697320686173206163686965766564207468726573686f6c6420746970706572732e3454697046696e64657273466565c5050414043501205468652070657263656e74206f66207468652066696e616c2074697020776869636820676f657320746f20746865206f726967696e616c207265706f72746572206f6620746865207469702e505469705265706f72744465706f73697442617365184000f45628fa320000000000000000000004d42054686520616d6f756e742068656c64206f6e206465706f73697420666f7220706c6163696e67206120746970207265706f72742e01c9052e14437479706501144374797065041843747970657300010402240004000c60204354797065732073746f726564206f6e20636861696e2e00a8204974206d6170732066726f6d2061204354797065206861736820746f206974732063726561746f722e01f10301f40001cd053d2c4174746573746174696f6e012c4174746573746174696f6e08304174746573746174696f6e730001040224d10504000c78204174746573746174696f6e732073746f726564206f6e20636861696e2e00cc204974206d6170732066726f6d206120636c61696d206861736820746f207468652066756c6c206174746573746174696f6e2e5045787465726e616c4174746573746174696f6e730101080502d905a804000ca02044656c656761746564206174746573746174696f6e732073746f726564206f6e20636861696e2e00e8204974206d6170732066726f6d20612064656c65676174696f6e20494420746f206120766563746f72206f6620636c61696d206861736865732e01f50301f8081c4465706f7369741840001cc9dd006e0000000000000000000004e420546865206465706f736974207468617420697320726571756972656420666f722073746f72696e6720616e206174746573746174696f6e2e604d617844656c6567617465644174746573746174696f6e731c10e803000008090120546865206d6178696d756d206e756d626572206f662064656c656761746564206174746573746174696f6e732077686963682063616e206265206d61646520627954207468652073616d652064656c65676174696f6e2e01dd053e2844656c65676174696f6e012844656c65676174696f6e083c44656c65676174696f6e4e6f6465730001040224e10504000c882044656c65676174696f6e206e6f6465732073746f726564206f6e20636861696e2e00b0204974206d6170732066726f6d2061206e6f646520494420746f20746865206e6f64652064657461696c732e5444656c65676174696f6e48696572617263686965730001040224f10504000ca02044656c65676174696f6e2068696572617263686965732073746f726564206f6e20636861696e2e00dc204974206d61707320666f7220612028726f6f7429206e6f646520494420746f20746865206869657261726368792064657461696c732e010904010501181c4465706f73697418400080c6a47e8d0300000000000000000004dc20546865206465706f736974207468617420697320726571756972656420666f722073746f72696e6720612064656c65676174696f6e2e584d61785369676e6174757265427974654c656e677468e408400000384d61785265766f636174696f6e731c1005000000047c204d6178696d756d206e756d626572206f66207265766f636174696f6e732e2c4d617852656d6f76616c731c100500000004f4204d6178696d756d206e756d626572206f662072656d6f76616c732e2053686f756c642062652073616d65206173204d61785265766f636174696f6e733c4d6178506172656e74436865636b731c1005000000080d01204d6178696d756d206e756d626572206f6620757077617264732074726176657273616c73206f66207468652064656c65676174696f6e20747265652066726f6d2061f0206e6f646520746f2074686520726f6f7420616e64207468757320746865206465707468206f66207468652064656c65676174696f6e20747265652e2c4d61784368696c6472656e1c10e80300000c0d01204d6178696d756d206e756d626572206f6620616c6c206368696c6472656e20666f7220612064656c65676174696f6e206e6f64652e20466f7220612062696e617279fc20747265652c20746869732073686f756c6420626520747769636520746865206d6178696d756d206465707468206f662074686520747265652c20692e652e5c206032205e204d6178506172656e74436865636b73602e01f5053f0c446964010c446964100c4469640001040200f90504000c5820444944732073746f726564206f6e20636861696e2e00c8204974206d6170732066726f6d206120444944206964656e74696669657220746f20746865204449442064657461696c732e4053657276696365456e64706f696e747300010805021906550404000ca0205365727669636520656e64706f696e7473206173736f636961746564207769746820444944732e000901204974206d6170732066726f6d2028444944206964656e7469666965722c20736572766963652049442920746f2074686520736572766963652064657461696c732e44446964456e64706f696e7473436f756e7401010402001c10000000000cac20436f756e746572206f66207365727669636520656e64706f696e747320666f722065616368204449442e00cc204974206d6170732066726f6d2028444944206964656e7469666965722920746f20612033322d62697420636f756e7465722e30446964426c61636b6c6973740001040200980400141d012054686520736574206f66204449447320746861742068617665206265656e2064656c6574656420616e642063616e6e6f74207468657265666f726520626520637265617465647020616761696e20666f7220736563757269747920726561736f6e732e002101204974206d6170732066726f6d206120444944206964656e74696669657220746f206120756e6974207475706c652c20666f72207468652073616b65206f6620747261636b696e674420444944206964656e746966696572732e012504010d01301c4465706f736974184000983ea62c22070000000000000000000c0d012054686520616d6f756e74206f662062616c616e636520746861742077696c6c2062652074616b656e20666f722065616368204449442061732061206465706f736974110120746f20696e63656e746976697365206661697220757365206f6620746865206f6e20636861696e2073746f726167652e20546865206465706f7369742063616e2062658c207265636c61696d6564207768656e20746865204449442069732064656c657465642e0c466565184000203d88792d000000000000000000000c09012054686520616d6f756e74206f662062616c616e636520746861742077696c6c2062652074616b656e20666f7220656163682044494420617320612066656520746f0d0120696e63656e746976697365206661697220757365206f6620746865206f6e20636861696e2073746f726167652e20546865206665652077696c6c206e6f74206765748820726566756e646564207768656e20746865204449442069732064656c657465642e4c4d61785075626c69634b6579735065724469641c10140000000c1101204d6178696d756d206e756d626572206f6620746f74616c207075626c6963206b6579732077686963682063616e2062652073746f7265642070657220444944206b6579d8206964656e7469666965722e205468697320696e636c7564657320746865206f6e65732063757272656e746c79207573656420666f72f02061757468656e7469636174696f6e2c206b65792061677265656d656e742c206174746573746174696f6e2c20616e642064656c65676174696f6e2e584d61784e65774b657941677265656d656e744b6579731c100a000000081501204d6178696d756d206e756d626572206f66206b65792061677265656d656e74206b65797320746861742063616e20626520616464656420696e2061206372656174696f6e2c206f7065726174696f6e2e604d6178546f74616c4b657941677265656d656e744b6579731c1013000000101101204d6178696d756d206e756d626572206f6620746f74616c206b65792061677265656d656e74206b65797320746861742063616e2062652073746f72656420666f7220613420444944207375626a6563742e00c42053686f756c642062652067726561746572207468616e20604d61784e65774b657941677265656d656e744b657973602e4c4d6178426c6f636b73547856616c696469747910202c0100000000000008ec20546865206d6178696d756d206e756d626572206f6620626c6f636b732061204449442d617574686f72697a6564206f7065726174696f6e2069739420636f6e736964657265642076616c696420616674657220697473206372656174696f6e2e644d61784e756d6265724f6653657276696365735065724469641c101900000004fc20546865206d6178696d756d206e756d626572206f6620736572766963657320746861742063616e2062652073746f72656420756e6465722061204449442e484d61785365727669636549644c656e6774681c1032000000049020546865206d6178696d756d206c656e677468206f66206120736572766963652049442e504d617853657276696365547970654c656e6774681c103200000004c820546865206d6178696d756d206c656e677468206f66206120736572766963652074797065206465736372697074696f6e2e684d61784e756d6265724f665479706573506572536572766963651c100100000004090120546865206d6178696d756d206e756d626572206f662061207479706573206465736372697074696f6e20666f722061207365727669636520656e64706f696e742e4c4d61785365727669636555726c4c656e6774681c10c8000000049420546865206d6178696d756d206c656e677468206f66206120736572766963652055524c2e644d61784e756d6265724f6655726c73506572536572766963651c100100000004d420546865206d6178696d756d206e756d626572206f6620612055524c7320666f722061207365727669636520656e64706f696e742e011d064024496e666c6174696f6e000000084c496e697469616c506572696f644c656e677468102048a3c800000000000c050120546865206c656e677468206f662074686520696e697469616c20706572696f6420696e2077686963682074686520636f6e7374616e74207265776172642069731101206d696e7465642e204f6e6365207468652063757272656e7420626c6f636b206578636565647320746869732c207265776172647320617265206e6f206675727468657220206973737565642e4c496e697469616c506572696f64526577617264184036f539fdaeb30200000000000000000008fc2054686520616d6f756e74206f66206e65776c792069737375656420746f6b656e732070657220626c6f636b20647572696e672074686520696e697469616c2020706572696f642e0042244469644c6f6f6b757001244469644c6f6f6b75700834436f6e6e65637465644469647300010402002106040004a8204d617070696e672066726f6d206163636f756e74206964656e7469666965727320746f20444944732e44436f6e6e65637465644163636f756e7473000108020225069804000cbc204d617070696e672066726f6d2028444944202b206163636f756e74206964656e74696669657229202d3e2028292e0d012054686520656d707479207475706c65206973207573656420617320612073656e74696e656c2076616c756520746f2073696d706c7920696e64696361746520746865982070726573656e6365206f66206120676976656e207475706c6520696e20746865206d61702e017904011101041c4465706f736974184000c0afd69136000000000000000000000c0d012054686520616d6f756e74206f662062616c616e636520746861742077696c6c2062652074616b656e20666f722065616368204449442061732061206465706f736974110120746f20696e63656e746976697365206661697220757365206f6620746865206f6e20636861696e2073746f726167652e20546865206465706f7369742063616e2062658c207265636c61696d6564207768656e20746865204449442069732064656c657465642e0129064324576562334e616d65730124576562334e616d65730c144f776e65720001040219012d0604000488204d6170206f66206e616d65202d3e206f776e6572736869702064657461696c732e144e616d65730001040200190104000458204d6170206f66206f776e6572202d3e206e616d652e1842616e6e65640001040219019804000c4c204d6170206f66206e616d65202d3e2028292e00e02049662061206e616d65206b65792069732070726573656e742c20746865206e616d652069732063757272656e746c792062616e6e65642e0181040115010c1c4465706f736974184000d450a85d6b0000000000000000000004bc2054686520616d6f756e74206f66204b494c5420746f206465706f73697420746f20636c61696d2061206e616d652e344d696e4e616d654c656e6774681c1003000000048820546865206d696e20656e636f646564206c656e677468206f662061206e616d652e344d61784e616d654c656e6774681c1020000000048820546865206d617820656e636f646564206c656e677468206f662061206e616d652e013106443c50617261636861696e53797374656d013c50617261636861696e53797374656d545450656e64696e6756616c69646174696f6e436f64650100280400187d0120496e2063617365206f662061207363686564756c656420757067726164652c20746869732073746f72616765206669656c6420636f6e7461696e73207468652076616c69646174696f6e20636f646520746f206265206170706c6965642e00c10120417320736f6f6e206173207468652072656c617920636861696e2067697665732075732074686520676f2d6168656164207369676e616c2c2077652077696c6c206f766572777269746520746865205b603a636f6465605d5b77656c6c5f6b6e6f776e5f6b6579733a3a434f44455dad012077686963682077696c6c20726573756c7420746865206e65787420626c6f636b2070726f63657373207769746820746865206e65772076616c69646174696f6e20636f64652e205468697320636f6e636c756465732074686520757067726164652070726f636573732e000501205b77656c6c5f6b6e6f776e5f6b6579733a3a434f44455d3a2073705f636f72653a3a73746f726167653a3a77656c6c5f6b6e6f776e5f6b6579733a3a434f4445444e657756616c69646174696f6e436f64650000280400145d012056616c69646174696f6e20636f6465207468617420697320736574206279207468652070617261636861696e20616e6420697320746f20626520636f6d6d756e69636174656420746f20636f6c6c61746f7220616e647820636f6e73657175656e746c79207468652072656c61792d636861696e2e00650120546869732077696c6c20626520636c656172656420696e20606f6e5f696e697469616c697a6560206f662065616368206e657720626c6f636b206966206e6f206f746865722070616c6c657420616c7265616479207365742c207468652076616c75652e3856616c69646174696f6e4461746100008d0404000cd020546865205b6050657273697374656456616c69646174696f6e44617461605d2073657420666f72207468697320626c6f636b2e2d0120546869732076616c756520697320657870656374656420746f20626520736574206f6e6c79206f6e63652070657220626c6f636b20616e642069742773206e657665722073746f7265643420696e2074686520747269652e5044696453657456616c69646174696f6e436f64650100a8040004e02057657265207468652076616c69646174696f6e20646174612073657420746f206e6f74696679207468652072656c617920636861696e3f644c61737452656c6179436861696e426c6f636b4e756d62657201001c1000000000041d01205468652072656c617920636861696e20626c6f636b206e756d626572206173736f636961746564207769746820746865206c6173742070617261636861696e20626c6f636b2e60557067726164655265737472696374696f6e5369676e616c0100350604001c750120416e206f7074696f6e20776869636820696e64696361746573206966207468652072656c61792d636861696e20726573747269637473207369676e616c6c696e6720612076616c69646174696f6e20636f646520757067726164652e610120496e206f7468657220776f7264732c20696620746869732069732060536f6d656020616e64205b604e657756616c69646174696f6e436f6465605d2069732060536f6d6560207468656e207468652070726f64756365646c2063616e6469646174652077696c6c20626520696e76616c69642e00710120546869732073746f72616765206974656d2069732061206d6972726f72206f662074686520636f72726573706f6e64696e672076616c756520666f72207468652063757272656e742070617261636861696e2066726f6d207468656d012072656c61792d636861696e2e20546869732076616c756520697320657068656d6572616c207768696368206d65616e7320697420646f65736e277420686974207468652073746f726167652e20546869732076616c756520697360207365742061667465722074686520696e686572656e742e3c52656c6179537461746550726f6f6600009504040018c4205468652073746174652070726f6f6620666f7220746865206c6173742072656c617920706172656e7420626c6f636b2e006d012054686973206669656c64206973206d65616e7420746f2062652075706461746564206561636820626c6f636b2077697468207468652076616c69646174696f6e206461746120696e686572656e742e205468657265666f72652c4d01206265666f72652070726f63657373696e67206f662074686520696e686572656e742c20652e672e20696e20606f6e5f696e697469616c697a656020746869732064617461206d6179206265207374616c652e00ac2054686973206461746120697320616c736f20616273656e742066726f6d207468652067656e657369732e5852656c6576616e744d6573736167696e67537461746500003d0604001c65012054686520736e617073686f74206f6620736f6d652073746174652072656c6174656420746f206d6573736167696e672072656c6576616e7420746f207468652063757272656e742070617261636861696e2061732070657248207468652072656c617920706172656e742e006d012054686973206669656c64206973206d65616e7420746f2062652075706461746564206561636820626c6f636b2077697468207468652076616c69646174696f6e206461746120696e686572656e742e205468657265666f72652c4d01206265666f72652070726f63657373696e67206f662074686520696e686572656e742c20652e672e20696e20606f6e5f696e697469616c697a656020746869732064617461206d6179206265207374616c652e00ac2054686973206461746120697320616c736f20616273656e742066726f6d207468652067656e657369732e44486f7374436f6e66696775726174696f6e000051060400182901205468652070617261636861696e20686f737420636f6e66696775726174696f6e207468617420776173206f627461696e65642066726f6d207468652072656c617920706172656e742e006d012054686973206669656c64206973206d65616e7420746f2062652075706461746564206561636820626c6f636b2077697468207468652076616c69646174696f6e206461746120696e686572656e742e205468657265666f72652c4d01206265666f72652070726f63657373696e67206f662074686520696e686572656e742c20652e672e20696e20606f6e5f696e697469616c697a656020746869732064617461206d6179206265207374616c652e00ac2054686973206461746120697320616c736f20616273656e742066726f6d207468652067656e657369732e384c617374446d714d7163486561640100550680000000000000000000000000000000000000000000000000000000000000000010f420546865206c61737420646f776e77617264206d65737361676520717565756520636861696e20686561642077652068617665206f627365727665642e00650120546869732076616c7565206973206c6f61646564206265666f726520616e642073617665642061667465722070726f63657373696e6720696e626f756e6420646f776e77617264206d65737361676573206361727269656460206279207468652073797374656d20696e686572656e742e404c61737448726d704d7163486561647301005906040010490120546865206d65737361676520717565756520636861696e2068656164732077652068617665206f62736572766564207065722065616368206368616e6e656c20696e636f6d696e67206368616e6e656c2e00650120546869732076616c7565206973206c6f61646564206265666f726520616e642073617665642061667465722070726f63657373696e6720696e626f756e6420646f776e77617264206d65737361676573206361727269656460206279207468652073797374656d20696e686572656e742e6450726f636573736564446f776e776172644d6573736167657301001c10000000000cc8204e756d626572206f6620646f776e77617264206d657373616765732070726f63657373656420696e206120626c6f636b2e00ec20546869732077696c6c20626520636c656172656420696e20606f6e5f696e697469616c697a6560206f662065616368206e657720626c6f636b2e3448726d7057617465726d61726b01001c10000000000ca02048524d502077617465726d61726b2074686174207761732073657420696e206120626c6f636b2e00ec20546869732077696c6c20626520636c656172656420696e20606f6e5f696e697469616c697a6560206f662065616368206e657720626c6f636b2e5048726d704f7574626f756e644d657373616765730100650604000ca42048524d50206d65737361676573207468617420776572652073656e7420696e206120626c6f636b2e00ec20546869732077696c6c20626520636c656172656420696e20606f6e5f696e697469616c697a6560206f662065616368206e657720626c6f636b2e385570776172644d657373616765730100010204000cac20557077617264206d65737361676573207468617420776572652073656e7420696e206120626c6f636b2e00ec20546869732077696c6c20626520636c656172656420696e20606f6e5f696e697469616c697a6560206f662065616368206e657720626c6f636b2e5450656e64696e675570776172644d6573736167657301000102040004310120557077617264206d65737361676573207468617420617265207374696c6c2070656e64696e6720616e64206e6f74207965742073656e6420746f207468652072656c617920636861696e2e84416e6e6f756e63656448726d704d6573736167657350657243616e64696461746501001c100000000008650120546865206e756d626572206f662048524d50206d65737361676573207765206f6273657276656420696e20606f6e5f696e697469616c697a656020616e64207468757320757365642074686174206e756d62657220666f72f020616e6e6f756e63696e672074686520776569676874206f6620606f6e5f696e697469616c697a656020616e6420606f6e5f66696e616c697a65602e68526573657276656458636d705765696768744f766572726964650000100400085d01205468652077656967687420776520726573657276652061742074686520626567696e6e696e67206f662074686520626c6f636b20666f722070726f63657373696e672058434d50206d657373616765732e2054686973b8206f76657272696465732074686520616d6f756e742073657420696e2074686520436f6e6669672074726169742e645265736572766564446d705765696768744f766572726964650000100400085901205468652077656967687420776520726573657276652061742074686520626567696e6e696e67206f662074686520626c6f636b20666f722070726f63657373696e6720444d50206d657373616765732e2054686973b8206f76657272696465732074686520616d6f756e742073657420696e2074686520436f6e6669672074726169742e44417574686f72697a656455706772616465000024040004b820546865206e65787420617574686f72697a656420757067726164652c206966207468657265206973206f6e652e60437573746f6d56616c69646174696f6e486561644461746100002804000c2901204120637573746f6d2068656164206461746120746861742073686f756c642062652072657475726e656420617320726573756c74206f66206076616c69646174655f626c6f636b602e00190120536565205b6050616c6c65743a3a7365745f637573746f6d5f76616c69646174696f6e5f686561645f64617461605d20666f72206d6f726520696e666f726d6174696f6e2e01850401210100016d06503450617261636861696e496e666f013450617261636861696e496e666f042c50617261636861696e49640100310110640000000000000000512458636d705175657565012458636d7051756575652444496e626f756e6458636d70537461747573010071060400049420537461747573206f662074686520696e626f756e642058434d50206368616e6e656c732e4c496e626f756e6458636d704d657373616765730101080205890628040004190120496e626f756e64206167677265676174652058434d50206d657373616765732e2049742063616e206f6e6c79206265206f6e6520706572205061726149642f626c6f636b2e484f7574626f756e6458636d7053746174757301008d060400185d0120546865206e6f6e2d656d7074792058434d50206368616e6e656c7320696e206f72646572206f66206265636f6d696e67206e6f6e2d656d7074792c20616e642074686520696e646578206f6620746865206669727374510120616e64206c617374206f7574626f756e64206d6573736167652e204966207468652074776f20696e64696365732061726520657175616c2c207468656e20697420696e6469636174657320616e20656d707479590120717565756520616e64207468657265206d7573742062652061206e6f6e2d604f6b6020604f7574626f756e64537461747573602e20576520617373756d65207175657565732067726f77206e6f20677265617465725901207468616e203635353335206974656d732e20517565756520696e646963657320666f72206e6f726d616c206d6573736167657320626567696e206174206f6e653b207a65726f20697320726573657276656420696e11012063617365206f6620746865206e65656420746f2073656e64206120686967682d7072696f72697479207369676e616c206d657373616765207468697320626c6f636b2e09012054686520626f6f6c20697320747275652069662074686572652069732061207369676e616c206d6573736167652077616974696e6720746f2062652073656e742e504f7574626f756e6458636d704d657373616765730101080205990628040004bc20546865206d65737361676573206f7574626f756e6420696e206120676976656e2058434d50206368616e6e656c2e385369676e616c4d6573736167657301010402310128040004a020416e79207369676e616c206d657373616765732077616974696e6720746f2062652073656e742e2c5175657565436f6e66696701009d0690020000000500000001000000a086010000000000020000000000000000c817a8040000000415012054686520636f6e66696775726174696f6e20776869636820636f6e74726f6c73207468652064796e616d696373206f6620746865206f7574626f756e642071756575652e284f7665727765696768740001040510a106040010050120546865206d657373616765732074686174206578636565646564206d617820696e646976696475616c206d65737361676520776569676874206275646765742e003901205468657365206d657373616765207374617920696e20746869732073746f72616765206d617020756e74696c207468657920617265206d616e75616c6c79206469737061746368656420766961582060736572766963655f6f766572776569676874602e3c4f766572776569676874436f756e7401001020000000000000000008690120546865206e756d626572206f66206f766572776569676874206d657373616765732065766572207265636f7264656420696e20604f766572776569676874602e20416c736f20646f75626c657320617320746865206e6578748420617661696c61626c652066726565206f76657277656967687420696e6465782e38517565756553757370656e6465640100a804000441012057686574686572206f72206e6f74207468652058434d502071756575652069732073757370656e6465642066726f6d20657865637574696e6720696e636f6d696e672058434d73206f72206e6f742e01b9040125010001a506522c506f6c6b61646f7458636d0001bd040135010001a906532843756d756c757358636d000001d5010001ad065420446d7051756575650120446d7051756575651034436f6e66696775726174696f6e0100b1062000e40b5402000000044c2054686520636f6e66696775726174696f6e2e2450616765496e6465780100b5064000000000000000000000000000000000044020546865207061676520696e6465782e145061676573010104021cb90604000444205468652071756575652070616765732e284f7665727765696768740001040210bd060400046420546865206f766572776569676874206d657373616765732e01210501d9010001c10655c506042048436865636b4e6f6e5a65726f53656e646572cd069840436865636b5370656356657273696f6ed1061c38436865636b547856657273696f6ed5061c30436865636b47656e65736973d9062438436865636b4d6f7274616c697479dd062428436865636b4e6f6e6365e506982c436865636b576569676874e90698604368617267655472616e73616374696f6e5061796d656e74ed06980504"} \ No newline at end of file diff --git a/packages/augment-api/package.json b/packages/augment-api/package.json index 6eacebb30..beab65ded 100644 --- a/packages/augment-api/package.json +++ b/packages/augment-api/package.json @@ -36,8 +36,8 @@ "bugs": "https://github.com/KILTprotocol/sdk-js/issues", "homepage": "https://github.com/KILTprotocol/sdk-js#readme", "devDependencies": { - "@polkadot/api": "^9.0.0", - "@polkadot/typegen": "^9.0.0", + "@polkadot/api": "^9.4.1", + "@polkadot/typegen": "^9.4.1", "@types/websocket": "^1.0.0", "glob": "^7.1.1", "rimraf": "^3.0.2", @@ -45,5 +45,8 @@ "typescript": "^4.8.3", "websocket": "^1.0.31", "yargs": "^16.2.0" + }, + "dependencies": { + "@kiltprotocol/type-definitions": "^0.2.0" } } diff --git a/packages/augment-api/src/index.ts b/packages/augment-api/src/index.ts index 0aefa5f4a..44308cd34 100644 --- a/packages/augment-api/src/index.ts +++ b/packages/augment-api/src/index.ts @@ -5,11 +5,9 @@ * found in the LICENSE file in the root directory of this source tree. */ -import './interfaces/augment-api-consts.js' -import './interfaces/augment-api-query.js' -import './interfaces/augment-api-rpc.js' -import './interfaces/augment-api-tx.js' +import './interfaces/augment-api.js' import './interfaces/augment-types.js' +import './interfaces/registry.js' import './interfaces/types-lookup.js' export * from './types.js' diff --git a/packages/augment-api/src/interfaces/augment-api-errors.ts b/packages/augment-api/src/interfaces/augment-api-errors.ts index 37c254b79..f54fae308 100644 --- a/packages/augment-api/src/interfaces/augment-api-errors.ts +++ b/packages/augment-api/src/interfaces/augment-api-errors.ts @@ -369,6 +369,10 @@ declare module '@polkadot/api-base/types/errors' { * these are removed, either through `unvote` or `reap_vote`. **/ VotesExist: AugmentedError; + /** + * Voting period too low + **/ + VotingPeriodLow: AugmentedError; /** * Invalid upper bound. **/ @@ -525,6 +529,8 @@ declare module '@polkadot/api-base/types/errors' { **/ Unknown: AugmentedError; }; + dynFilter: { + }; indices: { /** * The index was not available. @@ -848,6 +854,8 @@ declare module '@polkadot/api-base/types/errors' { **/ Unproxyable: AugmentedError; }; + relayMigration: { + }; scheduler: { /** * Failed to schedule a call @@ -969,6 +977,10 @@ declare module '@polkadot/api-base/types/errors' { * Not a member. **/ NotMember: AugmentedError; + /** + * Too many members. + **/ + TooManyMembers: AugmentedError; }; tips: { /** @@ -1005,8 +1017,17 @@ declare module '@polkadot/api-base/types/errors' { * Not a member. **/ NotMember: AugmentedError; + /** + * Too many members. + **/ + TooManyMembers: AugmentedError; }; treasury: { + /** + * The spend origin is valid but the amount it is allowed to spend is lower than the + * amount to be spent. + **/ + InsufficientPermission: AugmentedError; /** * Proposer's balance is too low. **/ diff --git a/packages/augment-api/src/interfaces/augment-api-events.ts b/packages/augment-api/src/interfaces/augment-api-events.ts index e618bb77e..8356fb644 100644 --- a/packages/augment-api/src/interfaces/augment-api-events.ts +++ b/packages/augment-api/src/interfaces/augment-api-events.ts @@ -9,7 +9,7 @@ import type { ApiTypes, AugmentedEvent } from '@polkadot/api-base/types'; import type { Bytes, Null, Option, Result, U8aFixed, Vec, bool, u128, u16, u32, u64, u8 } from '@polkadot/types-codec'; import type { ITuple } from '@polkadot/types-codec/types'; import type { AccountId32, H256, Perquintill } from '@polkadot/types/interfaces/runtime'; -import type { DelegationDelegationHierarchyPermissions, FrameSupportScheduleLookupError, FrameSupportTokensMiscBalanceStatus, FrameSupportWeightsDispatchInfo, PalletDemocracyVoteAccountVote, PalletDemocracyVoteThreshold, RuntimeCommonAuthorizationAuthorizationId, SpRuntimeDispatchError, SpiritnetRuntimeProxyType, XcmV1MultiLocation, XcmV2Response, XcmV2TraitsError, XcmV2TraitsOutcome, XcmV2Xcm, XcmVersionedMultiAssets, XcmVersionedMultiLocation } from '@polkadot/types/lookup'; +import type { DelegationDelegationHierarchyPermissions, FrameSupportScheduleLookupError, FrameSupportTokensMiscBalanceStatus, FrameSupportWeightsDispatchInfo, PalletDemocracyVoteAccountVote, PalletDemocracyVoteThreshold, PalletDynFilterSettingFilterSettings, RuntimeCommonAuthorizationAuthorizationId, SpRuntimeDispatchError, SpiritnetRuntimeProxyType, XcmV1MultiLocation, XcmV2Response, XcmV2TraitsError, XcmV2TraitsOutcome, XcmV2Xcm, XcmVersionedMultiAssets, XcmVersionedMultiLocation } from '@polkadot/types/lookup'; export type __AugmentedEvent = AugmentedEvent; @@ -224,6 +224,10 @@ declare module '@polkadot/api-base/types/events' { * A proposal preimage was removed and used (the deposit was returned). **/ PreimageUsed: AugmentedEvent; + /** + * A proposal got canceled. + **/ + ProposalCanceled: AugmentedEvent; /** * A motion has been proposed by a public account. **/ @@ -311,6 +315,9 @@ declare module '@polkadot/api-base/types/events' { **/ WeightExhausted: AugmentedEvent; }; + dynFilter: { + NewFilterRules: AugmentedEvent; + }; indices: { /** * A account index was assigned. @@ -626,6 +633,16 @@ declare module '@polkadot/api-base/types/events' { **/ ProxyRemoved: AugmentedEvent; }; + relayMigration: { + /** + * The parachain lease swap was initiated. + **/ + LeaseSwapInitiated: AugmentedEvent; + /** + * The requirement for associated relay block numbers was set + **/ + RelayNumberCheckSet: AugmentedEvent; + }; scheduler: { /** * The call for the provided hash was not found so the task has been aborted. @@ -783,6 +800,13 @@ declare module '@polkadot/api-base/types/events' { **/ MembersSwapped: AugmentedEvent; }; + transactionPayment: { + /** + * A transaction fee `actual_fee`, of which `tip` was added to the minimum inclusion fee, + * has been paid by `who`. + **/ + TransactionFeePaid: AugmentedEvent; + }; treasury: { /** * Some funds have been allocated. @@ -808,6 +832,10 @@ declare module '@polkadot/api-base/types/events' { * Spending has finished; this is the amount that rolls over until next spend. **/ Rollover: AugmentedEvent; + /** + * A new spend proposal has been approved. + **/ + SpendApproved: AugmentedEvent; /** * We have ended a spend period and will now allocate funds. **/ @@ -873,35 +901,35 @@ declare module '@polkadot/api-base/types/events' { /** * Bad XCM format used. **/ - BadFormat: AugmentedEvent]>; + BadFormat: AugmentedEvent], { messageHash: Option }>; /** * Bad XCM version used. **/ - BadVersion: AugmentedEvent]>; + BadVersion: AugmentedEvent], { messageHash: Option }>; /** * Some XCM failed. **/ - Fail: AugmentedEvent, XcmV2TraitsError]>; + Fail: AugmentedEvent, error: XcmV2TraitsError, weight: u64], { messageHash: Option, error: XcmV2TraitsError, weight: u64 }>; /** * An XCM exceeded the individual message weight budget. **/ - OverweightEnqueued: AugmentedEvent; + OverweightEnqueued: AugmentedEvent; /** * An XCM from the overweight queue was executed with the given actual weight used. **/ - OverweightServiced: AugmentedEvent; + OverweightServiced: AugmentedEvent; /** * Some XCM was executed ok. **/ - Success: AugmentedEvent]>; + Success: AugmentedEvent, weight: u64], { messageHash: Option, weight: u64 }>; /** * An upward message was sent to the relay chain. **/ - UpwardMessageSent: AugmentedEvent]>; + UpwardMessageSent: AugmentedEvent], { messageHash: Option }>; /** * An HRMP message was sent to a sibling parachain. **/ - XcmpMessageSent: AugmentedEvent]>; + XcmpMessageSent: AugmentedEvent], { messageHash: Option }>; }; } // AugmentedEvents } // declare module diff --git a/packages/augment-api/src/interfaces/augment-api-query.ts b/packages/augment-api/src/interfaces/augment-api-query.ts index 21bb42661..4f0d3de42 100644 --- a/packages/augment-api/src/interfaces/augment-api-query.ts +++ b/packages/augment-api/src/interfaces/augment-api-query.ts @@ -9,7 +9,7 @@ import type { ApiTypes, AugmentedQuery, QueryableStorageEntry } from '@polkadot/ import type { BTreeMap, Bytes, Null, Option, Vec, bool, u128, u16, u32, u64 } from '@polkadot/types-codec'; import type { AnyNumber, ITuple } from '@polkadot/types-codec/types'; import type { AccountId32, Call, H256 } from '@polkadot/types/interfaces/runtime'; -import type { AttestationAttestationsAttestationDetails, CumulusPalletDmpQueueConfigData, CumulusPalletDmpQueuePageIndexData, CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot, CumulusPalletXcmpQueueInboundChannelDetails, CumulusPalletXcmpQueueOutboundChannelDetails, CumulusPalletXcmpQueueQueueConfigData, DelegationDelegationHierarchyDelegationHierarchyDetails, DelegationDelegationHierarchyDelegationNode, DidDidDetails, DidServiceEndpointsDidEndpoint, FrameSupportWeightsPerDispatchClassU64, FrameSystemAccountInfo, FrameSystemEventRecord, FrameSystemLastRuntimeUpgradeInfo, FrameSystemPhase, PalletAuthorshipUncleEntryItem, PalletBalancesAccountData, PalletBalancesBalanceLock, PalletBalancesReleases, PalletBalancesReserveData, PalletCollectiveVotes, PalletDemocracyPreimageStatus, PalletDemocracyReferendumInfo, PalletDemocracyReleases, PalletDemocracyVoteThreshold, PalletDemocracyVoteVoting, PalletDidLookupConnectionRecord, PalletPreimageRequestStatus, PalletProxyAnnouncement, PalletProxyProxyDefinition, PalletSchedulerScheduledV3, PalletTipsOpenTip, PalletTransactionPaymentReleases, PalletTreasuryProposal, PalletVestingReleases, PalletVestingVestingInfo, PalletWeb3NamesWeb3NameWeb3NameOwnership, ParachainStakingCandidate, ParachainStakingDelegationCounter, ParachainStakingDelegator, ParachainStakingInflationInflationInfo, ParachainStakingRoundInfo, ParachainStakingStake, ParachainStakingTotalStake, PolkadotCorePrimitivesOutboundHrmpMessage, PolkadotPrimitivesV2AbridgedHostConfiguration, PolkadotPrimitivesV2PersistedValidationData, PolkadotPrimitivesV2UpgradeRestriction, RuntimeCommonAuthorizationAuthorizationId, SpConsensusAuraSr25519AppSr25519Public, SpCoreCryptoKeyTypeId, SpRuntimeDigest, SpTrieStorageProof, SpiritnetRuntimeSessionKeys } from '@polkadot/types/lookup'; +import type { AttestationAttestationsAttestationDetails, CumulusPalletDmpQueueConfigData, CumulusPalletDmpQueuePageIndexData, CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot, CumulusPalletXcmpQueueInboundChannelDetails, CumulusPalletXcmpQueueOutboundChannelDetails, CumulusPalletXcmpQueueQueueConfigData, DelegationDelegationHierarchyDelegationHierarchyDetails, DelegationDelegationHierarchyDelegationNode, DidDidDetails, DidServiceEndpointsDidEndpoint, FrameSupportWeightsPerDispatchClassU64, FrameSystemAccountInfo, FrameSystemEventRecord, FrameSystemLastRuntimeUpgradeInfo, FrameSystemPhase, PalletAuthorshipUncleEntryItem, PalletBalancesAccountData, PalletBalancesBalanceLock, PalletBalancesReleases, PalletBalancesReserveData, PalletCollectiveVotes, PalletDemocracyPreimageStatus, PalletDemocracyReferendumInfo, PalletDemocracyReleases, PalletDemocracyVoteThreshold, PalletDemocracyVoteVoting, PalletDidLookupConnectionRecord, PalletDynFilterSettingFilterSettings, PalletPreimageRequestStatus, PalletProxyAnnouncement, PalletProxyProxyDefinition, PalletSchedulerScheduledV3, PalletTipsOpenTip, PalletTransactionPaymentReleases, PalletTreasuryProposal, PalletVestingReleases, PalletVestingVestingInfo, PalletWeb3NamesWeb3NameWeb3NameOwnership, ParachainStakingCandidate, ParachainStakingDelegationCounter, ParachainStakingDelegator, ParachainStakingInflationInflationInfo, ParachainStakingRoundInfo, ParachainStakingStake, ParachainStakingTotalStake, PolkadotCorePrimitivesOutboundHrmpMessage, PolkadotPrimitivesV2AbridgedHostConfiguration, PolkadotPrimitivesV2PersistedValidationData, PolkadotPrimitivesV2UpgradeRestriction, RuntimeCommonAuthorizationAuthorizationId, SpConsensusAuraSr25519AppSr25519Public, SpCoreCryptoKeyTypeId, SpRuntimeDigest, SpTrieStorageProof, SpiritnetRuntimeSessionKeys } from '@polkadot/types/lookup'; import type { Observable } from '@polkadot/types/types'; export type __AugmentedQuery = AugmentedQuery unknown>; @@ -20,13 +20,13 @@ declare module '@polkadot/api-base/types/storage' { attestation: { /** * Attestations stored on chain. - * + * * It maps from a claim hash to the full attestation. **/ attestations: AugmentedQuery Observable>, [H256]>; /** * Delegated attestations stored on chain. - * + * * It maps from a delegation ID to a vector of claim hashes. **/ externalAttestations: AugmentedQuery Observable, [RuntimeCommonAuthorizationAuthorizationId, H256]>; @@ -38,7 +38,7 @@ declare module '@polkadot/api-base/types/storage' { authorities: AugmentedQuery Observable>, []>; /** * The current slot of this block. - * + * * This will be set in `on_initialize`. **/ currentSlot: AugmentedQuery Observable, []>; @@ -46,7 +46,7 @@ declare module '@polkadot/api-base/types/storage' { auraExt: { /** * Serves as cache for the authorities. - * + * * The authorities in AuRa are overwritten in `on_initialize` when we switch to a new session, * but we require the old authorities to verify the seal when validating a PoV. This will always * be updated to the latest AuRa authorities in `on_finalize`. @@ -70,25 +70,25 @@ declare module '@polkadot/api-base/types/storage' { balances: { /** * The Balances pallet example of storing the balance of an account. - * + * * # Example - * + * * ```nocompile * impl pallet_balances::Config for Runtime { * type AccountStore = StorageMapShim, frame_system::Provider, AccountId, Self::AccountData> * } * ``` - * + * * You can also store the balance of an account in the `System` pallet. - * + * * # Example - * + * * ```nocompile * impl pallet_balances::Config for Runtime { * type AccountStore = System * } * ``` - * + * * But this comes with tradeoffs, storing account balances in the system pallet stores * `frame_system` data alongside the account data contrary to storing account balances in the * `Balances` pallet, which uses a `StorageMap` to store balances data only. @@ -106,7 +106,7 @@ declare module '@polkadot/api-base/types/storage' { reserves: AugmentedQuery Observable>, [AccountId32]>; /** * Storage version of the pallet. - * + * * This is set to v2.0.0 for new networks. **/ storageVersion: AugmentedQuery Observable, []>; @@ -144,7 +144,7 @@ declare module '@polkadot/api-base/types/storage' { ctype: { /** * CTypes stored on chain. - * + * * It maps from a CType hash to its creator. **/ ctypes: AugmentedQuery Observable>, [H256]>; @@ -152,13 +152,13 @@ declare module '@polkadot/api-base/types/storage' { delegation: { /** * Delegation hierarchies stored on chain. - * + * * It maps for a (root) node ID to the hierarchy details. **/ delegationHierarchies: AugmentedQuery Observable>, [H256]>; /** * Delegation nodes stored on chain. - * + * * It maps from a node ID to the node details. **/ delegationNodes: AugmentedQuery Observable>, [H256]>; @@ -175,7 +175,7 @@ declare module '@polkadot/api-base/types/storage' { cancellations: AugmentedQuery Observable, [H256]>; /** * Those who have locked a deposit. - * + * * TWOX-NOTE: Safe, as increasing integer keys are safe. **/ depositOf: AugmentedQuery Observable, u128]>>>, [u32]>; @@ -215,20 +215,20 @@ declare module '@polkadot/api-base/types/storage' { referendumCount: AugmentedQuery Observable, []>; /** * Information concerning any given referendum. - * + * * TWOX-NOTE: SAFE as indexes are not under an attacker’s control. **/ referendumInfoOf: AugmentedQuery Observable>, [u32]>; /** * Storage version of the pallet. - * + * * New networks start with last version. **/ storageVersion: AugmentedQuery Observable>, []>; /** * All votes for a particular voter. We store the balance for the number of votes that we * have recorded. The second item is the total amount of delegations, that will be added. - * + * * TWOX-NOTE: SAFE as `AccountId`s are crypto hashes anyway. **/ votingOf: AugmentedQuery Observable, [AccountId32]>; @@ -236,27 +236,27 @@ declare module '@polkadot/api-base/types/storage' { did: { /** * DIDs stored on chain. - * + * * It maps from a DID identifier to the DID details. **/ did: AugmentedQuery Observable>, [AccountId32]>; /** * The set of DIDs that have been deleted and cannot therefore be created * again for security reasons. - * + * * It maps from a DID identifier to a unit tuple, for the sake of tracking * DID identifiers. **/ didBlacklist: AugmentedQuery Observable>, [AccountId32]>; /** * Counter of service endpoints for each DID. - * + * * It maps from (DID identifier) to a 32-bit counter. **/ didEndpointsCount: AugmentedQuery Observable, [AccountId32]>; /** * Service endpoints associated with DIDs. - * + * * It maps from (DID identifier, service ID) to the service details. **/ serviceEndpoints: AugmentedQuery Observable>, [AccountId32, Bytes]>; @@ -291,6 +291,9 @@ declare module '@polkadot/api-base/types/storage' { **/ pages: AugmentedQuery Observable>>, [u32]>; }; + dynFilter: { + filter: AugmentedQuery Observable, []>; + }; indices: { /** * The lookup from index to account. @@ -303,7 +306,7 @@ declare module '@polkadot/api-base/types/storage' { parachainStaking: { /** * The staking information for a candidate. - * + * * It maps from an account to its information. * Moreover, it counts the number of candidates. **/ @@ -314,7 +317,7 @@ declare module '@polkadot/api-base/types/storage' { counterForCandidatePool: AugmentedQuery Observable, []>; /** * Delegation staking information. - * + * * It maps from an account to its delegation details. **/ delegatorState: AugmentedQuery Observable>, [AccountId32]>; @@ -326,7 +329,7 @@ declare module '@polkadot/api-base/types/storage' { /** * Delegation information for the latest session in which a delegator * delegated. - * + * * It maps from an account to the number of delegations in the last * session in which they (re-)delegated. **/ @@ -334,7 +337,7 @@ declare module '@polkadot/api-base/types/storage' { /** * The year in which the last automatic reduction of the reward rates * occurred. - * + * * It starts at zero at genesis and increments by one every BLOCKS_PER_YEAR * many blocks. **/ @@ -353,12 +356,12 @@ declare module '@polkadot/api-base/types/storage' { round: AugmentedQuery Observable, []>; /** * The collator candidates with the highest amount of stake. - * + * * Each time the stake of a collator is increased, it is checked whether * this pushes another candidate out of the list. When the stake is * reduced however, it is not checked if another candidate has more stake, * since this would require iterating over the entire [CandidatePool]. - * + * * There must always be more candidates than [MaxSelectedCandidates] so * that a collator can drop out of the collator set by reducing their * stake. @@ -367,14 +370,14 @@ declare module '@polkadot/api-base/types/storage' { /** * Total funds locked to back the currently selected collators. * The sum of all collator and their delegator stakes. - * + * * Note: There are more funds locked by this pallet, since the backing for * non collating candidates is not included in [TotalCollatorStake]. **/ totalCollatorStake: AugmentedQuery Observable, []>; /** * The funds waiting to be unstaked. - * + * * It maps from accounts to all the funds addressed to them in the future * blocks. **/ @@ -392,7 +395,7 @@ declare module '@polkadot/api-base/types/storage' { authorizedUpgrade: AugmentedQuery Observable>, []>; /** * A custom head data that should be returned as result of `validate_block`. - * + * * See [`Pallet::set_custom_validation_head_data`] for more information. **/ customValidationHeadData: AugmentedQuery Observable>, []>; @@ -402,43 +405,47 @@ declare module '@polkadot/api-base/types/storage' { didSetValidationCode: AugmentedQuery Observable, []>; /** * The parachain host configuration that was obtained from the relay parent. - * + * * This field is meant to be updated each block with the validation data inherent. Therefore, * before processing of the inherent, e.g. in `on_initialize` this data may be stale. - * + * * This data is also absent from the genesis. **/ hostConfiguration: AugmentedQuery Observable>, []>; /** * HRMP messages that were sent in a block. - * + * * This will be cleared in `on_initialize` of each new block. **/ hrmpOutboundMessages: AugmentedQuery Observable>, []>; /** * HRMP watermark that was set in a block. - * + * * This will be cleared in `on_initialize` of each new block. **/ hrmpWatermark: AugmentedQuery Observable, []>; /** * The last downward message queue chain head we have observed. - * + * * This value is loaded before and saved after processing inbound downward messages carried * by the system inherent. **/ lastDmqMqcHead: AugmentedQuery Observable, []>; /** * The message queue chain heads we have observed per each channel incoming channel. - * + * * This value is loaded before and saved after processing inbound downward messages carried * by the system inherent. **/ lastHrmpMqcHeads: AugmentedQuery Observable>, []>; + /** + * The relay chain block number associated with the last parachain block. + **/ + lastRelayChainBlockNumber: AugmentedQuery Observable, []>; /** * Validation code that is set by the parachain and is to be communicated to collator and * consequently the relay-chain. - * + * * This will be cleared in `on_initialize` of each new block if no other pallet already set * the value. **/ @@ -449,35 +456,35 @@ declare module '@polkadot/api-base/types/storage' { pendingUpwardMessages: AugmentedQuery Observable>, []>; /** * In case of a scheduled upgrade, this storage field contains the validation code to be applied. - * + * * As soon as the relay chain gives us the go-ahead signal, we will overwrite the [`:code`][well_known_keys::CODE] * which will result the next block process with the new validation code. This concludes the upgrade process. - * + * * [well_known_keys::CODE]: sp_core::storage::well_known_keys::CODE **/ pendingValidationCode: AugmentedQuery Observable, []>; /** * Number of downward messages processed in a block. - * + * * This will be cleared in `on_initialize` of each new block. **/ processedDownwardMessages: AugmentedQuery Observable, []>; /** * The state proof for the last relay parent block. - * + * * This field is meant to be updated each block with the validation data inherent. Therefore, * before processing of the inherent, e.g. in `on_initialize` this data may be stale. - * + * * This data is also absent from the genesis. **/ relayStateProof: AugmentedQuery Observable>, []>; /** * The snapshot of some state related to messaging relevant to the current parachain as per * the relay parent. - * + * * This field is meant to be updated each block with the validation data inherent. Therefore, * before processing of the inherent, e.g. in `on_initialize` this data may be stale. - * + * * This data is also absent from the genesis. **/ relevantMessagingState: AugmentedQuery Observable>, []>; @@ -495,7 +502,7 @@ declare module '@polkadot/api-base/types/storage' { * An option which indicates if the relay-chain restricts signalling a validation code upgrade. * In other words, if this is `Some` and [`NewValidationCode`] is `Some` then the produced * candidate will be invalid. - * + * * This storage item is a mirror of the corresponding value for the current parachain from the * relay-chain. This value is ephemeral which means it doesn't hit the storage. This value is * set after the inherent. @@ -503,7 +510,7 @@ declare module '@polkadot/api-base/types/storage' { upgradeRestrictionSignal: AugmentedQuery Observable>, []>; /** * Upward messages that were sent in a block. - * + * * This will be cleared in `on_initialize` of each new block. **/ upwardMessages: AugmentedQuery Observable>, []>; @@ -543,6 +550,12 @@ declare module '@polkadot/api-base/types/storage' { **/ randomMaterial: AugmentedQuery Observable>, []>; }; + relayMigration: { + /** + * Switch between RelayNumberStrictlyIncreases and AnyRelayNumber. + **/ + relayNumberStrictlyIncreases: AugmentedQuery Observable, []>; + }; scheduler: { /** * Items to be executed, indexed by the block number that they should be executed on. @@ -560,7 +573,7 @@ declare module '@polkadot/api-base/types/storage' { currentIndex: AugmentedQuery Observable, []>; /** * Indices of disabled validators. - * + * * The vec is always kept sorted so that we can find whether a given validator is * disabled using binary search. It gets cleared when `on_session_ending` returns * a new set of identities. @@ -616,10 +629,10 @@ declare module '@polkadot/api-base/types/storage' { eventCount: AugmentedQuery Observable, []>; /** * Events deposited for the current block. - * + * * NOTE: The item is unbound and should therefore never be read on chain. * It could otherwise inflate the PoV size of a block. - * + * * Events have a large in-memory size. Box the events to not go out-of-memory * just in case someone still reads them from within the runtime. **/ @@ -627,11 +640,11 @@ declare module '@polkadot/api-base/types/storage' { /** * Mapping between a topic (represented by T::Hash) and a vector of indexes * of events in the `>` list. - * + * * All topic vectors have deterministic storage locations depending on the topic. This * allows light-clients to leverage the changes trie storage tracking mechanism and * in case of changes fetch the list of events of interest. - * + * * The value has the type `(T::BlockNumber, EventIndex)` because if we used only just * the `EventIndex` then in case if the topic has the same contents on the next block * no notification will be triggered thus the event might be lost. @@ -761,7 +774,7 @@ declare module '@polkadot/api-base/types/storage' { vesting: { /** * Storage version of the pallet. - * + * * New networks start with latest version, as determined by the genesis build. **/ storageVersion: AugmentedQuery Observable, []>; @@ -773,7 +786,7 @@ declare module '@polkadot/api-base/types/storage' { web3Names: { /** * Map of name -> (). - * + * * If a name key is present, the name is currently banned. **/ banned: AugmentedQuery Observable>, [Bytes]>; @@ -810,7 +823,7 @@ declare module '@polkadot/api-base/types/storage' { outboundXcmpStatus: AugmentedQuery Observable>, []>; /** * The messages that exceeded max individual message weight budget. - * + * * These message stay in this storage map until they are manually dispatched via * `service_overweight`. **/ diff --git a/packages/augment-api/src/interfaces/augment-api-rpc.ts b/packages/augment-api/src/interfaces/augment-api-rpc.ts index f1502ffb9..2c84b8670 100644 --- a/packages/augment-api/src/interfaces/augment-api-rpc.ts +++ b/packages/augment-api/src/interfaces/augment-api-rpc.ts @@ -5,6 +5,9 @@ // this is required to allow for ambient/previous definitions import '@polkadot/rpc-core/types/jsonrpc'; +// FIXME: Error when using the autogenerated "from '@kiltprotocol/augment-api/extraDefs'" +import type { DidLinkedInfo } from './extraDefs'; + import type { AugmentedRpc } from '@polkadot/rpc-core/types'; import type { Metadata, StorageKey } from '@polkadot/types'; import type { Bytes, HashMap, Json, Null, Option, Text, U256, U64, Vec, bool, f64, u32, u64 } from '@polkadot/types-codec'; @@ -25,7 +28,7 @@ import type { MmrLeafBatchProof, MmrLeafProof } from '@polkadot/types/interfaces import type { StorageKind } from '@polkadot/types/interfaces/offchain'; import type { FeeDetails, RuntimeDispatchInfo } from '@polkadot/types/interfaces/payment'; import type { RpcMethods } from '@polkadot/types/interfaces/rpc'; -import type { AccountId, BlockNumber, H160, H256, H64, Hash, Header, Index, Justification, KeyValue, SignedBlock, StorageData } from '@polkadot/types/interfaces/runtime'; +import type { AccountId, AccountId32, BlockNumber, H160, H256, H64, Hash, Header, Index, Justification, KeyValue, SignedBlock, StorageData } from '@polkadot/types/interfaces/runtime'; import type { MigrationStatusResult, ReadProof, RuntimeVersion, TraceBlockResponse } from '@polkadot/types/interfaces/state'; import type { ApplyExtrinsicResult, ChainProperties, ChainType, Health, NetworkState, NodeRole, PeerInfo, SyncState } from '@polkadot/types/interfaces/system'; import type { IExtrinsic, Observable } from '@polkadot/types/types'; @@ -168,6 +171,20 @@ declare module '@polkadot/rpc-core/types/jsonrpc' { **/ getBlockStats: AugmentedRpc<(at: Hash | string | Uint8Array) => Observable>>; }; + did: { + /** + * Return the DID information linked to the provided DID identifier, if found. + **/ + query: AugmentedRpc<(did: AccountId32 | string | Uint8Array, at?: Hash | string | Uint8Array) => Observable>>; + /** + * Return the DID information linked to the provided account, if found. + **/ + queryByAccount: AugmentedRpc<(account: AccountId32 | string | Uint8Array, at?: Hash | string | Uint8Array) => Observable>>; + /** + * Return the DID information linked to the provided web3name, if found. + **/ + queryByWeb3Name: AugmentedRpc<(name: Text | string, at?: Hash | string | Uint8Array) => Observable>>; + }; engine: { /** * Instructs the manual-seal authorship task to create a new block diff --git a/packages/augment-api/src/interfaces/augment-api-runtime.ts b/packages/augment-api/src/interfaces/augment-api-runtime.ts index 1d450b369..f8068f4e7 100644 --- a/packages/augment-api/src/interfaces/augment-api-runtime.ts +++ b/packages/augment-api/src/interfaces/augment-api-runtime.ts @@ -5,8 +5,11 @@ // this is required to allow for ambient/previous definitions import '@polkadot/api-base/types/calls'; +// FIXME: Error when using the autogenerated "from '@kiltprotocol/augment-api/extraDefs'" +import type { RawDidLinkedInfo } from './extraDefs'; + import type { ApiTypes, AugmentedCall, DecoratedCallBase } from '@polkadot/api-base/types'; -import type { Bytes, Null, Option, Vec, u32 } from '@polkadot/types-codec'; +import type { Bytes, Null, Option, Text, Vec, u32 } from '@polkadot/types-codec'; import type { AnyNumber, ITuple } from '@polkadot/types-codec/types'; import type { CheckInherentsResult, InherentData } from '@polkadot/types/interfaces/blockbuilder'; import type { BlockHash } from '@polkadot/types/interfaces/chain'; @@ -15,7 +18,7 @@ import type { CollationInfo } from '@polkadot/types/interfaces/cumulus'; import type { Extrinsic } from '@polkadot/types/interfaces/extrinsics'; import type { OpaqueMetadata } from '@polkadot/types/interfaces/metadata'; import type { FeeDetails, RuntimeDispatchInfo } from '@polkadot/types/interfaces/payment'; -import type { AccountId, Block, Header, Index, KeyTypeId, SlotDuration } from '@polkadot/types/interfaces/runtime'; +import type { AccountId, AccountId32, Block, Header, Index, KeyTypeId, SlotDuration } from '@polkadot/types/interfaces/runtime'; import type { RuntimeVersion } from '@polkadot/types/interfaces/state'; import type { ApplyExtrinsicResult } from '@polkadot/types/interfaces/system'; import type { TransactionSource, TransactionValidity } from '@polkadot/types/interfaces/txqueue'; @@ -85,6 +88,21 @@ declare module '@polkadot/api-base/types/calls' { **/ version: AugmentedCall Observable>; }; + /** 0xa02708c798d60bce/1 */ + didApi: { + /** + * Return the information relative to the owner of the provided DID, if present. + **/ + queryDid: AugmentedCall Observable>>; + /** + * Return the information relative to the DID to which the provided account is linked, if any. + **/ + queryDidByAccountId: AugmentedCall Observable>>; + /** + * Return the information relative to the owner of the provided web3name, if any. + **/ + queryDidByW3n: AugmentedCall Observable>>; + }; /** 0x37e397fc7c91f5e4/1 */ metadata: { /** diff --git a/packages/augment-api/src/interfaces/augment-api-tx.ts b/packages/augment-api/src/interfaces/augment-api-tx.ts index 9dc363025..dc5b012e2 100644 --- a/packages/augment-api/src/interfaces/augment-api-tx.ts +++ b/packages/augment-api/src/interfaces/augment-api-tx.ts @@ -9,7 +9,7 @@ import type { ApiTypes, AugmentedSubmittable, SubmittableExtrinsic, SubmittableE import type { Bytes, Compact, Option, Vec, bool, u128, u16, u32, u64, u8 } from '@polkadot/types-codec'; import type { AnyNumber, IMethod, ITuple } from '@polkadot/types-codec/types'; import type { AccountId32, Call, H256, MultiAddress, Perbill, Perquintill } from '@polkadot/types/interfaces/runtime'; -import type { CumulusPrimitivesParachainInherentParachainInherentData, DelegationDelegationHierarchyPermissions, DidDidDetailsDidAuthorizedCallOperation, DidDidDetailsDidCreationDetails, DidDidDetailsDidEncryptionKey, DidDidDetailsDidSignature, DidDidDetailsDidVerificationKey, DidServiceEndpointsDidEndpoint, FrameSupportScheduleMaybeHashed, PalletDemocracyConviction, PalletDemocracyVoteAccountVote, PalletVestingVestingInfo, RuntimeCommonAuthorizationPalletAuthorize, SpRuntimeHeader, SpRuntimeMultiSignature, SpiritnetRuntimeOriginCaller, SpiritnetRuntimeProxyType, SpiritnetRuntimeSessionKeys, XcmV1MultiLocation, XcmV2WeightLimit, XcmVersionedMultiAssets, XcmVersionedMultiLocation, XcmVersionedXcm } from '@polkadot/types/lookup'; +import type { CumulusPrimitivesParachainInherentParachainInherentData, DelegationDelegationHierarchyPermissions, DidDidDetailsDidAuthorizedCallOperation, DidDidDetailsDidCreationDetails, DidDidDetailsDidEncryptionKey, DidDidDetailsDidSignature, DidDidDetailsDidVerificationKey, DidServiceEndpointsDidEndpoint, FrameSupportScheduleMaybeHashed, PalletDemocracyConviction, PalletDemocracyVoteAccountVote, PalletDynFilterSettingFilterSettings, PalletVestingVestingInfo, RuntimeCommonAuthorizationPalletAuthorize, SpRuntimeHeader, SpRuntimeMultiSignature, SpiritnetRuntimeOriginCaller, SpiritnetRuntimeProxyType, SpiritnetRuntimeSessionKeys, XcmV1MultiLocation, XcmV2WeightLimit, XcmVersionedMultiAssets, XcmVersionedMultiLocation, XcmVersionedXcm } from '@polkadot/types/lookup'; export type __AugmentedSubmittable = AugmentedSubmittable<() => unknown>; export type __SubmittableExtrinsic = SubmittableExtrinsic; @@ -95,8 +95,6 @@ declare module '@polkadot/api-base/types/submittable' { **/ revoke: AugmentedSubmittable<(claimHash: H256 | string | Uint8Array, authorization: Option | null | Uint8Array | RuntimeCommonAuthorizationPalletAuthorize | { Delegation: any } | string) => SubmittableExtrinsic, [H256, Option]>; }; - auraExt: { - }; authorship: { /** * Provide a set of uncles. @@ -654,8 +652,9 @@ declare module '@polkadot/api-base/types/submittable' { * The dispatch of this call must be `FastTrackOrigin`. * * - `proposal_hash`: The hash of the current external proposal. - * - `voting_period`: The period that is allowed for voting on this proposal. Increased to - * `FastTrackVotingPeriod` if too low. + * - `voting_period`: The period that is allowed for voting on this proposal. + * Must be always greater than zero. + * For `FastTrackOrigin` must be equal or greater than `FastTrackVotingPeriod`. * - `delay`: The number of block after voting has ended in approval and this should be * enacted. This doesn't have a minimum amount. * @@ -1218,6 +1217,9 @@ declare module '@polkadot/api-base/types/submittable' { **/ serviceOverweight: AugmentedSubmittable<(index: u64 | AnyNumber | Uint8Array, weightLimit: u64 | AnyNumber | Uint8Array) => SubmittableExtrinsic, [u64, u64]>; }; + dynFilter: { + setFilter: AugmentedSubmittable<(filter: PalletDynFilterSettingFilterSettings | { transferDisabled?: any; featureDisabled?: any; xcmDisabled?: any } | string | Uint8Array) => SubmittableExtrinsic, [PalletDynFilterSettingFilterSettings]>; + }; indices: { /** * Assign an previously unassigned index. @@ -2182,6 +2184,27 @@ declare module '@polkadot/api-base/types/submittable' { **/ removeProxy: AugmentedSubmittable<(delegate: AccountId32 | string | Uint8Array, proxyType: SpiritnetRuntimeProxyType | 'Any' | 'NonTransfer' | 'Governance' | 'ParachainStaking' | 'CancelProxy' | 'NonDepositClaiming' | number | Uint8Array, delay: u64 | AnyNumber | Uint8Array) => SubmittableExtrinsic, [AccountId32, SpiritnetRuntimeProxyType, u64]>; }; + relayMigration: { + /** + * Set the associated relay block number to be AnyRelayNumber. + * + * Has to be done pre migration. + **/ + disableStrictRelayNumberCheck: AugmentedSubmittable<() => SubmittableExtrinsic, []>; + /** + * Set the associated relay block number to be + * RelayNumberStrictlyIncreases. + * + * Has to be done post migration. + **/ + enableStrictRelayNumberCheck: AugmentedSubmittable<() => SubmittableExtrinsic, []>; + /** + * Set an XCM call to the relay chain. + * + * Has to be done pre migration. + **/ + sendSwapCallBytes: AugmentedSubmittable<(relayCall: Bytes | string | Uint8Array, relayBalance: u128 | AnyNumber | Uint8Array, maxWeight: u64 | AnyNumber | Uint8Array) => SubmittableExtrinsic, [Bytes, u128, u64]>; + }; scheduler: { /** * Cancel an anonymously scheduled task. @@ -2776,6 +2799,17 @@ declare module '@polkadot/api-base/types/submittable' { * exist altogether, thus there is no way it would have been approved in the first place. **/ removeApproval: AugmentedSubmittable<(proposalId: Compact | AnyNumber | Uint8Array) => SubmittableExtrinsic, [Compact]>; + /** + * Propose and approve a spend of treasury funds. + * + * - `origin`: Must be `SpendOrigin` with the `Success` value being at least `amount`. + * - `amount`: The amount to be transferred from the treasury to the `beneficiary`. + * - `beneficiary`: The destination account for the transfer. + * + * NOTE: For record-keeping purposes, the proposer is deemed to be equivalent to the + * beneficiary. + **/ + spend: AugmentedSubmittable<(amount: Compact | AnyNumber | Uint8Array, beneficiary: MultiAddress | { Id: any } | { Index: any } | { Raw: any } | { Address32: any } | { Address20: any } | string | Uint8Array) => SubmittableExtrinsic, [Compact, MultiAddress]>; }; utility: { /** diff --git a/packages/augment-api/src/interfaces/augment-types.ts b/packages/augment-api/src/interfaces/augment-types.ts index 909ea0540..583ced875 100644 --- a/packages/augment-api/src/interfaces/augment-types.ts +++ b/packages/augment-api/src/interfaces/augment-types.ts @@ -5,6 +5,9 @@ // this is required to allow for ambient/previous definitions import '@polkadot/types/types/registry'; +// FIXME: Error when using the autogenerated "from '@kiltprotocol/augment-api/extraDefs'" +import type { DidLinkedInfo, RawDidDetails, RawDidLinkedInfo, RawServiceEndpoints, RpcDidDetails, RpcDidEncryptionKey, RpcDidPublicKey, RpcDidVerificationKey, RpcPublicKeyDetails, RpcServiceEndpoint, StakingRates } from './extraDefs'; + import type { Data, StorageKey } from '@polkadot/types'; import type { BitVec, Bool, Bytes, F32, F64, I128, I16, I256, I32, I64, I8, Json, Null, OptionBool, Raw, Text, Type, U128, U16, U256, U32, U64, U8, USize, bool, f32, f64, i128, i16, i256, i32, i64, i8, u128, u16, u256, u32, u64, u8, usize } from '@polkadot/types-codec'; import type { AssetApproval, AssetApprovalKey, AssetBalance, AssetDestroyWitness, AssetDetails, AssetMetadata, TAssetBalance, TAssetDepositBalance } from '@polkadot/types/interfaces/assets'; @@ -15,7 +18,7 @@ import type { UncleEntryItem } from '@polkadot/types/interfaces/authorship'; import type { AllowedSlots, BabeAuthorityWeight, BabeBlockWeight, BabeEpochConfiguration, BabeEquivocationProof, BabeGenesisConfiguration, BabeGenesisConfigurationV1, BabeWeight, Epoch, EpochAuthorship, MaybeRandomness, MaybeVrf, NextConfigDescriptor, NextConfigDescriptorV1, OpaqueKeyOwnershipProof, Randomness, RawBabePreDigest, RawBabePreDigestCompat, RawBabePreDigestPrimary, RawBabePreDigestPrimaryTo159, RawBabePreDigestSecondaryPlain, RawBabePreDigestSecondaryTo159, RawBabePreDigestSecondaryVRF, RawBabePreDigestTo159, SlotNumber, VrfData, VrfOutput, VrfProof } from '@polkadot/types/interfaces/babe'; import type { AccountData, BalanceLock, BalanceLockTo212, BalanceStatus, Reasons, ReserveData, ReserveIdentifier, VestingSchedule, WithdrawReasons } from '@polkadot/types/interfaces/balances'; import type { BeefyAuthoritySet, BeefyCommitment, BeefyId, BeefyNextAuthoritySet, BeefyPayload, BeefyPayloadId, BeefySignedCommitment, MmrRootHash, ValidatorSet, ValidatorSetId } from '@polkadot/types/interfaces/beefy'; -import type { BenchmarkConfig, BenchmarkList, BenchmarkMetadata, BenchmarkParameter } from '@polkadot/types/interfaces/benchmark'; +import type { BenchmarkBatch, BenchmarkConfig, BenchmarkList, BenchmarkMetadata, BenchmarkParameter, BenchmarkResult } from '@polkadot/types/interfaces/benchmark'; import type { CheckInherentsResult, InherentData, InherentIdentifier } from '@polkadot/types/interfaces/blockbuilder'; import type { BridgeMessageId, BridgedBlockHash, BridgedBlockNumber, BridgedHeader, CallOrigin, ChainId, DeliveredMessages, DispatchFeePayment, InboundLaneData, InboundRelayer, InitializationData, LaneId, MessageData, MessageKey, MessageNonce, MessagesDeliveryProofOf, MessagesProofOf, OperatingMode, OutboundLaneData, OutboundMessageFee, OutboundPayload, Parameter, RelayerId, UnrewardedRelayer, UnrewardedRelayersState } from '@polkadot/types/interfaces/bridges'; import type { BlockHash } from '@polkadot/types/interfaces/chain'; @@ -24,7 +27,7 @@ import type { StatementKind } from '@polkadot/types/interfaces/claims'; import type { CollectiveOrigin, MemberCount, ProposalIndex, Votes, VotesTo230 } from '@polkadot/types/interfaces/collective'; import type { AuthorityId, RawVRFOutput } from '@polkadot/types/interfaces/consensus'; import type { AliveContractInfo, CodeHash, CodeSource, CodeUploadRequest, CodeUploadResult, CodeUploadResultValue, ContractCallFlags, ContractCallRequest, ContractExecResult, ContractExecResultOk, ContractExecResultResult, ContractExecResultSuccessTo255, ContractExecResultSuccessTo260, ContractExecResultTo255, ContractExecResultTo260, ContractExecResultTo267, ContractInfo, ContractInstantiateResult, ContractInstantiateResultTo267, ContractInstantiateResultTo299, ContractReturnFlags, ContractStorageKey, DeletedContract, ExecReturnValue, Gas, HostFnWeights, HostFnWeightsTo264, InstantiateRequest, InstantiateRequestV1, InstantiateRequestV2, InstantiateReturnValue, InstantiateReturnValueOk, InstantiateReturnValueTo267, InstructionWeights, Limits, LimitsTo264, PrefabWasmModule, RentProjection, Schedule, ScheduleTo212, ScheduleTo258, ScheduleTo264, SeedOf, StorageDeposit, TombstoneContractInfo, TrieId } from '@polkadot/types/interfaces/contracts'; -import type { ContractConstructorSpecLatest, ContractConstructorSpecV0, ContractConstructorSpecV1, ContractConstructorSpecV2, ContractConstructorSpecV3, ContractContractSpecV0, ContractContractSpecV1, ContractContractSpecV2, ContractContractSpecV3, ContractCryptoHasher, ContractDiscriminant, ContractDisplayName, ContractEventParamSpecLatest, ContractEventParamSpecV0, ContractEventParamSpecV2, ContractEventSpecLatest, ContractEventSpecV0, ContractEventSpecV1, ContractEventSpecV2, ContractLayoutArray, ContractLayoutCell, ContractLayoutEnum, ContractLayoutHash, ContractLayoutHashingStrategy, ContractLayoutKey, ContractLayoutStruct, ContractLayoutStructField, ContractMessageParamSpecLatest, ContractMessageParamSpecV0, ContractMessageParamSpecV2, ContractMessageSpecLatest, ContractMessageSpecV0, ContractMessageSpecV1, ContractMessageSpecV2, ContractMetadata, ContractMetadataLatest, ContractMetadataV0, ContractMetadataV1, ContractMetadataV2, ContractMetadataV3, ContractProject, ContractProjectContract, ContractProjectInfo, ContractProjectSource, ContractProjectV0, ContractSelector, ContractStorageLayout, ContractTypeSpec } from '@polkadot/types/interfaces/contractsAbi'; +import type { ContractConstructorSpecLatest, ContractConstructorSpecV0, ContractConstructorSpecV1, ContractConstructorSpecV2, ContractConstructorSpecV3, ContractContractSpecV0, ContractContractSpecV1, ContractContractSpecV2, ContractContractSpecV3, ContractContractSpecV4, ContractCryptoHasher, ContractDiscriminant, ContractDisplayName, ContractEventParamSpecLatest, ContractEventParamSpecV0, ContractEventParamSpecV2, ContractEventSpecLatest, ContractEventSpecV0, ContractEventSpecV1, ContractEventSpecV2, ContractLayoutArray, ContractLayoutCell, ContractLayoutEnum, ContractLayoutHash, ContractLayoutHashingStrategy, ContractLayoutKey, ContractLayoutStruct, ContractLayoutStructField, ContractMessageParamSpecLatest, ContractMessageParamSpecV0, ContractMessageParamSpecV2, ContractMessageSpecLatest, ContractMessageSpecV0, ContractMessageSpecV1, ContractMessageSpecV2, ContractMetadata, ContractMetadataLatest, ContractMetadataV0, ContractMetadataV1, ContractMetadataV2, ContractMetadataV3, ContractMetadataV4, ContractProject, ContractProjectContract, ContractProjectInfo, ContractProjectSource, ContractProjectV0, ContractSelector, ContractStorageLayout, ContractTypeSpec } from '@polkadot/types/interfaces/contractsAbi'; import type { FundIndex, FundInfo, LastContribution, TrieIndex } from '@polkadot/types/interfaces/crowdloan'; import type { CollationInfo, CollationInfoV1, ConfigData, MessageId, OverweightIndex, PageCounter, PageIndexData } from '@polkadot/types/interfaces/cumulus'; import type { AccountVote, AccountVoteSplit, AccountVoteStandard, Conviction, Delegations, PreimageStatus, PreimageStatusAvailable, PriorLock, PropIndex, Proposal, ProxyState, ReferendumIndex, ReferendumInfo, ReferendumInfoFinished, ReferendumInfoTo239, ReferendumStatus, Tally, Voting, VotingDelegating, VotingDirect, VotingDirectVote } from '@polkadot/types/interfaces/democracy'; @@ -52,7 +55,7 @@ import type { ProxyAnnouncement, ProxyDefinition, ProxyType } from '@polkadot/ty import type { AccountStatus, AccountValidity } from '@polkadot/types/interfaces/purchase'; import type { ActiveRecovery, RecoveryConfig } from '@polkadot/types/interfaces/recovery'; import type { RpcMethods } from '@polkadot/types/interfaces/rpc'; -import type { AccountId, AccountId20, AccountId32, AccountIdOf, AccountIndex, Address, AssetId, Balance, BalanceOf, Block, BlockNumber, BlockNumberFor, BlockNumberOf, Call, CallHash, CallHashOf, ChangesTrieConfiguration, ChangesTrieSignal, CodecHash, Consensus, ConsensusEngineId, CrateVersion, Digest, DigestItem, EncodedJustification, ExtrinsicsWeight, Fixed128, Fixed64, FixedI128, FixedI64, FixedU128, FixedU64, H1024, H128, H160, H2048, H256, H32, H512, H64, Hash, Header, HeaderPartial, I32F32, Index, IndicesLookupSource, Justification, Justifications, KeyTypeId, KeyValue, LockIdentifier, LookupSource, LookupTarget, ModuleId, Moment, MultiAddress, MultiSigner, OpaqueCall, Origin, OriginCaller, PalletId, PalletVersion, PalletsOrigin, Pays, PerU16, Perbill, Percent, Permill, Perquintill, Phantom, PhantomData, PreRuntime, Releases, RuntimeDbWeight, Seal, SealV0, SignedBlock, SignedBlockWithJustification, SignedBlockWithJustifications, Slot, SlotDuration, StorageData, StorageInfo, StorageProof, TransactionInfo, TransactionLongevity, TransactionPriority, TransactionStorageProof, TransactionTag, U32F32, ValidatorId, ValidatorIdOf, Weight, WeightMultiplier } from '@polkadot/types/interfaces/runtime'; +import type { AccountId, AccountId20, AccountId32, AccountId33, AccountIdOf, AccountIndex, Address, AssetId, Balance, BalanceOf, Block, BlockNumber, BlockNumberFor, BlockNumberOf, Call, CallHash, CallHashOf, ChangesTrieConfiguration, ChangesTrieSignal, CodecHash, Consensus, ConsensusEngineId, CrateVersion, Digest, DigestItem, EncodedJustification, ExtrinsicsWeight, Fixed128, Fixed64, FixedI128, FixedI64, FixedU128, FixedU64, H1024, H128, H160, H2048, H256, H32, H512, H64, Hash, Header, HeaderPartial, I32F32, Index, IndicesLookupSource, Justification, Justifications, KeyTypeId, KeyValue, LockIdentifier, LookupSource, LookupTarget, ModuleId, Moment, MultiAddress, MultiSigner, OpaqueCall, Origin, OriginCaller, PalletId, PalletVersion, PalletsOrigin, Pays, PerU16, Perbill, Percent, Permill, Perquintill, Phantom, PhantomData, PreRuntime, Releases, RuntimeDbWeight, Seal, SealV0, SignedBlock, SignedBlockWithJustification, SignedBlockWithJustifications, Slot, SlotDuration, StorageData, StorageInfo, StorageProof, TransactionInfo, TransactionLongevity, TransactionPriority, TransactionStorageProof, TransactionTag, U32F32, ValidatorId, ValidatorIdOf, Weight, WeightMultiplier } from '@polkadot/types/interfaces/runtime'; import type { Si0Field, Si0LookupTypeId, Si0Path, Si0Type, Si0TypeDef, Si0TypeDefArray, Si0TypeDefBitSequence, Si0TypeDefCompact, Si0TypeDefComposite, Si0TypeDefPhantom, Si0TypeDefPrimitive, Si0TypeDefSequence, Si0TypeDefTuple, Si0TypeDefVariant, Si0TypeParameter, Si0Variant, Si1Field, Si1LookupTypeId, Si1Path, Si1Type, Si1TypeDef, Si1TypeDefArray, Si1TypeDefBitSequence, Si1TypeDefCompact, Si1TypeDefComposite, Si1TypeDefPrimitive, Si1TypeDefSequence, Si1TypeDefTuple, Si1TypeDefVariant, Si1TypeParameter, Si1Variant, SiField, SiLookupTypeId, SiPath, SiType, SiTypeDef, SiTypeDefArray, SiTypeDefBitSequence, SiTypeDefCompact, SiTypeDefComposite, SiTypeDefPrimitive, SiTypeDefSequence, SiTypeDefTuple, SiTypeDefVariant, SiTypeParameter, SiVariant } from '@polkadot/types/interfaces/scaleInfo'; import type { Period, Priority, SchedulePeriod, SchedulePriority, Scheduled, ScheduledTo254, TaskAddress } from '@polkadot/types/interfaces/scheduler'; import type { BeefyKey, FullIdentification, IdentificationTuple, Keys, MembershipProof, SessionIndex, SessionKeys1, SessionKeys10, SessionKeys10B, SessionKeys2, SessionKeys3, SessionKeys4, SessionKeys5, SessionKeys6, SessionKeys6B, SessionKeys7, SessionKeys7B, SessionKeys8, SessionKeys8B, SessionKeys9, SessionKeys9B, ValidatorCount } from '@polkadot/types/interfaces/session'; @@ -78,6 +81,7 @@ declare module '@polkadot/types/types/registry' { AccountId: AccountId; AccountId20: AccountId20; AccountId32: AccountId32; + AccountId33: AccountId33; AccountIdOf: AccountIdOf; AccountIndex: AccountIndex; AccountInfo: AccountInfo; @@ -155,10 +159,12 @@ declare module '@polkadot/types/types/registry' { BeefyPayload: BeefyPayload; BeefyPayloadId: BeefyPayloadId; BeefySignedCommitment: BeefySignedCommitment; + BenchmarkBatch: BenchmarkBatch; BenchmarkConfig: BenchmarkConfig; BenchmarkList: BenchmarkList; BenchmarkMetadata: BenchmarkMetadata; BenchmarkParameter: BenchmarkParameter; + BenchmarkResult: BenchmarkResult; Bid: Bid; Bidder: Bidder; BidKind: BidKind; @@ -250,6 +256,7 @@ declare module '@polkadot/types/types/registry' { ContractContractSpecV1: ContractContractSpecV1; ContractContractSpecV2: ContractContractSpecV2; ContractContractSpecV3: ContractContractSpecV3; + ContractContractSpecV4: ContractContractSpecV4; ContractCryptoHasher: ContractCryptoHasher; ContractDiscriminant: ContractDiscriminant; ContractDisplayName: ContractDisplayName; @@ -293,6 +300,7 @@ declare module '@polkadot/types/types/registry' { ContractMetadataV1: ContractMetadataV1; ContractMetadataV2: ContractMetadataV2; ContractMetadataV3: ContractMetadataV3; + ContractMetadataV4: ContractMetadataV4; ContractProject: ContractProject; ContractProjectContract: ContractProjectContract; ContractProjectInfo: ContractProjectInfo; @@ -321,6 +329,7 @@ declare module '@polkadot/types/types/registry' { DepositBalance: DepositBalance; DepositBalanceOf: DepositBalanceOf; DestroyWitness: DestroyWitness; + DidLinkedInfo: DidLinkedInfo; Digest: Digest; DigestItem: DigestItem; DigestOf: DigestOf; @@ -818,7 +827,10 @@ declare module '@polkadot/types/types/registry' { RawBabePreDigestSecondaryTo159: RawBabePreDigestSecondaryTo159; RawBabePreDigestSecondaryVRF: RawBabePreDigestSecondaryVRF; RawBabePreDigestTo159: RawBabePreDigestTo159; + RawDidDetails: RawDidDetails; + RawDidLinkedInfo: RawDidLinkedInfo; RawOrigin: RawOrigin; + RawServiceEndpoints: RawServiceEndpoints; RawSolution: RawSolution; RawSolutionTo265: RawSolutionTo265; RawSolutionWith16: RawSolutionWith16; @@ -867,7 +879,13 @@ declare module '@polkadot/types/types/registry' { RewardPoint: RewardPoint; RoundSnapshot: RoundSnapshot; RoundState: RoundState; + RpcDidDetails: RpcDidDetails; + RpcDidEncryptionKey: RpcDidEncryptionKey; + RpcDidPublicKey: RpcDidPublicKey; + RpcDidVerificationKey: RpcDidVerificationKey; RpcMethods: RpcMethods; + RpcPublicKeyDetails: RpcPublicKeyDetails; + RpcServiceEndpoint: RpcServiceEndpoint; RuntimeDbWeight: RuntimeDbWeight; RuntimeDispatchInfo: RuntimeDispatchInfo; RuntimeVersion: RuntimeVersion; @@ -990,6 +1008,7 @@ declare module '@polkadot/types/types/registry' { StakingLedger: StakingLedger; StakingLedgerTo223: StakingLedgerTo223; StakingLedgerTo240: StakingLedgerTo240; + StakingRates: StakingRates; Statement: Statement; StatementKind: StatementKind; StorageChangeSet: StorageChangeSet; diff --git a/packages/augment-api/src/interfaces/definitions.ts b/packages/augment-api/src/interfaces/definitions.ts index 25530a322..4e7e58412 100644 --- a/packages/augment-api/src/interfaces/definitions.ts +++ b/packages/augment-api/src/interfaces/definitions.ts @@ -1,3 +1,4 @@ /* eslint-disable */ export { default as extraDefs } from './extraDefs/definitions' +export { default as did } from './did/definitions' diff --git a/packages/augment-api/src/interfaces/did/definitions.ts b/packages/augment-api/src/interfaces/did/definitions.ts new file mode 100644 index 000000000..98c7d1eb7 --- /dev/null +++ b/packages/augment-api/src/interfaces/did/definitions.ts @@ -0,0 +1,9 @@ +/* eslint-disable */ + +import { rpc } from '@kiltprotocol/type-definitions' + +// Only RPC endpoints must be exported from here +export default { + types: {}, + rpc: rpc.did +} diff --git a/packages/augment-api/src/interfaces/did/index.ts b/packages/augment-api/src/interfaces/did/index.ts new file mode 100644 index 000000000..7f1de782f --- /dev/null +++ b/packages/augment-api/src/interfaces/did/index.ts @@ -0,0 +1,4 @@ +// Auto-generated via `yarn polkadot-types-from-defs`, do not edit +/* eslint-disable */ + +export * from './types.js'; diff --git a/packages/augment-api/src/interfaces/did/types.ts b/packages/augment-api/src/interfaces/did/types.ts new file mode 100644 index 000000000..fa66165ba --- /dev/null +++ b/packages/augment-api/src/interfaces/did/types.ts @@ -0,0 +1,4 @@ +// Auto-generated via `yarn polkadot-types-from-defs`, do not edit +/* eslint-disable */ + +export type PHANTOM_DID = 'did'; diff --git a/packages/augment-api/src/interfaces/extraDefs/definitions.ts b/packages/augment-api/src/interfaces/extraDefs/definitions.ts index 9562b9477..28adf2d1c 100644 --- a/packages/augment-api/src/interfaces/extraDefs/definitions.ts +++ b/packages/augment-api/src/interfaces/extraDefs/definitions.ts @@ -1,5 +1,9 @@ /* eslint-disable */ -// add any additional definitions (rpc etc) here + +import { latest, runtime } from '@kiltprotocol/type-definitions' + +// Only types and runtime calls can be exported from here. export default { - types: {}, + types: latest, + runtime } diff --git a/packages/augment-api/src/interfaces/extraDefs/types.ts b/packages/augment-api/src/interfaces/extraDefs/types.ts index 6f11e27bb..ef637b429 100644 --- a/packages/augment-api/src/interfaces/extraDefs/types.ts +++ b/packages/augment-api/src/interfaces/extraDefs/types.ts @@ -1,4 +1,105 @@ // Auto-generated via `yarn polkadot-types-from-defs`, do not edit /* eslint-disable */ +import type { BTreeMap, BTreeSet, Enum, Option, Struct, Text, Vec } from '@polkadot/types-codec'; +import type { AccountId32, AccountId33, BlockNumber, Hash, Perquintill } from '@polkadot/types/interfaces/runtime'; + +// FIXME: manually added as they are not automatically imported +import type { DidDidDetailsDidPublicKeyDetails, KiltSupportDeposit } from '@polkadot/types/lookup' + +/** @name DidLinkedInfo */ +export interface DidLinkedInfo extends Struct { + readonly identifier: AccountId32; + readonly accounts: Vec; + readonly w3n: Option; + readonly serviceEndpoints: Vec; + readonly details: RpcDidDetails; +} + +/** @name RawDidDetails */ +export interface RawDidDetails extends Struct { + readonly authenticationKey: Hash; + readonly keyAgreementKeys: BTreeSet; + readonly delegationKey: Option; + readonly attestationKey: Option; + readonly publicKeys: BTreeMap; + readonly lastTxCounter: BlockNumber; + readonly deposit: KiltSupportDeposit; +} + +/** @name RawDidLinkedInfo */ +export interface RawDidLinkedInfo extends Struct { + readonly identifier: AccountId32; + readonly accounts: Vec; + readonly w3n: Option; + readonly serviceEndpoints: Vec; + readonly details: RawDidDetails; +} + +/** @name RawServiceEndpoints */ +export interface RawServiceEndpoints extends Struct { + readonly id: Text; + readonly serviceTypes: Vec; + readonly urls: Vec; +} + +/** @name RpcDidDetails */ +export interface RpcDidDetails extends Struct { + readonly authenticationKey: Hash; + readonly keyAgreementKeys: BTreeSet; + readonly delegationKey: Option; + readonly attestationKey: Option; + readonly publicKeys: BTreeMap; + readonly lastTxCounter: BlockNumber; + readonly deposit: KiltSupportDeposit; +} + +/** @name RpcDidEncryptionKey */ +export interface RpcDidEncryptionKey extends Enum { + readonly isX25519: boolean; + readonly asX25519: AccountId32; + readonly type: 'X25519'; +} + +/** @name RpcDidPublicKey */ +export interface RpcDidPublicKey extends Enum { + readonly isPublicVerificationKey: boolean; + readonly asPublicVerificationKey: RpcDidVerificationKey; + readonly isPublicEncryptionKey: boolean; + readonly asPublicEncryptionKey: RpcDidEncryptionKey; + readonly type: 'PublicVerificationKey' | 'PublicEncryptionKey'; +} + +/** @name RpcDidVerificationKey */ +export interface RpcDidVerificationKey extends Enum { + readonly isEd25519: boolean; + readonly asEd25519: AccountId32; + readonly isSr25519: boolean; + readonly asSr25519: AccountId32; + readonly isEcdsa: boolean; + readonly asEcdsa: AccountId33; + readonly type: 'Ed25519' | 'Sr25519' | 'Ecdsa'; +} + +/** @name RpcPublicKeyDetails */ +export interface RpcPublicKeyDetails extends Struct { + readonly key: RpcDidPublicKey; + readonly blockNumber: BlockNumber; +} + +/** @name RpcServiceEndpoint */ +export interface RpcServiceEndpoint extends Struct { + readonly id: Text; + readonly serviceTypes: Vec; + readonly urls: Vec; +} + +/** @name StakingRates */ +export interface StakingRates extends Struct { + readonly collatorStakingRate: Perquintill; + readonly collatorRewardRate: Perquintill; + readonly delegatorStakingRate: Perquintill; + readonly delegatorRewardRate: Perquintill; +} + export type PHANTOM_EXTRADEFS = 'extraDefs'; diff --git a/packages/augment-api/src/interfaces/lookup.ts b/packages/augment-api/src/interfaces/lookup.ts index 5f3f72b70..0d609d2b1 100644 --- a/packages/augment-api/src/interfaces/lookup.ts +++ b/packages/augment-api/src/interfaces/lookup.ts @@ -227,7 +227,19 @@ export default { _enum: ['Free', 'Reserved'] }, /** - * Lookup30: parachain_staking::pallet::Event + * Lookup30: pallet_transaction_payment::pallet::Event + **/ + PalletTransactionPaymentEvent: { + _enum: { + TransactionFeePaid: { + who: 'AccountId32', + actualFee: 'u128', + tip: 'u128' + } + } + }, + /** + * Lookup31: parachain_staking::pallet::Event **/ ParachainStakingEvent: { _enum: { @@ -255,7 +267,7 @@ export default { } }, /** - * Lookup32: pallet_session::pallet::Event + * Lookup33: pallet_session::pallet::Event **/ PalletSessionEvent: { _enum: { @@ -265,7 +277,7 @@ export default { } }, /** - * Lookup33: pallet_democracy::pallet::Event + * Lookup34: pallet_democracy::pallet::Event **/ PalletDemocracyEvent: { _enum: { @@ -342,18 +354,21 @@ export default { }, Seconded: { seconder: 'AccountId32', + propIndex: 'u32', + }, + ProposalCanceled: { propIndex: 'u32' } } }, /** - * Lookup35: pallet_democracy::vote_threshold::VoteThreshold + * Lookup36: pallet_democracy::vote_threshold::VoteThreshold **/ PalletDemocracyVoteThreshold: { _enum: ['SuperMajorityApprove', 'SuperMajorityAgainst', 'SimpleMajority'] }, /** - * Lookup38: pallet_democracy::vote::AccountVote + * Lookup39: pallet_democracy::vote::AccountVote **/ PalletDemocracyVoteAccountVote: { _enum: { @@ -368,7 +383,7 @@ export default { } }, /** - * Lookup40: pallet_collective::pallet::Event + * Lookup41: pallet_collective::pallet::Event **/ PalletCollectiveEvent: { _enum: { @@ -407,13 +422,13 @@ export default { } }, /** - * Lookup43: pallet_membership::pallet::Event + * Lookup44: pallet_membership::pallet::Event **/ PalletMembershipEvent: { _enum: ['MemberAdded', 'MemberRemoved', 'MembersSwapped', 'MembersReset', 'KeyChanged', 'Dummy'] }, /** - * Lookup44: pallet_treasury::pallet::Event + * Lookup45: pallet_treasury::pallet::Event **/ PalletTreasuryEvent: { _enum: { @@ -439,12 +454,46 @@ export default { rolloverBalance: 'u128', }, Deposit: { - value: 'u128' + value: 'u128', + }, + SpendApproved: { + proposalIndex: 'u32', + amount: 'u128', + beneficiary: 'AccountId32' } } }, /** - * Lookup45: pallet_utility::pallet::Event + * Lookup46: pallet_relay_migration::pallet::Event + **/ + PalletRelayMigrationEvent: { + _enum: { + LeaseSwapInitiated: 'Null', + RelayNumberCheckSet: { + strict: 'bool' + } + } + }, + /** + * Lookup47: pallet_dyn_filter::pallet::Event + **/ + PalletDynFilterEvent: { + _enum: { + NewFilterRules: { + rules: 'PalletDynFilterSettingFilterSettings' + } + } + }, + /** + * Lookup48: pallet_dyn_filter::setting::FilterSettings + **/ + PalletDynFilterSettingFilterSettings: { + transferDisabled: 'bool', + featureDisabled: 'bool', + xcmDisabled: 'bool' + }, + /** + * Lookup49: pallet_utility::pallet::Event **/ PalletUtilityEvent: { _enum: { @@ -464,7 +513,7 @@ export default { } }, /** - * Lookup46: pallet_vesting::pallet::Event + * Lookup50: pallet_vesting::pallet::Event **/ PalletVestingEvent: { _enum: { @@ -478,7 +527,7 @@ export default { } }, /** - * Lookup47: pallet_scheduler::pallet::Event + * Lookup51: pallet_scheduler::pallet::Event **/ PalletSchedulerEvent: { _enum: { @@ -503,13 +552,13 @@ export default { } }, /** - * Lookup50: frame_support::traits::schedule::LookupError + * Lookup54: frame_support::traits::schedule::LookupError **/ FrameSupportScheduleLookupError: { _enum: ['Unknown', 'BadFormat'] }, /** - * Lookup51: pallet_proxy::pallet::Event + * Lookup55: pallet_proxy::pallet::Event **/ PalletProxyEvent: { _enum: { @@ -542,13 +591,13 @@ export default { } }, /** - * Lookup52: spiritnet_runtime::ProxyType + * Lookup56: spiritnet_runtime::ProxyType **/ SpiritnetRuntimeProxyType: { _enum: ['Any', 'NonTransfer', 'Governance', 'ParachainStaking', 'CancelProxy', 'NonDepositClaiming'] }, /** - * Lookup54: pallet_preimage::pallet::Event + * Lookup58: pallet_preimage::pallet::Event **/ PalletPreimageEvent: { _enum: { @@ -573,7 +622,7 @@ export default { } }, /** - * Lookup56: pallet_tips::pallet::Event + * Lookup60: pallet_tips::pallet::Event **/ PalletTipsEvent: { _enum: { @@ -599,7 +648,7 @@ export default { } }, /** - * Lookup57: ctype::pallet::Event + * Lookup61: ctype::pallet::Event **/ CtypeEvent: { _enum: { @@ -607,7 +656,7 @@ export default { } }, /** - * Lookup58: attestation::pallet::Event + * Lookup62: attestation::pallet::Event **/ AttestationEvent: { _enum: { @@ -618,7 +667,7 @@ export default { } }, /** - * Lookup60: runtime_common::authorization::AuthorizationId + * Lookup64: runtime_common::authorization::AuthorizationId **/ RuntimeCommonAuthorizationAuthorizationId: { _enum: { @@ -626,7 +675,7 @@ export default { } }, /** - * Lookup61: delegation::pallet::Event + * Lookup65: delegation::pallet::Event **/ DelegationEvent: { _enum: { @@ -640,13 +689,13 @@ export default { } }, /** - * Lookup62: delegation::delegation_hierarchy::Permissions + * Lookup66: delegation::delegation_hierarchy::Permissions **/ DelegationDelegationHierarchyPermissions: { bits: 'u32' }, /** - * Lookup63: did::pallet::Event + * Lookup67: did::pallet::Event **/ DidEvent: { _enum: { @@ -657,7 +706,7 @@ export default { } }, /** - * Lookup64: pallet_did_lookup::pallet::Event + * Lookup68: pallet_did_lookup::pallet::Event **/ PalletDidLookupEvent: { _enum: { @@ -666,7 +715,7 @@ export default { } }, /** - * Lookup65: pallet_web3_names::pallet::Event + * Lookup69: pallet_web3_names::pallet::Event **/ PalletWeb3NamesEvent: { _enum: { @@ -687,7 +736,7 @@ export default { } }, /** - * Lookup68: cumulus_pallet_parachain_system::pallet::Event + * Lookup72: cumulus_pallet_parachain_system::pallet::Event **/ CumulusPalletParachainSystemEvent: { _enum: { @@ -709,22 +758,45 @@ export default { } }, /** - * Lookup69: cumulus_pallet_xcmp_queue::pallet::Event + * Lookup73: cumulus_pallet_xcmp_queue::pallet::Event **/ CumulusPalletXcmpQueueEvent: { _enum: { - Success: 'Option', - Fail: '(Option,XcmV2TraitsError)', - BadVersion: 'Option', - BadFormat: 'Option', - UpwardMessageSent: 'Option', - XcmpMessageSent: 'Option', - OverweightEnqueued: '(u32,u32,u64,u64)', - OverweightServiced: '(u64,u64)' + Success: { + messageHash: 'Option', + weight: 'u64', + }, + Fail: { + messageHash: 'Option', + error: 'XcmV2TraitsError', + weight: 'u64', + }, + BadVersion: { + messageHash: 'Option', + }, + BadFormat: { + messageHash: 'Option', + }, + UpwardMessageSent: { + messageHash: 'Option', + }, + XcmpMessageSent: { + messageHash: 'Option', + }, + OverweightEnqueued: { + sender: 'u32', + sentAt: 'u32', + index: 'u64', + required: 'u64', + }, + OverweightServiced: { + index: 'u64', + used: 'u64' + } } }, /** - * Lookup71: xcm::v2::traits::Error + * Lookup75: xcm::v2::traits::Error **/ XcmV2TraitsError: { _enum: { @@ -757,7 +829,7 @@ export default { } }, /** - * Lookup73: pallet_xcm::pallet::Event + * Lookup77: pallet_xcm::pallet::Event **/ PalletXcmEvent: { _enum: { @@ -780,7 +852,7 @@ export default { } }, /** - * Lookup74: xcm::v2::traits::Outcome + * Lookup78: xcm::v2::traits::Outcome **/ XcmV2TraitsOutcome: { _enum: { @@ -790,14 +862,14 @@ export default { } }, /** - * Lookup75: xcm::v1::multilocation::MultiLocation + * Lookup79: xcm::v1::multilocation::MultiLocation **/ XcmV1MultiLocation: { parents: 'u8', interior: 'XcmV1MultilocationJunctions' }, /** - * Lookup76: xcm::v1::multilocation::Junctions + * Lookup80: xcm::v1::multilocation::Junctions **/ XcmV1MultilocationJunctions: { _enum: { @@ -813,7 +885,7 @@ export default { } }, /** - * Lookup77: xcm::v1::junction::Junction + * Lookup81: xcm::v1::junction::Junction **/ XcmV1Junction: { _enum: { @@ -841,7 +913,7 @@ export default { } }, /** - * Lookup79: xcm::v0::junction::NetworkId + * Lookup83: xcm::v0::junction::NetworkId **/ XcmV0JunctionNetworkId: { _enum: { @@ -852,7 +924,7 @@ export default { } }, /** - * Lookup83: xcm::v0::junction::BodyId + * Lookup88: xcm::v0::junction::BodyId **/ XcmV0JunctionBodyId: { _enum: { @@ -866,7 +938,7 @@ export default { } }, /** - * Lookup84: xcm::v0::junction::BodyPart + * Lookup89: xcm::v0::junction::BodyPart **/ XcmV0JunctionBodyPart: { _enum: { @@ -889,11 +961,11 @@ export default { } }, /** - * Lookup85: xcm::v2::Xcm + * Lookup90: xcm::v2::Xcm **/ XcmV2Xcm: 'Vec', /** - * Lookup87: xcm::v2::Instruction + * Lookup92: xcm::v2::Instruction **/ XcmV2Instruction: { _enum: { @@ -991,18 +1063,18 @@ export default { } }, /** - * Lookup88: xcm::v1::multiasset::MultiAssets + * Lookup93: xcm::v1::multiasset::MultiAssets **/ XcmV1MultiassetMultiAssets: 'Vec', /** - * Lookup90: xcm::v1::multiasset::MultiAsset + * Lookup95: xcm::v1::multiasset::MultiAsset **/ XcmV1MultiAsset: { id: 'XcmV1MultiassetAssetId', fun: 'XcmV1MultiassetFungibility' }, /** - * Lookup91: xcm::v1::multiasset::AssetId + * Lookup96: xcm::v1::multiasset::AssetId **/ XcmV1MultiassetAssetId: { _enum: { @@ -1011,7 +1083,7 @@ export default { } }, /** - * Lookup92: xcm::v1::multiasset::Fungibility + * Lookup97: xcm::v1::multiasset::Fungibility **/ XcmV1MultiassetFungibility: { _enum: { @@ -1020,7 +1092,7 @@ export default { } }, /** - * Lookup93: xcm::v1::multiasset::AssetInstance + * Lookup98: xcm::v1::multiasset::AssetInstance **/ XcmV1MultiassetAssetInstance: { _enum: { @@ -1034,7 +1106,7 @@ export default { } }, /** - * Lookup96: xcm::v2::Response + * Lookup101: xcm::v2::Response **/ XcmV2Response: { _enum: { @@ -1045,19 +1117,19 @@ export default { } }, /** - * Lookup99: xcm::v0::OriginKind + * Lookup104: xcm::v0::OriginKind **/ XcmV0OriginKind: { _enum: ['Native', 'SovereignAccount', 'Superuser', 'Xcm'] }, /** - * Lookup100: xcm::double_encoded::DoubleEncoded + * Lookup105: xcm::double_encoded::DoubleEncoded **/ XcmDoubleEncoded: { encoded: 'Bytes' }, /** - * Lookup101: xcm::v1::multiasset::MultiAssetFilter + * Lookup106: xcm::v1::multiasset::MultiAssetFilter **/ XcmV1MultiassetMultiAssetFilter: { _enum: { @@ -1066,7 +1138,7 @@ export default { } }, /** - * Lookup102: xcm::v1::multiasset::WildMultiAsset + * Lookup107: xcm::v1::multiasset::WildMultiAsset **/ XcmV1MultiassetWildMultiAsset: { _enum: { @@ -1078,13 +1150,13 @@ export default { } }, /** - * Lookup103: xcm::v1::multiasset::WildFungibility + * Lookup108: xcm::v1::multiasset::WildFungibility **/ XcmV1MultiassetWildFungibility: { _enum: ['Fungible', 'NonFungible'] }, /** - * Lookup104: xcm::v2::WeightLimit + * Lookup109: xcm::v2::WeightLimit **/ XcmV2WeightLimit: { _enum: { @@ -1093,7 +1165,7 @@ export default { } }, /** - * Lookup106: xcm::VersionedMultiAssets + * Lookup111: xcm::VersionedMultiAssets **/ XcmVersionedMultiAssets: { _enum: { @@ -1102,7 +1174,7 @@ export default { } }, /** - * Lookup108: xcm::v0::multi_asset::MultiAsset + * Lookup113: xcm::v0::multi_asset::MultiAsset **/ XcmV0MultiAsset: { _enum: { @@ -1141,7 +1213,7 @@ export default { } }, /** - * Lookup109: xcm::v0::multi_location::MultiLocation + * Lookup114: xcm::v0::multi_location::MultiLocation **/ XcmV0MultiLocation: { _enum: { @@ -1157,7 +1229,7 @@ export default { } }, /** - * Lookup110: xcm::v0::junction::Junction + * Lookup115: xcm::v0::junction::Junction **/ XcmV0Junction: { _enum: { @@ -1186,7 +1258,7 @@ export default { } }, /** - * Lookup111: xcm::VersionedMultiLocation + * Lookup116: xcm::VersionedMultiLocation **/ XcmVersionedMultiLocation: { _enum: { @@ -1195,7 +1267,7 @@ export default { } }, /** - * Lookup112: cumulus_pallet_xcm::pallet::Event + * Lookup117: cumulus_pallet_xcm::pallet::Event **/ CumulusPalletXcmEvent: { _enum: { @@ -1205,7 +1277,7 @@ export default { } }, /** - * Lookup113: cumulus_pallet_dmp_queue::pallet::Event + * Lookup118: cumulus_pallet_dmp_queue::pallet::Event **/ CumulusPalletDmpQueueEvent: { _enum: { @@ -1236,7 +1308,7 @@ export default { } }, /** - * Lookup114: frame_system::Phase + * Lookup119: frame_system::Phase **/ FrameSystemPhase: { _enum: { @@ -1246,14 +1318,14 @@ export default { } }, /** - * Lookup117: frame_system::LastRuntimeUpgradeInfo + * Lookup122: frame_system::LastRuntimeUpgradeInfo **/ FrameSystemLastRuntimeUpgradeInfo: { specVersion: 'Compact', specName: 'Text' }, /** - * Lookup119: frame_system::pallet::Call + * Lookup124: frame_system::pallet::Call **/ FrameSystemCall: { _enum: { @@ -1291,7 +1363,7 @@ export default { } }, /** - * Lookup124: frame_system::limits::BlockWeights + * Lookup129: frame_system::limits::BlockWeights **/ FrameSystemLimitsBlockWeights: { baseBlock: 'u64', @@ -1299,7 +1371,7 @@ export default { perClass: 'FrameSupportWeightsPerDispatchClassWeightsPerClass' }, /** - * Lookup125: frame_support::weights::PerDispatchClass + * Lookup130: frame_support::weights::PerDispatchClass **/ FrameSupportWeightsPerDispatchClassWeightsPerClass: { normal: 'FrameSystemLimitsWeightsPerClass', @@ -1307,7 +1379,7 @@ export default { mandatory: 'FrameSystemLimitsWeightsPerClass' }, /** - * Lookup126: frame_system::limits::WeightsPerClass + * Lookup131: frame_system::limits::WeightsPerClass **/ FrameSystemLimitsWeightsPerClass: { baseExtrinsic: 'u64', @@ -1316,13 +1388,13 @@ export default { reserved: 'Option' }, /** - * Lookup128: frame_system::limits::BlockLength + * Lookup133: frame_system::limits::BlockLength **/ FrameSystemLimitsBlockLength: { max: 'FrameSupportWeightsPerDispatchClassU32' }, /** - * Lookup129: frame_support::weights::PerDispatchClass + * Lookup134: frame_support::weights::PerDispatchClass **/ FrameSupportWeightsPerDispatchClassU32: { normal: 'u32', @@ -1330,14 +1402,14 @@ export default { mandatory: 'u32' }, /** - * Lookup130: frame_support::weights::RuntimeDbWeight + * Lookup135: frame_support::weights::RuntimeDbWeight **/ FrameSupportWeightsRuntimeDbWeight: { read: 'u64', write: 'u64' }, /** - * Lookup131: sp_version::RuntimeVersion + * Lookup136: sp_version::RuntimeVersion **/ SpVersionRuntimeVersion: { specName: 'Text', @@ -1350,13 +1422,13 @@ export default { stateVersion: 'u8' }, /** - * Lookup135: frame_system::pallet::Error + * Lookup140: frame_system::pallet::Error **/ FrameSystemError: { _enum: ['InvalidSpecName', 'SpecVersionNeedsToIncrease', 'FailedToExtractRuntimeVersion', 'NonDefaultComposite', 'NonZeroRefCount', 'CallFiltered'] }, /** - * Lookup137: pallet_timestamp::pallet::Call + * Lookup142: pallet_timestamp::pallet::Call **/ PalletTimestampCall: { _enum: { @@ -1366,7 +1438,7 @@ export default { } }, /** - * Lookup139: pallet_indices::pallet::Call + * Lookup144: pallet_indices::pallet::Call **/ PalletIndicesCall: { _enum: { @@ -1397,13 +1469,13 @@ export default { } }, /** - * Lookup140: pallet_indices::pallet::Error + * Lookup145: pallet_indices::pallet::Error **/ PalletIndicesError: { _enum: ['NotAssigned', 'NotOwner', 'InUse', 'NotTransfer', 'Permanent'] }, /** - * Lookup142: pallet_balances::BalanceLock + * Lookup147: pallet_balances::BalanceLock **/ PalletBalancesBalanceLock: { id: '[u8;8]', @@ -1411,26 +1483,26 @@ export default { reasons: 'PalletBalancesReasons' }, /** - * Lookup143: pallet_balances::Reasons + * Lookup148: pallet_balances::Reasons **/ PalletBalancesReasons: { _enum: ['Fee', 'Misc', 'All'] }, /** - * Lookup146: pallet_balances::ReserveData + * Lookup151: pallet_balances::ReserveData **/ PalletBalancesReserveData: { id: '[u8;8]', amount: 'u128' }, /** - * Lookup148: pallet_balances::Releases + * Lookup153: pallet_balances::Releases **/ PalletBalancesReleases: { _enum: ['V1_0_0', 'V2_0_0'] }, /** - * Lookup149: pallet_balances::pallet::Call + * Lookup154: pallet_balances::pallet::Call **/ PalletBalancesCall: { _enum: { @@ -1463,19 +1535,19 @@ export default { } }, /** - * Lookup152: pallet_balances::pallet::Error + * Lookup157: pallet_balances::pallet::Error **/ PalletBalancesError: { _enum: ['VestingBalance', 'LiquidityRestrictions', 'InsufficientBalance', 'ExistentialDeposit', 'KeepAlive', 'ExistingVestingSchedule', 'DeadAccount', 'TooManyReserves'] }, /** - * Lookup154: pallet_transaction_payment::Releases + * Lookup159: pallet_transaction_payment::Releases **/ PalletTransactionPaymentReleases: { _enum: ['V1Ancient', 'V2'] }, /** - * Lookup156: pallet_authorship::UncleEntryItem + * Lookup161: pallet_authorship::UncleEntryItem **/ PalletAuthorshipUncleEntryItem: { _enum: { @@ -1484,7 +1556,7 @@ export default { } }, /** - * Lookup158: pallet_authorship::pallet::Call + * Lookup164: pallet_authorship::pallet::Call **/ PalletAuthorshipCall: { _enum: { @@ -1494,7 +1566,7 @@ export default { } }, /** - * Lookup160: sp_runtime::generic::header::Header + * Lookup166: sp_runtime::generic::header::Header **/ SpRuntimeHeader: { parentHash: 'H256', @@ -1504,17 +1576,17 @@ export default { digest: 'SpRuntimeDigest' }, /** - * Lookup161: sp_runtime::traits::BlakeTwo256 + * Lookup167: sp_runtime::traits::BlakeTwo256 **/ SpRuntimeBlakeTwo256: 'Null', /** - * Lookup162: pallet_authorship::pallet::Error + * Lookup168: pallet_authorship::pallet::Error **/ PalletAuthorshipError: { _enum: ['InvalidUncleParent', 'UnclesAlreadySet', 'TooManyUncles', 'GenesisUncle', 'TooHighUncle', 'UncleAlreadyIncluded', 'OldUncle'] }, /** - * Lookup163: parachain_staking::types::RoundInfo + * Lookup169: parachain_staking::types::RoundInfo **/ ParachainStakingRoundInfo: { current: 'u32', @@ -1522,32 +1594,32 @@ export default { length: 'u64' }, /** - * Lookup164: parachain_staking::types::DelegationCounter + * Lookup170: parachain_staking::types::DelegationCounter **/ ParachainStakingDelegationCounter: { round: 'u32', counter: 'u32' }, /** - * Lookup165: parachain_staking::types::Delegator + * Lookup171: parachain_staking::types::Delegator **/ ParachainStakingDelegator: { delegations: 'ParachainStakingSetOrderedSet', total: 'u128' }, /** - * Lookup166: parachain_staking::set::OrderedSet, S> + * Lookup172: parachain_staking::set::OrderedSet, S> **/ ParachainStakingSetOrderedSet: 'Vec', /** - * Lookup167: parachain_staking::types::Stake + * Lookup173: parachain_staking::types::Stake **/ ParachainStakingStake: { owner: 'AccountId32', amount: 'u128' }, /** - * Lookup170: parachain_staking::types::Candidate + * Lookup176: parachain_staking::types::Candidate **/ ParachainStakingCandidate: { id: 'AccountId32', @@ -1557,7 +1629,7 @@ export default { status: 'ParachainStakingCandidateStatus' }, /** - * Lookup173: parachain_staking::types::CandidateStatus + * Lookup179: parachain_staking::types::CandidateStatus **/ ParachainStakingCandidateStatus: { _enum: { @@ -1566,35 +1638,35 @@ export default { } }, /** - * Lookup174: parachain_staking::types::TotalStake + * Lookup180: parachain_staking::types::TotalStake **/ ParachainStakingTotalStake: { collators: 'u128', delegators: 'u128' }, /** - * Lookup177: parachain_staking::inflation::InflationInfo + * Lookup183: parachain_staking::inflation::InflationInfo **/ ParachainStakingInflationInflationInfo: { collator: 'ParachainStakingInflationStakingInfo', delegator: 'ParachainStakingInflationStakingInfo' }, /** - * Lookup178: parachain_staking::inflation::StakingInfo + * Lookup184: parachain_staking::inflation::StakingInfo **/ ParachainStakingInflationStakingInfo: { maxRate: 'Perquintill', rewardRate: 'ParachainStakingInflationRewardRate' }, /** - * Lookup179: parachain_staking::inflation::RewardRate + * Lookup185: parachain_staking::inflation::RewardRate **/ ParachainStakingInflationRewardRate: { annual: 'Perquintill', perBlock: 'Perquintill' }, /** - * Lookup184: parachain_staking::pallet::Call + * Lookup190: parachain_staking::pallet::Call **/ ParachainStakingCall: { _enum: { @@ -1666,31 +1738,31 @@ export default { } }, /** - * Lookup185: parachain_staking::pallet::Error + * Lookup191: parachain_staking::pallet::Error **/ ParachainStakingError: { _enum: ['DelegatorNotFound', 'CandidateNotFound', 'DelegatorExists', 'CandidateExists', 'ValStakeZero', 'ValStakeBelowMin', 'ValStakeAboveMax', 'NomStakeBelowMin', 'DelegationBelowMin', 'AlreadyLeaving', 'NotLeaving', 'CannotLeaveYet', 'CannotJoinBeforeUnlocking', 'AlreadyDelegating', 'NotYetDelegating', 'DelegationsPerRoundExceeded', 'TooManyDelegators', 'TooFewCollatorCandidates', 'CannotStakeIfLeaving', 'CannotDelegateIfLeaving', 'MaxCollatorsPerDelegatorExceeded', 'AlreadyDelegatedCollator', 'DelegationNotFound', 'Underflow', 'CannotSetAboveMax', 'CannotSetBelowMin', 'InvalidSchedule', 'NoMoreUnstaking', 'StakeNotFound', 'UnstakingIsEmpty'] }, /** - * Lookup188: spiritnet_runtime::SessionKeys + * Lookup194: spiritnet_runtime::SessionKeys **/ SpiritnetRuntimeSessionKeys: { aura: 'SpConsensusAuraSr25519AppSr25519Public' }, /** - * Lookup189: sp_consensus_aura::sr25519::app_sr25519::Public + * Lookup195: sp_consensus_aura::sr25519::app_sr25519::Public **/ SpConsensusAuraSr25519AppSr25519Public: 'SpCoreSr25519Public', /** - * Lookup190: sp_core::sr25519::Public + * Lookup196: sp_core::sr25519::Public **/ SpCoreSr25519Public: '[u8;32]', /** - * Lookup193: sp_core::crypto::KeyTypeId + * Lookup199: sp_core::crypto::KeyTypeId **/ SpCoreCryptoKeyTypeId: '[u8;4]', /** - * Lookup194: pallet_session::pallet::Call + * Lookup200: pallet_session::pallet::Call **/ PalletSessionCall: { _enum: { @@ -1705,17 +1777,13 @@ export default { } }, /** - * Lookup195: pallet_session::pallet::Error + * Lookup201: pallet_session::pallet::Error **/ PalletSessionError: { _enum: ['InvalidProof', 'NoAssociatedValidatorId', 'DuplicatedKey', 'NoKeys', 'NoAccount'] }, /** - * Lookup199: cumulus_pallet_aura_ext::pallet::Call - **/ - CumulusPalletAuraExtCall: 'Null', - /** - * Lookup203: pallet_democracy::PreimageStatus + * Lookup208: pallet_democracy::PreimageStatus **/ PalletDemocracyPreimageStatus: { _enum: { @@ -1730,7 +1798,7 @@ export default { } }, /** - * Lookup204: pallet_democracy::types::ReferendumInfo + * Lookup209: pallet_democracy::types::ReferendumInfo **/ PalletDemocracyReferendumInfo: { _enum: { @@ -1742,7 +1810,7 @@ export default { } }, /** - * Lookup205: pallet_democracy::types::ReferendumStatus + * Lookup210: pallet_democracy::types::ReferendumStatus **/ PalletDemocracyReferendumStatus: { end: 'u64', @@ -1752,7 +1820,7 @@ export default { tally: 'PalletDemocracyTally' }, /** - * Lookup206: pallet_democracy::types::Tally + * Lookup211: pallet_democracy::types::Tally **/ PalletDemocracyTally: { ayes: 'u128', @@ -1760,7 +1828,7 @@ export default { turnout: 'u128' }, /** - * Lookup207: pallet_democracy::vote::Voting + * Lookup212: pallet_democracy::vote::Voting **/ PalletDemocracyVoteVoting: { _enum: { @@ -1779,30 +1847,30 @@ export default { } }, /** - * Lookup210: pallet_democracy::types::Delegations + * Lookup215: pallet_democracy::types::Delegations **/ PalletDemocracyDelegations: { votes: 'u128', capital: 'u128' }, /** - * Lookup211: pallet_democracy::vote::PriorLock + * Lookup216: pallet_democracy::vote::PriorLock **/ PalletDemocracyVotePriorLock: '(u64,u128)', /** - * Lookup212: pallet_democracy::conviction::Conviction + * Lookup217: pallet_democracy::conviction::Conviction **/ PalletDemocracyConviction: { _enum: ['None', 'Locked1x', 'Locked2x', 'Locked3x', 'Locked4x', 'Locked5x', 'Locked6x'] }, /** - * Lookup215: pallet_democracy::Releases + * Lookup220: pallet_democracy::Releases **/ PalletDemocracyReleases: { _enum: ['V1'] }, /** - * Lookup216: pallet_democracy::pallet::Call + * Lookup221: pallet_democracy::pallet::Call **/ PalletDemocracyCall: { _enum: { @@ -1891,13 +1959,13 @@ export default { } }, /** - * Lookup218: pallet_democracy::pallet::Error + * Lookup223: pallet_democracy::pallet::Error **/ PalletDemocracyError: { - _enum: ['ValueLow', 'ProposalMissing', 'AlreadyCanceled', 'DuplicateProposal', 'ProposalBlacklisted', 'NotSimpleMajority', 'InvalidHash', 'NoProposal', 'AlreadyVetoed', 'DuplicatePreimage', 'NotImminent', 'TooEarly', 'Imminent', 'PreimageMissing', 'ReferendumInvalid', 'PreimageInvalid', 'NoneWaiting', 'NotVoter', 'NoPermission', 'AlreadyDelegating', 'InsufficientFunds', 'NotDelegating', 'VotesExist', 'InstantNotAllowed', 'Nonsense', 'WrongUpperBound', 'MaxVotesReached', 'TooManyProposals'] + _enum: ['ValueLow', 'ProposalMissing', 'AlreadyCanceled', 'DuplicateProposal', 'ProposalBlacklisted', 'NotSimpleMajority', 'InvalidHash', 'NoProposal', 'AlreadyVetoed', 'DuplicatePreimage', 'NotImminent', 'TooEarly', 'Imminent', 'PreimageMissing', 'ReferendumInvalid', 'PreimageInvalid', 'NoneWaiting', 'NotVoter', 'NoPermission', 'AlreadyDelegating', 'InsufficientFunds', 'NotDelegating', 'VotesExist', 'InstantNotAllowed', 'Nonsense', 'WrongUpperBound', 'MaxVotesReached', 'TooManyProposals', 'VotingPeriodLow'] }, /** - * Lookup221: pallet_collective::pallet::Call + * Lookup226: pallet_collective::pallet::Call **/ PalletCollectiveCall: { _enum: { @@ -1932,7 +2000,7 @@ export default { } }, /** - * Lookup223: pallet_membership::pallet::Call + * Lookup228: pallet_membership::pallet::Call **/ PalletMembershipCall: { _enum: { @@ -1962,7 +2030,7 @@ export default { } }, /** - * Lookup224: pallet_treasury::pallet::Call + * Lookup229: pallet_treasury::pallet::Call **/ PalletTreasuryCall: { _enum: { @@ -1976,13 +2044,41 @@ export default { approve_proposal: { proposalId: 'Compact', }, + spend: { + amount: 'Compact', + beneficiary: 'MultiAddress', + }, remove_approval: { proposalId: 'Compact' } } }, /** - * Lookup225: pallet_utility::pallet::Call + * Lookup230: pallet_relay_migration::pallet::Call + **/ + PalletRelayMigrationCall: { + _enum: { + send_swap_call_bytes: { + relayCall: 'Bytes', + relayBalance: 'u128', + maxWeight: 'u64', + }, + enable_strict_relay_number_check: 'Null', + disable_strict_relay_number_check: 'Null' + } + }, + /** + * Lookup231: pallet_dyn_filter::pallet::Call + **/ + PalletDynFilterCall: { + _enum: { + set_filter: { + filter: 'PalletDynFilterSettingFilterSettings' + } + } + }, + /** + * Lookup232: pallet_utility::pallet::Call **/ PalletUtilityCall: { _enum: { @@ -2006,7 +2102,7 @@ export default { } }, /** - * Lookup227: spiritnet_runtime::OriginCaller + * Lookup234: spiritnet_runtime::OriginCaller **/ SpiritnetRuntimeOriginCaller: { _enum: { @@ -2098,7 +2194,7 @@ export default { } }, /** - * Lookup228: frame_support::dispatch::RawOrigin + * Lookup235: frame_support::dispatch::RawOrigin **/ FrameSupportDispatchRawOrigin: { _enum: { @@ -2108,7 +2204,7 @@ export default { } }, /** - * Lookup229: pallet_collective::RawOrigin + * Lookup236: pallet_collective::RawOrigin **/ PalletCollectiveRawOrigin: { _enum: { @@ -2118,14 +2214,14 @@ export default { } }, /** - * Lookup231: did::origin::DidRawOrigin + * Lookup238: did::origin::DidRawOrigin **/ DidOriginDidRawOrigin: { id: 'AccountId32', submitter: 'AccountId32' }, /** - * Lookup232: pallet_xcm::pallet::Origin + * Lookup239: pallet_xcm::pallet::Origin **/ PalletXcmOrigin: { _enum: { @@ -2134,7 +2230,7 @@ export default { } }, /** - * Lookup233: cumulus_pallet_xcm::pallet::Origin + * Lookup240: cumulus_pallet_xcm::pallet::Origin **/ CumulusPalletXcmOrigin: { _enum: { @@ -2143,11 +2239,11 @@ export default { } }, /** - * Lookup234: sp_core::Void + * Lookup241: sp_core::Void **/ SpCoreVoid: 'Null', /** - * Lookup235: pallet_vesting::pallet::Call + * Lookup242: pallet_vesting::pallet::Call **/ PalletVestingCall: { _enum: { @@ -2171,7 +2267,7 @@ export default { } }, /** - * Lookup236: pallet_vesting::vesting_info::VestingInfo + * Lookup243: pallet_vesting::vesting_info::VestingInfo **/ PalletVestingVestingInfo: { locked: 'u128', @@ -2179,7 +2275,7 @@ export default { startingBlock: 'u64' }, /** - * Lookup237: pallet_scheduler::pallet::Call + * Lookup244: pallet_scheduler::pallet::Call **/ PalletSchedulerCall: { _enum: { @@ -2219,7 +2315,7 @@ export default { } }, /** - * Lookup239: frame_support::traits::schedule::MaybeHashed + * Lookup246: frame_support::traits::schedule::MaybeHashed **/ FrameSupportScheduleMaybeHashed: { _enum: { @@ -2228,7 +2324,7 @@ export default { } }, /** - * Lookup240: pallet_proxy::pallet::Call + * Lookup247: pallet_proxy::pallet::Call **/ PalletProxyCall: { _enum: { @@ -2281,7 +2377,7 @@ export default { } }, /** - * Lookup242: pallet_preimage::pallet::Call + * Lookup249: pallet_preimage::pallet::Call **/ PalletPreimageCall: { _enum: { @@ -2309,7 +2405,7 @@ export default { } }, /** - * Lookup244: pallet_tips::pallet::Call + * Lookup251: pallet_tips::pallet::Call **/ PalletTipsCall: { _enum: { @@ -2350,7 +2446,7 @@ export default { } }, /** - * Lookup245: ctype::pallet::Call + * Lookup252: ctype::pallet::Call **/ CtypeCall: { _enum: { @@ -2360,7 +2456,7 @@ export default { } }, /** - * Lookup246: attestation::pallet::Call + * Lookup253: attestation::pallet::Call **/ AttestationCall: { _enum: { @@ -2383,7 +2479,7 @@ export default { } }, /** - * Lookup248: runtime_common::authorization::PalletAuthorize> + * Lookup255: runtime_common::authorization::PalletAuthorize> **/ RuntimeCommonAuthorizationPalletAuthorize: { _enum: { @@ -2391,18 +2487,18 @@ export default { } }, /** - * Lookup249: delegation::access_control::DelegationAc + * Lookup256: delegation::access_control::DelegationAc **/ DelegationAccessControlDelegationAc: { subjectNodeId: 'H256', maxChecks: 'u32' }, /** - * Lookup250: spiritnet_runtime::Runtime + * Lookup257: spiritnet_runtime::Runtime **/ SpiritnetRuntimeRuntime: 'Null', /** - * Lookup251: delegation::pallet::Call + * Lookup258: delegation::pallet::Call **/ DelegationCall: { _enum: { @@ -2433,7 +2529,7 @@ export default { } }, /** - * Lookup252: did::did_details::DidSignature + * Lookup259: did::did_details::DidSignature **/ DidDidDetailsDidSignature: { _enum: { @@ -2443,19 +2539,19 @@ export default { } }, /** - * Lookup253: sp_core::ed25519::Signature + * Lookup260: sp_core::ed25519::Signature **/ SpCoreEd25519Signature: '[u8;64]', /** - * Lookup255: sp_core::sr25519::Signature + * Lookup262: sp_core::sr25519::Signature **/ SpCoreSr25519Signature: '[u8;64]', /** - * Lookup256: sp_core::ecdsa::Signature + * Lookup263: sp_core::ecdsa::Signature **/ SpCoreEcdsaSignature: '[u8;65]', /** - * Lookup258: did::pallet::Call + * Lookup265: did::pallet::Call **/ DidCall: { _enum: { @@ -2500,7 +2596,7 @@ export default { } }, /** - * Lookup259: did::did_details::DidCreationDetails + * Lookup266: did::did_details::DidCreationDetails **/ DidDidDetailsDidCreationDetails: { did: 'AccountId32', @@ -2511,7 +2607,7 @@ export default { newServiceDetails: 'Vec' }, /** - * Lookup261: did::did_details::DidEncryptionKey + * Lookup268: did::did_details::DidEncryptionKey **/ DidDidDetailsDidEncryptionKey: { _enum: { @@ -2519,7 +2615,7 @@ export default { } }, /** - * Lookup265: did::did_details::DidVerificationKey + * Lookup272: did::did_details::DidVerificationKey **/ DidDidDetailsDidVerificationKey: { _enum: { @@ -2529,15 +2625,15 @@ export default { } }, /** - * Lookup266: sp_core::ed25519::Public + * Lookup273: sp_core::ed25519::Public **/ SpCoreEd25519Public: '[u8;32]', /** - * Lookup267: sp_core::ecdsa::Public + * Lookup274: sp_core::ecdsa::Public **/ SpCoreEcdsaPublic: '[u8;33]', /** - * Lookup270: did::service_endpoints::DidEndpoint + * Lookup277: did::service_endpoints::DidEndpoint **/ DidServiceEndpointsDidEndpoint: { id: 'Bytes', @@ -2545,7 +2641,7 @@ export default { urls: 'Vec' }, /** - * Lookup278: did::did_details::DidAuthorizedCallOperation + * Lookup285: did::did_details::DidAuthorizedCallOperation **/ DidDidDetailsDidAuthorizedCallOperation: { did: 'AccountId32', @@ -2555,7 +2651,7 @@ export default { submitter: 'AccountId32' }, /** - * Lookup279: pallet_did_lookup::pallet::Call + * Lookup286: pallet_did_lookup::pallet::Call **/ PalletDidLookupCall: { _enum: { @@ -2575,7 +2671,7 @@ export default { } }, /** - * Lookup280: sp_runtime::MultiSignature + * Lookup287: sp_runtime::MultiSignature **/ SpRuntimeMultiSignature: { _enum: { @@ -2585,7 +2681,7 @@ export default { } }, /** - * Lookup281: pallet_web3_names::pallet::Call + * Lookup288: pallet_web3_names::pallet::Call **/ PalletWeb3NamesCall: { _enum: { @@ -2605,7 +2701,7 @@ export default { } }, /** - * Lookup282: cumulus_pallet_parachain_system::pallet::Call + * Lookup289: cumulus_pallet_parachain_system::pallet::Call **/ CumulusPalletParachainSystemCall: { _enum: { @@ -2624,7 +2720,7 @@ export default { } }, /** - * Lookup283: cumulus_primitives_parachain_inherent::ParachainInherentData + * Lookup290: cumulus_primitives_parachain_inherent::ParachainInherentData **/ CumulusPrimitivesParachainInherentParachainInherentData: { validationData: 'PolkadotPrimitivesV2PersistedValidationData', @@ -2633,7 +2729,7 @@ export default { horizontalMessages: 'BTreeMap>' }, /** - * Lookup284: polkadot_primitives::v2::PersistedValidationData + * Lookup291: polkadot_primitives::v2::PersistedValidationData **/ PolkadotPrimitivesV2PersistedValidationData: { parentHead: 'Bytes', @@ -2642,27 +2738,27 @@ export default { maxPovSize: 'u32' }, /** - * Lookup286: sp_trie::storage_proof::StorageProof + * Lookup293: sp_trie::storage_proof::StorageProof **/ SpTrieStorageProof: { trieNodes: 'BTreeSet' }, /** - * Lookup289: polkadot_core_primitives::InboundDownwardMessage + * Lookup296: polkadot_core_primitives::InboundDownwardMessage **/ PolkadotCorePrimitivesInboundDownwardMessage: { sentAt: 'u32', msg: 'Bytes' }, /** - * Lookup292: polkadot_core_primitives::InboundHrmpMessage + * Lookup299: polkadot_core_primitives::InboundHrmpMessage **/ PolkadotCorePrimitivesInboundHrmpMessage: { sentAt: 'u32', data: 'Bytes' }, /** - * Lookup295: cumulus_pallet_xcmp_queue::pallet::Call + * Lookup302: cumulus_pallet_xcmp_queue::pallet::Call **/ CumulusPalletXcmpQueueCall: { _enum: { @@ -2711,7 +2807,7 @@ export default { } }, /** - * Lookup296: pallet_xcm::pallet::Call + * Lookup303: pallet_xcm::pallet::Call **/ PalletXcmCall: { _enum: { @@ -2765,7 +2861,7 @@ export default { } }, /** - * Lookup297: xcm::VersionedXcm + * Lookup304: xcm::VersionedXcm **/ XcmVersionedXcm: { _enum: { @@ -2775,7 +2871,7 @@ export default { } }, /** - * Lookup298: xcm::v0::Xcm + * Lookup305: xcm::v0::Xcm **/ XcmV0Xcm: { _enum: { @@ -2829,7 +2925,7 @@ export default { } }, /** - * Lookup300: xcm::v0::order::Order + * Lookup307: xcm::v0::order::Order **/ XcmV0Order: { _enum: { @@ -2872,7 +2968,7 @@ export default { } }, /** - * Lookup302: xcm::v0::Response + * Lookup309: xcm::v0::Response **/ XcmV0Response: { _enum: { @@ -2880,7 +2976,7 @@ export default { } }, /** - * Lookup303: xcm::v1::Xcm + * Lookup310: xcm::v1::Xcm **/ XcmV1Xcm: { _enum: { @@ -2939,7 +3035,7 @@ export default { } }, /** - * Lookup305: xcm::v1::order::Order + * Lookup312: xcm::v1::order::Order **/ XcmV1Order: { _enum: { @@ -2984,7 +3080,7 @@ export default { } }, /** - * Lookup307: xcm::v1::Response + * Lookup314: xcm::v1::Response **/ XcmV1Response: { _enum: { @@ -2993,7 +3089,7 @@ export default { } }, /** - * Lookup321: cumulus_pallet_dmp_queue::pallet::Call + * Lookup328: cumulus_pallet_dmp_queue::pallet::Call **/ CumulusPalletDmpQueueCall: { _enum: { @@ -3004,7 +3100,7 @@ export default { } }, /** - * Lookup322: pallet_collective::Votes + * Lookup329: pallet_collective::Votes **/ PalletCollectiveVotes: { index: 'u32', @@ -3014,19 +3110,19 @@ export default { end: 'u64' }, /** - * Lookup323: pallet_collective::pallet::Error + * Lookup330: pallet_collective::pallet::Error **/ PalletCollectiveError: { _enum: ['NotMember', 'DuplicateProposal', 'ProposalMissing', 'WrongIndex', 'DuplicateVote', 'AlreadyInitialized', 'TooEarly', 'TooManyProposals', 'WrongProposalWeight', 'WrongProposalLength'] }, /** - * Lookup326: pallet_membership::pallet::Error + * Lookup334: pallet_membership::pallet::Error **/ PalletMembershipError: { - _enum: ['AlreadyMember', 'NotMember'] + _enum: ['AlreadyMember', 'NotMember', 'TooManyMembers'] }, /** - * Lookup327: pallet_treasury::Proposal + * Lookup335: pallet_treasury::Proposal **/ PalletTreasuryProposal: { proposer: 'AccountId32', @@ -3035,35 +3131,43 @@ export default { bond: 'u128' }, /** - * Lookup331: frame_support::PalletId + * Lookup339: frame_support::PalletId **/ FrameSupportPalletId: '[u8;8]', /** - * Lookup332: pallet_treasury::pallet::Error + * Lookup340: pallet_treasury::pallet::Error **/ PalletTreasuryError: { - _enum: ['InsufficientProposersBalance', 'InvalidIndex', 'TooManyApprovals', 'ProposalNotApproved'] + _enum: ['InsufficientProposersBalance', 'InvalidIndex', 'TooManyApprovals', 'InsufficientPermission', 'ProposalNotApproved'] }, /** - * Lookup333: pallet_utility::pallet::Error + * Lookup341: pallet_relay_migration::pallet::Error + **/ + PalletRelayMigrationError: 'Null', + /** + * Lookup342: pallet_dyn_filter::pallet::Error + **/ + PalletDynFilterError: 'Null', + /** + * Lookup343: pallet_utility::pallet::Error **/ PalletUtilityError: { _enum: ['TooManyCalls'] }, /** - * Lookup336: pallet_vesting::Releases + * Lookup346: pallet_vesting::Releases **/ PalletVestingReleases: { _enum: ['V0', 'V1'] }, /** - * Lookup337: pallet_vesting::pallet::Error + * Lookup347: pallet_vesting::pallet::Error **/ PalletVestingError: { _enum: ['NotVesting', 'AtMaxVestingSchedules', 'AmountLow', 'ScheduleIndexOutOfBounds', 'InvalidScheduleParams'] }, /** - * Lookup340: pallet_scheduler::ScheduledV3, BlockNumber, spiritnet_runtime::OriginCaller, sp_core::crypto::AccountId32> + * Lookup350: pallet_scheduler::ScheduledV3, BlockNumber, spiritnet_runtime::OriginCaller, sp_core::crypto::AccountId32> **/ PalletSchedulerScheduledV3: { maybeId: 'Option', @@ -3073,13 +3177,13 @@ export default { origin: 'SpiritnetRuntimeOriginCaller' }, /** - * Lookup341: pallet_scheduler::pallet::Error + * Lookup351: pallet_scheduler::pallet::Error **/ PalletSchedulerError: { _enum: ['FailedToSchedule', 'NotFound', 'TargetBlockNumberInPast', 'RescheduleNoChange'] }, /** - * Lookup344: pallet_proxy::ProxyDefinition + * Lookup354: pallet_proxy::ProxyDefinition **/ PalletProxyProxyDefinition: { delegate: 'AccountId32', @@ -3087,7 +3191,7 @@ export default { delay: 'u64' }, /** - * Lookup348: pallet_proxy::Announcement + * Lookup358: pallet_proxy::Announcement **/ PalletProxyAnnouncement: { real: 'AccountId32', @@ -3095,13 +3199,13 @@ export default { height: 'u64' }, /** - * Lookup350: pallet_proxy::pallet::Error + * Lookup360: pallet_proxy::pallet::Error **/ PalletProxyError: { _enum: ['TooMany', 'NotFound', 'NotProxy', 'Unproxyable', 'Duplicate', 'NoPermission', 'Unannounced', 'NoSelfProxy'] }, /** - * Lookup351: pallet_preimage::RequestStatus + * Lookup361: pallet_preimage::RequestStatus **/ PalletPreimageRequestStatus: { _enum: { @@ -3110,13 +3214,13 @@ export default { } }, /** - * Lookup355: pallet_preimage::pallet::Error + * Lookup365: pallet_preimage::pallet::Error **/ PalletPreimageError: { _enum: ['TooLarge', 'AlreadyNoted', 'NotAuthorized', 'NotNoted', 'Requested', 'NotRequested'] }, /** - * Lookup357: pallet_tips::OpenTip + * Lookup367: pallet_tips::OpenTip **/ PalletTipsOpenTip: { reason: 'H256', @@ -3128,19 +3232,19 @@ export default { findersFee: 'bool' }, /** - * Lookup360: pallet_tips::pallet::Error + * Lookup370: pallet_tips::pallet::Error **/ PalletTipsError: { _enum: ['ReasonTooBig', 'AlreadyKnown', 'UnknownTip', 'NotFinder', 'StillOpen', 'Premature'] }, /** - * Lookup361: ctype::pallet::Error + * Lookup371: ctype::pallet::Error **/ CtypeError: { _enum: ['CTypeNotFound', 'CTypeAlreadyExists', 'UnableToPayFees'] }, /** - * Lookup362: attestation::attestations::AttestationDetails + * Lookup372: attestation::attestations::AttestationDetails **/ AttestationAttestationsAttestationDetails: { ctypeHash: 'H256', @@ -3150,20 +3254,20 @@ export default { deposit: 'KiltSupportDeposit' }, /** - * Lookup363: kilt_support::deposit::Deposit + * Lookup373: kilt_support::deposit::Deposit **/ KiltSupportDeposit: { owner: 'AccountId32', amount: 'u128' }, /** - * Lookup365: attestation::pallet::Error + * Lookup375: attestation::pallet::Error **/ AttestationError: { _enum: ['AlreadyAttested', 'AlreadyRevoked', 'AttestationNotFound', 'CTypeMismatch', 'Unauthorized', 'MaxDelegatedAttestationsExceeded'] }, /** - * Lookup366: delegation::delegation_hierarchy::DelegationNode + * Lookup376: delegation::delegation_hierarchy::DelegationNode **/ DelegationDelegationHierarchyDelegationNode: { hierarchyRootId: 'H256', @@ -3173,7 +3277,7 @@ export default { deposit: 'KiltSupportDeposit' }, /** - * Lookup369: delegation::delegation_hierarchy::DelegationDetails + * Lookup379: delegation::delegation_hierarchy::DelegationDetails **/ DelegationDelegationHierarchyDelegationDetails: { owner: 'AccountId32', @@ -3181,19 +3285,19 @@ export default { permissions: 'DelegationDelegationHierarchyPermissions' }, /** - * Lookup370: delegation::delegation_hierarchy::DelegationHierarchyDetails + * Lookup380: delegation::delegation_hierarchy::DelegationHierarchyDetails **/ DelegationDelegationHierarchyDelegationHierarchyDetails: { ctypeHash: 'H256' }, /** - * Lookup371: delegation::pallet::Error + * Lookup381: delegation::pallet::Error **/ DelegationError: { _enum: ['DelegationAlreadyExists', 'InvalidDelegateSignature', 'DelegationNotFound', 'DelegateNotFound', 'HierarchyAlreadyExists', 'HierarchyNotFound', 'MaxSearchDepthReached', 'NotOwnerOfParentDelegation', 'NotOwnerOfDelegationHierarchy', 'ParentDelegationNotFound', 'ParentDelegationRevoked', 'UnauthorizedRevocation', 'UnauthorizedRemoval', 'UnauthorizedDelegation', 'AccessDenied', 'ExceededRevocationBounds', 'ExceededRemovalBounds', 'MaxRevocationsTooLarge', 'MaxRemovalsTooLarge', 'MaxParentChecksTooLarge', 'InternalError', 'MaxChildrenExceeded'] }, /** - * Lookup372: did::did_details::DidDetails + * Lookup382: did::did_details::DidDetails **/ DidDidDetails: { authenticationKey: 'H256', @@ -3205,14 +3309,14 @@ export default { deposit: 'KiltSupportDeposit' }, /** - * Lookup375: did::did_details::DidPublicKeyDetails + * Lookup385: did::did_details::DidPublicKeyDetails **/ DidDidDetailsDidPublicKeyDetails: { key: 'DidDidDetailsDidPublicKey', blockNumber: 'u64' }, /** - * Lookup376: did::did_details::DidPublicKey + * Lookup386: did::did_details::DidPublicKey **/ DidDidDetailsDidPublicKey: { _enum: { @@ -3221,26 +3325,26 @@ export default { } }, /** - * Lookup381: did::pallet::Error + * Lookup391: did::pallet::Error **/ DidError: { _enum: ['InvalidSignatureFormat', 'InvalidSignature', 'DidAlreadyPresent', 'DidNotPresent', 'VerificationKeyNotPresent', 'InvalidNonce', 'UnsupportedDidAuthorizationCall', 'InvalidDidAuthorizationCall', 'MaxKeyAgreementKeysLimitExceeded', 'MaxPublicKeysPerDidExceeded', 'MaxTotalKeyAgreementKeysExceeded', 'BadDidOrigin', 'TransactionExpired', 'DidAlreadyDeleted', 'NotOwnerOfDeposit', 'UnableToPayFees', 'MaxNumberOfServicesPerDidExceeded', 'MaxServiceIdLengthExceeded', 'MaxServiceTypeLengthExceeded', 'MaxNumberOfTypesPerServiceExceeded', 'MaxServiceUrlLengthExceeded', 'MaxNumberOfUrlsPerServiceExceeded', 'ServiceAlreadyPresent', 'ServiceNotPresent', 'InvalidServiceEncoding', 'StoredEndpointsCountTooLarge', 'InternalError'] }, /** - * Lookup382: pallet_did_lookup::connection_record::ConnectionRecord + * Lookup392: pallet_did_lookup::connection_record::ConnectionRecord **/ PalletDidLookupConnectionRecord: { did: 'AccountId32', deposit: 'KiltSupportDeposit' }, /** - * Lookup384: pallet_did_lookup::pallet::Error + * Lookup394: pallet_did_lookup::pallet::Error **/ PalletDidLookupError: { _enum: ['AssociationNotFound', 'NotAuthorized', 'OutdatedProof', 'InsufficientFunds'] }, /** - * Lookup385: pallet_web3_names::web3_name::Web3NameOwnership, BlockNumber> + * Lookup395: pallet_web3_names::web3_name::Web3NameOwnership, BlockNumber> **/ PalletWeb3NamesWeb3NameWeb3NameOwnership: { owner: 'AccountId32', @@ -3248,19 +3352,19 @@ export default { deposit: 'KiltSupportDeposit' }, /** - * Lookup386: pallet_web3_names::pallet::Error + * Lookup396: pallet_web3_names::pallet::Error **/ PalletWeb3NamesError: { _enum: ['InsufficientFunds', 'Web3NameAlreadyClaimed', 'Web3NameNotFound', 'OwnerAlreadyExists', 'OwnerNotFound', 'Web3NameBanned', 'Web3NameNotBanned', 'Web3NameAlreadyBanned', 'NotAuthorized', 'Web3NameTooShort', 'Web3NameTooLong', 'InvalidWeb3NameCharacter'] }, /** - * Lookup388: polkadot_primitives::v2::UpgradeRestriction + * Lookup398: polkadot_primitives::v2::UpgradeRestriction **/ PolkadotPrimitivesV2UpgradeRestriction: { _enum: ['Present'] }, /** - * Lookup389: cumulus_pallet_parachain_system::relay_state_snapshot::MessagingStateSnapshot + * Lookup399: cumulus_pallet_parachain_system::relay_state_snapshot::MessagingStateSnapshot **/ CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot: { dmqMqcHead: 'H256', @@ -3269,7 +3373,7 @@ export default { egressChannels: 'Vec<(u32,PolkadotPrimitivesV2AbridgedHrmpChannel)>' }, /** - * Lookup393: polkadot_primitives::v2::AbridgedHrmpChannel + * Lookup403: polkadot_primitives::v2::AbridgedHrmpChannel **/ PolkadotPrimitivesV2AbridgedHrmpChannel: { maxCapacity: 'u32', @@ -3280,7 +3384,7 @@ export default { mqcHead: 'Option' }, /** - * Lookup394: polkadot_primitives::v2::AbridgedHostConfiguration + * Lookup404: polkadot_primitives::v2::AbridgedHostConfiguration **/ PolkadotPrimitivesV2AbridgedHostConfiguration: { maxCodeSize: 'u32', @@ -3294,20 +3398,20 @@ export default { validationUpgradeDelay: 'u32' }, /** - * Lookup400: polkadot_core_primitives::OutboundHrmpMessage + * Lookup410: polkadot_core_primitives::OutboundHrmpMessage **/ PolkadotCorePrimitivesOutboundHrmpMessage: { recipient: 'u32', data: 'Bytes' }, /** - * Lookup401: cumulus_pallet_parachain_system::pallet::Error + * Lookup411: cumulus_pallet_parachain_system::pallet::Error **/ CumulusPalletParachainSystemError: { _enum: ['OverlappingUpgrades', 'ProhibitedByPolkadot', 'TooBig', 'ValidationDataNotAvailable', 'HostConfigurationNotAvailable', 'NotScheduled', 'NothingAuthorized', 'Unauthorized'] }, /** - * Lookup403: cumulus_pallet_xcmp_queue::InboundChannelDetails + * Lookup413: cumulus_pallet_xcmp_queue::InboundChannelDetails **/ CumulusPalletXcmpQueueInboundChannelDetails: { sender: 'u32', @@ -3315,19 +3419,19 @@ export default { messageMetadata: 'Vec<(u32,PolkadotParachainPrimitivesXcmpMessageFormat)>' }, /** - * Lookup404: cumulus_pallet_xcmp_queue::InboundState + * Lookup414: cumulus_pallet_xcmp_queue::InboundState **/ CumulusPalletXcmpQueueInboundState: { _enum: ['Ok', 'Suspended'] }, /** - * Lookup407: polkadot_parachain::primitives::XcmpMessageFormat + * Lookup417: polkadot_parachain::primitives::XcmpMessageFormat **/ PolkadotParachainPrimitivesXcmpMessageFormat: { _enum: ['ConcatenatedVersionedXcm', 'ConcatenatedEncodedBlob', 'Signals'] }, /** - * Lookup410: cumulus_pallet_xcmp_queue::OutboundChannelDetails + * Lookup420: cumulus_pallet_xcmp_queue::OutboundChannelDetails **/ CumulusPalletXcmpQueueOutboundChannelDetails: { recipient: 'u32', @@ -3337,13 +3441,13 @@ export default { lastIndex: 'u16' }, /** - * Lookup411: cumulus_pallet_xcmp_queue::OutboundState + * Lookup421: cumulus_pallet_xcmp_queue::OutboundState **/ CumulusPalletXcmpQueueOutboundState: { _enum: ['Ok', 'Suspended'] }, /** - * Lookup413: cumulus_pallet_xcmp_queue::QueueConfigData + * Lookup423: cumulus_pallet_xcmp_queue::QueueConfigData **/ CumulusPalletXcmpQueueQueueConfigData: { suspendThreshold: 'u32', @@ -3354,29 +3458,29 @@ export default { xcmpMaxIndividualWeight: 'u64' }, /** - * Lookup415: cumulus_pallet_xcmp_queue::pallet::Error + * Lookup425: cumulus_pallet_xcmp_queue::pallet::Error **/ CumulusPalletXcmpQueueError: { _enum: ['FailedToSend', 'BadXcmOrigin', 'BadXcm', 'BadOverweightIndex', 'WeightOverLimit'] }, /** - * Lookup416: pallet_xcm::pallet::Error + * Lookup426: pallet_xcm::pallet::Error **/ PalletXcmError: { _enum: ['Unreachable', 'SendFailure', 'Filtered', 'UnweighableMessage', 'DestinationNotInvertible', 'Empty', 'CannotReanchor', 'TooManyAssets', 'InvalidOrigin', 'BadVersion', 'BadLocation', 'NoSubscription', 'AlreadySubscribed'] }, /** - * Lookup417: cumulus_pallet_xcm::pallet::Error + * Lookup427: cumulus_pallet_xcm::pallet::Error **/ CumulusPalletXcmError: 'Null', /** - * Lookup418: cumulus_pallet_dmp_queue::ConfigData + * Lookup428: cumulus_pallet_dmp_queue::ConfigData **/ CumulusPalletDmpQueueConfigData: { maxIndividual: 'u64' }, /** - * Lookup419: cumulus_pallet_dmp_queue::PageIndexData + * Lookup429: cumulus_pallet_dmp_queue::PageIndexData **/ CumulusPalletDmpQueuePageIndexData: { beginUsed: 'u32', @@ -3384,37 +3488,37 @@ export default { overweightCount: 'u64' }, /** - * Lookup422: cumulus_pallet_dmp_queue::pallet::Error + * Lookup432: cumulus_pallet_dmp_queue::pallet::Error **/ CumulusPalletDmpQueueError: { _enum: ['Unknown', 'OverLimit'] }, /** - * Lookup425: frame_system::extensions::check_non_zero_sender::CheckNonZeroSender + * Lookup435: frame_system::extensions::check_non_zero_sender::CheckNonZeroSender **/ FrameSystemExtensionsCheckNonZeroSender: 'Null', /** - * Lookup426: frame_system::extensions::check_spec_version::CheckSpecVersion + * Lookup436: frame_system::extensions::check_spec_version::CheckSpecVersion **/ FrameSystemExtensionsCheckSpecVersion: 'Null', /** - * Lookup427: frame_system::extensions::check_tx_version::CheckTxVersion + * Lookup437: frame_system::extensions::check_tx_version::CheckTxVersion **/ FrameSystemExtensionsCheckTxVersion: 'Null', /** - * Lookup428: frame_system::extensions::check_genesis::CheckGenesis + * Lookup438: frame_system::extensions::check_genesis::CheckGenesis **/ FrameSystemExtensionsCheckGenesis: 'Null', /** - * Lookup431: frame_system::extensions::check_nonce::CheckNonce + * Lookup441: frame_system::extensions::check_nonce::CheckNonce **/ FrameSystemExtensionsCheckNonce: 'Compact', /** - * Lookup432: frame_system::extensions::check_weight::CheckWeight + * Lookup442: frame_system::extensions::check_weight::CheckWeight **/ FrameSystemExtensionsCheckWeight: 'Null', /** - * Lookup433: pallet_transaction_payment::ChargeTransactionPayment + * Lookup443: pallet_transaction_payment::ChargeTransactionPayment **/ PalletTransactionPaymentChargeTransactionPayment: 'Compact' }; diff --git a/packages/augment-api/src/interfaces/registry.ts b/packages/augment-api/src/interfaces/registry.ts index 28f36f03c..f5e5367cf 100644 --- a/packages/augment-api/src/interfaces/registry.ts +++ b/packages/augment-api/src/interfaces/registry.ts @@ -5,7 +5,7 @@ // this is required to allow for ambient/previous definitions import '@polkadot/types/types/registry'; -import type { AttestationAttestationsAttestationDetails, AttestationCall, AttestationError, AttestationEvent, CtypeCall, CtypeError, CtypeEvent, CumulusPalletAuraExtCall, CumulusPalletDmpQueueCall, CumulusPalletDmpQueueConfigData, CumulusPalletDmpQueueError, CumulusPalletDmpQueueEvent, CumulusPalletDmpQueuePageIndexData, CumulusPalletParachainSystemCall, CumulusPalletParachainSystemError, CumulusPalletParachainSystemEvent, CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot, CumulusPalletXcmError, CumulusPalletXcmEvent, CumulusPalletXcmOrigin, CumulusPalletXcmpQueueCall, CumulusPalletXcmpQueueError, CumulusPalletXcmpQueueEvent, CumulusPalletXcmpQueueInboundChannelDetails, CumulusPalletXcmpQueueInboundState, CumulusPalletXcmpQueueOutboundChannelDetails, CumulusPalletXcmpQueueOutboundState, CumulusPalletXcmpQueueQueueConfigData, CumulusPrimitivesParachainInherentParachainInherentData, DelegationAccessControlDelegationAc, DelegationCall, DelegationDelegationHierarchyDelegationDetails, DelegationDelegationHierarchyDelegationHierarchyDetails, DelegationDelegationHierarchyDelegationNode, DelegationDelegationHierarchyPermissions, DelegationError, DelegationEvent, DidCall, DidDidDetails, DidDidDetailsDidAuthorizedCallOperation, DidDidDetailsDidCreationDetails, DidDidDetailsDidEncryptionKey, DidDidDetailsDidPublicKey, DidDidDetailsDidPublicKeyDetails, DidDidDetailsDidSignature, DidDidDetailsDidVerificationKey, DidError, DidEvent, DidOriginDidRawOrigin, DidServiceEndpointsDidEndpoint, FrameSupportDispatchRawOrigin, FrameSupportPalletId, FrameSupportScheduleLookupError, FrameSupportScheduleMaybeHashed, FrameSupportTokensMiscBalanceStatus, FrameSupportWeightsDispatchClass, FrameSupportWeightsDispatchInfo, FrameSupportWeightsPays, FrameSupportWeightsPerDispatchClassU32, FrameSupportWeightsPerDispatchClassU64, FrameSupportWeightsPerDispatchClassWeightsPerClass, FrameSupportWeightsRuntimeDbWeight, FrameSystemAccountInfo, FrameSystemCall, FrameSystemError, FrameSystemEvent, FrameSystemEventRecord, FrameSystemExtensionsCheckGenesis, FrameSystemExtensionsCheckNonZeroSender, FrameSystemExtensionsCheckNonce, FrameSystemExtensionsCheckSpecVersion, FrameSystemExtensionsCheckTxVersion, FrameSystemExtensionsCheckWeight, FrameSystemLastRuntimeUpgradeInfo, FrameSystemLimitsBlockLength, FrameSystemLimitsBlockWeights, FrameSystemLimitsWeightsPerClass, FrameSystemPhase, KiltSupportDeposit, PalletAuthorshipCall, PalletAuthorshipError, PalletAuthorshipUncleEntryItem, PalletBalancesAccountData, PalletBalancesBalanceLock, PalletBalancesCall, PalletBalancesError, PalletBalancesEvent, PalletBalancesReasons, PalletBalancesReleases, PalletBalancesReserveData, PalletCollectiveCall, PalletCollectiveError, PalletCollectiveEvent, PalletCollectiveRawOrigin, PalletCollectiveVotes, PalletDemocracyCall, PalletDemocracyConviction, PalletDemocracyDelegations, PalletDemocracyError, PalletDemocracyEvent, PalletDemocracyPreimageStatus, PalletDemocracyReferendumInfo, PalletDemocracyReferendumStatus, PalletDemocracyReleases, PalletDemocracyTally, PalletDemocracyVoteAccountVote, PalletDemocracyVotePriorLock, PalletDemocracyVoteThreshold, PalletDemocracyVoteVoting, PalletDidLookupCall, PalletDidLookupConnectionRecord, PalletDidLookupError, PalletDidLookupEvent, PalletIndicesCall, PalletIndicesError, PalletIndicesEvent, PalletMembershipCall, PalletMembershipError, PalletMembershipEvent, PalletPreimageCall, PalletPreimageError, PalletPreimageEvent, PalletPreimageRequestStatus, PalletProxyAnnouncement, PalletProxyCall, PalletProxyError, PalletProxyEvent, PalletProxyProxyDefinition, PalletSchedulerCall, PalletSchedulerError, PalletSchedulerEvent, PalletSchedulerScheduledV3, PalletSessionCall, PalletSessionError, PalletSessionEvent, PalletTimestampCall, PalletTipsCall, PalletTipsError, PalletTipsEvent, PalletTipsOpenTip, PalletTransactionPaymentChargeTransactionPayment, PalletTransactionPaymentReleases, PalletTreasuryCall, PalletTreasuryError, PalletTreasuryEvent, PalletTreasuryProposal, PalletUtilityCall, PalletUtilityError, PalletUtilityEvent, PalletVestingCall, PalletVestingError, PalletVestingEvent, PalletVestingReleases, PalletVestingVestingInfo, PalletWeb3NamesCall, PalletWeb3NamesError, PalletWeb3NamesEvent, PalletWeb3NamesWeb3NameWeb3NameOwnership, PalletXcmCall, PalletXcmError, PalletXcmEvent, PalletXcmOrigin, ParachainStakingCall, ParachainStakingCandidate, ParachainStakingCandidateStatus, ParachainStakingDelegationCounter, ParachainStakingDelegator, ParachainStakingError, ParachainStakingEvent, ParachainStakingInflationInflationInfo, ParachainStakingInflationRewardRate, ParachainStakingInflationStakingInfo, ParachainStakingRoundInfo, ParachainStakingSetOrderedSet, ParachainStakingStake, ParachainStakingTotalStake, PolkadotCorePrimitivesInboundDownwardMessage, PolkadotCorePrimitivesInboundHrmpMessage, PolkadotCorePrimitivesOutboundHrmpMessage, PolkadotParachainPrimitivesXcmpMessageFormat, PolkadotPrimitivesV2AbridgedHostConfiguration, PolkadotPrimitivesV2AbridgedHrmpChannel, PolkadotPrimitivesV2PersistedValidationData, PolkadotPrimitivesV2UpgradeRestriction, RuntimeCommonAuthorizationAuthorizationId, RuntimeCommonAuthorizationPalletAuthorize, SpConsensusAuraSr25519AppSr25519Public, SpCoreCryptoKeyTypeId, SpCoreEcdsaPublic, SpCoreEcdsaSignature, SpCoreEd25519Public, SpCoreEd25519Signature, SpCoreSr25519Public, SpCoreSr25519Signature, SpCoreVoid, SpRuntimeArithmeticError, SpRuntimeBlakeTwo256, SpRuntimeDigest, SpRuntimeDigestDigestItem, SpRuntimeDispatchError, SpRuntimeHeader, SpRuntimeModuleError, SpRuntimeMultiSignature, SpRuntimeTokenError, SpRuntimeTransactionalError, SpTrieStorageProof, SpVersionRuntimeVersion, SpiritnetRuntimeOriginCaller, SpiritnetRuntimeProxyType, SpiritnetRuntimeRuntime, SpiritnetRuntimeSessionKeys, XcmDoubleEncoded, XcmV0Junction, XcmV0JunctionBodyId, XcmV0JunctionBodyPart, XcmV0JunctionNetworkId, XcmV0MultiAsset, XcmV0MultiLocation, XcmV0Order, XcmV0OriginKind, XcmV0Response, XcmV0Xcm, XcmV1Junction, XcmV1MultiAsset, XcmV1MultiLocation, XcmV1MultiassetAssetId, XcmV1MultiassetAssetInstance, XcmV1MultiassetFungibility, XcmV1MultiassetMultiAssetFilter, XcmV1MultiassetMultiAssets, XcmV1MultiassetWildFungibility, XcmV1MultiassetWildMultiAsset, XcmV1MultilocationJunctions, XcmV1Order, XcmV1Response, XcmV1Xcm, XcmV2Instruction, XcmV2Response, XcmV2TraitsError, XcmV2TraitsOutcome, XcmV2WeightLimit, XcmV2Xcm, XcmVersionedMultiAssets, XcmVersionedMultiLocation, XcmVersionedXcm } from '@polkadot/types/lookup'; +import type { AttestationAttestationsAttestationDetails, AttestationCall, AttestationError, AttestationEvent, CtypeCall, CtypeError, CtypeEvent, CumulusPalletDmpQueueCall, CumulusPalletDmpQueueConfigData, CumulusPalletDmpQueueError, CumulusPalletDmpQueueEvent, CumulusPalletDmpQueuePageIndexData, CumulusPalletParachainSystemCall, CumulusPalletParachainSystemError, CumulusPalletParachainSystemEvent, CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot, CumulusPalletXcmError, CumulusPalletXcmEvent, CumulusPalletXcmOrigin, CumulusPalletXcmpQueueCall, CumulusPalletXcmpQueueError, CumulusPalletXcmpQueueEvent, CumulusPalletXcmpQueueInboundChannelDetails, CumulusPalletXcmpQueueInboundState, CumulusPalletXcmpQueueOutboundChannelDetails, CumulusPalletXcmpQueueOutboundState, CumulusPalletXcmpQueueQueueConfigData, CumulusPrimitivesParachainInherentParachainInherentData, DelegationAccessControlDelegationAc, DelegationCall, DelegationDelegationHierarchyDelegationDetails, DelegationDelegationHierarchyDelegationHierarchyDetails, DelegationDelegationHierarchyDelegationNode, DelegationDelegationHierarchyPermissions, DelegationError, DelegationEvent, DidCall, DidDidDetails, DidDidDetailsDidAuthorizedCallOperation, DidDidDetailsDidCreationDetails, DidDidDetailsDidEncryptionKey, DidDidDetailsDidPublicKey, DidDidDetailsDidPublicKeyDetails, DidDidDetailsDidSignature, DidDidDetailsDidVerificationKey, DidError, DidEvent, DidOriginDidRawOrigin, DidServiceEndpointsDidEndpoint, FrameSupportDispatchRawOrigin, FrameSupportPalletId, FrameSupportScheduleLookupError, FrameSupportScheduleMaybeHashed, FrameSupportTokensMiscBalanceStatus, FrameSupportWeightsDispatchClass, FrameSupportWeightsDispatchInfo, FrameSupportWeightsPays, FrameSupportWeightsPerDispatchClassU32, FrameSupportWeightsPerDispatchClassU64, FrameSupportWeightsPerDispatchClassWeightsPerClass, FrameSupportWeightsRuntimeDbWeight, FrameSystemAccountInfo, FrameSystemCall, FrameSystemError, FrameSystemEvent, FrameSystemEventRecord, FrameSystemExtensionsCheckGenesis, FrameSystemExtensionsCheckNonZeroSender, FrameSystemExtensionsCheckNonce, FrameSystemExtensionsCheckSpecVersion, FrameSystemExtensionsCheckTxVersion, FrameSystemExtensionsCheckWeight, FrameSystemLastRuntimeUpgradeInfo, FrameSystemLimitsBlockLength, FrameSystemLimitsBlockWeights, FrameSystemLimitsWeightsPerClass, FrameSystemPhase, KiltSupportDeposit, PalletAuthorshipCall, PalletAuthorshipError, PalletAuthorshipUncleEntryItem, PalletBalancesAccountData, PalletBalancesBalanceLock, PalletBalancesCall, PalletBalancesError, PalletBalancesEvent, PalletBalancesReasons, PalletBalancesReleases, PalletBalancesReserveData, PalletCollectiveCall, PalletCollectiveError, PalletCollectiveEvent, PalletCollectiveRawOrigin, PalletCollectiveVotes, PalletDemocracyCall, PalletDemocracyConviction, PalletDemocracyDelegations, PalletDemocracyError, PalletDemocracyEvent, PalletDemocracyPreimageStatus, PalletDemocracyReferendumInfo, PalletDemocracyReferendumStatus, PalletDemocracyReleases, PalletDemocracyTally, PalletDemocracyVoteAccountVote, PalletDemocracyVotePriorLock, PalletDemocracyVoteThreshold, PalletDemocracyVoteVoting, PalletDidLookupCall, PalletDidLookupConnectionRecord, PalletDidLookupError, PalletDidLookupEvent, PalletDynFilterCall, PalletDynFilterError, PalletDynFilterEvent, PalletDynFilterSettingFilterSettings, PalletIndicesCall, PalletIndicesError, PalletIndicesEvent, PalletMembershipCall, PalletMembershipError, PalletMembershipEvent, PalletPreimageCall, PalletPreimageError, PalletPreimageEvent, PalletPreimageRequestStatus, PalletProxyAnnouncement, PalletProxyCall, PalletProxyError, PalletProxyEvent, PalletProxyProxyDefinition, PalletRelayMigrationCall, PalletRelayMigrationError, PalletRelayMigrationEvent, PalletSchedulerCall, PalletSchedulerError, PalletSchedulerEvent, PalletSchedulerScheduledV3, PalletSessionCall, PalletSessionError, PalletSessionEvent, PalletTimestampCall, PalletTipsCall, PalletTipsError, PalletTipsEvent, PalletTipsOpenTip, PalletTransactionPaymentChargeTransactionPayment, PalletTransactionPaymentEvent, PalletTransactionPaymentReleases, PalletTreasuryCall, PalletTreasuryError, PalletTreasuryEvent, PalletTreasuryProposal, PalletUtilityCall, PalletUtilityError, PalletUtilityEvent, PalletVestingCall, PalletVestingError, PalletVestingEvent, PalletVestingReleases, PalletVestingVestingInfo, PalletWeb3NamesCall, PalletWeb3NamesError, PalletWeb3NamesEvent, PalletWeb3NamesWeb3NameWeb3NameOwnership, PalletXcmCall, PalletXcmError, PalletXcmEvent, PalletXcmOrigin, ParachainStakingCall, ParachainStakingCandidate, ParachainStakingCandidateStatus, ParachainStakingDelegationCounter, ParachainStakingDelegator, ParachainStakingError, ParachainStakingEvent, ParachainStakingInflationInflationInfo, ParachainStakingInflationRewardRate, ParachainStakingInflationStakingInfo, ParachainStakingRoundInfo, ParachainStakingSetOrderedSet, ParachainStakingStake, ParachainStakingTotalStake, PolkadotCorePrimitivesInboundDownwardMessage, PolkadotCorePrimitivesInboundHrmpMessage, PolkadotCorePrimitivesOutboundHrmpMessage, PolkadotParachainPrimitivesXcmpMessageFormat, PolkadotPrimitivesV2AbridgedHostConfiguration, PolkadotPrimitivesV2AbridgedHrmpChannel, PolkadotPrimitivesV2PersistedValidationData, PolkadotPrimitivesV2UpgradeRestriction, RuntimeCommonAuthorizationAuthorizationId, RuntimeCommonAuthorizationPalletAuthorize, SpConsensusAuraSr25519AppSr25519Public, SpCoreCryptoKeyTypeId, SpCoreEcdsaPublic, SpCoreEcdsaSignature, SpCoreEd25519Public, SpCoreEd25519Signature, SpCoreSr25519Public, SpCoreSr25519Signature, SpCoreVoid, SpRuntimeArithmeticError, SpRuntimeBlakeTwo256, SpRuntimeDigest, SpRuntimeDigestDigestItem, SpRuntimeDispatchError, SpRuntimeHeader, SpRuntimeModuleError, SpRuntimeMultiSignature, SpRuntimeTokenError, SpRuntimeTransactionalError, SpTrieStorageProof, SpVersionRuntimeVersion, SpiritnetRuntimeOriginCaller, SpiritnetRuntimeProxyType, SpiritnetRuntimeRuntime, SpiritnetRuntimeSessionKeys, XcmDoubleEncoded, XcmV0Junction, XcmV0JunctionBodyId, XcmV0JunctionBodyPart, XcmV0JunctionNetworkId, XcmV0MultiAsset, XcmV0MultiLocation, XcmV0Order, XcmV0OriginKind, XcmV0Response, XcmV0Xcm, XcmV1Junction, XcmV1MultiAsset, XcmV1MultiLocation, XcmV1MultiassetAssetId, XcmV1MultiassetAssetInstance, XcmV1MultiassetFungibility, XcmV1MultiassetMultiAssetFilter, XcmV1MultiassetMultiAssets, XcmV1MultiassetWildFungibility, XcmV1MultiassetWildMultiAsset, XcmV1MultilocationJunctions, XcmV1Order, XcmV1Response, XcmV1Xcm, XcmV2Instruction, XcmV2Response, XcmV2TraitsError, XcmV2TraitsOutcome, XcmV2WeightLimit, XcmV2Xcm, XcmVersionedMultiAssets, XcmVersionedMultiLocation, XcmVersionedXcm } from '@polkadot/types/lookup'; declare module '@polkadot/types/types/registry' { interface InterfaceTypes { @@ -16,7 +16,6 @@ declare module '@polkadot/types/types/registry' { CtypeCall: CtypeCall; CtypeError: CtypeError; CtypeEvent: CtypeEvent; - CumulusPalletAuraExtCall: CumulusPalletAuraExtCall; CumulusPalletDmpQueueCall: CumulusPalletDmpQueueCall; CumulusPalletDmpQueueConfigData: CumulusPalletDmpQueueConfigData; CumulusPalletDmpQueueError: CumulusPalletDmpQueueError; @@ -122,6 +121,10 @@ declare module '@polkadot/types/types/registry' { PalletDidLookupConnectionRecord: PalletDidLookupConnectionRecord; PalletDidLookupError: PalletDidLookupError; PalletDidLookupEvent: PalletDidLookupEvent; + PalletDynFilterCall: PalletDynFilterCall; + PalletDynFilterError: PalletDynFilterError; + PalletDynFilterEvent: PalletDynFilterEvent; + PalletDynFilterSettingFilterSettings: PalletDynFilterSettingFilterSettings; PalletIndicesCall: PalletIndicesCall; PalletIndicesError: PalletIndicesError; PalletIndicesEvent: PalletIndicesEvent; @@ -137,6 +140,9 @@ declare module '@polkadot/types/types/registry' { PalletProxyError: PalletProxyError; PalletProxyEvent: PalletProxyEvent; PalletProxyProxyDefinition: PalletProxyProxyDefinition; + PalletRelayMigrationCall: PalletRelayMigrationCall; + PalletRelayMigrationError: PalletRelayMigrationError; + PalletRelayMigrationEvent: PalletRelayMigrationEvent; PalletSchedulerCall: PalletSchedulerCall; PalletSchedulerError: PalletSchedulerError; PalletSchedulerEvent: PalletSchedulerEvent; @@ -150,6 +156,7 @@ declare module '@polkadot/types/types/registry' { PalletTipsEvent: PalletTipsEvent; PalletTipsOpenTip: PalletTipsOpenTip; PalletTransactionPaymentChargeTransactionPayment: PalletTransactionPaymentChargeTransactionPayment; + PalletTransactionPaymentEvent: PalletTransactionPaymentEvent; PalletTransactionPaymentReleases: PalletTransactionPaymentReleases; PalletTreasuryCall: PalletTreasuryCall; PalletTreasuryError: PalletTreasuryError; diff --git a/packages/augment-api/src/interfaces/types-lookup.ts b/packages/augment-api/src/interfaces/types-lookup.ts index 67700cfd7..942e58fc0 100644 --- a/packages/augment-api/src/interfaces/types-lookup.ts +++ b/packages/augment-api/src/interfaces/types-lookup.ts @@ -249,7 +249,18 @@ declare module '@polkadot/types/lookup' { readonly type: 'Free' | 'Reserved'; } - /** @name ParachainStakingEvent (30) */ + /** @name PalletTransactionPaymentEvent (30) */ + interface PalletTransactionPaymentEvent extends Enum { + readonly isTransactionFeePaid: boolean; + readonly asTransactionFeePaid: { + readonly who: AccountId32; + readonly actualFee: u128; + readonly tip: u128; + } & Struct; + readonly type: 'TransactionFeePaid'; + } + + /** @name ParachainStakingEvent (31) */ interface ParachainStakingEvent extends Enum { readonly isNewRound: boolean; readonly asNewRound: ITuple<[u64, u32]>; @@ -296,7 +307,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'NewRound' | 'EnteredTopCandidates' | 'LeftTopCandidates' | 'JoinedCollatorCandidates' | 'CollatorStakedMore' | 'CollatorStakedLess' | 'CollatorScheduledExit' | 'CollatorCanceledExit' | 'CandidateLeft' | 'CollatorRemoved' | 'MaxCandidateStakeChanged' | 'DelegatorStakedMore' | 'DelegatorStakedLess' | 'DelegatorLeft' | 'Delegation' | 'DelegationReplaced' | 'DelegatorLeftCollator' | 'Rewarded' | 'RoundInflationSet' | 'MaxSelectedCandidatesSet' | 'BlocksPerRoundSet'; } - /** @name PalletSessionEvent (32) */ + /** @name PalletSessionEvent (33) */ interface PalletSessionEvent extends Enum { readonly isNewSession: boolean; readonly asNewSession: { @@ -305,7 +316,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'NewSession'; } - /** @name PalletDemocracyEvent (33) */ + /** @name PalletDemocracyEvent (34) */ interface PalletDemocracyEvent extends Enum { readonly isProposed: boolean; readonly asProposed: { @@ -400,10 +411,14 @@ declare module '@polkadot/types/lookup' { readonly seconder: AccountId32; readonly propIndex: u32; } & Struct; - readonly type: 'Proposed' | 'Tabled' | 'ExternalTabled' | 'Started' | 'Passed' | 'NotPassed' | 'Cancelled' | 'Executed' | 'Delegated' | 'Undelegated' | 'Vetoed' | 'PreimageNoted' | 'PreimageUsed' | 'PreimageInvalid' | 'PreimageMissing' | 'PreimageReaped' | 'Blacklisted' | 'Voted' | 'Seconded'; + readonly isProposalCanceled: boolean; + readonly asProposalCanceled: { + readonly propIndex: u32; + } & Struct; + readonly type: 'Proposed' | 'Tabled' | 'ExternalTabled' | 'Started' | 'Passed' | 'NotPassed' | 'Cancelled' | 'Executed' | 'Delegated' | 'Undelegated' | 'Vetoed' | 'PreimageNoted' | 'PreimageUsed' | 'PreimageInvalid' | 'PreimageMissing' | 'PreimageReaped' | 'Blacklisted' | 'Voted' | 'Seconded' | 'ProposalCanceled'; } - /** @name PalletDemocracyVoteThreshold (35) */ + /** @name PalletDemocracyVoteThreshold (36) */ interface PalletDemocracyVoteThreshold extends Enum { readonly isSuperMajorityApprove: boolean; readonly isSuperMajorityAgainst: boolean; @@ -411,7 +426,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'SuperMajorityApprove' | 'SuperMajorityAgainst' | 'SimpleMajority'; } - /** @name PalletDemocracyVoteAccountVote (38) */ + /** @name PalletDemocracyVoteAccountVote (39) */ interface PalletDemocracyVoteAccountVote extends Enum { readonly isStandard: boolean; readonly asStandard: { @@ -426,7 +441,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'Standard' | 'Split'; } - /** @name PalletCollectiveEvent (40) */ + /** @name PalletCollectiveEvent (41) */ interface PalletCollectiveEvent extends Enum { readonly isProposed: boolean; readonly asProposed: { @@ -470,7 +485,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'Proposed' | 'Voted' | 'Approved' | 'Disapproved' | 'Executed' | 'MemberExecuted' | 'Closed'; } - /** @name PalletMembershipEvent (43) */ + /** @name PalletMembershipEvent (44) */ interface PalletMembershipEvent extends Enum { readonly isMemberAdded: boolean; readonly isMemberRemoved: boolean; @@ -481,7 +496,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'MemberAdded' | 'MemberRemoved' | 'MembersSwapped' | 'MembersReset' | 'KeyChanged' | 'Dummy'; } - /** @name PalletTreasuryEvent (44) */ + /** @name PalletTreasuryEvent (45) */ interface PalletTreasuryEvent extends Enum { readonly isProposed: boolean; readonly asProposed: { @@ -514,10 +529,42 @@ declare module '@polkadot/types/lookup' { readonly asDeposit: { readonly value: u128; } & Struct; - readonly type: 'Proposed' | 'Spending' | 'Awarded' | 'Rejected' | 'Burnt' | 'Rollover' | 'Deposit'; + readonly isSpendApproved: boolean; + readonly asSpendApproved: { + readonly proposalIndex: u32; + readonly amount: u128; + readonly beneficiary: AccountId32; + } & Struct; + readonly type: 'Proposed' | 'Spending' | 'Awarded' | 'Rejected' | 'Burnt' | 'Rollover' | 'Deposit' | 'SpendApproved'; + } + + /** @name PalletRelayMigrationEvent (46) */ + interface PalletRelayMigrationEvent extends Enum { + readonly isLeaseSwapInitiated: boolean; + readonly isRelayNumberCheckSet: boolean; + readonly asRelayNumberCheckSet: { + readonly strict: bool; + } & Struct; + readonly type: 'LeaseSwapInitiated' | 'RelayNumberCheckSet'; + } + + /** @name PalletDynFilterEvent (47) */ + interface PalletDynFilterEvent extends Enum { + readonly isNewFilterRules: boolean; + readonly asNewFilterRules: { + readonly rules: PalletDynFilterSettingFilterSettings; + } & Struct; + readonly type: 'NewFilterRules'; + } + + /** @name PalletDynFilterSettingFilterSettings (48) */ + interface PalletDynFilterSettingFilterSettings extends Struct { + readonly transferDisabled: bool; + readonly featureDisabled: bool; + readonly xcmDisabled: bool; } - /** @name PalletUtilityEvent (45) */ + /** @name PalletUtilityEvent (49) */ interface PalletUtilityEvent extends Enum { readonly isBatchInterrupted: boolean; readonly asBatchInterrupted: { @@ -538,7 +585,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'BatchInterrupted' | 'BatchCompleted' | 'BatchCompletedWithErrors' | 'ItemCompleted' | 'ItemFailed' | 'DispatchedAs'; } - /** @name PalletVestingEvent (46) */ + /** @name PalletVestingEvent (50) */ interface PalletVestingEvent extends Enum { readonly isVestingUpdated: boolean; readonly asVestingUpdated: { @@ -552,7 +599,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'VestingUpdated' | 'VestingCompleted'; } - /** @name PalletSchedulerEvent (47) */ + /** @name PalletSchedulerEvent (51) */ interface PalletSchedulerEvent extends Enum { readonly isScheduled: boolean; readonly asScheduled: { @@ -579,14 +626,14 @@ declare module '@polkadot/types/lookup' { readonly type: 'Scheduled' | 'Canceled' | 'Dispatched' | 'CallLookupFailed'; } - /** @name FrameSupportScheduleLookupError (50) */ + /** @name FrameSupportScheduleLookupError (54) */ interface FrameSupportScheduleLookupError extends Enum { readonly isUnknown: boolean; readonly isBadFormat: boolean; readonly type: 'Unknown' | 'BadFormat'; } - /** @name PalletProxyEvent (51) */ + /** @name PalletProxyEvent (55) */ interface PalletProxyEvent extends Enum { readonly isProxyExecuted: boolean; readonly asProxyExecuted: { @@ -622,7 +669,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'ProxyExecuted' | 'AnonymousCreated' | 'Announced' | 'ProxyAdded' | 'ProxyRemoved'; } - /** @name SpiritnetRuntimeProxyType (52) */ + /** @name SpiritnetRuntimeProxyType (56) */ interface SpiritnetRuntimeProxyType extends Enum { readonly isAny: boolean; readonly isNonTransfer: boolean; @@ -633,7 +680,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'Any' | 'NonTransfer' | 'Governance' | 'ParachainStaking' | 'CancelProxy' | 'NonDepositClaiming'; } - /** @name PalletPreimageEvent (54) */ + /** @name PalletPreimageEvent (58) */ interface PalletPreimageEvent extends Enum { readonly isNoted: boolean; readonly asNoted: { @@ -650,7 +697,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'Noted' | 'Requested' | 'Cleared'; } - /** @name PalletTipsEvent (56) */ + /** @name PalletTipsEvent (60) */ interface PalletTipsEvent extends Enum { readonly isNewTip: boolean; readonly asNewTip: { @@ -679,14 +726,14 @@ declare module '@polkadot/types/lookup' { readonly type: 'NewTip' | 'TipClosing' | 'TipClosed' | 'TipRetracted' | 'TipSlashed'; } - /** @name CtypeEvent (57) */ + /** @name CtypeEvent (61) */ interface CtypeEvent extends Enum { readonly isCTypeCreated: boolean; readonly asCTypeCreated: ITuple<[AccountId32, H256]>; readonly type: 'CTypeCreated'; } - /** @name AttestationEvent (58) */ + /** @name AttestationEvent (62) */ interface AttestationEvent extends Enum { readonly isAttestationCreated: boolean; readonly asAttestationCreated: ITuple<[AccountId32, H256, H256, Option]>; @@ -699,14 +746,14 @@ declare module '@polkadot/types/lookup' { readonly type: 'AttestationCreated' | 'AttestationRevoked' | 'AttestationRemoved' | 'DepositReclaimed'; } - /** @name RuntimeCommonAuthorizationAuthorizationId (60) */ + /** @name RuntimeCommonAuthorizationAuthorizationId (64) */ interface RuntimeCommonAuthorizationAuthorizationId extends Enum { readonly isDelegation: boolean; readonly asDelegation: H256; readonly type: 'Delegation'; } - /** @name DelegationEvent (61) */ + /** @name DelegationEvent (65) */ interface DelegationEvent extends Enum { readonly isHierarchyCreated: boolean; readonly asHierarchyCreated: ITuple<[AccountId32, H256, H256]>; @@ -725,12 +772,12 @@ declare module '@polkadot/types/lookup' { readonly type: 'HierarchyCreated' | 'HierarchyRevoked' | 'HierarchyRemoved' | 'DelegationCreated' | 'DelegationRevoked' | 'DelegationRemoved' | 'DepositReclaimed'; } - /** @name DelegationDelegationHierarchyPermissions (62) */ + /** @name DelegationDelegationHierarchyPermissions (66) */ interface DelegationDelegationHierarchyPermissions extends Struct { readonly bits: u32; } - /** @name DidEvent (63) */ + /** @name DidEvent (67) */ interface DidEvent extends Enum { readonly isDidCreated: boolean; readonly asDidCreated: ITuple<[AccountId32, AccountId32]>; @@ -743,7 +790,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'DidCreated' | 'DidUpdated' | 'DidDeleted' | 'DidCallDispatched'; } - /** @name PalletDidLookupEvent (64) */ + /** @name PalletDidLookupEvent (68) */ interface PalletDidLookupEvent extends Enum { readonly isAssociationEstablished: boolean; readonly asAssociationEstablished: ITuple<[AccountId32, AccountId32]>; @@ -752,7 +799,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'AssociationEstablished' | 'AssociationRemoved'; } - /** @name PalletWeb3NamesEvent (65) */ + /** @name PalletWeb3NamesEvent (69) */ interface PalletWeb3NamesEvent extends Enum { readonly isWeb3NameClaimed: boolean; readonly asWeb3NameClaimed: { @@ -775,7 +822,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'Web3NameClaimed' | 'Web3NameReleased' | 'Web3NameBanned' | 'Web3NameUnbanned'; } - /** @name CumulusPalletParachainSystemEvent (68) */ + /** @name CumulusPalletParachainSystemEvent (72) */ interface CumulusPalletParachainSystemEvent extends Enum { readonly isValidationFunctionStored: boolean; readonly isValidationFunctionApplied: boolean; @@ -799,28 +846,51 @@ declare module '@polkadot/types/lookup' { readonly type: 'ValidationFunctionStored' | 'ValidationFunctionApplied' | 'ValidationFunctionDiscarded' | 'UpgradeAuthorized' | 'DownwardMessagesReceived' | 'DownwardMessagesProcessed'; } - /** @name CumulusPalletXcmpQueueEvent (69) */ + /** @name CumulusPalletXcmpQueueEvent (73) */ interface CumulusPalletXcmpQueueEvent extends Enum { readonly isSuccess: boolean; - readonly asSuccess: Option; + readonly asSuccess: { + readonly messageHash: Option; + readonly weight: u64; + } & Struct; readonly isFail: boolean; - readonly asFail: ITuple<[Option, XcmV2TraitsError]>; + readonly asFail: { + readonly messageHash: Option; + readonly error: XcmV2TraitsError; + readonly weight: u64; + } & Struct; readonly isBadVersion: boolean; - readonly asBadVersion: Option; + readonly asBadVersion: { + readonly messageHash: Option; + } & Struct; readonly isBadFormat: boolean; - readonly asBadFormat: Option; + readonly asBadFormat: { + readonly messageHash: Option; + } & Struct; readonly isUpwardMessageSent: boolean; - readonly asUpwardMessageSent: Option; + readonly asUpwardMessageSent: { + readonly messageHash: Option; + } & Struct; readonly isXcmpMessageSent: boolean; - readonly asXcmpMessageSent: Option; + readonly asXcmpMessageSent: { + readonly messageHash: Option; + } & Struct; readonly isOverweightEnqueued: boolean; - readonly asOverweightEnqueued: ITuple<[u32, u32, u64, u64]>; + readonly asOverweightEnqueued: { + readonly sender: u32; + readonly sentAt: u32; + readonly index: u64; + readonly required: u64; + } & Struct; readonly isOverweightServiced: boolean; - readonly asOverweightServiced: ITuple<[u64, u64]>; + readonly asOverweightServiced: { + readonly index: u64; + readonly used: u64; + } & Struct; readonly type: 'Success' | 'Fail' | 'BadVersion' | 'BadFormat' | 'UpwardMessageSent' | 'XcmpMessageSent' | 'OverweightEnqueued' | 'OverweightServiced'; } - /** @name XcmV2TraitsError (71) */ + /** @name XcmV2TraitsError (75) */ interface XcmV2TraitsError extends Enum { readonly isOverflow: boolean; readonly isUnimplemented: boolean; @@ -853,7 +923,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'Overflow' | 'Unimplemented' | 'UntrustedReserveLocation' | 'UntrustedTeleportLocation' | 'MultiLocationFull' | 'MultiLocationNotInvertible' | 'BadOrigin' | 'InvalidLocation' | 'AssetNotFound' | 'FailedToTransactAsset' | 'NotWithdrawable' | 'LocationCannotHold' | 'ExceedsMaxMessageSize' | 'DestinationUnsupported' | 'Transport' | 'Unroutable' | 'UnknownClaim' | 'FailedToDecode' | 'MaxWeightInvalid' | 'NotHoldingFees' | 'TooExpensive' | 'Trap' | 'UnhandledXcmVersion' | 'WeightLimitReached' | 'Barrier' | 'WeightNotComputable'; } - /** @name PalletXcmEvent (73) */ + /** @name PalletXcmEvent (77) */ interface PalletXcmEvent extends Enum { readonly isAttempted: boolean; readonly asAttempted: XcmV2TraitsOutcome; @@ -890,7 +960,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'Attempted' | 'Sent' | 'UnexpectedResponse' | 'ResponseReady' | 'Notified' | 'NotifyOverweight' | 'NotifyDispatchError' | 'NotifyDecodeFailed' | 'InvalidResponder' | 'InvalidResponderVersion' | 'ResponseTaken' | 'AssetsTrapped' | 'VersionChangeNotified' | 'SupportedVersionChanged' | 'NotifyTargetSendFail' | 'NotifyTargetMigrationFail'; } - /** @name XcmV2TraitsOutcome (74) */ + /** @name XcmV2TraitsOutcome (78) */ interface XcmV2TraitsOutcome extends Enum { readonly isComplete: boolean; readonly asComplete: u64; @@ -901,13 +971,13 @@ declare module '@polkadot/types/lookup' { readonly type: 'Complete' | 'Incomplete' | 'Error'; } - /** @name XcmV1MultiLocation (75) */ + /** @name XcmV1MultiLocation (79) */ interface XcmV1MultiLocation extends Struct { readonly parents: u8; readonly interior: XcmV1MultilocationJunctions; } - /** @name XcmV1MultilocationJunctions (76) */ + /** @name XcmV1MultilocationJunctions (80) */ interface XcmV1MultilocationJunctions extends Enum { readonly isHere: boolean; readonly isX1: boolean; @@ -929,7 +999,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'Here' | 'X1' | 'X2' | 'X3' | 'X4' | 'X5' | 'X6' | 'X7' | 'X8'; } - /** @name XcmV1Junction (77) */ + /** @name XcmV1Junction (81) */ interface XcmV1Junction extends Enum { readonly isParachain: boolean; readonly asParachain: Compact; @@ -963,7 +1033,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'Parachain' | 'AccountId32' | 'AccountIndex64' | 'AccountKey20' | 'PalletInstance' | 'GeneralIndex' | 'GeneralKey' | 'OnlyChild' | 'Plurality'; } - /** @name XcmV0JunctionNetworkId (79) */ + /** @name XcmV0JunctionNetworkId (83) */ interface XcmV0JunctionNetworkId extends Enum { readonly isAny: boolean; readonly isNamed: boolean; @@ -973,7 +1043,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'Any' | 'Named' | 'Polkadot' | 'Kusama'; } - /** @name XcmV0JunctionBodyId (83) */ + /** @name XcmV0JunctionBodyId (88) */ interface XcmV0JunctionBodyId extends Enum { readonly isUnit: boolean; readonly isNamed: boolean; @@ -987,7 +1057,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'Unit' | 'Named' | 'Index' | 'Executive' | 'Technical' | 'Legislative' | 'Judicial'; } - /** @name XcmV0JunctionBodyPart (84) */ + /** @name XcmV0JunctionBodyPart (89) */ interface XcmV0JunctionBodyPart extends Enum { readonly isVoice: boolean; readonly isMembers: boolean; @@ -1012,10 +1082,10 @@ declare module '@polkadot/types/lookup' { readonly type: 'Voice' | 'Members' | 'Fraction' | 'AtLeastProportion' | 'MoreThanProportion'; } - /** @name XcmV2Xcm (85) */ + /** @name XcmV2Xcm (90) */ interface XcmV2Xcm extends Vec {} - /** @name XcmV2Instruction (87) */ + /** @name XcmV2Instruction (92) */ interface XcmV2Instruction extends Enum { readonly isWithdrawAsset: boolean; readonly asWithdrawAsset: XcmV1MultiassetMultiAssets; @@ -1135,16 +1205,16 @@ declare module '@polkadot/types/lookup' { readonly type: 'WithdrawAsset' | 'ReserveAssetDeposited' | 'ReceiveTeleportedAsset' | 'QueryResponse' | 'TransferAsset' | 'TransferReserveAsset' | 'Transact' | 'HrmpNewChannelOpenRequest' | 'HrmpChannelAccepted' | 'HrmpChannelClosing' | 'ClearOrigin' | 'DescendOrigin' | 'ReportError' | 'DepositAsset' | 'DepositReserveAsset' | 'ExchangeAsset' | 'InitiateReserveWithdraw' | 'InitiateTeleport' | 'QueryHolding' | 'BuyExecution' | 'RefundSurplus' | 'SetErrorHandler' | 'SetAppendix' | 'ClearError' | 'ClaimAsset' | 'Trap' | 'SubscribeVersion' | 'UnsubscribeVersion'; } - /** @name XcmV1MultiassetMultiAssets (88) */ + /** @name XcmV1MultiassetMultiAssets (93) */ interface XcmV1MultiassetMultiAssets extends Vec {} - /** @name XcmV1MultiAsset (90) */ + /** @name XcmV1MultiAsset (95) */ interface XcmV1MultiAsset extends Struct { readonly id: XcmV1MultiassetAssetId; readonly fun: XcmV1MultiassetFungibility; } - /** @name XcmV1MultiassetAssetId (91) */ + /** @name XcmV1MultiassetAssetId (96) */ interface XcmV1MultiassetAssetId extends Enum { readonly isConcrete: boolean; readonly asConcrete: XcmV1MultiLocation; @@ -1153,7 +1223,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'Concrete' | 'Abstract'; } - /** @name XcmV1MultiassetFungibility (92) */ + /** @name XcmV1MultiassetFungibility (97) */ interface XcmV1MultiassetFungibility extends Enum { readonly isFungible: boolean; readonly asFungible: Compact; @@ -1162,7 +1232,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'Fungible' | 'NonFungible'; } - /** @name XcmV1MultiassetAssetInstance (93) */ + /** @name XcmV1MultiassetAssetInstance (98) */ interface XcmV1MultiassetAssetInstance extends Enum { readonly isUndefined: boolean; readonly isIndex: boolean; @@ -1180,7 +1250,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'Undefined' | 'Index' | 'Array4' | 'Array8' | 'Array16' | 'Array32' | 'Blob'; } - /** @name XcmV2Response (96) */ + /** @name XcmV2Response (101) */ interface XcmV2Response extends Enum { readonly isNull: boolean; readonly isAssets: boolean; @@ -1192,7 +1262,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'Null' | 'Assets' | 'ExecutionResult' | 'Version'; } - /** @name XcmV0OriginKind (99) */ + /** @name XcmV0OriginKind (104) */ interface XcmV0OriginKind extends Enum { readonly isNative: boolean; readonly isSovereignAccount: boolean; @@ -1201,12 +1271,12 @@ declare module '@polkadot/types/lookup' { readonly type: 'Native' | 'SovereignAccount' | 'Superuser' | 'Xcm'; } - /** @name XcmDoubleEncoded (100) */ + /** @name XcmDoubleEncoded (105) */ interface XcmDoubleEncoded extends Struct { readonly encoded: Bytes; } - /** @name XcmV1MultiassetMultiAssetFilter (101) */ + /** @name XcmV1MultiassetMultiAssetFilter (106) */ interface XcmV1MultiassetMultiAssetFilter extends Enum { readonly isDefinite: boolean; readonly asDefinite: XcmV1MultiassetMultiAssets; @@ -1215,7 +1285,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'Definite' | 'Wild'; } - /** @name XcmV1MultiassetWildMultiAsset (102) */ + /** @name XcmV1MultiassetWildMultiAsset (107) */ interface XcmV1MultiassetWildMultiAsset extends Enum { readonly isAll: boolean; readonly isAllOf: boolean; @@ -1226,14 +1296,14 @@ declare module '@polkadot/types/lookup' { readonly type: 'All' | 'AllOf'; } - /** @name XcmV1MultiassetWildFungibility (103) */ + /** @name XcmV1MultiassetWildFungibility (108) */ interface XcmV1MultiassetWildFungibility extends Enum { readonly isFungible: boolean; readonly isNonFungible: boolean; readonly type: 'Fungible' | 'NonFungible'; } - /** @name XcmV2WeightLimit (104) */ + /** @name XcmV2WeightLimit (109) */ interface XcmV2WeightLimit extends Enum { readonly isUnlimited: boolean; readonly isLimited: boolean; @@ -1241,7 +1311,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'Unlimited' | 'Limited'; } - /** @name XcmVersionedMultiAssets (106) */ + /** @name XcmVersionedMultiAssets (111) */ interface XcmVersionedMultiAssets extends Enum { readonly isV0: boolean; readonly asV0: Vec; @@ -1250,7 +1320,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'V0' | 'V1'; } - /** @name XcmV0MultiAsset (108) */ + /** @name XcmV0MultiAsset (113) */ interface XcmV0MultiAsset extends Enum { readonly isNone: boolean; readonly isAll: boolean; @@ -1295,7 +1365,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'None' | 'All' | 'AllFungible' | 'AllNonFungible' | 'AllAbstractFungible' | 'AllAbstractNonFungible' | 'AllConcreteFungible' | 'AllConcreteNonFungible' | 'AbstractFungible' | 'AbstractNonFungible' | 'ConcreteFungible' | 'ConcreteNonFungible'; } - /** @name XcmV0MultiLocation (109) */ + /** @name XcmV0MultiLocation (114) */ interface XcmV0MultiLocation extends Enum { readonly isNull: boolean; readonly isX1: boolean; @@ -1317,7 +1387,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'Null' | 'X1' | 'X2' | 'X3' | 'X4' | 'X5' | 'X6' | 'X7' | 'X8'; } - /** @name XcmV0Junction (110) */ + /** @name XcmV0Junction (115) */ interface XcmV0Junction extends Enum { readonly isParent: boolean; readonly isParachain: boolean; @@ -1352,7 +1422,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'Parent' | 'Parachain' | 'AccountId32' | 'AccountIndex64' | 'AccountKey20' | 'PalletInstance' | 'GeneralIndex' | 'GeneralKey' | 'OnlyChild' | 'Plurality'; } - /** @name XcmVersionedMultiLocation (111) */ + /** @name XcmVersionedMultiLocation (116) */ interface XcmVersionedMultiLocation extends Enum { readonly isV0: boolean; readonly asV0: XcmV0MultiLocation; @@ -1361,7 +1431,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'V0' | 'V1'; } - /** @name CumulusPalletXcmEvent (112) */ + /** @name CumulusPalletXcmEvent (117) */ interface CumulusPalletXcmEvent extends Enum { readonly isInvalidFormat: boolean; readonly asInvalidFormat: U8aFixed; @@ -1372,7 +1442,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'InvalidFormat' | 'UnsupportedVersion' | 'ExecutedDownward'; } - /** @name CumulusPalletDmpQueueEvent (113) */ + /** @name CumulusPalletDmpQueueEvent (118) */ interface CumulusPalletDmpQueueEvent extends Enum { readonly isInvalidFormat: boolean; readonly asInvalidFormat: { @@ -1407,7 +1477,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'InvalidFormat' | 'UnsupportedVersion' | 'ExecutedDownward' | 'WeightExhausted' | 'OverweightEnqueued' | 'OverweightServiced'; } - /** @name FrameSystemPhase (114) */ + /** @name FrameSystemPhase (119) */ interface FrameSystemPhase extends Enum { readonly isApplyExtrinsic: boolean; readonly asApplyExtrinsic: u32; @@ -1416,13 +1486,13 @@ declare module '@polkadot/types/lookup' { readonly type: 'ApplyExtrinsic' | 'Finalization' | 'Initialization'; } - /** @name FrameSystemLastRuntimeUpgradeInfo (117) */ + /** @name FrameSystemLastRuntimeUpgradeInfo (122) */ interface FrameSystemLastRuntimeUpgradeInfo extends Struct { readonly specVersion: Compact; readonly specName: Text; } - /** @name FrameSystemCall (119) */ + /** @name FrameSystemCall (124) */ interface FrameSystemCall extends Enum { readonly isFillBlock: boolean; readonly asFillBlock: { @@ -1464,21 +1534,21 @@ declare module '@polkadot/types/lookup' { readonly type: 'FillBlock' | 'Remark' | 'SetHeapPages' | 'SetCode' | 'SetCodeWithoutChecks' | 'SetStorage' | 'KillStorage' | 'KillPrefix' | 'RemarkWithEvent'; } - /** @name FrameSystemLimitsBlockWeights (124) */ + /** @name FrameSystemLimitsBlockWeights (129) */ interface FrameSystemLimitsBlockWeights extends Struct { readonly baseBlock: u64; readonly maxBlock: u64; readonly perClass: FrameSupportWeightsPerDispatchClassWeightsPerClass; } - /** @name FrameSupportWeightsPerDispatchClassWeightsPerClass (125) */ + /** @name FrameSupportWeightsPerDispatchClassWeightsPerClass (130) */ interface FrameSupportWeightsPerDispatchClassWeightsPerClass extends Struct { readonly normal: FrameSystemLimitsWeightsPerClass; readonly operational: FrameSystemLimitsWeightsPerClass; readonly mandatory: FrameSystemLimitsWeightsPerClass; } - /** @name FrameSystemLimitsWeightsPerClass (126) */ + /** @name FrameSystemLimitsWeightsPerClass (131) */ interface FrameSystemLimitsWeightsPerClass extends Struct { readonly baseExtrinsic: u64; readonly maxExtrinsic: Option; @@ -1486,25 +1556,25 @@ declare module '@polkadot/types/lookup' { readonly reserved: Option; } - /** @name FrameSystemLimitsBlockLength (128) */ + /** @name FrameSystemLimitsBlockLength (133) */ interface FrameSystemLimitsBlockLength extends Struct { readonly max: FrameSupportWeightsPerDispatchClassU32; } - /** @name FrameSupportWeightsPerDispatchClassU32 (129) */ + /** @name FrameSupportWeightsPerDispatchClassU32 (134) */ interface FrameSupportWeightsPerDispatchClassU32 extends Struct { readonly normal: u32; readonly operational: u32; readonly mandatory: u32; } - /** @name FrameSupportWeightsRuntimeDbWeight (130) */ + /** @name FrameSupportWeightsRuntimeDbWeight (135) */ interface FrameSupportWeightsRuntimeDbWeight extends Struct { readonly read: u64; readonly write: u64; } - /** @name SpVersionRuntimeVersion (131) */ + /** @name SpVersionRuntimeVersion (136) */ interface SpVersionRuntimeVersion extends Struct { readonly specName: Text; readonly implName: Text; @@ -1516,7 +1586,7 @@ declare module '@polkadot/types/lookup' { readonly stateVersion: u8; } - /** @name FrameSystemError (135) */ + /** @name FrameSystemError (140) */ interface FrameSystemError extends Enum { readonly isInvalidSpecName: boolean; readonly isSpecVersionNeedsToIncrease: boolean; @@ -1527,7 +1597,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'InvalidSpecName' | 'SpecVersionNeedsToIncrease' | 'FailedToExtractRuntimeVersion' | 'NonDefaultComposite' | 'NonZeroRefCount' | 'CallFiltered'; } - /** @name PalletTimestampCall (137) */ + /** @name PalletTimestampCall (142) */ interface PalletTimestampCall extends Enum { readonly isSet: boolean; readonly asSet: { @@ -1536,7 +1606,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'Set'; } - /** @name PalletIndicesCall (139) */ + /** @name PalletIndicesCall (144) */ interface PalletIndicesCall extends Enum { readonly isClaim: boolean; readonly asClaim: { @@ -1564,7 +1634,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'Claim' | 'Transfer' | 'Free' | 'ForceTransfer' | 'Freeze'; } - /** @name PalletIndicesError (140) */ + /** @name PalletIndicesError (145) */ interface PalletIndicesError extends Enum { readonly isNotAssigned: boolean; readonly isNotOwner: boolean; @@ -1574,14 +1644,14 @@ declare module '@polkadot/types/lookup' { readonly type: 'NotAssigned' | 'NotOwner' | 'InUse' | 'NotTransfer' | 'Permanent'; } - /** @name PalletBalancesBalanceLock (142) */ + /** @name PalletBalancesBalanceLock (147) */ interface PalletBalancesBalanceLock extends Struct { readonly id: U8aFixed; readonly amount: u128; readonly reasons: PalletBalancesReasons; } - /** @name PalletBalancesReasons (143) */ + /** @name PalletBalancesReasons (148) */ interface PalletBalancesReasons extends Enum { readonly isFee: boolean; readonly isMisc: boolean; @@ -1589,20 +1659,20 @@ declare module '@polkadot/types/lookup' { readonly type: 'Fee' | 'Misc' | 'All'; } - /** @name PalletBalancesReserveData (146) */ + /** @name PalletBalancesReserveData (151) */ interface PalletBalancesReserveData extends Struct { readonly id: U8aFixed; readonly amount: u128; } - /** @name PalletBalancesReleases (148) */ + /** @name PalletBalancesReleases (153) */ interface PalletBalancesReleases extends Enum { readonly isV100: boolean; readonly isV200: boolean; readonly type: 'V100' | 'V200'; } - /** @name PalletBalancesCall (149) */ + /** @name PalletBalancesCall (154) */ interface PalletBalancesCall extends Enum { readonly isTransfer: boolean; readonly asTransfer: { @@ -1639,7 +1709,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'Transfer' | 'SetBalance' | 'ForceTransfer' | 'TransferKeepAlive' | 'TransferAll' | 'ForceUnreserve'; } - /** @name PalletBalancesError (152) */ + /** @name PalletBalancesError (157) */ interface PalletBalancesError extends Enum { readonly isVestingBalance: boolean; readonly isLiquidityRestrictions: boolean; @@ -1652,14 +1722,14 @@ declare module '@polkadot/types/lookup' { readonly type: 'VestingBalance' | 'LiquidityRestrictions' | 'InsufficientBalance' | 'ExistentialDeposit' | 'KeepAlive' | 'ExistingVestingSchedule' | 'DeadAccount' | 'TooManyReserves'; } - /** @name PalletTransactionPaymentReleases (154) */ + /** @name PalletTransactionPaymentReleases (159) */ interface PalletTransactionPaymentReleases extends Enum { readonly isV1Ancient: boolean; readonly isV2: boolean; readonly type: 'V1Ancient' | 'V2'; } - /** @name PalletAuthorshipUncleEntryItem (156) */ + /** @name PalletAuthorshipUncleEntryItem (161) */ interface PalletAuthorshipUncleEntryItem extends Enum { readonly isInclusionHeight: boolean; readonly asInclusionHeight: u64; @@ -1668,7 +1738,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'InclusionHeight' | 'Uncle'; } - /** @name PalletAuthorshipCall (158) */ + /** @name PalletAuthorshipCall (164) */ interface PalletAuthorshipCall extends Enum { readonly isSetUncles: boolean; readonly asSetUncles: { @@ -1677,7 +1747,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'SetUncles'; } - /** @name SpRuntimeHeader (160) */ + /** @name SpRuntimeHeader (166) */ interface SpRuntimeHeader extends Struct { readonly parentHash: H256; readonly number: Compact; @@ -1686,10 +1756,10 @@ declare module '@polkadot/types/lookup' { readonly digest: SpRuntimeDigest; } - /** @name SpRuntimeBlakeTwo256 (161) */ + /** @name SpRuntimeBlakeTwo256 (167) */ type SpRuntimeBlakeTwo256 = Null; - /** @name PalletAuthorshipError (162) */ + /** @name PalletAuthorshipError (168) */ interface PalletAuthorshipError extends Enum { readonly isInvalidUncleParent: boolean; readonly isUnclesAlreadySet: boolean; @@ -1701,35 +1771,35 @@ declare module '@polkadot/types/lookup' { readonly type: 'InvalidUncleParent' | 'UnclesAlreadySet' | 'TooManyUncles' | 'GenesisUncle' | 'TooHighUncle' | 'UncleAlreadyIncluded' | 'OldUncle'; } - /** @name ParachainStakingRoundInfo (163) */ + /** @name ParachainStakingRoundInfo (169) */ interface ParachainStakingRoundInfo extends Struct { readonly current: u32; readonly first: u64; readonly length: u64; } - /** @name ParachainStakingDelegationCounter (164) */ + /** @name ParachainStakingDelegationCounter (170) */ interface ParachainStakingDelegationCounter extends Struct { readonly round: u32; readonly counter: u32; } - /** @name ParachainStakingDelegator (165) */ + /** @name ParachainStakingDelegator (171) */ interface ParachainStakingDelegator extends Struct { readonly delegations: ParachainStakingSetOrderedSet; readonly total: u128; } - /** @name ParachainStakingSetOrderedSet (166) */ + /** @name ParachainStakingSetOrderedSet (172) */ interface ParachainStakingSetOrderedSet extends Vec {} - /** @name ParachainStakingStake (167) */ + /** @name ParachainStakingStake (173) */ interface ParachainStakingStake extends Struct { readonly owner: AccountId32; readonly amount: u128; } - /** @name ParachainStakingCandidate (170) */ + /** @name ParachainStakingCandidate (176) */ interface ParachainStakingCandidate extends Struct { readonly id: AccountId32; readonly stake: u128; @@ -1738,7 +1808,7 @@ declare module '@polkadot/types/lookup' { readonly status: ParachainStakingCandidateStatus; } - /** @name ParachainStakingCandidateStatus (173) */ + /** @name ParachainStakingCandidateStatus (179) */ interface ParachainStakingCandidateStatus extends Enum { readonly isActive: boolean; readonly isLeaving: boolean; @@ -1746,31 +1816,31 @@ declare module '@polkadot/types/lookup' { readonly type: 'Active' | 'Leaving'; } - /** @name ParachainStakingTotalStake (174) */ + /** @name ParachainStakingTotalStake (180) */ interface ParachainStakingTotalStake extends Struct { readonly collators: u128; readonly delegators: u128; } - /** @name ParachainStakingInflationInflationInfo (177) */ + /** @name ParachainStakingInflationInflationInfo (183) */ interface ParachainStakingInflationInflationInfo extends Struct { readonly collator: ParachainStakingInflationStakingInfo; readonly delegator: ParachainStakingInflationStakingInfo; } - /** @name ParachainStakingInflationStakingInfo (178) */ + /** @name ParachainStakingInflationStakingInfo (184) */ interface ParachainStakingInflationStakingInfo extends Struct { readonly maxRate: Perquintill; readonly rewardRate: ParachainStakingInflationRewardRate; } - /** @name ParachainStakingInflationRewardRate (179) */ + /** @name ParachainStakingInflationRewardRate (185) */ interface ParachainStakingInflationRewardRate extends Struct { readonly annual: Perquintill; readonly perBlock: Perquintill; } - /** @name ParachainStakingCall (184) */ + /** @name ParachainStakingCall (190) */ interface ParachainStakingCall extends Enum { readonly isForceNewRound: boolean; readonly isSetInflation: boolean; @@ -1846,7 +1916,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'ForceNewRound' | 'SetInflation' | 'SetMaxSelectedCandidates' | 'SetBlocksPerRound' | 'SetMaxCandidateStake' | 'ForceRemoveCandidate' | 'JoinCandidates' | 'InitLeaveCandidates' | 'ExecuteLeaveCandidates' | 'CancelLeaveCandidates' | 'CandidateStakeMore' | 'CandidateStakeLess' | 'JoinDelegators' | 'DelegateAnotherCandidate' | 'LeaveDelegators' | 'RevokeDelegation' | 'DelegatorStakeMore' | 'DelegatorStakeLess' | 'UnlockUnstaked'; } - /** @name ParachainStakingError (185) */ + /** @name ParachainStakingError (191) */ interface ParachainStakingError extends Enum { readonly isDelegatorNotFound: boolean; readonly isCandidateNotFound: boolean; @@ -1881,21 +1951,21 @@ declare module '@polkadot/types/lookup' { readonly type: 'DelegatorNotFound' | 'CandidateNotFound' | 'DelegatorExists' | 'CandidateExists' | 'ValStakeZero' | 'ValStakeBelowMin' | 'ValStakeAboveMax' | 'NomStakeBelowMin' | 'DelegationBelowMin' | 'AlreadyLeaving' | 'NotLeaving' | 'CannotLeaveYet' | 'CannotJoinBeforeUnlocking' | 'AlreadyDelegating' | 'NotYetDelegating' | 'DelegationsPerRoundExceeded' | 'TooManyDelegators' | 'TooFewCollatorCandidates' | 'CannotStakeIfLeaving' | 'CannotDelegateIfLeaving' | 'MaxCollatorsPerDelegatorExceeded' | 'AlreadyDelegatedCollator' | 'DelegationNotFound' | 'Underflow' | 'CannotSetAboveMax' | 'CannotSetBelowMin' | 'InvalidSchedule' | 'NoMoreUnstaking' | 'StakeNotFound' | 'UnstakingIsEmpty'; } - /** @name SpiritnetRuntimeSessionKeys (188) */ + /** @name SpiritnetRuntimeSessionKeys (194) */ interface SpiritnetRuntimeSessionKeys extends Struct { readonly aura: SpConsensusAuraSr25519AppSr25519Public; } - /** @name SpConsensusAuraSr25519AppSr25519Public (189) */ + /** @name SpConsensusAuraSr25519AppSr25519Public (195) */ interface SpConsensusAuraSr25519AppSr25519Public extends SpCoreSr25519Public {} - /** @name SpCoreSr25519Public (190) */ + /** @name SpCoreSr25519Public (196) */ interface SpCoreSr25519Public extends U8aFixed {} - /** @name SpCoreCryptoKeyTypeId (193) */ + /** @name SpCoreCryptoKeyTypeId (199) */ interface SpCoreCryptoKeyTypeId extends U8aFixed {} - /** @name PalletSessionCall (194) */ + /** @name PalletSessionCall (200) */ interface PalletSessionCall extends Enum { readonly isSetKeys: boolean; readonly asSetKeys: { @@ -1906,7 +1976,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'SetKeys' | 'PurgeKeys'; } - /** @name PalletSessionError (195) */ + /** @name PalletSessionError (201) */ interface PalletSessionError extends Enum { readonly isInvalidProof: boolean; readonly isNoAssociatedValidatorId: boolean; @@ -1916,10 +1986,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'InvalidProof' | 'NoAssociatedValidatorId' | 'DuplicatedKey' | 'NoKeys' | 'NoAccount'; } - /** @name CumulusPalletAuraExtCall (199) */ - type CumulusPalletAuraExtCall = Null; - - /** @name PalletDemocracyPreimageStatus (203) */ + /** @name PalletDemocracyPreimageStatus (208) */ interface PalletDemocracyPreimageStatus extends Enum { readonly isMissing: boolean; readonly asMissing: u64; @@ -1934,7 +2001,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'Missing' | 'Available'; } - /** @name PalletDemocracyReferendumInfo (204) */ + /** @name PalletDemocracyReferendumInfo (209) */ interface PalletDemocracyReferendumInfo extends Enum { readonly isOngoing: boolean; readonly asOngoing: PalletDemocracyReferendumStatus; @@ -1946,7 +2013,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'Ongoing' | 'Finished'; } - /** @name PalletDemocracyReferendumStatus (205) */ + /** @name PalletDemocracyReferendumStatus (210) */ interface PalletDemocracyReferendumStatus extends Struct { readonly end: u64; readonly proposalHash: H256; @@ -1955,14 +2022,14 @@ declare module '@polkadot/types/lookup' { readonly tally: PalletDemocracyTally; } - /** @name PalletDemocracyTally (206) */ + /** @name PalletDemocracyTally (211) */ interface PalletDemocracyTally extends Struct { readonly ayes: u128; readonly nays: u128; readonly turnout: u128; } - /** @name PalletDemocracyVoteVoting (207) */ + /** @name PalletDemocracyVoteVoting (212) */ interface PalletDemocracyVoteVoting extends Enum { readonly isDirect: boolean; readonly asDirect: { @@ -1981,16 +2048,16 @@ declare module '@polkadot/types/lookup' { readonly type: 'Direct' | 'Delegating'; } - /** @name PalletDemocracyDelegations (210) */ + /** @name PalletDemocracyDelegations (215) */ interface PalletDemocracyDelegations extends Struct { readonly votes: u128; readonly capital: u128; } - /** @name PalletDemocracyVotePriorLock (211) */ + /** @name PalletDemocracyVotePriorLock (216) */ interface PalletDemocracyVotePriorLock extends ITuple<[u64, u128]> {} - /** @name PalletDemocracyConviction (212) */ + /** @name PalletDemocracyConviction (217) */ interface PalletDemocracyConviction extends Enum { readonly isNone: boolean; readonly isLocked1x: boolean; @@ -2002,13 +2069,13 @@ declare module '@polkadot/types/lookup' { readonly type: 'None' | 'Locked1x' | 'Locked2x' | 'Locked3x' | 'Locked4x' | 'Locked5x' | 'Locked6x'; } - /** @name PalletDemocracyReleases (215) */ + /** @name PalletDemocracyReleases (220) */ interface PalletDemocracyReleases extends Enum { readonly isV1: boolean; readonly type: 'V1'; } - /** @name PalletDemocracyCall (216) */ + /** @name PalletDemocracyCall (221) */ interface PalletDemocracyCall extends Enum { readonly isPropose: boolean; readonly asPropose: { @@ -2118,7 +2185,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'Propose' | 'Second' | 'Vote' | 'EmergencyCancel' | 'ExternalPropose' | 'ExternalProposeMajority' | 'ExternalProposeDefault' | 'FastTrack' | 'VetoExternal' | 'CancelReferendum' | 'CancelQueued' | 'Delegate' | 'Undelegate' | 'ClearPublicProposals' | 'NotePreimage' | 'NotePreimageOperational' | 'NoteImminentPreimage' | 'NoteImminentPreimageOperational' | 'ReapPreimage' | 'Unlock' | 'RemoveVote' | 'RemoveOtherVote' | 'EnactProposal' | 'Blacklist' | 'CancelProposal'; } - /** @name PalletDemocracyError (218) */ + /** @name PalletDemocracyError (223) */ interface PalletDemocracyError extends Enum { readonly isValueLow: boolean; readonly isProposalMissing: boolean; @@ -2148,10 +2215,11 @@ declare module '@polkadot/types/lookup' { readonly isWrongUpperBound: boolean; readonly isMaxVotesReached: boolean; readonly isTooManyProposals: boolean; - readonly type: 'ValueLow' | 'ProposalMissing' | 'AlreadyCanceled' | 'DuplicateProposal' | 'ProposalBlacklisted' | 'NotSimpleMajority' | 'InvalidHash' | 'NoProposal' | 'AlreadyVetoed' | 'DuplicatePreimage' | 'NotImminent' | 'TooEarly' | 'Imminent' | 'PreimageMissing' | 'ReferendumInvalid' | 'PreimageInvalid' | 'NoneWaiting' | 'NotVoter' | 'NoPermission' | 'AlreadyDelegating' | 'InsufficientFunds' | 'NotDelegating' | 'VotesExist' | 'InstantNotAllowed' | 'Nonsense' | 'WrongUpperBound' | 'MaxVotesReached' | 'TooManyProposals'; + readonly isVotingPeriodLow: boolean; + readonly type: 'ValueLow' | 'ProposalMissing' | 'AlreadyCanceled' | 'DuplicateProposal' | 'ProposalBlacklisted' | 'NotSimpleMajority' | 'InvalidHash' | 'NoProposal' | 'AlreadyVetoed' | 'DuplicatePreimage' | 'NotImminent' | 'TooEarly' | 'Imminent' | 'PreimageMissing' | 'ReferendumInvalid' | 'PreimageInvalid' | 'NoneWaiting' | 'NotVoter' | 'NoPermission' | 'AlreadyDelegating' | 'InsufficientFunds' | 'NotDelegating' | 'VotesExist' | 'InstantNotAllowed' | 'Nonsense' | 'WrongUpperBound' | 'MaxVotesReached' | 'TooManyProposals' | 'VotingPeriodLow'; } - /** @name PalletCollectiveCall (221) */ + /** @name PalletCollectiveCall (226) */ interface PalletCollectiveCall extends Enum { readonly isSetMembers: boolean; readonly asSetMembers: { @@ -2190,7 +2258,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'SetMembers' | 'Execute' | 'Propose' | 'Vote' | 'Close' | 'DisapproveProposal'; } - /** @name PalletMembershipCall (223) */ + /** @name PalletMembershipCall (228) */ interface PalletMembershipCall extends Enum { readonly isAddMember: boolean; readonly asAddMember: { @@ -2221,7 +2289,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'AddMember' | 'RemoveMember' | 'SwapMember' | 'ResetMembers' | 'ChangeKey' | 'SetPrime' | 'ClearPrime'; } - /** @name PalletTreasuryCall (224) */ + /** @name PalletTreasuryCall (229) */ interface PalletTreasuryCall extends Enum { readonly isProposeSpend: boolean; readonly asProposeSpend: { @@ -2236,14 +2304,41 @@ declare module '@polkadot/types/lookup' { readonly asApproveProposal: { readonly proposalId: Compact; } & Struct; + readonly isSpend: boolean; + readonly asSpend: { + readonly amount: Compact; + readonly beneficiary: MultiAddress; + } & Struct; readonly isRemoveApproval: boolean; readonly asRemoveApproval: { readonly proposalId: Compact; } & Struct; - readonly type: 'ProposeSpend' | 'RejectProposal' | 'ApproveProposal' | 'RemoveApproval'; + readonly type: 'ProposeSpend' | 'RejectProposal' | 'ApproveProposal' | 'Spend' | 'RemoveApproval'; + } + + /** @name PalletRelayMigrationCall (230) */ + interface PalletRelayMigrationCall extends Enum { + readonly isSendSwapCallBytes: boolean; + readonly asSendSwapCallBytes: { + readonly relayCall: Bytes; + readonly relayBalance: u128; + readonly maxWeight: u64; + } & Struct; + readonly isEnableStrictRelayNumberCheck: boolean; + readonly isDisableStrictRelayNumberCheck: boolean; + readonly type: 'SendSwapCallBytes' | 'EnableStrictRelayNumberCheck' | 'DisableStrictRelayNumberCheck'; } - /** @name PalletUtilityCall (225) */ + /** @name PalletDynFilterCall (231) */ + interface PalletDynFilterCall extends Enum { + readonly isSetFilter: boolean; + readonly asSetFilter: { + readonly filter: PalletDynFilterSettingFilterSettings; + } & Struct; + readonly type: 'SetFilter'; + } + + /** @name PalletUtilityCall (232) */ interface PalletUtilityCall extends Enum { readonly isBatch: boolean; readonly asBatch: { @@ -2270,7 +2365,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'Batch' | 'AsDerivative' | 'BatchAll' | 'DispatchAs' | 'ForceBatch'; } - /** @name SpiritnetRuntimeOriginCaller (227) */ + /** @name SpiritnetRuntimeOriginCaller (234) */ interface SpiritnetRuntimeOriginCaller extends Enum { readonly isSystem: boolean; readonly asSystem: FrameSupportDispatchRawOrigin; @@ -2288,7 +2383,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'System' | 'Void' | 'Council' | 'TechnicalCommittee' | 'Did' | 'PolkadotXcm' | 'CumulusXcm'; } - /** @name FrameSupportDispatchRawOrigin (228) */ + /** @name FrameSupportDispatchRawOrigin (235) */ interface FrameSupportDispatchRawOrigin extends Enum { readonly isRoot: boolean; readonly isSigned: boolean; @@ -2297,7 +2392,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'Root' | 'Signed' | 'None'; } - /** @name PalletCollectiveRawOrigin (229) */ + /** @name PalletCollectiveRawOrigin (236) */ interface PalletCollectiveRawOrigin extends Enum { readonly isMembers: boolean; readonly asMembers: ITuple<[u32, u32]>; @@ -2307,13 +2402,13 @@ declare module '@polkadot/types/lookup' { readonly type: 'Members' | 'Member' | 'Phantom'; } - /** @name DidOriginDidRawOrigin (231) */ + /** @name DidOriginDidRawOrigin (238) */ interface DidOriginDidRawOrigin extends Struct { readonly id: AccountId32; readonly submitter: AccountId32; } - /** @name PalletXcmOrigin (232) */ + /** @name PalletXcmOrigin (239) */ interface PalletXcmOrigin extends Enum { readonly isXcm: boolean; readonly asXcm: XcmV1MultiLocation; @@ -2322,7 +2417,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'Xcm' | 'Response'; } - /** @name CumulusPalletXcmOrigin (233) */ + /** @name CumulusPalletXcmOrigin (240) */ interface CumulusPalletXcmOrigin extends Enum { readonly isRelay: boolean; readonly isSiblingParachain: boolean; @@ -2330,10 +2425,10 @@ declare module '@polkadot/types/lookup' { readonly type: 'Relay' | 'SiblingParachain'; } - /** @name SpCoreVoid (234) */ + /** @name SpCoreVoid (241) */ type SpCoreVoid = Null; - /** @name PalletVestingCall (235) */ + /** @name PalletVestingCall (242) */ interface PalletVestingCall extends Enum { readonly isVest: boolean; readonly isVestOther: boolean; @@ -2359,14 +2454,14 @@ declare module '@polkadot/types/lookup' { readonly type: 'Vest' | 'VestOther' | 'VestedTransfer' | 'ForceVestedTransfer' | 'MergeSchedules'; } - /** @name PalletVestingVestingInfo (236) */ + /** @name PalletVestingVestingInfo (243) */ interface PalletVestingVestingInfo extends Struct { readonly locked: u128; readonly perBlock: u128; readonly startingBlock: u64; } - /** @name PalletSchedulerCall (237) */ + /** @name PalletSchedulerCall (244) */ interface PalletSchedulerCall extends Enum { readonly isSchedule: boolean; readonly asSchedule: { @@ -2410,7 +2505,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'Schedule' | 'Cancel' | 'ScheduleNamed' | 'CancelNamed' | 'ScheduleAfter' | 'ScheduleNamedAfter'; } - /** @name FrameSupportScheduleMaybeHashed (239) */ + /** @name FrameSupportScheduleMaybeHashed (246) */ interface FrameSupportScheduleMaybeHashed extends Enum { readonly isValue: boolean; readonly asValue: Call; @@ -2419,7 +2514,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'Value' | 'Hash'; } - /** @name PalletProxyCall (240) */ + /** @name PalletProxyCall (247) */ interface PalletProxyCall extends Enum { readonly isProxy: boolean; readonly asProxy: { @@ -2479,7 +2574,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'Proxy' | 'AddProxy' | 'RemoveProxy' | 'RemoveProxies' | 'Anonymous' | 'KillAnonymous' | 'Announce' | 'RemoveAnnouncement' | 'RejectAnnouncement' | 'ProxyAnnounced'; } - /** @name PalletPreimageCall (242) */ + /** @name PalletPreimageCall (249) */ interface PalletPreimageCall extends Enum { readonly isNotePreimage: boolean; readonly asNotePreimage: { @@ -2500,7 +2595,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'NotePreimage' | 'UnnotePreimage' | 'RequestPreimage' | 'UnrequestPreimage'; } - /** @name PalletTipsCall (244) */ + /** @name PalletTipsCall (251) */ interface PalletTipsCall extends Enum { readonly isReportAwesome: boolean; readonly asReportAwesome: { @@ -2533,7 +2628,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'ReportAwesome' | 'RetractTip' | 'TipNew' | 'Tip' | 'CloseTip' | 'SlashTip'; } - /** @name CtypeCall (245) */ + /** @name CtypeCall (252) */ interface CtypeCall extends Enum { readonly isAdd: boolean; readonly asAdd: { @@ -2542,7 +2637,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'Add'; } - /** @name AttestationCall (246) */ + /** @name AttestationCall (253) */ interface AttestationCall extends Enum { readonly isAdd: boolean; readonly asAdd: { @@ -2567,23 +2662,23 @@ declare module '@polkadot/types/lookup' { readonly type: 'Add' | 'Revoke' | 'Remove' | 'ReclaimDeposit'; } - /** @name RuntimeCommonAuthorizationPalletAuthorize (248) */ + /** @name RuntimeCommonAuthorizationPalletAuthorize (255) */ interface RuntimeCommonAuthorizationPalletAuthorize extends Enum { readonly isDelegation: boolean; readonly asDelegation: DelegationAccessControlDelegationAc; readonly type: 'Delegation'; } - /** @name DelegationAccessControlDelegationAc (249) */ + /** @name DelegationAccessControlDelegationAc (256) */ interface DelegationAccessControlDelegationAc extends Struct { readonly subjectNodeId: H256; readonly maxChecks: u32; } - /** @name SpiritnetRuntimeRuntime (250) */ + /** @name SpiritnetRuntimeRuntime (257) */ type SpiritnetRuntimeRuntime = Null; - /** @name DelegationCall (251) */ + /** @name DelegationCall (258) */ interface DelegationCall extends Enum { readonly isCreateHierarchy: boolean; readonly asCreateHierarchy: { @@ -2617,7 +2712,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'CreateHierarchy' | 'AddDelegation' | 'RevokeDelegation' | 'RemoveDelegation' | 'ReclaimDeposit'; } - /** @name DidDidDetailsDidSignature (252) */ + /** @name DidDidDetailsDidSignature (259) */ interface DidDidDetailsDidSignature extends Enum { readonly isEd25519: boolean; readonly asEd25519: SpCoreEd25519Signature; @@ -2628,16 +2723,16 @@ declare module '@polkadot/types/lookup' { readonly type: 'Ed25519' | 'Sr25519' | 'Ecdsa'; } - /** @name SpCoreEd25519Signature (253) */ + /** @name SpCoreEd25519Signature (260) */ interface SpCoreEd25519Signature extends U8aFixed {} - /** @name SpCoreSr25519Signature (255) */ + /** @name SpCoreSr25519Signature (262) */ interface SpCoreSr25519Signature extends U8aFixed {} - /** @name SpCoreEcdsaSignature (256) */ + /** @name SpCoreEcdsaSignature (263) */ interface SpCoreEcdsaSignature extends U8aFixed {} - /** @name DidCall (258) */ + /** @name DidCall (265) */ interface DidCall extends Enum { readonly isCreate: boolean; readonly asCreate: { @@ -2691,7 +2786,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'Create' | 'SetAuthenticationKey' | 'SetDelegationKey' | 'RemoveDelegationKey' | 'SetAttestationKey' | 'RemoveAttestationKey' | 'AddKeyAgreementKey' | 'RemoveKeyAgreementKey' | 'AddServiceEndpoint' | 'RemoveServiceEndpoint' | 'Delete' | 'ReclaimDeposit' | 'SubmitDidCall'; } - /** @name DidDidDetailsDidCreationDetails (259) */ + /** @name DidDidDetailsDidCreationDetails (266) */ interface DidDidDetailsDidCreationDetails extends Struct { readonly did: AccountId32; readonly submitter: AccountId32; @@ -2701,14 +2796,14 @@ declare module '@polkadot/types/lookup' { readonly newServiceDetails: Vec; } - /** @name DidDidDetailsDidEncryptionKey (261) */ + /** @name DidDidDetailsDidEncryptionKey (268) */ interface DidDidDetailsDidEncryptionKey extends Enum { readonly isX25519: boolean; readonly asX25519: U8aFixed; readonly type: 'X25519'; } - /** @name DidDidDetailsDidVerificationKey (265) */ + /** @name DidDidDetailsDidVerificationKey (272) */ interface DidDidDetailsDidVerificationKey extends Enum { readonly isEd25519: boolean; readonly asEd25519: SpCoreEd25519Public; @@ -2719,20 +2814,20 @@ declare module '@polkadot/types/lookup' { readonly type: 'Ed25519' | 'Sr25519' | 'Ecdsa'; } - /** @name SpCoreEd25519Public (266) */ + /** @name SpCoreEd25519Public (273) */ interface SpCoreEd25519Public extends U8aFixed {} - /** @name SpCoreEcdsaPublic (267) */ + /** @name SpCoreEcdsaPublic (274) */ interface SpCoreEcdsaPublic extends U8aFixed {} - /** @name DidServiceEndpointsDidEndpoint (270) */ + /** @name DidServiceEndpointsDidEndpoint (277) */ interface DidServiceEndpointsDidEndpoint extends Struct { readonly id: Bytes; readonly serviceTypes: Vec; readonly urls: Vec; } - /** @name DidDidDetailsDidAuthorizedCallOperation (278) */ + /** @name DidDidDetailsDidAuthorizedCallOperation (285) */ interface DidDidDetailsDidAuthorizedCallOperation extends Struct { readonly did: AccountId32; readonly txCounter: u64; @@ -2741,7 +2836,7 @@ declare module '@polkadot/types/lookup' { readonly submitter: AccountId32; } - /** @name PalletDidLookupCall (279) */ + /** @name PalletDidLookupCall (286) */ interface PalletDidLookupCall extends Enum { readonly isAssociateAccount: boolean; readonly asAssociateAccount: { @@ -2762,7 +2857,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'AssociateAccount' | 'AssociateSender' | 'RemoveSenderAssociation' | 'RemoveAccountAssociation' | 'ReclaimDeposit'; } - /** @name SpRuntimeMultiSignature (280) */ + /** @name SpRuntimeMultiSignature (287) */ interface SpRuntimeMultiSignature extends Enum { readonly isEd25519: boolean; readonly asEd25519: SpCoreEd25519Signature; @@ -2773,7 +2868,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'Ed25519' | 'Sr25519' | 'Ecdsa'; } - /** @name PalletWeb3NamesCall (281) */ + /** @name PalletWeb3NamesCall (288) */ interface PalletWeb3NamesCall extends Enum { readonly isClaim: boolean; readonly asClaim: { @@ -2795,7 +2890,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'Claim' | 'ReleaseByOwner' | 'ReclaimDeposit' | 'Ban' | 'Unban'; } - /** @name CumulusPalletParachainSystemCall (282) */ + /** @name CumulusPalletParachainSystemCall (289) */ interface CumulusPalletParachainSystemCall extends Enum { readonly isSetValidationData: boolean; readonly asSetValidationData: { @@ -2816,7 +2911,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'SetValidationData' | 'SudoSendUpwardMessage' | 'AuthorizeUpgrade' | 'EnactAuthorizedUpgrade'; } - /** @name CumulusPrimitivesParachainInherentParachainInherentData (283) */ + /** @name CumulusPrimitivesParachainInherentParachainInherentData (290) */ interface CumulusPrimitivesParachainInherentParachainInherentData extends Struct { readonly validationData: PolkadotPrimitivesV2PersistedValidationData; readonly relayChainState: SpTrieStorageProof; @@ -2824,7 +2919,7 @@ declare module '@polkadot/types/lookup' { readonly horizontalMessages: BTreeMap>; } - /** @name PolkadotPrimitivesV2PersistedValidationData (284) */ + /** @name PolkadotPrimitivesV2PersistedValidationData (291) */ interface PolkadotPrimitivesV2PersistedValidationData extends Struct { readonly parentHead: Bytes; readonly relayParentNumber: u32; @@ -2832,24 +2927,24 @@ declare module '@polkadot/types/lookup' { readonly maxPovSize: u32; } - /** @name SpTrieStorageProof (286) */ + /** @name SpTrieStorageProof (293) */ interface SpTrieStorageProof extends Struct { readonly trieNodes: BTreeSet; } - /** @name PolkadotCorePrimitivesInboundDownwardMessage (289) */ + /** @name PolkadotCorePrimitivesInboundDownwardMessage (296) */ interface PolkadotCorePrimitivesInboundDownwardMessage extends Struct { readonly sentAt: u32; readonly msg: Bytes; } - /** @name PolkadotCorePrimitivesInboundHrmpMessage (292) */ + /** @name PolkadotCorePrimitivesInboundHrmpMessage (299) */ interface PolkadotCorePrimitivesInboundHrmpMessage extends Struct { readonly sentAt: u32; readonly data: Bytes; } - /** @name CumulusPalletXcmpQueueCall (295) */ + /** @name CumulusPalletXcmpQueueCall (302) */ interface CumulusPalletXcmpQueueCall extends Enum { readonly isServiceOverweight: boolean; readonly asServiceOverweight: { @@ -2885,7 +2980,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'ServiceOverweight' | 'SuspendXcmExecution' | 'ResumeXcmExecution' | 'UpdateSuspendThreshold' | 'UpdateDropThreshold' | 'UpdateResumeThreshold' | 'UpdateThresholdWeight' | 'UpdateWeightRestrictDecay' | 'UpdateXcmpMaxIndividualWeight'; } - /** @name PalletXcmCall (296) */ + /** @name PalletXcmCall (303) */ interface PalletXcmCall extends Enum { readonly isSend: boolean; readonly asSend: { @@ -2947,7 +3042,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'Send' | 'TeleportAssets' | 'ReserveTransferAssets' | 'Execute' | 'ForceXcmVersion' | 'ForceDefaultXcmVersion' | 'ForceSubscribeVersionNotify' | 'ForceUnsubscribeVersionNotify' | 'LimitedReserveTransferAssets' | 'LimitedTeleportAssets'; } - /** @name XcmVersionedXcm (297) */ + /** @name XcmVersionedXcm (304) */ interface XcmVersionedXcm extends Enum { readonly isV0: boolean; readonly asV0: XcmV0Xcm; @@ -2958,7 +3053,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'V0' | 'V1' | 'V2'; } - /** @name XcmV0Xcm (298) */ + /** @name XcmV0Xcm (305) */ interface XcmV0Xcm extends Enum { readonly isWithdrawAsset: boolean; readonly asWithdrawAsset: { @@ -3021,7 +3116,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'WithdrawAsset' | 'ReserveAssetDeposit' | 'TeleportAsset' | 'QueryResponse' | 'TransferAsset' | 'TransferReserveAsset' | 'Transact' | 'HrmpNewChannelOpenRequest' | 'HrmpChannelAccepted' | 'HrmpChannelClosing' | 'RelayedFrom'; } - /** @name XcmV0Order (300) */ + /** @name XcmV0Order (307) */ interface XcmV0Order extends Enum { readonly isNull: boolean; readonly isDepositAsset: boolean; @@ -3069,14 +3164,14 @@ declare module '@polkadot/types/lookup' { readonly type: 'Null' | 'DepositAsset' | 'DepositReserveAsset' | 'ExchangeAsset' | 'InitiateReserveWithdraw' | 'InitiateTeleport' | 'QueryHolding' | 'BuyExecution'; } - /** @name XcmV0Response (302) */ + /** @name XcmV0Response (309) */ interface XcmV0Response extends Enum { readonly isAssets: boolean; readonly asAssets: Vec; readonly type: 'Assets'; } - /** @name XcmV1Xcm (303) */ + /** @name XcmV1Xcm (310) */ interface XcmV1Xcm extends Enum { readonly isWithdrawAsset: boolean; readonly asWithdrawAsset: { @@ -3145,7 +3240,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'WithdrawAsset' | 'ReserveAssetDeposited' | 'ReceiveTeleportedAsset' | 'QueryResponse' | 'TransferAsset' | 'TransferReserveAsset' | 'Transact' | 'HrmpNewChannelOpenRequest' | 'HrmpChannelAccepted' | 'HrmpChannelClosing' | 'RelayedFrom' | 'SubscribeVersion' | 'UnsubscribeVersion'; } - /** @name XcmV1Order (305) */ + /** @name XcmV1Order (312) */ interface XcmV1Order extends Enum { readonly isNoop: boolean; readonly isDepositAsset: boolean; @@ -3195,7 +3290,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'Noop' | 'DepositAsset' | 'DepositReserveAsset' | 'ExchangeAsset' | 'InitiateReserveWithdraw' | 'InitiateTeleport' | 'QueryHolding' | 'BuyExecution'; } - /** @name XcmV1Response (307) */ + /** @name XcmV1Response (314) */ interface XcmV1Response extends Enum { readonly isAssets: boolean; readonly asAssets: XcmV1MultiassetMultiAssets; @@ -3204,7 +3299,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'Assets' | 'Version'; } - /** @name CumulusPalletDmpQueueCall (321) */ + /** @name CumulusPalletDmpQueueCall (328) */ interface CumulusPalletDmpQueueCall extends Enum { readonly isServiceOverweight: boolean; readonly asServiceOverweight: { @@ -3214,7 +3309,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'ServiceOverweight'; } - /** @name PalletCollectiveVotes (322) */ + /** @name PalletCollectiveVotes (329) */ interface PalletCollectiveVotes extends Struct { readonly index: u32; readonly threshold: u32; @@ -3223,7 +3318,7 @@ declare module '@polkadot/types/lookup' { readonly end: u64; } - /** @name PalletCollectiveError (323) */ + /** @name PalletCollectiveError (330) */ interface PalletCollectiveError extends Enum { readonly isNotMember: boolean; readonly isDuplicateProposal: boolean; @@ -3238,14 +3333,15 @@ declare module '@polkadot/types/lookup' { readonly type: 'NotMember' | 'DuplicateProposal' | 'ProposalMissing' | 'WrongIndex' | 'DuplicateVote' | 'AlreadyInitialized' | 'TooEarly' | 'TooManyProposals' | 'WrongProposalWeight' | 'WrongProposalLength'; } - /** @name PalletMembershipError (326) */ + /** @name PalletMembershipError (334) */ interface PalletMembershipError extends Enum { readonly isAlreadyMember: boolean; readonly isNotMember: boolean; - readonly type: 'AlreadyMember' | 'NotMember'; + readonly isTooManyMembers: boolean; + readonly type: 'AlreadyMember' | 'NotMember' | 'TooManyMembers'; } - /** @name PalletTreasuryProposal (327) */ + /** @name PalletTreasuryProposal (335) */ interface PalletTreasuryProposal extends Struct { readonly proposer: AccountId32; readonly value: u128; @@ -3253,32 +3349,39 @@ declare module '@polkadot/types/lookup' { readonly bond: u128; } - /** @name FrameSupportPalletId (331) */ + /** @name FrameSupportPalletId (339) */ interface FrameSupportPalletId extends U8aFixed {} - /** @name PalletTreasuryError (332) */ + /** @name PalletTreasuryError (340) */ interface PalletTreasuryError extends Enum { readonly isInsufficientProposersBalance: boolean; readonly isInvalidIndex: boolean; readonly isTooManyApprovals: boolean; + readonly isInsufficientPermission: boolean; readonly isProposalNotApproved: boolean; - readonly type: 'InsufficientProposersBalance' | 'InvalidIndex' | 'TooManyApprovals' | 'ProposalNotApproved'; + readonly type: 'InsufficientProposersBalance' | 'InvalidIndex' | 'TooManyApprovals' | 'InsufficientPermission' | 'ProposalNotApproved'; } - /** @name PalletUtilityError (333) */ + /** @name PalletRelayMigrationError (341) */ + type PalletRelayMigrationError = Null; + + /** @name PalletDynFilterError (342) */ + type PalletDynFilterError = Null; + + /** @name PalletUtilityError (343) */ interface PalletUtilityError extends Enum { readonly isTooManyCalls: boolean; readonly type: 'TooManyCalls'; } - /** @name PalletVestingReleases (336) */ + /** @name PalletVestingReleases (346) */ interface PalletVestingReleases extends Enum { readonly isV0: boolean; readonly isV1: boolean; readonly type: 'V0' | 'V1'; } - /** @name PalletVestingError (337) */ + /** @name PalletVestingError (347) */ interface PalletVestingError extends Enum { readonly isNotVesting: boolean; readonly isAtMaxVestingSchedules: boolean; @@ -3288,7 +3391,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'NotVesting' | 'AtMaxVestingSchedules' | 'AmountLow' | 'ScheduleIndexOutOfBounds' | 'InvalidScheduleParams'; } - /** @name PalletSchedulerScheduledV3 (340) */ + /** @name PalletSchedulerScheduledV3 (350) */ interface PalletSchedulerScheduledV3 extends Struct { readonly maybeId: Option; readonly priority: u8; @@ -3297,7 +3400,7 @@ declare module '@polkadot/types/lookup' { readonly origin: SpiritnetRuntimeOriginCaller; } - /** @name PalletSchedulerError (341) */ + /** @name PalletSchedulerError (351) */ interface PalletSchedulerError extends Enum { readonly isFailedToSchedule: boolean; readonly isNotFound: boolean; @@ -3306,21 +3409,21 @@ declare module '@polkadot/types/lookup' { readonly type: 'FailedToSchedule' | 'NotFound' | 'TargetBlockNumberInPast' | 'RescheduleNoChange'; } - /** @name PalletProxyProxyDefinition (344) */ + /** @name PalletProxyProxyDefinition (354) */ interface PalletProxyProxyDefinition extends Struct { readonly delegate: AccountId32; readonly proxyType: SpiritnetRuntimeProxyType; readonly delay: u64; } - /** @name PalletProxyAnnouncement (348) */ + /** @name PalletProxyAnnouncement (358) */ interface PalletProxyAnnouncement extends Struct { readonly real: AccountId32; readonly callHash: H256; readonly height: u64; } - /** @name PalletProxyError (350) */ + /** @name PalletProxyError (360) */ interface PalletProxyError extends Enum { readonly isTooMany: boolean; readonly isNotFound: boolean; @@ -3333,7 +3436,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'TooMany' | 'NotFound' | 'NotProxy' | 'Unproxyable' | 'Duplicate' | 'NoPermission' | 'Unannounced' | 'NoSelfProxy'; } - /** @name PalletPreimageRequestStatus (351) */ + /** @name PalletPreimageRequestStatus (361) */ interface PalletPreimageRequestStatus extends Enum { readonly isUnrequested: boolean; readonly asUnrequested: Option>; @@ -3342,7 +3445,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'Unrequested' | 'Requested'; } - /** @name PalletPreimageError (355) */ + /** @name PalletPreimageError (365) */ interface PalletPreimageError extends Enum { readonly isTooLarge: boolean; readonly isAlreadyNoted: boolean; @@ -3353,7 +3456,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'TooLarge' | 'AlreadyNoted' | 'NotAuthorized' | 'NotNoted' | 'Requested' | 'NotRequested'; } - /** @name PalletTipsOpenTip (357) */ + /** @name PalletTipsOpenTip (367) */ interface PalletTipsOpenTip extends Struct { readonly reason: H256; readonly who: AccountId32; @@ -3364,7 +3467,7 @@ declare module '@polkadot/types/lookup' { readonly findersFee: bool; } - /** @name PalletTipsError (360) */ + /** @name PalletTipsError (370) */ interface PalletTipsError extends Enum { readonly isReasonTooBig: boolean; readonly isAlreadyKnown: boolean; @@ -3375,7 +3478,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'ReasonTooBig' | 'AlreadyKnown' | 'UnknownTip' | 'NotFinder' | 'StillOpen' | 'Premature'; } - /** @name CtypeError (361) */ + /** @name CtypeError (371) */ interface CtypeError extends Enum { readonly isCTypeNotFound: boolean; readonly isCTypeAlreadyExists: boolean; @@ -3383,7 +3486,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'CTypeNotFound' | 'CTypeAlreadyExists' | 'UnableToPayFees'; } - /** @name AttestationAttestationsAttestationDetails (362) */ + /** @name AttestationAttestationsAttestationDetails (372) */ interface AttestationAttestationsAttestationDetails extends Struct { readonly ctypeHash: H256; readonly attester: AccountId32; @@ -3392,13 +3495,13 @@ declare module '@polkadot/types/lookup' { readonly deposit: KiltSupportDeposit; } - /** @name KiltSupportDeposit (363) */ + /** @name KiltSupportDeposit (373) */ interface KiltSupportDeposit extends Struct { readonly owner: AccountId32; readonly amount: u128; } - /** @name AttestationError (365) */ + /** @name AttestationError (375) */ interface AttestationError extends Enum { readonly isAlreadyAttested: boolean; readonly isAlreadyRevoked: boolean; @@ -3409,7 +3512,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'AlreadyAttested' | 'AlreadyRevoked' | 'AttestationNotFound' | 'CTypeMismatch' | 'Unauthorized' | 'MaxDelegatedAttestationsExceeded'; } - /** @name DelegationDelegationHierarchyDelegationNode (366) */ + /** @name DelegationDelegationHierarchyDelegationNode (376) */ interface DelegationDelegationHierarchyDelegationNode extends Struct { readonly hierarchyRootId: H256; readonly parent: Option; @@ -3418,19 +3521,19 @@ declare module '@polkadot/types/lookup' { readonly deposit: KiltSupportDeposit; } - /** @name DelegationDelegationHierarchyDelegationDetails (369) */ + /** @name DelegationDelegationHierarchyDelegationDetails (379) */ interface DelegationDelegationHierarchyDelegationDetails extends Struct { readonly owner: AccountId32; readonly revoked: bool; readonly permissions: DelegationDelegationHierarchyPermissions; } - /** @name DelegationDelegationHierarchyDelegationHierarchyDetails (370) */ + /** @name DelegationDelegationHierarchyDelegationHierarchyDetails (380) */ interface DelegationDelegationHierarchyDelegationHierarchyDetails extends Struct { readonly ctypeHash: H256; } - /** @name DelegationError (371) */ + /** @name DelegationError (381) */ interface DelegationError extends Enum { readonly isDelegationAlreadyExists: boolean; readonly isInvalidDelegateSignature: boolean; @@ -3457,7 +3560,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'DelegationAlreadyExists' | 'InvalidDelegateSignature' | 'DelegationNotFound' | 'DelegateNotFound' | 'HierarchyAlreadyExists' | 'HierarchyNotFound' | 'MaxSearchDepthReached' | 'NotOwnerOfParentDelegation' | 'NotOwnerOfDelegationHierarchy' | 'ParentDelegationNotFound' | 'ParentDelegationRevoked' | 'UnauthorizedRevocation' | 'UnauthorizedRemoval' | 'UnauthorizedDelegation' | 'AccessDenied' | 'ExceededRevocationBounds' | 'ExceededRemovalBounds' | 'MaxRevocationsTooLarge' | 'MaxRemovalsTooLarge' | 'MaxParentChecksTooLarge' | 'InternalError' | 'MaxChildrenExceeded'; } - /** @name DidDidDetails (372) */ + /** @name DidDidDetails (382) */ interface DidDidDetails extends Struct { readonly authenticationKey: H256; readonly keyAgreementKeys: BTreeSet; @@ -3468,13 +3571,13 @@ declare module '@polkadot/types/lookup' { readonly deposit: KiltSupportDeposit; } - /** @name DidDidDetailsDidPublicKeyDetails (375) */ + /** @name DidDidDetailsDidPublicKeyDetails (385) */ interface DidDidDetailsDidPublicKeyDetails extends Struct { readonly key: DidDidDetailsDidPublicKey; readonly blockNumber: u64; } - /** @name DidDidDetailsDidPublicKey (376) */ + /** @name DidDidDetailsDidPublicKey (386) */ interface DidDidDetailsDidPublicKey extends Enum { readonly isPublicVerificationKey: boolean; readonly asPublicVerificationKey: DidDidDetailsDidVerificationKey; @@ -3483,7 +3586,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'PublicVerificationKey' | 'PublicEncryptionKey'; } - /** @name DidError (381) */ + /** @name DidError (391) */ interface DidError extends Enum { readonly isInvalidSignatureFormat: boolean; readonly isInvalidSignature: boolean; @@ -3515,13 +3618,13 @@ declare module '@polkadot/types/lookup' { readonly type: 'InvalidSignatureFormat' | 'InvalidSignature' | 'DidAlreadyPresent' | 'DidNotPresent' | 'VerificationKeyNotPresent' | 'InvalidNonce' | 'UnsupportedDidAuthorizationCall' | 'InvalidDidAuthorizationCall' | 'MaxKeyAgreementKeysLimitExceeded' | 'MaxPublicKeysPerDidExceeded' | 'MaxTotalKeyAgreementKeysExceeded' | 'BadDidOrigin' | 'TransactionExpired' | 'DidAlreadyDeleted' | 'NotOwnerOfDeposit' | 'UnableToPayFees' | 'MaxNumberOfServicesPerDidExceeded' | 'MaxServiceIdLengthExceeded' | 'MaxServiceTypeLengthExceeded' | 'MaxNumberOfTypesPerServiceExceeded' | 'MaxServiceUrlLengthExceeded' | 'MaxNumberOfUrlsPerServiceExceeded' | 'ServiceAlreadyPresent' | 'ServiceNotPresent' | 'InvalidServiceEncoding' | 'StoredEndpointsCountTooLarge' | 'InternalError'; } - /** @name PalletDidLookupConnectionRecord (382) */ + /** @name PalletDidLookupConnectionRecord (392) */ interface PalletDidLookupConnectionRecord extends Struct { readonly did: AccountId32; readonly deposit: KiltSupportDeposit; } - /** @name PalletDidLookupError (384) */ + /** @name PalletDidLookupError (394) */ interface PalletDidLookupError extends Enum { readonly isAssociationNotFound: boolean; readonly isNotAuthorized: boolean; @@ -3530,14 +3633,14 @@ declare module '@polkadot/types/lookup' { readonly type: 'AssociationNotFound' | 'NotAuthorized' | 'OutdatedProof' | 'InsufficientFunds'; } - /** @name PalletWeb3NamesWeb3NameWeb3NameOwnership (385) */ + /** @name PalletWeb3NamesWeb3NameWeb3NameOwnership (395) */ interface PalletWeb3NamesWeb3NameWeb3NameOwnership extends Struct { readonly owner: AccountId32; readonly claimedAt: u64; readonly deposit: KiltSupportDeposit; } - /** @name PalletWeb3NamesError (386) */ + /** @name PalletWeb3NamesError (396) */ interface PalletWeb3NamesError extends Enum { readonly isInsufficientFunds: boolean; readonly isWeb3NameAlreadyClaimed: boolean; @@ -3554,13 +3657,13 @@ declare module '@polkadot/types/lookup' { readonly type: 'InsufficientFunds' | 'Web3NameAlreadyClaimed' | 'Web3NameNotFound' | 'OwnerAlreadyExists' | 'OwnerNotFound' | 'Web3NameBanned' | 'Web3NameNotBanned' | 'Web3NameAlreadyBanned' | 'NotAuthorized' | 'Web3NameTooShort' | 'Web3NameTooLong' | 'InvalidWeb3NameCharacter'; } - /** @name PolkadotPrimitivesV2UpgradeRestriction (388) */ + /** @name PolkadotPrimitivesV2UpgradeRestriction (398) */ interface PolkadotPrimitivesV2UpgradeRestriction extends Enum { readonly isPresent: boolean; readonly type: 'Present'; } - /** @name CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot (389) */ + /** @name CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot (399) */ interface CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot extends Struct { readonly dmqMqcHead: H256; readonly relayDispatchQueueSize: ITuple<[u32, u32]>; @@ -3568,7 +3671,7 @@ declare module '@polkadot/types/lookup' { readonly egressChannels: Vec>; } - /** @name PolkadotPrimitivesV2AbridgedHrmpChannel (393) */ + /** @name PolkadotPrimitivesV2AbridgedHrmpChannel (403) */ interface PolkadotPrimitivesV2AbridgedHrmpChannel extends Struct { readonly maxCapacity: u32; readonly maxTotalSize: u32; @@ -3578,7 +3681,7 @@ declare module '@polkadot/types/lookup' { readonly mqcHead: Option; } - /** @name PolkadotPrimitivesV2AbridgedHostConfiguration (394) */ + /** @name PolkadotPrimitivesV2AbridgedHostConfiguration (404) */ interface PolkadotPrimitivesV2AbridgedHostConfiguration extends Struct { readonly maxCodeSize: u32; readonly maxHeadDataSize: u32; @@ -3591,13 +3694,13 @@ declare module '@polkadot/types/lookup' { readonly validationUpgradeDelay: u32; } - /** @name PolkadotCorePrimitivesOutboundHrmpMessage (400) */ + /** @name PolkadotCorePrimitivesOutboundHrmpMessage (410) */ interface PolkadotCorePrimitivesOutboundHrmpMessage extends Struct { readonly recipient: u32; readonly data: Bytes; } - /** @name CumulusPalletParachainSystemError (401) */ + /** @name CumulusPalletParachainSystemError (411) */ interface CumulusPalletParachainSystemError extends Enum { readonly isOverlappingUpgrades: boolean; readonly isProhibitedByPolkadot: boolean; @@ -3610,21 +3713,21 @@ declare module '@polkadot/types/lookup' { readonly type: 'OverlappingUpgrades' | 'ProhibitedByPolkadot' | 'TooBig' | 'ValidationDataNotAvailable' | 'HostConfigurationNotAvailable' | 'NotScheduled' | 'NothingAuthorized' | 'Unauthorized'; } - /** @name CumulusPalletXcmpQueueInboundChannelDetails (403) */ + /** @name CumulusPalletXcmpQueueInboundChannelDetails (413) */ interface CumulusPalletXcmpQueueInboundChannelDetails extends Struct { readonly sender: u32; readonly state: CumulusPalletXcmpQueueInboundState; readonly messageMetadata: Vec>; } - /** @name CumulusPalletXcmpQueueInboundState (404) */ + /** @name CumulusPalletXcmpQueueInboundState (414) */ interface CumulusPalletXcmpQueueInboundState extends Enum { readonly isOk: boolean; readonly isSuspended: boolean; readonly type: 'Ok' | 'Suspended'; } - /** @name PolkadotParachainPrimitivesXcmpMessageFormat (407) */ + /** @name PolkadotParachainPrimitivesXcmpMessageFormat (417) */ interface PolkadotParachainPrimitivesXcmpMessageFormat extends Enum { readonly isConcatenatedVersionedXcm: boolean; readonly isConcatenatedEncodedBlob: boolean; @@ -3632,7 +3735,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'ConcatenatedVersionedXcm' | 'ConcatenatedEncodedBlob' | 'Signals'; } - /** @name CumulusPalletXcmpQueueOutboundChannelDetails (410) */ + /** @name CumulusPalletXcmpQueueOutboundChannelDetails (420) */ interface CumulusPalletXcmpQueueOutboundChannelDetails extends Struct { readonly recipient: u32; readonly state: CumulusPalletXcmpQueueOutboundState; @@ -3641,14 +3744,14 @@ declare module '@polkadot/types/lookup' { readonly lastIndex: u16; } - /** @name CumulusPalletXcmpQueueOutboundState (411) */ + /** @name CumulusPalletXcmpQueueOutboundState (421) */ interface CumulusPalletXcmpQueueOutboundState extends Enum { readonly isOk: boolean; readonly isSuspended: boolean; readonly type: 'Ok' | 'Suspended'; } - /** @name CumulusPalletXcmpQueueQueueConfigData (413) */ + /** @name CumulusPalletXcmpQueueQueueConfigData (423) */ interface CumulusPalletXcmpQueueQueueConfigData extends Struct { readonly suspendThreshold: u32; readonly dropThreshold: u32; @@ -3658,7 +3761,7 @@ declare module '@polkadot/types/lookup' { readonly xcmpMaxIndividualWeight: u64; } - /** @name CumulusPalletXcmpQueueError (415) */ + /** @name CumulusPalletXcmpQueueError (425) */ interface CumulusPalletXcmpQueueError extends Enum { readonly isFailedToSend: boolean; readonly isBadXcmOrigin: boolean; @@ -3668,7 +3771,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'FailedToSend' | 'BadXcmOrigin' | 'BadXcm' | 'BadOverweightIndex' | 'WeightOverLimit'; } - /** @name PalletXcmError (416) */ + /** @name PalletXcmError (426) */ interface PalletXcmError extends Enum { readonly isUnreachable: boolean; readonly isSendFailure: boolean; @@ -3686,47 +3789,47 @@ declare module '@polkadot/types/lookup' { readonly type: 'Unreachable' | 'SendFailure' | 'Filtered' | 'UnweighableMessage' | 'DestinationNotInvertible' | 'Empty' | 'CannotReanchor' | 'TooManyAssets' | 'InvalidOrigin' | 'BadVersion' | 'BadLocation' | 'NoSubscription' | 'AlreadySubscribed'; } - /** @name CumulusPalletXcmError (417) */ + /** @name CumulusPalletXcmError (427) */ type CumulusPalletXcmError = Null; - /** @name CumulusPalletDmpQueueConfigData (418) */ + /** @name CumulusPalletDmpQueueConfigData (428) */ interface CumulusPalletDmpQueueConfigData extends Struct { readonly maxIndividual: u64; } - /** @name CumulusPalletDmpQueuePageIndexData (419) */ + /** @name CumulusPalletDmpQueuePageIndexData (429) */ interface CumulusPalletDmpQueuePageIndexData extends Struct { readonly beginUsed: u32; readonly endUsed: u32; readonly overweightCount: u64; } - /** @name CumulusPalletDmpQueueError (422) */ + /** @name CumulusPalletDmpQueueError (432) */ interface CumulusPalletDmpQueueError extends Enum { readonly isUnknown: boolean; readonly isOverLimit: boolean; readonly type: 'Unknown' | 'OverLimit'; } - /** @name FrameSystemExtensionsCheckNonZeroSender (425) */ + /** @name FrameSystemExtensionsCheckNonZeroSender (435) */ type FrameSystemExtensionsCheckNonZeroSender = Null; - /** @name FrameSystemExtensionsCheckSpecVersion (426) */ + /** @name FrameSystemExtensionsCheckSpecVersion (436) */ type FrameSystemExtensionsCheckSpecVersion = Null; - /** @name FrameSystemExtensionsCheckTxVersion (427) */ + /** @name FrameSystemExtensionsCheckTxVersion (437) */ type FrameSystemExtensionsCheckTxVersion = Null; - /** @name FrameSystemExtensionsCheckGenesis (428) */ + /** @name FrameSystemExtensionsCheckGenesis (438) */ type FrameSystemExtensionsCheckGenesis = Null; - /** @name FrameSystemExtensionsCheckNonce (431) */ + /** @name FrameSystemExtensionsCheckNonce (441) */ interface FrameSystemExtensionsCheckNonce extends Compact {} - /** @name FrameSystemExtensionsCheckWeight (432) */ + /** @name FrameSystemExtensionsCheckWeight (442) */ type FrameSystemExtensionsCheckWeight = Null; - /** @name PalletTransactionPaymentChargeTransactionPayment (433) */ + /** @name PalletTransactionPaymentChargeTransactionPayment (443) */ interface PalletTransactionPaymentChargeTransactionPayment extends Compact {} } // declare module diff --git a/packages/augment-api/src/interfaces/types.ts b/packages/augment-api/src/interfaces/types.ts index 5aa673d41..0407897e5 100644 --- a/packages/augment-api/src/interfaces/types.ts +++ b/packages/augment-api/src/interfaces/types.ts @@ -2,3 +2,4 @@ /* eslint-disable */ export * from './extraDefs/types.js'; +export * from './did/types.js'; diff --git a/packages/augment-api/tsconfig.build.json b/packages/augment-api/tsconfig.build.json index bff86ca43..46233a664 100644 --- a/packages/augment-api/tsconfig.build.json +++ b/packages/augment-api/tsconfig.build.json @@ -4,7 +4,18 @@ "module": "CommonJS", "outDir": "./lib/cjs", "skipLibCheck": true, - "noUnusedLocals": false + "noUnusedLocals": false, + "paths": { + "@kiltprotocol/augment-api/*": [ + "./src/*" + ], + "@polkadot/api/augment": [ + "./src/interfaces/augment-api.ts" + ], + "@polkadot/types/augment": [ + "./src/interfaces/augment-types.ts" + ] + } }, "include": [ "src/**/*.ts", @@ -14,5 +25,5 @@ "coverage", "**/*.spec.ts", "src/**/definitions.ts", - ] + ], } \ No newline at end of file diff --git a/packages/chain-helpers/package.json b/packages/chain-helpers/package.json index 13e9263bb..144e3cd4f 100644 --- a/packages/chain-helpers/package.json +++ b/packages/chain-helpers/package.json @@ -40,7 +40,7 @@ "@kiltprotocol/config": "workspace:*", "@kiltprotocol/types": "workspace:*", "@kiltprotocol/utils": "workspace:*", - "@polkadot/api": "^9.0.0", - "@polkadot/types": "^9.0.0" + "@polkadot/api": "^9.4.1", + "@polkadot/types": "^9.4.1" } } diff --git a/packages/config/package.json b/packages/config/package.json index 2469781d9..db50018fa 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -36,7 +36,7 @@ "dependencies": { "@kiltprotocol/types": "workspace:*", "@kiltprotocol/utils": "workspace:*", - "@polkadot/api": "^9.0.0", + "@polkadot/api": "^9.4.1", "typescript-logging": "^0.6.4" } } diff --git a/packages/core/package.json b/packages/core/package.json index b27c67a4e..9896ae2c8 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -41,11 +41,12 @@ "@kiltprotocol/chain-helpers": "workspace:*", "@kiltprotocol/config": "workspace:*", "@kiltprotocol/did": "workspace:*", + "@kiltprotocol/type-definitions": "0.2.0", "@kiltprotocol/types": "workspace:*", "@kiltprotocol/utils": "workspace:*", - "@polkadot/api": "^9.0.0", + "@polkadot/api": "^9.4.1", "@polkadot/keyring": "^10.0.0", - "@polkadot/types": "^9.0.0", + "@polkadot/types": "^9.4.1", "@polkadot/util": "^10.0.0", "@polkadot/util-crypto": "^10.0.0" } diff --git a/packages/core/src/kilt/Kilt.ts b/packages/core/src/kilt/Kilt.ts index a05b7b634..9c763ccfe 100644 --- a/packages/core/src/kilt/Kilt.ts +++ b/packages/core/src/kilt/Kilt.ts @@ -16,6 +16,7 @@ import { cryptoWaitReady } from '@polkadot/util-crypto' import { ApiPromise, WsProvider } from '@polkadot/api' import { ConfigService } from '@kiltprotocol/config' +import { latest, rpc, runtime } from '@kiltprotocol/type-definitions' /** * Allows setting global configuration such as the log level and the polkadot ApiPromise instance used throughout the sdk. @@ -51,6 +52,9 @@ export async function connect(blockchainRpcWsUrl: string): Promise { const provider = new WsProvider(blockchainRpcWsUrl) const api = await ApiPromise.create({ provider, + types: latest, + rpc, + runtime, }) await init({ api }) return api.isReadyOrError diff --git a/packages/did/package.json b/packages/did/package.json index 976e220d5..d88e08476 100644 --- a/packages/did/package.json +++ b/packages/did/package.json @@ -39,10 +39,10 @@ "@kiltprotocol/config": "workspace:*", "@kiltprotocol/types": "workspace:*", "@kiltprotocol/utils": "workspace:*", - "@polkadot/api": "^9.0.0", + "@polkadot/api": "^9.4.1", "@polkadot/keyring": "^10.0.0", - "@polkadot/types": "^9.0.0", - "@polkadot/types-codec": "^9.0.0", + "@polkadot/types": "^9.4.1", + "@polkadot/types-codec": "^9.4.1", "@polkadot/util": "^10.0.0", "@polkadot/util-crypto": "^10.0.0", "cbor": "^8.0.2" diff --git a/packages/testing/package.json b/packages/testing/package.json index 3c9e0219b..a671f2246 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -36,9 +36,9 @@ "@kiltprotocol/did": "workspace:*", "@kiltprotocol/types": "workspace:*", "@kiltprotocol/utils": "workspace:*", - "@polkadot/api": "^9.0.0", + "@polkadot/api": "^9.4.1", "@polkadot/keyring": "^10.0.0", - "@polkadot/types": "^9.0.0", + "@polkadot/types": "^9.4.1", "@polkadot/util": "^10.0.0", "@polkadot/util-crypto": "^10.0.0" }, diff --git a/packages/types/package.json b/packages/types/package.json index e7816b6c5..be89ab27a 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -31,9 +31,9 @@ "homepage": "https://github.com/KILTprotocol/sdk-js#readme", "dependencies": { "@kiltprotocol/augment-api": "workspace:*", - "@polkadot/api": "^9.0.0", + "@polkadot/api": "^9.4.1", "@polkadot/keyring": "^10.0.0", - "@polkadot/types": "^9.0.0", + "@polkadot/types": "^9.4.1", "@polkadot/util": "^10.0.0", "@polkadot/util-crypto": "^10.0.0" }, diff --git a/packages/vc-export/package.json b/packages/vc-export/package.json index fea45e379..c9d4a8aeb 100644 --- a/packages/vc-export/package.json +++ b/packages/vc-export/package.json @@ -42,8 +42,8 @@ "@kiltprotocol/did": "workspace:*", "@kiltprotocol/types": "workspace:*", "@kiltprotocol/utils": "workspace:*", - "@polkadot/api": "^9.0.0", - "@polkadot/types": "^9.0.0", + "@polkadot/api": "^9.4.1", + "@polkadot/types": "^9.4.1", "@polkadot/util": "^10.0.0", "@polkadot/util-crypto": "^10.0.0", "jsonld": "^2.0.2", diff --git a/yarn.lock b/yarn.lock index e26ec2a6e..8f02ca91c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -41,10 +41,10 @@ __metadata: languageName: node linkType: hard -"@babel/compat-data@npm:^7.18.8": - version: 7.18.8 - resolution: "@babel/compat-data@npm:7.18.8" - checksum: 3096aafad74936477ebdd039bcf342fba84eb3100e608f3360850fb63e1efa1c66037c4824f814d62f439ab47d25164439343a6e92e9b4357024fdf571505eb9 +"@babel/compat-data@npm:^7.19.1": + version: 7.19.1 + resolution: "@babel/compat-data@npm:7.19.1" + checksum: f985887ea08a140e4af87a94d3fb17af0345491eb97f5a85b1840255c2e2a97429f32a8fd12a7aae9218af5f1024f1eb12a5cd280d2d69b2337583c17ea506ba languageName: node linkType: hard @@ -71,37 +71,37 @@ __metadata: languageName: node linkType: hard -"@babel/core@npm:7.18.10, @babel/core@npm:^7.1.0, @babel/core@npm:^7.12.3, @babel/core@npm:^7.18.10, @babel/core@npm:^7.7.2, @babel/core@npm:^7.8.0": - version: 7.18.10 - resolution: "@babel/core@npm:7.18.10" +"@babel/core@npm:7.19.1, @babel/core@npm:^7.1.0, @babel/core@npm:^7.12.3, @babel/core@npm:^7.19.1, @babel/core@npm:^7.7.2, @babel/core@npm:^7.8.0": + version: 7.19.1 + resolution: "@babel/core@npm:7.19.1" dependencies: "@ampproject/remapping": ^2.1.0 "@babel/code-frame": ^7.18.6 - "@babel/generator": ^7.18.10 - "@babel/helper-compilation-targets": ^7.18.9 - "@babel/helper-module-transforms": ^7.18.9 - "@babel/helpers": ^7.18.9 - "@babel/parser": ^7.18.10 + "@babel/generator": ^7.19.0 + "@babel/helper-compilation-targets": ^7.19.1 + "@babel/helper-module-transforms": ^7.19.0 + "@babel/helpers": ^7.19.0 + "@babel/parser": ^7.19.1 "@babel/template": ^7.18.10 - "@babel/traverse": ^7.18.10 - "@babel/types": ^7.18.10 + "@babel/traverse": ^7.19.1 + "@babel/types": ^7.19.0 convert-source-map: ^1.7.0 debug: ^4.1.0 gensync: ^1.0.0-beta.2 json5: ^2.2.1 semver: ^6.3.0 - checksum: 3a3fcd878430a9e1cb165f755c89fff45acc4efe4dd3a2ba356e89af331cb1947886b9782d56902a49af19ba3c24f08cf638a632699b9c5a4d8305c57c6a150d + checksum: 941c8c119b80bdba5fafc80bbaa424d51146b6d3c30b8fae35879358dd37c11d3d0926bc7e970a0861229656eedaa8c884d4a3a25cc904086eb73b827a2f1168 languageName: node linkType: hard -"@babel/generator@npm:^7.16.8, @babel/generator@npm:^7.18.10, @babel/generator@npm:^7.7.2": - version: 7.18.12 - resolution: "@babel/generator@npm:7.18.12" +"@babel/generator@npm:^7.16.8, @babel/generator@npm:^7.19.0, @babel/generator@npm:^7.7.2": + version: 7.19.0 + resolution: "@babel/generator@npm:7.19.0" dependencies: - "@babel/types": ^7.18.10 + "@babel/types": ^7.19.0 "@jridgewell/gen-mapping": ^0.3.2 jsesc: ^2.5.1 - checksum: 07dd71d255144bb703a80ab0156c35d64172ce81ddfb70ff24e2be687b052080233840c9a28d92fa2c33f7ecb8a8b30aef03b807518afc53b74c7908bf8859b1 + checksum: aa3d5785cf8f8e81672dcc61aef351188efeadb20d9f66d79113d82cbcf3bbbdeb829989fa14582108572ddbc4e4027bdceb06ccaf5ec40fa93c2dda8fbcd4aa languageName: node linkType: hard @@ -114,17 +114,17 @@ __metadata: languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.16.7, @babel/helper-compilation-targets@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/helper-compilation-targets@npm:7.18.9" +"@babel/helper-compilation-targets@npm:^7.16.7, @babel/helper-compilation-targets@npm:^7.19.1": + version: 7.19.1 + resolution: "@babel/helper-compilation-targets@npm:7.19.1" dependencies: - "@babel/compat-data": ^7.18.8 + "@babel/compat-data": ^7.19.1 "@babel/helper-validator-option": ^7.18.6 - browserslist: ^4.20.2 + browserslist: ^4.21.3 semver: ^6.3.0 peerDependencies: "@babel/core": ^7.0.0 - checksum: 2a9d71e124e098a9f45de4527ddd1982349d231827d341e00da9dfb967e260ecc7662c8b62abee4a010fb34d5f07a8d2155c974e0bc1928144cee5644910621d + checksum: c2d3039265e498b341a6b597f855f2fcef02659050fefedf36ad4e6815e6aafe1011a761214cc80d98260ed07ab15a8cbe959a0458e97bec5f05a450e1b1741b languageName: node linkType: hard @@ -152,13 +152,13 @@ __metadata: languageName: node linkType: hard -"@babel/helper-function-name@npm:^7.16.7, @babel/helper-function-name@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/helper-function-name@npm:7.18.9" +"@babel/helper-function-name@npm:^7.16.7, @babel/helper-function-name@npm:^7.19.0": + version: 7.19.0 + resolution: "@babel/helper-function-name@npm:7.19.0" dependencies: - "@babel/template": ^7.18.6 - "@babel/types": ^7.18.9 - checksum: d04c44e0272f887c0c868651be7fc3c5690531bea10936f00d4cca3f6d5db65e76dfb49e8d553c42ae1fe1eba61ccce9f3d93ba2df50a66408c8d4c3cc61cf0c + "@babel/template": ^7.18.10 + "@babel/types": ^7.19.0 + checksum: eac1f5db428ba546270c2b8d750c24eb528b8fcfe50c81de2e0bdebf0e20f24bec688d4331533b782e4a907fad435244621ca2193cfcf80a86731299840e0f6e languageName: node linkType: hard @@ -189,19 +189,19 @@ __metadata: languageName: node linkType: hard -"@babel/helper-module-transforms@npm:^7.16.7, @babel/helper-module-transforms@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/helper-module-transforms@npm:7.18.9" +"@babel/helper-module-transforms@npm:^7.16.7, @babel/helper-module-transforms@npm:^7.19.0": + version: 7.19.0 + resolution: "@babel/helper-module-transforms@npm:7.19.0" dependencies: "@babel/helper-environment-visitor": ^7.18.9 "@babel/helper-module-imports": ^7.18.6 "@babel/helper-simple-access": ^7.18.6 "@babel/helper-split-export-declaration": ^7.18.6 "@babel/helper-validator-identifier": ^7.18.6 - "@babel/template": ^7.18.6 - "@babel/traverse": ^7.18.9 - "@babel/types": ^7.18.9 - checksum: af08c60ea239ff3d40eda542fceaab69de17e713f131e80ead08c975ba7a47dd55d439cb48cfb14ae7ec96704a10c989ff5a5240e52a39101cb44a49467ce058 + "@babel/template": ^7.18.10 + "@babel/traverse": ^7.19.0 + "@babel/types": ^7.19.0 + checksum: 4483276c66f56cf3b5b063634092ad9438c2593725de5c143ba277dda82f1501e6d73b311c1b28036f181dbe36eaeff29f24726cde37a599d4e735af294e5359 languageName: node linkType: hard @@ -282,14 +282,14 @@ __metadata: languageName: node linkType: hard -"@babel/helpers@npm:^7.16.7, @babel/helpers@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/helpers@npm:7.18.9" +"@babel/helpers@npm:^7.16.7, @babel/helpers@npm:^7.19.0": + version: 7.19.0 + resolution: "@babel/helpers@npm:7.19.0" dependencies: - "@babel/template": ^7.18.6 - "@babel/traverse": ^7.18.9 - "@babel/types": ^7.18.9 - checksum: d0bd8255d36bfc65dc52ce75f7fea778c70287da2d64981db4c84fbdf9581409ecbd6433deff1c81da3a5acf26d7e4c364b3a4445efacf88f4f48e77c5b34d8d + "@babel/template": ^7.18.10 + "@babel/traverse": ^7.19.0 + "@babel/types": ^7.19.0 + checksum: e50e78e0dbb0435075fa3f85021a6bcae529589800bca0292721afd7f7c874bea54508d6dc57eca16e5b8224f8142c6b0e32e3b0140029dc09865da747da4623 languageName: node linkType: hard @@ -304,12 +304,12 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.16.12, @babel/parser@npm:^7.18.10, @babel/parser@npm:^7.18.11": - version: 7.18.11 - resolution: "@babel/parser@npm:7.18.11" +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.16.12, @babel/parser@npm:^7.18.10, @babel/parser@npm:^7.19.1": + version: 7.19.1 + resolution: "@babel/parser@npm:7.19.1" bin: parser: ./bin/babel-parser.js - checksum: 5ecc75b83e62ec53a947b1635a6ca75d6210d4a4f962f9f16f4239a6783f98e57f9662b598fa2fb1b8e12c0ad5c2bd86846ed0b97b85eb73dd7498b3a6d71a4b + checksum: b1e0acb346b2a533c857e1e97ac0886cdcbd76aafef67835a2b23f760c10568eb53ad8a27dd5f862d8ba4e583742e6067f107281ccbd68959d61bc61e4ddaa51 languageName: node linkType: hard @@ -655,16 +655,16 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:^7.18.9, @babel/runtime@npm:^7.9.6": - version: 7.18.9 - resolution: "@babel/runtime@npm:7.18.9" +"@babel/runtime@npm:^7.18.9, @babel/runtime@npm:^7.19.0, @babel/runtime@npm:^7.9.6": + version: 7.19.0 + resolution: "@babel/runtime@npm:7.19.0" dependencies: regenerator-runtime: ^0.13.4 - checksum: 36dd736baba7164e82b3cc9d43e081f0cb2d05ff867ad39cac515d99546cee75b7f782018b02a3dcf5f2ef3d27f319faa68965fdfec49d4912c60c6002353a2e + checksum: fa69c351bb05e1db3ceb9a02fdcf620c234180af68cdda02152d3561015f6d55277265d3109815992f96d910f3db709458cae4f8df1c3def66f32e0867d82294 languageName: node linkType: hard -"@babel/template@npm:^7.16.7, @babel/template@npm:^7.18.10, @babel/template@npm:^7.18.6, @babel/template@npm:^7.3.3": +"@babel/template@npm:^7.16.7, @babel/template@npm:^7.18.10, @babel/template@npm:^7.3.3": version: 7.18.10 resolution: "@babel/template@npm:7.18.10" dependencies: @@ -675,32 +675,32 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:^7.16.10, @babel/traverse@npm:^7.16.7, @babel/traverse@npm:^7.18.10, @babel/traverse@npm:^7.18.9, @babel/traverse@npm:^7.7.2": - version: 7.18.11 - resolution: "@babel/traverse@npm:7.18.11" +"@babel/traverse@npm:^7.16.10, @babel/traverse@npm:^7.16.7, @babel/traverse@npm:^7.19.0, @babel/traverse@npm:^7.19.1, @babel/traverse@npm:^7.7.2": + version: 7.19.1 + resolution: "@babel/traverse@npm:7.19.1" dependencies: "@babel/code-frame": ^7.18.6 - "@babel/generator": ^7.18.10 + "@babel/generator": ^7.19.0 "@babel/helper-environment-visitor": ^7.18.9 - "@babel/helper-function-name": ^7.18.9 + "@babel/helper-function-name": ^7.19.0 "@babel/helper-hoist-variables": ^7.18.6 "@babel/helper-split-export-declaration": ^7.18.6 - "@babel/parser": ^7.18.11 - "@babel/types": ^7.18.10 + "@babel/parser": ^7.19.1 + "@babel/types": ^7.19.0 debug: ^4.1.0 globals: ^11.1.0 - checksum: 727409464d5cf27f33555010098ce9bb435f0648cc76e674f4fb7513522356655ba62be99c8df330982b391ccf5f0c0c23c7bd7453d4936d47e2181693fed14c + checksum: 9d782b5089ebc989e54c2406814ed1206cb745ed2734e6602dee3e23d4b6ebbb703ff86e536276630f8de83fda6cde99f0634e3c3d847ddb40572d0303ba8800 languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.16.0, @babel/types@npm:^7.16.7, @babel/types@npm:^7.16.8, @babel/types@npm:^7.17.0, @babel/types@npm:^7.18.10, @babel/types@npm:^7.18.6, @babel/types@npm:^7.18.9, @babel/types@npm:^7.3.0, @babel/types@npm:^7.3.3, @babel/types@npm:^7.8.3": - version: 7.18.10 - resolution: "@babel/types@npm:7.18.10" +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.16.0, @babel/types@npm:^7.16.7, @babel/types@npm:^7.16.8, @babel/types@npm:^7.17.0, @babel/types@npm:^7.18.10, @babel/types@npm:^7.18.6, @babel/types@npm:^7.19.0, @babel/types@npm:^7.3.0, @babel/types@npm:^7.3.3, @babel/types@npm:^7.8.3": + version: 7.19.0 + resolution: "@babel/types@npm:7.19.0" dependencies: "@babel/helper-string-parser": ^7.18.10 "@babel/helper-validator-identifier": ^7.18.6 to-fast-properties: ^2.0.0 - checksum: 11632c9b106e54021937a6498138014ebc9ad6c327a07b2af3ba8700773945aba4055fd136431cbe3a500d0f363cbf9c68eb4d6d38229897c5de9d06e14c85e8 + checksum: 9b346715a68aeede70ba9c685a144b0b26c53bcd595d448e24c8fa8df4d5956a5712e56ebadb7c85dcc32f218ee42788e37b93d50d3295c992072224cb3ef3fe languageName: node linkType: hard @@ -1234,8 +1234,9 @@ __metadata: version: 0.0.0-use.local resolution: "@kiltprotocol/augment-api@workspace:packages/augment-api" dependencies: - "@polkadot/api": ^9.0.0 - "@polkadot/typegen": ^9.0.0 + "@kiltprotocol/type-definitions": ^0.2.0 + "@polkadot/api": ^9.4.1 + "@polkadot/typegen": ^9.4.1 "@types/websocket": ^1.0.0 glob: ^7.1.1 rimraf: ^3.0.2 @@ -1255,9 +1256,9 @@ __metadata: "@kiltprotocol/testing": "workspace:*" "@kiltprotocol/types": "workspace:*" "@kiltprotocol/utils": "workspace:*" - "@polkadot/api": ^9.0.0 + "@polkadot/api": ^9.4.1 "@polkadot/keyring": ^10.0.0 - "@polkadot/types": ^9.0.0 + "@polkadot/types": ^9.4.1 rimraf: ^3.0.2 typescript: ^4.8.3 languageName: unknown @@ -1269,7 +1270,7 @@ __metadata: dependencies: "@kiltprotocol/types": "workspace:*" "@kiltprotocol/utils": "workspace:*" - "@polkadot/api": ^9.0.0 + "@polkadot/api": ^9.4.1 rimraf: ^3.0.2 typescript: ^4.8.3 typescript-logging: ^0.6.4 @@ -1285,11 +1286,12 @@ __metadata: "@kiltprotocol/config": "workspace:*" "@kiltprotocol/did": "workspace:*" "@kiltprotocol/testing": "workspace:*" + "@kiltprotocol/type-definitions": 0.2.0 "@kiltprotocol/types": "workspace:*" "@kiltprotocol/utils": "workspace:*" - "@polkadot/api": ^9.0.0 + "@polkadot/api": ^9.4.1 "@polkadot/keyring": ^10.0.0 - "@polkadot/types": ^9.0.0 + "@polkadot/types": ^9.4.1 "@polkadot/util": ^10.0.0 "@polkadot/util-crypto": ^10.0.0 "@types/uuid": ^8.0.0 @@ -1308,10 +1310,10 @@ __metadata: "@kiltprotocol/testing": "workspace:*" "@kiltprotocol/types": "workspace:*" "@kiltprotocol/utils": "workspace:*" - "@polkadot/api": ^9.0.0 + "@polkadot/api": ^9.4.1 "@polkadot/keyring": ^10.0.0 - "@polkadot/types": ^9.0.0 - "@polkadot/types-codec": ^9.0.0 + "@polkadot/types": ^9.4.1 + "@polkadot/types-codec": ^9.4.1 "@polkadot/util": ^10.0.0 "@polkadot/util-crypto": ^10.0.0 cbor: ^8.0.2 @@ -1369,9 +1371,9 @@ __metadata: "@kiltprotocol/did": "workspace:*" "@kiltprotocol/types": "workspace:*" "@kiltprotocol/utils": "workspace:*" - "@polkadot/api": ^9.0.0 + "@polkadot/api": ^9.4.1 "@polkadot/keyring": ^10.0.0 - "@polkadot/types": ^9.0.0 + "@polkadot/types": ^9.4.1 "@polkadot/util": ^10.0.0 "@polkadot/util-crypto": ^10.0.0 rimraf: ^3.0.2 @@ -1379,14 +1381,28 @@ __metadata: languageName: unknown linkType: soft +"@kiltprotocol/type-definitions@npm:0.2.0": + version: 0.2.0 + resolution: "@kiltprotocol/type-definitions@npm:0.2.0" + checksum: 849c8b54c581bcda0702b243db41fd9ca6377087aaf9a793c74140bb511a96027bbf677a58bba64d788b516a5237d2130a578d637e63aa2e3fdaf234b58b49f0 + languageName: node + linkType: hard + +"@kiltprotocol/type-definitions@npm:^0.2.0": + version: 0.2.1 + resolution: "@kiltprotocol/type-definitions@npm:0.2.1" + checksum: c8606942d10b65ee1b45180e48273ed58f0df3fa9cdaa376d8b7da0d7c8741ef45d5a81ec4689f64945f06a2789d5fd16b3b47128ffafb23ae729b42876bbca4 + languageName: node + linkType: hard + "@kiltprotocol/types@workspace:*, @kiltprotocol/types@workspace:packages/types": version: 0.0.0-use.local resolution: "@kiltprotocol/types@workspace:packages/types" dependencies: "@kiltprotocol/augment-api": "workspace:*" - "@polkadot/api": ^9.0.0 + "@polkadot/api": ^9.4.1 "@polkadot/keyring": ^10.0.0 - "@polkadot/types": ^9.0.0 + "@polkadot/types": ^9.4.1 "@polkadot/util": ^10.0.0 "@polkadot/util-crypto": ^10.0.0 rimraf: ^3.0.2 @@ -1420,8 +1436,8 @@ __metadata: "@kiltprotocol/testing": "workspace:*" "@kiltprotocol/types": "workspace:*" "@kiltprotocol/utils": "workspace:*" - "@polkadot/api": ^9.0.0 - "@polkadot/types": ^9.0.0 + "@polkadot/api": ^9.4.1 + "@polkadot/types": ^9.4.1 "@polkadot/util": ^10.0.0 "@polkadot/util-crypto": ^10.0.0 "@types/jsonld": 1.5.1 @@ -1440,10 +1456,10 @@ __metadata: languageName: node linkType: hard -"@noble/secp256k1@npm:1.6.3": - version: 1.6.3 - resolution: "@noble/secp256k1@npm:1.6.3" - checksum: 16eb3242533e645deb64444c771515f66bdc2ee0759894efd42fdeed4ab226ed29827aaaf6caa27d3d95b831452fd4246aa1007cd688aa462ad48fc084ab76e6 +"@noble/secp256k1@npm:1.7.0": + version: 1.7.0 + resolution: "@noble/secp256k1@npm:1.7.0" + checksum: 540a2b8e527ee1e5522af1c430e54945ad373883cac983b115136cd0950efa1f2c473ee6a36d8e69b6809b3ee586276de62f5fa705c77a9425721e81bada8116 languageName: node linkType: hard @@ -1538,169 +1554,169 @@ __metadata: languageName: node linkType: hard -"@polkadot/api-augment@npm:9.1.1": - version: 9.1.1 - resolution: "@polkadot/api-augment@npm:9.1.1" +"@polkadot/api-augment@npm:9.4.1": + version: 9.4.1 + resolution: "@polkadot/api-augment@npm:9.4.1" dependencies: - "@babel/runtime": ^7.18.9 - "@polkadot/api-base": 9.1.1 - "@polkadot/rpc-augment": 9.1.1 - "@polkadot/types": 9.1.1 - "@polkadot/types-augment": 9.1.1 - "@polkadot/types-codec": 9.1.1 - "@polkadot/util": ^10.1.3 - checksum: f62cbdb948add79ff34377b2391265b52082dc78044a29c07cc5b356970eecd7582a4004d47fb36bef0ba6d9b19f5d8f46adabec890e667b4d282ebe7dd07e5b + "@babel/runtime": ^7.19.0 + "@polkadot/api-base": 9.4.1 + "@polkadot/rpc-augment": 9.4.1 + "@polkadot/types": 9.4.1 + "@polkadot/types-augment": 9.4.1 + "@polkadot/types-codec": 9.4.1 + "@polkadot/util": ^10.1.8 + checksum: b9fea9020250f2370f340896ee8cfbee6564115a39a80ddacbe82fa31045686798d04f8157e9280cfd7a371137c18d86101553224657fadcb0ba69d84652a613 languageName: node linkType: hard -"@polkadot/api-base@npm:9.1.1": - version: 9.1.1 - resolution: "@polkadot/api-base@npm:9.1.1" +"@polkadot/api-base@npm:9.4.1": + version: 9.4.1 + resolution: "@polkadot/api-base@npm:9.4.1" dependencies: - "@babel/runtime": ^7.18.9 - "@polkadot/rpc-core": 9.1.1 - "@polkadot/types": 9.1.1 - "@polkadot/util": ^10.1.3 + "@babel/runtime": ^7.19.0 + "@polkadot/rpc-core": 9.4.1 + "@polkadot/types": 9.4.1 + "@polkadot/util": ^10.1.8 rxjs: ^7.5.6 - checksum: ae15279715566628460063a6ca4cd85b1d535f6b05e98cb6a23fcedae282e2f7d0a0bf95a35ace200cbb880b8e14dc3067ea2a4b29310d4ab42ac928e06f5b04 + checksum: 292399aaebc77eb2ef0e8692c3c91748859df0e58fffa7665e95986ce0eee023207e76435f58aa4b703390fdb14f7fa2d76c36b8bdf46fc9ed6484f867f9b9ec languageName: node linkType: hard -"@polkadot/api-derive@npm:9.1.1": - version: 9.1.1 - resolution: "@polkadot/api-derive@npm:9.1.1" +"@polkadot/api-derive@npm:9.4.1": + version: 9.4.1 + resolution: "@polkadot/api-derive@npm:9.4.1" dependencies: - "@babel/runtime": ^7.18.9 - "@polkadot/api": 9.1.1 - "@polkadot/api-augment": 9.1.1 - "@polkadot/api-base": 9.1.1 - "@polkadot/rpc-core": 9.1.1 - "@polkadot/types": 9.1.1 - "@polkadot/types-codec": 9.1.1 - "@polkadot/util": ^10.1.3 - "@polkadot/util-crypto": ^10.1.3 + "@babel/runtime": ^7.19.0 + "@polkadot/api": 9.4.1 + "@polkadot/api-augment": 9.4.1 + "@polkadot/api-base": 9.4.1 + "@polkadot/rpc-core": 9.4.1 + "@polkadot/types": 9.4.1 + "@polkadot/types-codec": 9.4.1 + "@polkadot/util": ^10.1.8 + "@polkadot/util-crypto": ^10.1.8 rxjs: ^7.5.6 - checksum: 3bd49df1cdc4f4941815af0480ea903154dcf79342ab14884374855df5cb88707b1318ffcb5dac001c9c1478c55b69fa10d064bd3b68c3e4c6b1c665b7c38e29 - languageName: node - linkType: hard - -"@polkadot/api@npm:9.1.1, @polkadot/api@npm:^9.0.0": - version: 9.1.1 - resolution: "@polkadot/api@npm:9.1.1" - dependencies: - "@babel/runtime": ^7.18.9 - "@polkadot/api-augment": 9.1.1 - "@polkadot/api-base": 9.1.1 - "@polkadot/api-derive": 9.1.1 - "@polkadot/keyring": ^10.1.3 - "@polkadot/rpc-augment": 9.1.1 - "@polkadot/rpc-core": 9.1.1 - "@polkadot/rpc-provider": 9.1.1 - "@polkadot/types": 9.1.1 - "@polkadot/types-augment": 9.1.1 - "@polkadot/types-codec": 9.1.1 - "@polkadot/types-create": 9.1.1 - "@polkadot/types-known": 9.1.1 - "@polkadot/util": ^10.1.3 - "@polkadot/util-crypto": ^10.1.3 + checksum: a06f449653c16b5c7570c5c231991c45fc497705e41e8bfa4af256f15df50917e3e558bed7aaa499a683863686afc09512dc9a100fc4d39a8ebc8bb02ea115d0 + languageName: node + linkType: hard + +"@polkadot/api@npm:9.4.1, @polkadot/api@npm:^9.4.1": + version: 9.4.1 + resolution: "@polkadot/api@npm:9.4.1" + dependencies: + "@babel/runtime": ^7.19.0 + "@polkadot/api-augment": 9.4.1 + "@polkadot/api-base": 9.4.1 + "@polkadot/api-derive": 9.4.1 + "@polkadot/keyring": ^10.1.8 + "@polkadot/rpc-augment": 9.4.1 + "@polkadot/rpc-core": 9.4.1 + "@polkadot/rpc-provider": 9.4.1 + "@polkadot/types": 9.4.1 + "@polkadot/types-augment": 9.4.1 + "@polkadot/types-codec": 9.4.1 + "@polkadot/types-create": 9.4.1 + "@polkadot/types-known": 9.4.1 + "@polkadot/util": ^10.1.8 + "@polkadot/util-crypto": ^10.1.8 eventemitter3: ^4.0.7 rxjs: ^7.5.6 - checksum: f5001f773ae58b1ce35d8350bace07bed58bd12c1b8dc7fa78877362a82a689589dbc320e10c58f831535577d4789adea201a5c0bd9f688eab801e1c2dd8ee65 + checksum: efaf5bf6fc6b4c983c829368f1a86b2190c1ff619b73e019bfd979e2bb129cef644cbd4d9ebf82a6a95650a626049a869d9b8d2a9c032f0a162e6d9b2b9f1328 languageName: node linkType: hard -"@polkadot/keyring@npm:^10.0.0, @polkadot/keyring@npm:^10.1.3": - version: 10.1.3 - resolution: "@polkadot/keyring@npm:10.1.3" +"@polkadot/keyring@npm:^10.0.0, @polkadot/keyring@npm:^10.1.8": + version: 10.1.8 + resolution: "@polkadot/keyring@npm:10.1.8" dependencies: - "@babel/runtime": ^7.18.9 - "@polkadot/util": 10.1.3 - "@polkadot/util-crypto": 10.1.3 + "@babel/runtime": ^7.19.0 + "@polkadot/util": 10.1.8 + "@polkadot/util-crypto": 10.1.8 peerDependencies: - "@polkadot/util": 10.1.3 - "@polkadot/util-crypto": 10.1.3 - checksum: 23c5ef127b256384cc1b289391ff7adc43edb30949d521b8b726c8b82477c3232fdef9b7d1982d15372e5faf134f1b8ee7f4fb09411785aa4c20f8776931f7eb + "@polkadot/util": 10.1.8 + "@polkadot/util-crypto": 10.1.8 + checksum: b52f0b6b5550ede6ad8b99334bbeab31c2c0cf62cabefeae33ca7349b5d43dc9ba10c799ed1a027b69cc7e0be8b862ee7d99e4fa66c7b2fa6e5b872eb3bef9be languageName: node linkType: hard -"@polkadot/networks@npm:10.1.3, @polkadot/networks@npm:^10.1.3": - version: 10.1.3 - resolution: "@polkadot/networks@npm:10.1.3" +"@polkadot/networks@npm:10.1.8, @polkadot/networks@npm:^10.1.8": + version: 10.1.8 + resolution: "@polkadot/networks@npm:10.1.8" dependencies: - "@babel/runtime": ^7.18.9 - "@polkadot/util": 10.1.3 - "@substrate/ss58-registry": ^1.25.0 - checksum: c265c1be5672936af2b36d8d99233e19296d614285e9471076e976d001e74fa20b1713b57c1d4c3ae4d8d6bd81a54233ff5ace6a70f98f3f1b5f34e8e433b112 + "@babel/runtime": ^7.19.0 + "@polkadot/util": 10.1.8 + "@substrate/ss58-registry": ^1.29.0 + checksum: 185e3d87d98616cddaebfe1787b10e1344dcf62804e3e74e1d86abc737289e62c3155f618b15384fe00cdd006aa09d14fdcd54e4c836ba0787ae3ad003d50f36 languageName: node linkType: hard -"@polkadot/rpc-augment@npm:9.1.1": - version: 9.1.1 - resolution: "@polkadot/rpc-augment@npm:9.1.1" +"@polkadot/rpc-augment@npm:9.4.1": + version: 9.4.1 + resolution: "@polkadot/rpc-augment@npm:9.4.1" dependencies: - "@babel/runtime": ^7.18.9 - "@polkadot/rpc-core": 9.1.1 - "@polkadot/types": 9.1.1 - "@polkadot/types-codec": 9.1.1 - "@polkadot/util": ^10.1.3 - checksum: 03ca916a9a63aac609e0eb47005339549ee830a077044780619e1ae099f6ec64e74b967e26ca4d19e5454aded09f9f7021a68ee84892d987f6b91368dd0966de + "@babel/runtime": ^7.19.0 + "@polkadot/rpc-core": 9.4.1 + "@polkadot/types": 9.4.1 + "@polkadot/types-codec": 9.4.1 + "@polkadot/util": ^10.1.8 + checksum: 9a99adb17884cba7bb1d478fb59a7eb7bbbacfcf5680ccfefe349b173f212f6e8ec66934f149d9eb03ea6bafb7c581cbee7642d8974e5aeab93eaeed090d16af languageName: node linkType: hard -"@polkadot/rpc-core@npm:9.1.1": - version: 9.1.1 - resolution: "@polkadot/rpc-core@npm:9.1.1" +"@polkadot/rpc-core@npm:9.4.1": + version: 9.4.1 + resolution: "@polkadot/rpc-core@npm:9.4.1" dependencies: - "@babel/runtime": ^7.18.9 - "@polkadot/rpc-augment": 9.1.1 - "@polkadot/rpc-provider": 9.1.1 - "@polkadot/types": 9.1.1 - "@polkadot/util": ^10.1.3 + "@babel/runtime": ^7.19.0 + "@polkadot/rpc-augment": 9.4.1 + "@polkadot/rpc-provider": 9.4.1 + "@polkadot/types": 9.4.1 + "@polkadot/util": ^10.1.8 rxjs: ^7.5.6 - checksum: 85388af40a211919fb64a414d576bcf2dbed569f11a330aac0f8fcc136cc8aee34fa76d5dfaaf418db93ead0bdac9a2250594d6c2145f651ef80d59c942ced33 + checksum: 44c1c2462e92f673601152e4090187c3f42d3ff43a5cff58a327f9e318b128868500e85ba4c2aca5cdf9c0bde1e213a458aef8368a106232624eece17880bf97 languageName: node linkType: hard -"@polkadot/rpc-provider@npm:9.1.1": - version: 9.1.1 - resolution: "@polkadot/rpc-provider@npm:9.1.1" +"@polkadot/rpc-provider@npm:9.4.1": + version: 9.4.1 + resolution: "@polkadot/rpc-provider@npm:9.4.1" dependencies: - "@babel/runtime": ^7.18.9 - "@polkadot/keyring": ^10.1.3 - "@polkadot/types": 9.1.1 - "@polkadot/types-support": 9.1.1 - "@polkadot/util": ^10.1.3 - "@polkadot/util-crypto": ^10.1.3 - "@polkadot/x-fetch": ^10.1.3 - "@polkadot/x-global": ^10.1.3 - "@polkadot/x-ws": ^10.1.3 - "@substrate/connect": 0.7.10 + "@babel/runtime": ^7.19.0 + "@polkadot/keyring": ^10.1.8 + "@polkadot/types": 9.4.1 + "@polkadot/types-support": 9.4.1 + "@polkadot/util": ^10.1.8 + "@polkadot/util-crypto": ^10.1.8 + "@polkadot/x-fetch": ^10.1.8 + "@polkadot/x-global": ^10.1.8 + "@polkadot/x-ws": ^10.1.8 + "@substrate/connect": 0.7.13 eventemitter3: ^4.0.7 mock-socket: ^9.1.5 nock: ^13.2.9 - checksum: db34bcc81837edcb4fb68ef19f63a1ac8d1c96adafd13911a454c00e114999f3939dd528899ae9a1d4caecbab371e19d4d7ac1e4cd05aa269e50e915591313cc + checksum: 7109fb1602652daf3d18fecee208be4a9510ad92a17726fe5f481c967b9e330b0c56333d5f1008c7066a2494736f464c7fb46fc00df53e685ee3113fbbf2a73a languageName: node linkType: hard -"@polkadot/typegen@npm:^9.0.0": - version: 9.1.1 - resolution: "@polkadot/typegen@npm:9.1.1" +"@polkadot/typegen@npm:^9.4.1": + version: 9.4.1 + resolution: "@polkadot/typegen@npm:9.4.1" dependencies: - "@babel/core": ^7.18.10 + "@babel/core": ^7.19.1 "@babel/register": ^7.18.9 - "@babel/runtime": ^7.18.9 - "@polkadot/api": 9.1.1 - "@polkadot/api-augment": 9.1.1 - "@polkadot/rpc-augment": 9.1.1 - "@polkadot/rpc-provider": 9.1.1 - "@polkadot/types": 9.1.1 - "@polkadot/types-augment": 9.1.1 - "@polkadot/types-codec": 9.1.1 - "@polkadot/types-create": 9.1.1 - "@polkadot/types-support": 9.1.1 - "@polkadot/util": ^10.1.3 - "@polkadot/util-crypto": ^10.1.3 - "@polkadot/x-ws": ^10.1.3 + "@babel/runtime": ^7.19.0 + "@polkadot/api": 9.4.1 + "@polkadot/api-augment": 9.4.1 + "@polkadot/rpc-augment": 9.4.1 + "@polkadot/rpc-provider": 9.4.1 + "@polkadot/types": 9.4.1 + "@polkadot/types-augment": 9.4.1 + "@polkadot/types-codec": 9.4.1 + "@polkadot/types-create": 9.4.1 + "@polkadot/types-support": 9.4.1 + "@polkadot/util": ^10.1.8 + "@polkadot/util-crypto": ^10.1.8 + "@polkadot/x-ws": ^10.1.8 handlebars: ^4.7.7 websocket: ^1.0.34 yargs: ^17.5.1 @@ -1710,117 +1726,117 @@ __metadata: polkadot-types-from-defs: scripts/polkadot-types-from-defs.cjs polkadot-types-internal-interfaces: scripts/polkadot-types-internal-interfaces.cjs polkadot-types-internal-metadata: scripts/polkadot-types-internal-metadata.cjs - checksum: c3ab9e8e8090da458a1270cc8c2c0bd4aba9bae8211112d66fc15bb8095adf534e4ce9bb6d88a75212d8691a11c27c59377b5f76714ee403a5e70ab85decbba8 + checksum: 7d1e0007945d9e821936047626d7e70c9e4e84ed4537f0b624cd7d8c465f03433df0794e08c5dcd7760eb7b9294cf36ac20f766225f4d81615c079075ea597b4 languageName: node linkType: hard -"@polkadot/types-augment@npm:9.1.1": - version: 9.1.1 - resolution: "@polkadot/types-augment@npm:9.1.1" +"@polkadot/types-augment@npm:9.4.1": + version: 9.4.1 + resolution: "@polkadot/types-augment@npm:9.4.1" dependencies: - "@babel/runtime": ^7.18.9 - "@polkadot/types": 9.1.1 - "@polkadot/types-codec": 9.1.1 - "@polkadot/util": ^10.1.3 - checksum: b817d332b848a8866f3f0844e5c1369d4d6dd08274bc1b22798ff83db55f541ef423fa13ef3e916b81c07846915b46263abfc87d2aee6a71b22be33f010fe328 + "@babel/runtime": ^7.19.0 + "@polkadot/types": 9.4.1 + "@polkadot/types-codec": 9.4.1 + "@polkadot/util": ^10.1.8 + checksum: fe4e9ca7f8720e6bcce18430e412f4130d8d2a2710f20e5b999665dfd2f1342e630e73819e1ece2a43fcb20f0d1e91f04a29b21f01d82e722b8f28a4f82d9193 languageName: node linkType: hard -"@polkadot/types-codec@npm:9.1.1, @polkadot/types-codec@npm:^9.0.0": - version: 9.1.1 - resolution: "@polkadot/types-codec@npm:9.1.1" +"@polkadot/types-codec@npm:9.4.1, @polkadot/types-codec@npm:^9.4.1": + version: 9.4.1 + resolution: "@polkadot/types-codec@npm:9.4.1" dependencies: - "@babel/runtime": ^7.18.9 - "@polkadot/util": ^10.1.3 - "@polkadot/x-bigint": ^10.1.3 - checksum: 2d9769605ece73558306ec34da129c98b74821e9e217bac0f73ff0c0f879828d84da4b857197ba76293a7cda667bfb11b56c1606f3beac85f7779b566de36bc8 + "@babel/runtime": ^7.19.0 + "@polkadot/util": ^10.1.8 + "@polkadot/x-bigint": ^10.1.8 + checksum: 350cb0bbd46acab5b76d9a4c87ecfc7bf5da5e1dfea810c919e0990b6df59ac05021f09d4c6eb7ec875977823217eb7d18e0fdbbd591cb972bba12d579180982 languageName: node linkType: hard -"@polkadot/types-create@npm:9.1.1": - version: 9.1.1 - resolution: "@polkadot/types-create@npm:9.1.1" +"@polkadot/types-create@npm:9.4.1": + version: 9.4.1 + resolution: "@polkadot/types-create@npm:9.4.1" dependencies: - "@babel/runtime": ^7.18.9 - "@polkadot/types-codec": 9.1.1 - "@polkadot/util": ^10.1.3 - checksum: 43915e7dc5e3da1b3fe4871fb89cb29c91bede51ae3f2539020feaf55960d290ddc4d80844a9c994099d88a6fb76fcd61b7a30be2817e0ca8c4f7ab7cd922d34 + "@babel/runtime": ^7.19.0 + "@polkadot/types-codec": 9.4.1 + "@polkadot/util": ^10.1.8 + checksum: bed46245b762e46b1002332e0bcf0fe6e7404475e8a9915a9dd68103b56bcfa0f6b63fcfac287af7d526d9933f8a843c5c821eb88504644d700f90b44c354972 languageName: node linkType: hard -"@polkadot/types-known@npm:9.1.1": - version: 9.1.1 - resolution: "@polkadot/types-known@npm:9.1.1" +"@polkadot/types-known@npm:9.4.1": + version: 9.4.1 + resolution: "@polkadot/types-known@npm:9.4.1" dependencies: - "@babel/runtime": ^7.18.9 - "@polkadot/networks": ^10.1.3 - "@polkadot/types": 9.1.1 - "@polkadot/types-codec": 9.1.1 - "@polkadot/types-create": 9.1.1 - "@polkadot/util": ^10.1.3 - checksum: 1d6a897597c3fdcd3543ad6be2570697e290ae2a917dbaa3faf188510f0db4e1ce694236609e26296eab19eceadaf14bd5f6ffd2724e76501d4016f455f1fb3f + "@babel/runtime": ^7.19.0 + "@polkadot/networks": ^10.1.8 + "@polkadot/types": 9.4.1 + "@polkadot/types-codec": 9.4.1 + "@polkadot/types-create": 9.4.1 + "@polkadot/util": ^10.1.8 + checksum: 3306b7c73b506763ffa9a0c4b5d1fc9e44fa3e5ecdc9aecf6f0e6cf6d9b11ac890bb7b219890e0190f5028abae6c9c0298648840d3bcaf1fe35e9959670dba20 languageName: node linkType: hard -"@polkadot/types-support@npm:9.1.1": - version: 9.1.1 - resolution: "@polkadot/types-support@npm:9.1.1" +"@polkadot/types-support@npm:9.4.1": + version: 9.4.1 + resolution: "@polkadot/types-support@npm:9.4.1" dependencies: - "@babel/runtime": ^7.18.9 - "@polkadot/util": ^10.1.3 - checksum: abdeacc5c9acc5268c3ef13609dc837cf1ca33ddbe6bda6f2d78df5052874a7b9e248826840d37d5325307ac8d5d5685704ec11efa52d8013310eae6f4549b31 + "@babel/runtime": ^7.19.0 + "@polkadot/util": ^10.1.8 + checksum: 999791ec10c5dc80023bc869ef6af5b9b44be56cf63d7531e08fb26affe152caeb56759e83d30731e81c3301d0e8fb25beea04ce00fdacd61c60e7d1295785b2 languageName: node linkType: hard -"@polkadot/types@npm:9.1.1, @polkadot/types@npm:^9.0.0": - version: 9.1.1 - resolution: "@polkadot/types@npm:9.1.1" +"@polkadot/types@npm:9.4.1, @polkadot/types@npm:^9.4.1": + version: 9.4.1 + resolution: "@polkadot/types@npm:9.4.1" dependencies: - "@babel/runtime": ^7.18.9 - "@polkadot/keyring": ^10.1.3 - "@polkadot/types-augment": 9.1.1 - "@polkadot/types-codec": 9.1.1 - "@polkadot/types-create": 9.1.1 - "@polkadot/util": ^10.1.3 - "@polkadot/util-crypto": ^10.1.3 + "@babel/runtime": ^7.19.0 + "@polkadot/keyring": ^10.1.8 + "@polkadot/types-augment": 9.4.1 + "@polkadot/types-codec": 9.4.1 + "@polkadot/types-create": 9.4.1 + "@polkadot/util": ^10.1.8 + "@polkadot/util-crypto": ^10.1.8 rxjs: ^7.5.6 - checksum: d33cf8c48bf03185bd57a45b7de8fdf9c8668513073c91af12eb841752f2f2a2771ec54cbf759870b11351a5add12fc24a0fb96cbe6dc99dc6e2f5b61ffc6a1f + checksum: 7064b593cf8cc03fd2c53c61d2ec569fb26957e89d40e747200a5a8155c564578b0231687d6247468d1c0637593f9c4f4396f277294a2f98746ad17f889b820e languageName: node linkType: hard -"@polkadot/util-crypto@npm:10.1.3, @polkadot/util-crypto@npm:^10.0.0, @polkadot/util-crypto@npm:^10.1.3": - version: 10.1.3 - resolution: "@polkadot/util-crypto@npm:10.1.3" +"@polkadot/util-crypto@npm:10.1.8, @polkadot/util-crypto@npm:^10.0.0, @polkadot/util-crypto@npm:^10.1.8": + version: 10.1.8 + resolution: "@polkadot/util-crypto@npm:10.1.8" dependencies: - "@babel/runtime": ^7.18.9 + "@babel/runtime": ^7.19.0 "@noble/hashes": 1.1.2 - "@noble/secp256k1": 1.6.3 - "@polkadot/networks": 10.1.3 - "@polkadot/util": 10.1.3 + "@noble/secp256k1": 1.7.0 + "@polkadot/networks": 10.1.8 + "@polkadot/util": 10.1.8 "@polkadot/wasm-crypto": ^6.3.1 - "@polkadot/x-bigint": 10.1.3 - "@polkadot/x-randomvalues": 10.1.3 + "@polkadot/x-bigint": 10.1.8 + "@polkadot/x-randomvalues": 10.1.8 "@scure/base": 1.1.1 ed2curve: ^0.3.0 tweetnacl: ^1.0.3 peerDependencies: - "@polkadot/util": 10.1.3 - checksum: 91b663f24db78aba6f236905af498009d54204273c387f59fa2a074b3f9e22f321482b1104c82156c269532097a8285033fede2c930544bd4b1936e53f2ae621 + "@polkadot/util": 10.1.8 + checksum: 0887e7231eeb9c41677b164469491d50c5936badfa8512d4c6ec8f07bf8491feea4ce6a91d133eb3646a8538862009b3c4e807aee7b9ee940ccd82e4cdfd9bb7 languageName: node linkType: hard -"@polkadot/util@npm:10.1.3, @polkadot/util@npm:^10.0.0, @polkadot/util@npm:^10.1.3": - version: 10.1.3 - resolution: "@polkadot/util@npm:10.1.3" +"@polkadot/util@npm:10.1.8, @polkadot/util@npm:^10.0.0, @polkadot/util@npm:^10.1.8": + version: 10.1.8 + resolution: "@polkadot/util@npm:10.1.8" dependencies: - "@babel/runtime": ^7.18.9 - "@polkadot/x-bigint": 10.1.3 - "@polkadot/x-global": 10.1.3 - "@polkadot/x-textdecoder": 10.1.3 - "@polkadot/x-textencoder": 10.1.3 - "@types/bn.js": ^5.1.0 + "@babel/runtime": ^7.19.0 + "@polkadot/x-bigint": 10.1.8 + "@polkadot/x-global": 10.1.8 + "@polkadot/x-textdecoder": 10.1.8 + "@polkadot/x-textencoder": 10.1.8 + "@types/bn.js": ^5.1.1 bn.js: ^5.2.1 - checksum: 458055c1ed89c83449571de2dd5a67067fe2d8cd6506f02d9ce32077bef106b0297446e15b22db3dc39406f50a4e13d8dc10cf97fb0dd5a4979ce8f68dfa5d7d + checksum: ab908bb7cf0e7dd77b2f246234174640415f11f3ebef322097c5fca7c5ae87409b7b77e3b4200311509c77b883ee69bfb622a24540a5116c6443e51ee9382945 languageName: node linkType: hard @@ -1902,76 +1918,76 @@ __metadata: languageName: node linkType: hard -"@polkadot/x-bigint@npm:10.1.3, @polkadot/x-bigint@npm:^10.1.3": - version: 10.1.3 - resolution: "@polkadot/x-bigint@npm:10.1.3" +"@polkadot/x-bigint@npm:10.1.8, @polkadot/x-bigint@npm:^10.1.8": + version: 10.1.8 + resolution: "@polkadot/x-bigint@npm:10.1.8" dependencies: - "@babel/runtime": ^7.18.9 - "@polkadot/x-global": 10.1.3 - checksum: 5bc2923b6c5bbab76c47bcd4710d68860312eb943a0a6d759d82c1b53ff12f0738cbc1b09bc9ee0344dbafb1e77a6ca20a4bcd42601c4ca5ef0348d9e7124b63 + "@babel/runtime": ^7.19.0 + "@polkadot/x-global": 10.1.8 + checksum: c2ca2c90c668e2920899596bbd077d55a1417a54fa5e1fa42697373e3f18ff4e84bb7a39114b5bf5237ce0df94b6d85e9419d6409e6bd2afd36b475e62d65141 languageName: node linkType: hard -"@polkadot/x-fetch@npm:^10.1.3": - version: 10.1.3 - resolution: "@polkadot/x-fetch@npm:10.1.3" +"@polkadot/x-fetch@npm:^10.1.8": + version: 10.1.8 + resolution: "@polkadot/x-fetch@npm:10.1.8" dependencies: - "@babel/runtime": ^7.18.9 - "@polkadot/x-global": 10.1.3 + "@babel/runtime": ^7.19.0 + "@polkadot/x-global": 10.1.8 "@types/node-fetch": ^2.6.2 node-fetch: ^3.2.10 - checksum: c9c1ea15aa19726592c974791c9980e57684db2ecc10fbf1cb69bebff89edde1433f5eaac10d0cc1b8e97b387b517fe6c2d52dce25947a5e2109cd4872ecf902 + checksum: 6fe40ecbc2b6dfe9add302a4ce5c43f290d23943d14ed7b2ea911620eb3998ae97f893ddfb59797ec911c1a4407a50c673f8aa4bec433bfb7961a1ff5cf739e2 languageName: node linkType: hard -"@polkadot/x-global@npm:10.1.3, @polkadot/x-global@npm:^10.1.3": - version: 10.1.3 - resolution: "@polkadot/x-global@npm:10.1.3" +"@polkadot/x-global@npm:10.1.8, @polkadot/x-global@npm:^10.1.8": + version: 10.1.8 + resolution: "@polkadot/x-global@npm:10.1.8" dependencies: - "@babel/runtime": ^7.18.9 - checksum: 8b3aacdf9102bb9b5c3ceb29f1b7288c7fee11fd79f375f5c61efc4ed77eae200e478edf6fe88d7ecdf5961d8d7cda69beea28eea2c1e0f6e70eecff19aa8cd2 + "@babel/runtime": ^7.19.0 + checksum: e6b925cec66a0b4715c784ddd122285a8034e6a7e8d7178a0433b87abe3273950efa157dbfca860a0c0f5eac9b2b10aa916ecacbb91467dd47870c917fdac815 languageName: node linkType: hard -"@polkadot/x-randomvalues@npm:10.1.3": - version: 10.1.3 - resolution: "@polkadot/x-randomvalues@npm:10.1.3" +"@polkadot/x-randomvalues@npm:10.1.8": + version: 10.1.8 + resolution: "@polkadot/x-randomvalues@npm:10.1.8" dependencies: - "@babel/runtime": ^7.18.9 - "@polkadot/x-global": 10.1.3 - checksum: 3bb5ef49b1920f85c9aa965d77c60175c16d9203d3321646aef870d225454205f9969361d7a6ded193995a70aa0bab244d14516d0dc5997c36eb3ae5dbf378f3 + "@babel/runtime": ^7.19.0 + "@polkadot/x-global": 10.1.8 + checksum: ae9b3a5dfb1af56c2f9855c090a3edb949cf6be35e52b160ee051283f587ef8a67f5a5918476fe7d82bc91d5a02710f8dc0ad3236d46aa70f1c8b1aa7e6b976c languageName: node linkType: hard -"@polkadot/x-textdecoder@npm:10.1.3": - version: 10.1.3 - resolution: "@polkadot/x-textdecoder@npm:10.1.3" +"@polkadot/x-textdecoder@npm:10.1.8": + version: 10.1.8 + resolution: "@polkadot/x-textdecoder@npm:10.1.8" dependencies: - "@babel/runtime": ^7.18.9 - "@polkadot/x-global": 10.1.3 - checksum: 62c159f6d966c82207e013147b0a9502a091f06c8ab9956ae65f698b1325f834b4aeb2f07fdc2cc560a3d5290355e3a9131f68c5578b25d640c8bc221b7eba5a + "@babel/runtime": ^7.19.0 + "@polkadot/x-global": 10.1.8 + checksum: c47ad72d50324840bd48e365b2983e374ae84372511c3dd2680781571d04375eefc96a96446438103837ab85cffa735f1fa8ea55e0aa7748cfd7c266a9789ce1 languageName: node linkType: hard -"@polkadot/x-textencoder@npm:10.1.3": - version: 10.1.3 - resolution: "@polkadot/x-textencoder@npm:10.1.3" +"@polkadot/x-textencoder@npm:10.1.8": + version: 10.1.8 + resolution: "@polkadot/x-textencoder@npm:10.1.8" dependencies: - "@babel/runtime": ^7.18.9 - "@polkadot/x-global": 10.1.3 - checksum: 4947f187a1f5dbbde9031de144d14d64954662fa814936f84b145ca3bc41ff0f6f7e76ed72f252e780d4862a99f0b6cc899dabcb6788a05417a812cc8752cc31 + "@babel/runtime": ^7.19.0 + "@polkadot/x-global": 10.1.8 + checksum: 5c82e3e1445a4afb2a4c40560f191be245efe10c7fd90930eee20cb9be59bf11f0abe178eeeb455e9d11292a546414688f3f1cc3dcfe5539d8fc8ffc8d4df14c languageName: node linkType: hard -"@polkadot/x-ws@npm:^10.1.3": - version: 10.1.3 - resolution: "@polkadot/x-ws@npm:10.1.3" +"@polkadot/x-ws@npm:^10.1.8": + version: 10.1.8 + resolution: "@polkadot/x-ws@npm:10.1.8" dependencies: - "@babel/runtime": ^7.18.9 - "@polkadot/x-global": 10.1.3 + "@babel/runtime": ^7.19.0 + "@polkadot/x-global": 10.1.8 "@types/websocket": ^1.0.5 websocket: ^1.0.34 - checksum: 3c6324bbae670178ed7dcf5b8f6c66b6c57717ea88d289682cfcca1cbbb60b2688799bdc563314384bbafe7b5c16adb0b180fb3ce756f4ab68d821e8d690eb28 + checksum: 522d045c9ddb2399484421bd1af97a3ccb866a7fc34717dc509d061ca24bfcc27d1bc69fa4ef1df1bf70d5cbaf6de55f18ee570a9e13077c0730a935ba31def0 languageName: node linkType: hard @@ -2007,31 +2023,31 @@ __metadata: languageName: node linkType: hard -"@substrate/connect@npm:0.7.10": - version: 0.7.10 - resolution: "@substrate/connect@npm:0.7.10" +"@substrate/connect@npm:0.7.13": + version: 0.7.13 + resolution: "@substrate/connect@npm:0.7.13" dependencies: "@substrate/connect-extension-protocol": ^1.0.1 - "@substrate/smoldot-light": 0.6.27 + "@substrate/smoldot-light": 0.6.33 eventemitter3: ^4.0.7 - checksum: e41823eb8b997910d11011142f52b609d7f0d94e53603ce294d14ee96217d7eb2a6cd1ae9aebc66b59f7a4bd2925b631a4ed3f3bd12bbf87123c25aaa5344fd4 + checksum: b0589f8bf39d64881da5d0b9150dc0956c59f5f8c2f39cf7a9dd022f903611de2e196971c2a2dde9ee804ce29ef7fe693368f3d5ef5df1b69c6f97115a942117 languageName: node linkType: hard -"@substrate/smoldot-light@npm:0.6.27": - version: 0.6.27 - resolution: "@substrate/smoldot-light@npm:0.6.27" +"@substrate/smoldot-light@npm:0.6.33": + version: 0.6.33 + resolution: "@substrate/smoldot-light@npm:0.6.33" dependencies: pako: ^2.0.4 - websocket: ^1.0.32 - checksum: a45869b621e0f529b48273cf3a00dab35d37b2dd73fe460a9a74f8ed323487606583e04dc42f8c8e3aac9c980fa040f1edece5602ec509bd868cea95ba654e13 + ws: ^8.8.1 + checksum: 9e1f011bdd97c6547fa93227de5701b4eeea738963574b959ee035f5f98f29270b48fb29ca2ab985daaac49a6d6dbdcdfe13606006a5d655dea7b34502a2123f languageName: node linkType: hard -"@substrate/ss58-registry@npm:^1.25.0": - version: 1.25.0 - resolution: "@substrate/ss58-registry@npm:1.25.0" - checksum: 87f6e29702154ace790489342a1157afd9b855bd79a5061472564fb0843addfe0c11c8cc46c7a35fddd5106bce8c1c9a9cace19822185ae5a1975f0f7504b9be +"@substrate/ss58-registry@npm:^1.29.0": + version: 1.29.0 + resolution: "@substrate/ss58-registry@npm:1.29.0" + checksum: 75993e5d3cace064adfb7b7e35ed567be674e786c0b111ef199ebfa9eec84c8457e3b3d20046fc8af3b4cc2267ae1bddfc6f6e854ddc5de66f7008332a8b4071 languageName: node linkType: hard @@ -2127,12 +2143,12 @@ __metadata: languageName: node linkType: hard -"@types/bn.js@npm:^5.1.0": - version: 5.1.0 - resolution: "@types/bn.js@npm:5.1.0" +"@types/bn.js@npm:^5.1.1": + version: 5.1.1 + resolution: "@types/bn.js@npm:5.1.1" dependencies: "@types/node": "*" - checksum: 1dc1cbbd7a1e8bf3614752e9602f558762a901031f499f3055828b5e3e2bba16e5b88c27b3c4152ad795248fbe4086c731a5c4b0f29bb243f1875beeeabee59c + checksum: e50ed2dd3abe997e047caf90e0352c71e54fc388679735217978b4ceb7e336e51477791b715f49fd77195ac26dd296c7bad08a3be9750e235f9b2e1edb1b51c2 languageName: node linkType: hard @@ -3345,17 +3361,17 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:4.21.2, browserslist@npm:^4.14.5, browserslist@npm:^4.20.2": - version: 4.21.2 - resolution: "browserslist@npm:4.21.2" +"browserslist@npm:4.21.4, browserslist@npm:^4.14.5, browserslist@npm:^4.21.3": + version: 4.21.4 + resolution: "browserslist@npm:4.21.4" dependencies: - caniuse-lite: ^1.0.30001366 - electron-to-chromium: ^1.4.188 + caniuse-lite: ^1.0.30001400 + electron-to-chromium: ^1.4.251 node-releases: ^2.0.6 - update-browserslist-db: ^1.0.4 + update-browserslist-db: ^1.0.9 bin: browserslist: cli.js - checksum: 30fe59f8b065f99665ea63819d29c797660f7975857c290f61f570403abed4d7039ca15b6fd21e39a57b87e1a9262f94676114040766fc0da6ccc11faf9fc377 + checksum: 4af3793704dbb4615bcd29059ab472344dc7961c8680aa6c4bb84f05340e14038d06a5aead58724eae69455b8fade8b8c69f1638016e87e5578969d74c078b79 languageName: node linkType: hard @@ -3519,10 +3535,10 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.30001366": - version: 1.0.30001366 - resolution: "caniuse-lite@npm:1.0.30001366" - checksum: eeb878e0be4090a4247dd3de5392ff1a864d086e5401790c7c81697918ce6ce3dac75956a21f9404b5ac770bfdabdb18619d0f920dc2295f3211ee893355f697 +"caniuse-lite@npm:^1.0.30001400": + version: 1.0.30001407 + resolution: "caniuse-lite@npm:1.0.30001407" + checksum: e1c449d22f120a708accc956c1780f1da01af6c226cb6a324e531dc9f26f53075bff98e6c9cfce806157cdeede459aa8de03a3407b05f71d292a57b2910018b1 languageName: node linkType: hard @@ -4409,10 +4425,10 @@ __metadata: languageName: node linkType: hard -"electron-to-chromium@npm:^1.4.188": - version: 1.4.189 - resolution: "electron-to-chromium@npm:1.4.189" - checksum: 3971bf78de177d66663076393ceeca761ba72f1b080205202f04868791da613c8312fdb08aeaa855f39a739f67781722903d198a1591b2f02382dc65f289e3d6 +"electron-to-chromium@npm:^1.4.251": + version: 1.4.255 + resolution: "electron-to-chromium@npm:1.4.255" + checksum: 9fd4e0b4a05b072e211b5a1ad2e20b099d7cd54a47b6cbf700dc9ef2020291b5b2d179af0dd0fc71be74b3c765a71ad14f7ff20afb637c0b58e7abc26ff3b68e languageName: node linkType: hard @@ -9936,9 +9952,9 @@ typescript@^4.8.3: languageName: node linkType: hard -"update-browserslist-db@npm:^1.0.4": - version: 1.0.4 - resolution: "update-browserslist-db@npm:1.0.4" +"update-browserslist-db@npm:^1.0.9": + version: 1.0.9 + resolution: "update-browserslist-db@npm:1.0.9" dependencies: escalade: ^3.1.1 picocolors: ^1.0.0 @@ -9946,7 +9962,7 @@ typescript@^4.8.3: browserslist: ">= 4.21.0" bin: browserslist-lint: cli.js - checksum: 7c7da28d0fc733b17e01c8fa9385ab909eadce64b8ea644e9603867dc368c2e2a6611af8247e72612b23f9e7cb87ac7c7585a05ff94e1759e9d646cbe9bf49a7 + checksum: f625899b236f6a4d7f62b56be1b8da230c5563d1fef84d3ef148f2e1a3f11a5a4b3be4fd7e3703e51274c116194017775b10afb4de09eb2c0d09d36b90f1f578 languageName: node linkType: hard @@ -10241,7 +10257,7 @@ typescript@^4.8.3: languageName: node linkType: hard -"websocket@npm:^1.0.31, websocket@npm:^1.0.32, websocket@npm:^1.0.34": +"websocket@npm:^1.0.31, websocket@npm:^1.0.34": version: 1.0.34 resolution: "websocket@npm:1.0.34" dependencies: @@ -10435,6 +10451,21 @@ typescript@^4.8.3: languageName: node linkType: hard +"ws@npm:^8.8.1": + version: 8.8.1 + resolution: "ws@npm:8.8.1" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 2152cf862cae0693f3775bc688a6afb2e989d19d626d215e70f5fcd8eb55b1c3b0d3a6a4052905ec320e2d7734e20aeedbf9744496d62f15a26ad79cf4cf7dae + languageName: node + linkType: hard + "xml-name-validator@npm:^3.0.0": version: 3.0.0 resolution: "xml-name-validator@npm:3.0.0" From ff9c7455bd5a8933bf717f6d04bbfb680e4e07f2 Mon Sep 17 00:00:00 2001 From: Github Action Date: Wed, 21 Sep 2022 06:32:26 +0000 Subject: [PATCH 24/36] [CI Skip] ci: publish prerelease --- package.json | 2 +- packages/augment-api/package.json | 2 +- packages/chain-helpers/package.json | 2 +- packages/config/package.json | 2 +- packages/core/package.json | 2 +- packages/did/package.json | 2 +- packages/messaging/package.json | 2 +- packages/sdk-js/package.json | 2 +- packages/testing/package.json | 2 +- packages/types/package.json | 2 +- packages/utils/package.json | 2 +- packages/vc-export/package.json | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index 85f0ac494..51a430be8 100644 --- a/package.json +++ b/package.json @@ -68,6 +68,6 @@ "typedoc": "^0.22.15", "typescript": "^4.8.3" }, - "version": "0.30.0-11", + "version": "0.30.0-12", "packageManager": "yarn@3.0.2" } diff --git a/packages/augment-api/package.json b/packages/augment-api/package.json index beab65ded..7caae98b6 100644 --- a/packages/augment-api/package.json +++ b/packages/augment-api/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/augment-api", - "version": "0.30.0-11", + "version": "0.30.0-12", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/chain-helpers/package.json b/packages/chain-helpers/package.json index 144e3cd4f..43654fe5a 100644 --- a/packages/chain-helpers/package.json +++ b/packages/chain-helpers/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/chain-helpers", - "version": "0.30.0-11", + "version": "0.30.0-12", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/config/package.json b/packages/config/package.json index db50018fa..b9f7d5c3b 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/config", - "version": "0.30.0-11", + "version": "0.30.0-12", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/core/package.json b/packages/core/package.json index 9896ae2c8..5299c3f12 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/core", - "version": "0.30.0-11", + "version": "0.30.0-12", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/did/package.json b/packages/did/package.json index d88e08476..36bd574de 100644 --- a/packages/did/package.json +++ b/packages/did/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/did", - "version": "0.30.0-11", + "version": "0.30.0-12", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/messaging/package.json b/packages/messaging/package.json index 7156131fe..887e3a0d9 100644 --- a/packages/messaging/package.json +++ b/packages/messaging/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/messaging", - "version": "0.30.0-11", + "version": "0.30.0-12", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/sdk-js/package.json b/packages/sdk-js/package.json index dfd9bdfa8..36c1177a1 100644 --- a/packages/sdk-js/package.json +++ b/packages/sdk-js/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/sdk-js", - "version": "0.30.0-11", + "version": "0.30.0-12", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/testing/package.json b/packages/testing/package.json index a671f2246..51150e7e3 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -1,7 +1,7 @@ { "name": "@kiltprotocol/testing", "private": true, - "version": "0.30.0-11", + "version": "0.30.0-12", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/types/package.json b/packages/types/package.json index be89ab27a..144455528 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/types", - "version": "0.30.0-11", + "version": "0.30.0-12", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/utils/package.json b/packages/utils/package.json index 34acc46f5..a4f6b7a40 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/utils", - "version": "0.30.0-11", + "version": "0.30.0-12", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/vc-export/package.json b/packages/vc-export/package.json index c9d4a8aeb..75dff237e 100644 --- a/packages/vc-export/package.json +++ b/packages/vc-export/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/vc-export", - "version": "0.30.0-11", + "version": "0.30.0-12", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", From 0082f5b76a4bd9b3ad1ca932c01cdb7c8cd4220d Mon Sep 17 00:00:00 2001 From: Tom Adler Date: Wed, 21 Sep 2022 14:46:55 +0200 Subject: [PATCH 25/36] feat!: export ConfigService from the SDK (#638) --- packages/core/src/index.ts | 2 +- packages/core/src/kilt/Kilt.ts | 17 +++-------------- packages/sdk-js/package.json | 1 + packages/sdk-js/src/index.ts | 1 + tests/bundle-test.ts | 2 +- yarn.lock | 1 + 6 files changed, 8 insertions(+), 16 deletions(-) diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 1aa3ba565..31008384d 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -19,5 +19,5 @@ export * as CType from './ctype/index.js' export { DelegationNode, DelegationNodeUtils } from './delegation/index.js' export * as Quote from './quote/index.js' -export { connect, disconnect, config, init } from './kilt/index.js' +export { connect, disconnect, init } from './kilt/index.js' export { SDKErrors } from '@kiltprotocol/utils' diff --git a/packages/core/src/kilt/Kilt.ts b/packages/core/src/kilt/Kilt.ts index 9c763ccfe..dd6f42b2a 100644 --- a/packages/core/src/kilt/Kilt.ts +++ b/packages/core/src/kilt/Kilt.ts @@ -19,26 +19,15 @@ import { ConfigService } from '@kiltprotocol/config' import { latest, rpc, runtime } from '@kiltprotocol/type-definitions' /** - * Allows setting global configuration such as the log level and the polkadot ApiPromise instance used throughout the sdk. + * Prepares crypto modules (required e.g. for identity creation) and calls ConfigService.set(). * - * @param configs Config options object. - */ -export function config>( - configs: K -): void { - ConfigService.set(configs) -} - -/** - * Prepares crypto modules (required e.g. For identity creation) and calls Kilt.config(). - * - * @param configs Arguments to pass on to Kilt.config(). + * @param configs Arguments to pass on to ConfigService.set(). * @returns Promise that must be awaited to assure crypto is ready. */ export async function init>( configs?: K ): Promise { - config(configs || {}) + ConfigService.set(configs || {}) await cryptoWaitReady() } diff --git a/packages/sdk-js/package.json b/packages/sdk-js/package.json index 36c1177a1..207fdb55a 100644 --- a/packages/sdk-js/package.json +++ b/packages/sdk-js/package.json @@ -47,6 +47,7 @@ "dependencies": { "@kiltprotocol/augment-api": "workspace:*", "@kiltprotocol/chain-helpers": "workspace:*", + "@kiltprotocol/config": "workspace:*", "@kiltprotocol/core": "workspace:*", "@kiltprotocol/did": "workspace:*", "@kiltprotocol/messaging": "workspace:*", diff --git a/packages/sdk-js/src/index.ts b/packages/sdk-js/src/index.ts index e3f6a6d95..fa2b1f2b8 100644 --- a/packages/sdk-js/src/index.ts +++ b/packages/sdk-js/src/index.ts @@ -12,6 +12,7 @@ import '@kiltprotocol/augment-api' export * from '@kiltprotocol/core' +export { ConfigService } from '@kiltprotocol/config' export * as Message from '@kiltprotocol/messaging' export { Blockchain } from '@kiltprotocol/chain-helpers' export * as ChainHelpers from '@kiltprotocol/chain-helpers' diff --git a/tests/bundle-test.ts b/tests/bundle-test.ts index 4125f6289..dc60255ce 100644 --- a/tests/bundle-test.ts +++ b/tests/bundle-test.ts @@ -35,7 +35,7 @@ const { BalanceUtils, } = kilt -kilt.config({ submitTxResolveOn: Blockchain.IS_IN_BLOCK }) +kilt.ConfigService.set({ submitTxResolveOn: Blockchain.IS_IN_BLOCK }) function makeSignCallback( keypair: KeyringPair diff --git a/yarn.lock b/yarn.lock index 8f02ca91c..307bf9203 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1343,6 +1343,7 @@ __metadata: dependencies: "@kiltprotocol/augment-api": "workspace:*" "@kiltprotocol/chain-helpers": "workspace:*" + "@kiltprotocol/config": "workspace:*" "@kiltprotocol/core": "workspace:*" "@kiltprotocol/did": "workspace:*" "@kiltprotocol/messaging": "workspace:*" From abd49b094098c90e4d89a59a8d58a99e2a57f0c5 Mon Sep 17 00:00:00 2001 From: Github Action Date: Wed, 21 Sep 2022 12:51:46 +0000 Subject: [PATCH 26/36] [CI Skip] ci: publish prerelease --- package.json | 2 +- packages/augment-api/package.json | 2 +- packages/chain-helpers/package.json | 2 +- packages/config/package.json | 2 +- packages/core/package.json | 2 +- packages/did/package.json | 2 +- packages/messaging/package.json | 2 +- packages/sdk-js/package.json | 2 +- packages/testing/package.json | 2 +- packages/types/package.json | 2 +- packages/utils/package.json | 2 +- packages/vc-export/package.json | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index 51a430be8..2a81f59fd 100644 --- a/package.json +++ b/package.json @@ -68,6 +68,6 @@ "typedoc": "^0.22.15", "typescript": "^4.8.3" }, - "version": "0.30.0-12", + "version": "0.30.0-13", "packageManager": "yarn@3.0.2" } diff --git a/packages/augment-api/package.json b/packages/augment-api/package.json index 7caae98b6..7c0891330 100644 --- a/packages/augment-api/package.json +++ b/packages/augment-api/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/augment-api", - "version": "0.30.0-12", + "version": "0.30.0-13", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/chain-helpers/package.json b/packages/chain-helpers/package.json index 43654fe5a..a79600c8f 100644 --- a/packages/chain-helpers/package.json +++ b/packages/chain-helpers/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/chain-helpers", - "version": "0.30.0-12", + "version": "0.30.0-13", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/config/package.json b/packages/config/package.json index b9f7d5c3b..d89e3abae 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/config", - "version": "0.30.0-12", + "version": "0.30.0-13", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/core/package.json b/packages/core/package.json index 5299c3f12..2e3f4f204 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/core", - "version": "0.30.0-12", + "version": "0.30.0-13", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/did/package.json b/packages/did/package.json index 36bd574de..60ac785a4 100644 --- a/packages/did/package.json +++ b/packages/did/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/did", - "version": "0.30.0-12", + "version": "0.30.0-13", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/messaging/package.json b/packages/messaging/package.json index 887e3a0d9..47e588a5c 100644 --- a/packages/messaging/package.json +++ b/packages/messaging/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/messaging", - "version": "0.30.0-12", + "version": "0.30.0-13", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/sdk-js/package.json b/packages/sdk-js/package.json index 207fdb55a..f9aed0b72 100644 --- a/packages/sdk-js/package.json +++ b/packages/sdk-js/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/sdk-js", - "version": "0.30.0-12", + "version": "0.30.0-13", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/testing/package.json b/packages/testing/package.json index 51150e7e3..0af0b0a23 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -1,7 +1,7 @@ { "name": "@kiltprotocol/testing", "private": true, - "version": "0.30.0-12", + "version": "0.30.0-13", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/types/package.json b/packages/types/package.json index 144455528..11c0ea0a9 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/types", - "version": "0.30.0-12", + "version": "0.30.0-13", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/utils/package.json b/packages/utils/package.json index a4f6b7a40..8772fa058 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/utils", - "version": "0.30.0-12", + "version": "0.30.0-13", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/vc-export/package.json b/packages/vc-export/package.json index 75dff237e..a011a3ce7 100644 --- a/packages/vc-export/package.json +++ b/packages/vc-export/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/vc-export", - "version": "0.30.0-12", + "version": "0.30.0-13", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", From 181d16aba9d388d9074d6c28e87762f134383dc9 Mon Sep 17 00:00:00 2001 From: Tom Adler Date: Thu, 22 Sep 2022 09:36:02 +0200 Subject: [PATCH 27/36] feat: utilities for KiltKeyringPair (#639) --- .../src/blockchain/Blockchain.spec.ts | 6 +- .../core/src/__integrationtests__/Did.spec.ts | 5 +- .../core/src/__integrationtests__/utils.ts | 12 ++- packages/did/src/Did.signature.spec.ts | 17 +--- .../src/DidDetails/LightDidDetails.spec.ts | 80 +++++++------------ .../did/src/DidDetails/LightDidDetails.ts | 6 +- .../did/src/DidResolver/DidResolver.spec.ts | 8 +- packages/messaging/src/Message.ts | 5 +- packages/testing/src/TestUtils.ts | 35 ++------ packages/utils/package.json | 1 + packages/utils/src/Crypto.ts | 41 +++++++++- tests/bundle-test.ts | 16 +--- yarn.lock | 3 +- 13 files changed, 104 insertions(+), 131 deletions(-) diff --git a/packages/chain-helpers/src/blockchain/Blockchain.spec.ts b/packages/chain-helpers/src/blockchain/Blockchain.spec.ts index 901491e17..a28bb66cd 100644 --- a/packages/chain-helpers/src/blockchain/Blockchain.spec.ts +++ b/packages/chain-helpers/src/blockchain/Blockchain.spec.ts @@ -9,12 +9,10 @@ * @group unit/blockchain */ -import Keyring from '@polkadot/keyring' - import { ApiMocks } from '@kiltprotocol/testing' import { ConfigService } from '@kiltprotocol/config' import type { KeyringPair } from '@kiltprotocol/types' -import { SDKErrors } from '@kiltprotocol/utils' +import { Crypto, SDKErrors } from '@kiltprotocol/utils' import { IS_FINALIZED, @@ -35,7 +33,7 @@ describe('Blockchain', () => { let pair: KeyringPair beforeAll(async () => { - pair = new Keyring().addFromUri('//Alice') + pair = Crypto.makeKeypairFromUri('//Alice') }) it('allows waiting for finalization', async () => { diff --git a/packages/core/src/__integrationtests__/Did.spec.ts b/packages/core/src/__integrationtests__/Did.spec.ts index cb50f10ec..0669353c6 100644 --- a/packages/core/src/__integrationtests__/Did.spec.ts +++ b/packages/core/src/__integrationtests__/Did.spec.ts @@ -859,7 +859,10 @@ describe('DID management batching', () => { expect(finalFullDid).not.toBeNull() - expect(finalFullDid.authentication[0]).toMatchObject(newAuthKey) + expect(finalFullDid.authentication[0]).toMatchObject({ + publicKey: newAuthKey.publicKey, + type: newAuthKey.type, + }) expect(finalFullDid.keyAgreement).toBeUndefined() expect(finalFullDid.assertionMethod).toBeUndefined() diff --git a/packages/core/src/__integrationtests__/utils.ts b/packages/core/src/__integrationtests__/utils.ts index a9ad6d899..a04fd5b28 100644 --- a/packages/core/src/__integrationtests__/utils.ts +++ b/packages/core/src/__integrationtests__/utils.ts @@ -12,7 +12,7 @@ import { BN } from '@polkadot/util' import { ApiPromise, WsProvider } from '@polkadot/api' import { GenericContainer, StartedTestContainer, Wait } from 'testcontainers' -import { Keyring, ss58Format } from '@kiltprotocol/utils' +import { Crypto } from '@kiltprotocol/utils' import { makeSigningKeyTool } from '@kiltprotocol/testing' import { Blockchain } from '@kiltprotocol/chain-helpers' import type { @@ -80,17 +80,15 @@ export async function initializeApi(): Promise { return api } -const keyring = new Keyring({ ss58Format, type: 'ed25519' }) - // Dev Faucet account seed phrase const faucetSeed = 'receive clutch item involve chaos clutch furnace arrest claw isolate okay together' // endowed accounts on development chain spec // ids are ed25519 because the endowed accounts are -export const devFaucet = keyring.createFromUri(faucetSeed) as KiltKeyringPair -export const devAlice = keyring.createFromUri('//Alice') as KiltKeyringPair -export const devBob = keyring.createFromUri('//Bob') as KiltKeyringPair -export const devCharlie = keyring.createFromUri('//Charlie') as KiltKeyringPair +export const devFaucet = Crypto.makeKeypairFromUri(faucetSeed) +export const devAlice = Crypto.makeKeypairFromUri('//Alice') +export const devBob = Crypto.makeKeypairFromUri('//Bob') +export const devCharlie = Crypto.makeKeypairFromUri('//Charlie') export function addressFromRandom(): KiltAddress { return makeSigningKeyTool('ed25519').keypair.address diff --git a/packages/did/src/Did.signature.spec.ts b/packages/did/src/Did.signature.spec.ts index 3c7c605ba..b6cab6143 100644 --- a/packages/did/src/Did.signature.spec.ts +++ b/packages/did/src/Did.signature.spec.ts @@ -17,13 +17,8 @@ import { KiltKeyringPair, SignCallback, } from '@kiltprotocol/types' -import Keyring from '@polkadot/keyring' -import { - mnemonicGenerate, - randomAsHex, - randomAsU8a, -} from '@polkadot/util-crypto' -import { ss58Format } from '@kiltprotocol/utils' +import { randomAsHex, randomAsU8a } from '@polkadot/util-crypto' +import { Crypto } from '@kiltprotocol/utils' import { makeSigningKeyTool } from '@kiltprotocol/testing' import * as Did from './index.js' import { verifyDidSignature, isDidSignature } from './Did.signature' @@ -191,9 +186,7 @@ describe('full DID', () => { let did: DidDocument let sign: SignCallback beforeAll(() => { - keypair = new Keyring({ type: 'sr25519', ss58Format }).addFromMnemonic( - mnemonicGenerate() - ) as KiltKeyringPair + keypair = Crypto.makeKeypairFromSeed() did = { uri: `did:kilt:${keypair.address}`, authentication: [ @@ -294,9 +287,7 @@ describe('full DID', () => { describe('type guard', () => { let keypair: KeyringPair beforeAll(() => { - keypair = new Keyring({ type: 'sr25519', ss58Format }).addFromMnemonic( - mnemonicGenerate() - ) + keypair = Crypto.makeKeypairFromSeed() }) it('rejects malformed key uri', () => { diff --git a/packages/did/src/DidDetails/LightDidDetails.spec.ts b/packages/did/src/DidDetails/LightDidDetails.spec.ts index 1549a97aa..da819fe5d 100644 --- a/packages/did/src/DidDetails/LightDidDetails.spec.ts +++ b/packages/did/src/DidDetails/LightDidDetails.spec.ts @@ -5,10 +5,8 @@ * found in the LICENSE file in the root directory of this source tree. */ -import { Keyring } from '@polkadot/api' - import { DidDocument, DidServiceEndpoint, DidUri } from '@kiltprotocol/types' -import { ss58Format } from '@kiltprotocol/utils' +import { Crypto } from '@kiltprotocol/utils' import { CreateDocumentInput } from './LightDidDetails.utils' @@ -29,12 +27,9 @@ import * as Did from '../index.js' */ describe('When creating an instance from the details', () => { - it('correctly assign the right ed25519 authentication key, x25519 encryption key, and service endpoints', () => { - const authKey = new Keyring({ - type: 'sr25519', - ss58Format, - }).addFromMnemonic('auth') - const encKey = new Keyring().addFromMnemonic('enc') + it('correctly assign the right sr25519 authentication key, x25519 encryption key, and service endpoints', () => { + const authKey = Crypto.makeKeypairFromSeed(undefined, 'sr25519') + const encKey = Crypto.makeEncryptionKeyFromSeed(new Uint8Array(32).fill(1)) const service: DidServiceEndpoint[] = [ { id: '#service-1', @@ -48,14 +43,14 @@ describe('When creating an instance from the details', () => { }, ] const validInput: CreateDocumentInput = { - authentication: [{ publicKey: authKey.publicKey, type: 'sr25519' }], - keyAgreement: [{ publicKey: encKey.publicKey, type: 'x25519' }], + authentication: [authKey], + keyAgreement: [encKey], service, } const lightDid = Did.createLightDidDocument(validInput) expect(lightDid).toEqual({ - uri: `did:kilt:light:00${authKey.address}:z1Dzpgq4F3EVKSe4X1Gm3GZJBkQGrXB2cbXGsPabPWK861QXnJLRaCHjr1EGYAMF7hDJi6ikYBoyNu7qMiMfixZYWfgPL1TL7GcHSq9PkoTckt7YpUoeGPyjYwVFgwuvUEDvBMT8NqstfC39hTM1FkDCgHFXaeVY4HCHThKMyXw4r3k1rmXUEm52sCs7yqWxjLUuR1g7sbBo79EQjDRbLzUZq4Vs22PaYUfxdKzboNF5UVvw8ChzAaVk56dFQ2ivmbP`, + uri: `did:kilt:light:00${authKey.address}:z17GNCdxLqMYTMC5pnnDrPZGxLEFcXvDamtGNXeNkfSaFf8cktX6erFJiQy8S3ugL981NNys7Rz8DJiaNPZi98v1oeFVL7PjUGNTz1g3jgZo4VgQri2SYHBifZFX9foHZH4DreZXFN66k5dPrvAtBpFXaiG2WZkkxsnxNWxYpqWPPcxvbTE6pJbXxWKjRUd7rog1h9vjA93QA9jMDxm6BSGJHACFgSPUU3UTLk2kjNwT2bjZVvihVFu1zibxwHjowb7N6UQfieJ7ny9HnaQy64qJvGqh4NNtpwkhwm5DTYUoAeAhjt3a6TWyxmBgbFdZF7`, authentication: [ { id: '#authentication', @@ -86,14 +81,11 @@ describe('When creating an instance from the details', () => { }) it('correctly assign the right ed25519 authentication key and encryption key', () => { - const authKey = new Keyring({ - type: 'ed25519', - ss58Format, - }).addFromMnemonic('auth') - const encKey = new Keyring().addFromMnemonic('enc') + const authKey = Crypto.makeKeypairFromSeed() + const encKey = Crypto.makeEncryptionKeyFromSeed(new Uint8Array(32).fill(1)) const validInput: CreateDocumentInput = { - authentication: [{ publicKey: authKey.publicKey, type: 'ed25519' }], - keyAgreement: [{ publicKey: encKey.publicKey, type: 'x25519' }], + authentication: [authKey], + keyAgreement: [encKey], } const lightDid = Did.createLightDidDocument(validInput) @@ -102,7 +94,7 @@ describe('When creating an instance from the details', () => { ) expect(lightDid).toEqual({ - uri: `did:kilt:light:01${authKey.address}:z1Ac9CMtYCTRWjetJfJqJoV7FcP9zdFudqUaupQkBCERoCQcnu2SUS5CGHdCXhWoxbihovMVymRperWSPpRc7mJ`, + uri: `did:kilt:light:01${authKey.address}:z15dZSRuzEPTFnBErPxqJie4CmmQH1gYKSQYxmwW5Qhgz5Sr7EYJA3J65KoC5YbgF3NGoBsTY2v6zwj1uDnZzgXzLy8R72Fhjmp8ujY81y2AJc8uQ6s2pVbAMZ6bnvaZ3GVe8bMjY5MiKFySS27qRi`, authentication: [ { id: '#authentication', @@ -121,43 +113,34 @@ describe('When creating an instance from the details', () => { }) it('throws for unsupported authentication key type', () => { - const authKey = new Keyring({ - type: 'ed25519', - ss58Format, - }).addFromMnemonic('auth') + const authKey = Crypto.makeKeypairFromSeed(undefined, 'ecdsa') const invalidInput = { // Not an authentication key type - authentication: [{ publicKey: authKey.publicKey, type: 'ecdsa' }], + authentication: [authKey], } expect(() => - Did.createLightDidDocument(invalidInput as CreateDocumentInput) + Did.createLightDidDocument(invalidInput as unknown as CreateDocumentInput) ).toThrowError() }) it('throws for unsupported encryption key type', () => { - const authKey = new Keyring({ - type: 'ed25519', - ss58Format, - }).addFromMnemonic('auth') - const encKey = new Keyring().addFromMnemonic('enc') + const authKey = Crypto.makeKeypairFromSeed() + const encKey = Crypto.makeEncryptionKeyFromSeed() const invalidInput = { - authentication: [{ publicKey: authKey.publicKey, type: 'ed25519' }], + authentication: [authKey], // Not an encryption key type keyAgreement: [{ publicKey: encKey.publicKey, type: 'bls' }], } expect(() => - Did.createLightDidDocument(invalidInput as CreateDocumentInput) + Did.createLightDidDocument(invalidInput as unknown as CreateDocumentInput) ).toThrowError() }) }) describe('When creating an instance from a URI', () => { it('correctly assign the right authentication key, encryption key, and service endpoints', () => { - const authKey = new Keyring({ - type: 'sr25519', - ss58Format, - }).addFromMnemonic('auth') - const encKey = new Keyring().addFromMnemonic('enc') + const authKey = Crypto.makeKeypairFromSeed(undefined, 'sr25519') + const encKey = Crypto.makeEncryptionKeyFromSeed(new Uint8Array(32).fill(1)) const endpoints: DidServiceEndpoint[] = [ { id: '#service-1', @@ -171,8 +154,8 @@ describe('When creating an instance from a URI', () => { }, ] const creationInput: CreateDocumentInput = { - authentication: [{ publicKey: authKey.publicKey, type: 'sr25519' }], - keyAgreement: [{ publicKey: encKey.publicKey, type: 'x25519' }], + authentication: [authKey], + keyAgreement: [encKey], service: endpoints, } // We are sure this is correct because of the described case above @@ -183,7 +166,7 @@ describe('When creating an instance from a URI', () => { expect(builtLightDid).toStrictEqual(expectedLightDid) expect(builtLightDid).toStrictEqual({ - uri: `did:kilt:light:00${address}:z1Dzpgq4F3EVKSe4X1Gm3GZJBkQGrXB2cbXGsPabPWK861QXnJLRaCHjr1EGYAMF7hDJi6ikYBoyNu7qMiMfixZYWfgPL1TL7GcHSq9PkoTckt7YpUoeGPyjYwVFgwuvUEDvBMT8NqstfC39hTM1FkDCgHFXaeVY4HCHThKMyXw4r3k1rmXUEm52sCs7yqWxjLUuR1g7sbBo79EQjDRbLzUZq4Vs22PaYUfxdKzboNF5UVvw8ChzAaVk56dFQ2ivmbP` as DidUri, + uri: `did:kilt:light:00${address}:z17GNCdxLqMYTMC5pnnDrPZGxLEFcXvDamtGNXeNkfSaFf8cktX6erFJiQy8S3ugL981NNys7Rz8DJiaNPZi98v1oeFVL7PjUGNTz1g3jgZo4VgQri2SYHBifZFX9foHZH4DreZXFN66k5dPrvAtBpFXaiG2WZkkxsnxNWxYpqWPPcxvbTE6pJbXxWKjRUd7rog1h9vjA93QA9jMDxm6BSGJHACFgSPUU3UTLk2kjNwT2bjZVvihVFu1zibxwHjowb7N6UQfieJ7ny9HnaQy64qJvGqh4NNtpwkhwm5DTYUoAeAhjt3a6TWyxmBgbFdZF7` as DidUri, authentication: [ { id: '#authentication', @@ -214,11 +197,8 @@ describe('When creating an instance from a URI', () => { }) it('fail if a fragment is present according to the options', () => { - const authKey = new Keyring({ - type: 'sr25519', - ss58Format, - }).addFromMnemonic('auth') - const encKey = new Keyring().addFromMnemonic('enc') + const authKey = Crypto.makeKeypairFromSeed() + const encKey = Crypto.makeEncryptionKeyFromSeed() const service: DidServiceEndpoint[] = [ { id: '#service-1', @@ -232,8 +212,8 @@ describe('When creating an instance from a URI', () => { }, ] const creationInput: CreateDocumentInput = { - authentication: [{ publicKey: authKey.publicKey, type: 'sr25519' }], - keyAgreement: [{ publicKey: encKey.publicKey, type: 'x25519' }], + authentication: [authKey], + keyAgreement: [encKey], service, } // We are sure this is correct because of the described case above @@ -248,9 +228,7 @@ describe('When creating an instance from a URI', () => { }) it('fail if the URI is not correct', () => { - const validKiltAddress = new Keyring({ ss58Format }).addFromMnemonic( - 'random' - ) + const validKiltAddress = Crypto.makeKeypairFromSeed() const incorrectURIs = [ 'did:kilt:light:sdasdsadas', // @ts-ignore not a valid DID uri diff --git a/packages/did/src/DidDetails/LightDidDetails.ts b/packages/did/src/DidDetails/LightDidDetails.ts index 7fc38115c..5174ead8c 100644 --- a/packages/did/src/DidDetails/LightDidDetails.ts +++ b/packages/did/src/DidDetails/LightDidDetails.ts @@ -69,7 +69,8 @@ export function createLightDidDocument({ authentication: [ { id: authenticationKeyId, // Authentication key always has the #authentication ID. - ...authentication[0], + type: authentication[0].type, + publicKey: authentication[0].publicKey, }, ], service, @@ -79,7 +80,8 @@ export function createLightDidDocument({ did.keyAgreement = [ { id: encryptionKeyId, // Encryption key always has the #encryption ID. - ...keyAgreement[0], + type: keyAgreement[0].type, + publicKey: keyAgreement[0].publicKey, }, ] } diff --git a/packages/did/src/DidResolver/DidResolver.spec.ts b/packages/did/src/DidResolver/DidResolver.spec.ts index 805d17b86..c83546f1d 100644 --- a/packages/did/src/DidResolver/DidResolver.spec.ts +++ b/packages/did/src/DidResolver/DidResolver.spec.ts @@ -6,7 +6,6 @@ */ import { BN } from '@polkadot/util' -import Keyring from '@polkadot/keyring' import type { DidEncryptionKey, @@ -21,7 +20,7 @@ import type { ResolvedDidServiceEndpoint, UriFragment, } from '@kiltprotocol/types' -import { ss58Format } from '@kiltprotocol/utils' +import { Crypto } from '@kiltprotocol/utils' import { ApiMocks, makeSigningKeyTool } from '@kiltprotocol/testing' import { ConfigService } from '@kiltprotocol/config' @@ -366,9 +365,8 @@ describe('When resolving a full DID', () => { }) describe('When resolving a light DID', () => { - const keyring = new Keyring({ ss58Format }) - const authKey = keyring.addFromMnemonic('auth') - const encryptionKey = keyring.addFromMnemonic('enc') + const authKey = Crypto.makeKeypairFromSeed() + const encryptionKey = Crypto.makeEncryptionKeyFromSeed() beforeEach(() => { mockedApi.query.did.did.mockReturnValue(didNotFound) diff --git a/packages/messaging/src/Message.ts b/packages/messaging/src/Message.ts index db4296a5b..6161855d5 100644 --- a/packages/messaging/src/Message.ts +++ b/packages/messaging/src/Message.ts @@ -11,7 +11,6 @@ import type { DidResolveKey, DidResourceUri, EncryptCallback, - EncryptionKeyType, IEncryptedMessage, IEncryptedMessageContents, ICType, @@ -335,9 +334,7 @@ export async function decrypt( ) } const receiverKeyAlgType = - Did.Utils.encryptionAlgForKeyType[ - receiverKeyDetails.type as EncryptionKeyType - ] + Did.Utils.encryptionAlgForKeyType[receiverKeyDetails.type] if (receiverKeyAlgType !== 'x25519-xsalsa20-poly1305') { throw new SDKErrors.EncryptionError( 'Only the "x25519-xsalsa20-poly1305" encryption algorithm currently supported' diff --git a/packages/testing/src/TestUtils.ts b/packages/testing/src/TestUtils.ts index 8e4f06293..888b7735e 100644 --- a/packages/testing/src/TestUtils.ts +++ b/packages/testing/src/TestUtils.ts @@ -5,14 +5,7 @@ * found in the LICENSE file in the root directory of this source tree. */ -import { - blake2AsHex, - blake2AsU8a, - naclBoxPairFromSecret, - randomAsHex, -} from '@polkadot/util-crypto' -import { KeypairType } from '@polkadot/util-crypto/types' -import { Keyring } from '@polkadot/keyring' +import { blake2AsHex, blake2AsU8a } from '@polkadot/util-crypto' import { DecryptCallback, @@ -30,7 +23,7 @@ import { SignCallback, SigningAlgorithms, } from '@kiltprotocol/types' -import { Crypto, ss58Format } from '@kiltprotocol/utils' +import { Crypto } from '@kiltprotocol/utils' import * as Did from '@kiltprotocol/did' import { Blockchain } from '@kiltprotocol/chain-helpers' @@ -115,12 +108,7 @@ export interface EncryptionKeyTool { * @returns Object with secret and public key and the key type. */ export function makeEncryptionKeyTool(seed: string): EncryptionKeyTool { - const { secretKey, publicKey } = naclBoxPairFromSecret(blake2AsU8a(seed, 256)) - const keypair = { - secretKey, - publicKey, - type: 'x25519' as EncryptionKeyType, - } + const keypair = Crypto.makeEncryptionKeyFromSeed(blake2AsU8a(seed, 256)) const encrypt = makeEncryptCallback(keypair) const decrypt = makeDecryptCallback(keypair) @@ -180,7 +168,7 @@ export function makeStoreDidCallback( } } -const keypairTypeForAlg: Record = { +const keypairTypeForAlg: Record = { ed25519: 'ed25519', sr25519: 'sr25519', 'ecdsa-secp256k1': 'ecdsa', @@ -202,26 +190,15 @@ export interface KeyTool { export function makeSigningKeyTool( alg: SigningAlgorithms = 'sr25519' ): KeyTool { - const type = keypairTypeForAlg[alg] - const seed = randomAsHex(32) - const keypair = new Keyring({ type, ss58Format }).addFromUri( - seed, - {}, - type - ) as KiltKeyringPair + const keypair = Crypto.makeKeypairFromSeed(undefined, keypairTypeForAlg[alg]) const getSignCallback = makeSignCallback(keypair) const storeDidCallback = makeStoreDidCallback(keypair) - const authenticationKey = { - publicKey: keypair.publicKey, - type: keypair.type as LightDidSupportedVerificationKeyType, - } - return { keypair, getSignCallback, storeDidCallback, - authentication: [authenticationKey], + authentication: [keypair as NewLightDidVerificationKey], } } diff --git a/packages/utils/package.json b/packages/utils/package.json index 8772fa058..78eb2f663 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -35,6 +35,7 @@ }, "dependencies": { "@kiltprotocol/types": "workspace:*", + "@polkadot/api": "^9.0.0", "@polkadot/keyring": "^10.0.0", "@polkadot/util": "^10.0.0", "@polkadot/util-crypto": "^10.0.0", diff --git a/packages/utils/src/Crypto.ts b/packages/utils/src/Crypto.ts index 38b4b0faf..8d684461f 100644 --- a/packages/utils/src/Crypto.ts +++ b/packages/utils/src/Crypto.ts @@ -14,7 +14,11 @@ */ import { decodeAddress, encodeAddress } from '@polkadot/keyring' -import type { KeyringPair } from '@kiltprotocol/types' +import type { + EncryptionKeyType, + KeyringPair, + KiltKeyringPair, +} from '@kiltprotocol/types' import { isString, stringToU8a, @@ -26,15 +30,23 @@ import { import { blake2AsHex, blake2AsU8a, + naclBoxPairFromSecret, + randomAsU8a, signatureVerify, } from '@polkadot/util-crypto' +import { Keyring } from '@polkadot/api' import nacl from 'tweetnacl' import { v4 as uuid } from 'uuid' import type { HexString } from '@polkadot/util/types' import jsonabc from './jsonabc.js' import * as SDKErrors from './SDKErrors.js' +import { ss58Format } from './ss58Format.js' -export { naclBoxPairFromSecret } from '@polkadot/util-crypto' +export { + naclBoxPairFromSecret, + mnemonicGenerate, + mnemonicToMiniSecret, +} from '@polkadot/util-crypto' export { encodeAddress, decodeAddress, u8aToHex, u8aConcat } @@ -338,3 +350,28 @@ export function hashStatements( return { digest, saltedHash, nonce, statement } }) } + +export function makeKeypairFromSeed< + KeyType extends KiltKeyringPair['type'] = 'ed25519' +>(seed = randomAsU8a(32), type?: KeyType): KiltKeyringPair & { type: KeyType } { + const keyring = new Keyring({ ss58Format, type }) + return keyring.addFromSeed(seed) as KiltKeyringPair & { type: KeyType } +} + +export function makeKeypairFromUri< + KeyType extends KiltKeyringPair['type'] = 'ed25519' +>(uri: string, type?: KeyType): KiltKeyringPair & { type: KeyType } { + const keyring = new Keyring({ ss58Format, type }) + return keyring.addFromUri(uri) as KiltKeyringPair & { type: KeyType } +} + +export function makeEncryptionKeyFromSeed(seed = randomAsU8a(32)): { + secretKey: Uint8Array + publicKey: Uint8Array + type: EncryptionKeyType +} { + return { + ...naclBoxPairFromSecret(seed), + type: 'x25519', + } +} diff --git a/tests/bundle-test.ts b/tests/bundle-test.ts index dc60255ce..8ac665334 100644 --- a/tests/bundle-test.ts +++ b/tests/bundle-test.ts @@ -7,8 +7,6 @@ /// -import type { KeypairType } from '@polkadot/util-crypto/types' - import type { DecryptCallback, DidDocument, @@ -30,7 +28,7 @@ const { CType, Did, Blockchain, - Utils: { Crypto, Keyring, ss58Format }, + Utils: { Crypto, ss58Format }, Message, BalanceUtils, } = kilt @@ -74,17 +72,13 @@ function makeSigningKeypair( getSignCallback: (didDocument: DidDocument) => SignCallback storeDidCallback: StoreDidCallback } { - const keypairTypeForAlg: Record = { + const keypairTypeForAlg: Record = { ed25519: 'ed25519', sr25519: 'sr25519', 'ecdsa-secp256k1': 'ecdsa', } const type = keypairTypeForAlg[alg] - const keypair = new Keyring({ type }).addFromUri( - seed, - {}, - type - ) as KiltKeyringPair + const keypair = Crypto.makeKeypairFromUri(seed, type) const getSignCallback = makeSignCallback(keypair) const storeDidCallback = makeStoreDidCallback(keypair) @@ -181,9 +175,7 @@ async function runAll() { console.log('Account setup started') const FaucetSeed = 'receive clutch item involve chaos clutch furnace arrest claw isolate okay together' - const payer = new Keyring({ ss58Format, type: 'ed25519' }).createFromUri( - FaucetSeed - ) as KiltKeyringPair + const payer = Crypto.makeKeypairFromUri(FaucetSeed) const { keypair: aliceKeypair, getSignCallback: aliceSign } = makeSigningKeypair('//Alice') diff --git a/yarn.lock b/yarn.lock index 307bf9203..6afb8c1c6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1416,6 +1416,7 @@ __metadata: resolution: "@kiltprotocol/utils@workspace:packages/utils" dependencies: "@kiltprotocol/types": "workspace:*" + "@polkadot/api": ^9.0.0 "@polkadot/keyring": ^10.0.0 "@polkadot/util": ^10.0.0 "@polkadot/util-crypto": ^10.0.0 @@ -1601,7 +1602,7 @@ __metadata: languageName: node linkType: hard -"@polkadot/api@npm:9.4.1, @polkadot/api@npm:^9.4.1": +"@polkadot/api@npm:9.4.1, @polkadot/api@npm:^9.0.0, @polkadot/api@npm:^9.4.1": version: 9.4.1 resolution: "@polkadot/api@npm:9.4.1" dependencies: From cb77bb7e7ad9b858c9943c40fa08140e204f3aee Mon Sep 17 00:00:00 2001 From: Github Action Date: Thu, 22 Sep 2022 07:41:10 +0000 Subject: [PATCH 28/36] [CI Skip] ci: publish prerelease --- package.json | 2 +- packages/augment-api/package.json | 2 +- packages/chain-helpers/package.json | 2 +- packages/config/package.json | 2 +- packages/core/package.json | 2 +- packages/did/package.json | 2 +- packages/messaging/package.json | 2 +- packages/sdk-js/package.json | 2 +- packages/testing/package.json | 2 +- packages/types/package.json | 2 +- packages/utils/package.json | 2 +- packages/vc-export/package.json | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index 2a81f59fd..4f27bd046 100644 --- a/package.json +++ b/package.json @@ -68,6 +68,6 @@ "typedoc": "^0.22.15", "typescript": "^4.8.3" }, - "version": "0.30.0-13", + "version": "0.30.0-14", "packageManager": "yarn@3.0.2" } diff --git a/packages/augment-api/package.json b/packages/augment-api/package.json index 7c0891330..c8e16739a 100644 --- a/packages/augment-api/package.json +++ b/packages/augment-api/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/augment-api", - "version": "0.30.0-13", + "version": "0.30.0-14", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/chain-helpers/package.json b/packages/chain-helpers/package.json index a79600c8f..02134f78e 100644 --- a/packages/chain-helpers/package.json +++ b/packages/chain-helpers/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/chain-helpers", - "version": "0.30.0-13", + "version": "0.30.0-14", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/config/package.json b/packages/config/package.json index d89e3abae..17425390a 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/config", - "version": "0.30.0-13", + "version": "0.30.0-14", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/core/package.json b/packages/core/package.json index 2e3f4f204..eaec29e57 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/core", - "version": "0.30.0-13", + "version": "0.30.0-14", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/did/package.json b/packages/did/package.json index 60ac785a4..1013e4bd6 100644 --- a/packages/did/package.json +++ b/packages/did/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/did", - "version": "0.30.0-13", + "version": "0.30.0-14", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/messaging/package.json b/packages/messaging/package.json index 47e588a5c..1888ed2ac 100644 --- a/packages/messaging/package.json +++ b/packages/messaging/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/messaging", - "version": "0.30.0-13", + "version": "0.30.0-14", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/sdk-js/package.json b/packages/sdk-js/package.json index f9aed0b72..1c268a2c7 100644 --- a/packages/sdk-js/package.json +++ b/packages/sdk-js/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/sdk-js", - "version": "0.30.0-13", + "version": "0.30.0-14", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/testing/package.json b/packages/testing/package.json index 0af0b0a23..52c1a98a7 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -1,7 +1,7 @@ { "name": "@kiltprotocol/testing", "private": true, - "version": "0.30.0-13", + "version": "0.30.0-14", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/types/package.json b/packages/types/package.json index 11c0ea0a9..930c15a0b 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/types", - "version": "0.30.0-13", + "version": "0.30.0-14", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/utils/package.json b/packages/utils/package.json index 78eb2f663..0e3551bcd 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/utils", - "version": "0.30.0-13", + "version": "0.30.0-14", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/vc-export/package.json b/packages/vc-export/package.json index a011a3ce7..d9ce83daa 100644 --- a/packages/vc-export/package.json +++ b/packages/vc-export/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/vc-export", - "version": "0.30.0-13", + "version": "0.30.0-14", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", From b059eece251ecaae4f6838839902cbe4a066d9a4 Mon Sep 17 00:00:00 2001 From: Tom Adler Date: Thu, 22 Sep 2022 17:12:12 +0200 Subject: [PATCH 29/36] refactor!: single DID namespace (#640) * refactor!: removed Web3Names namespace * refactor!: removed AccountLinks namespace * refactor!: removed Did.Chain namespace * refactor!: removed Did.Utils namespace * refactor!: getEndpoint -> getService * refactor!: resolveServiceEndpoint -> resolveService * refactor!: didToChain -> toChain * refactor!: didFromChain -> documentFromChain * refactor!: parseDidUri -> parse * refactor!: validateKiltDidUri -> validateUri * refactor!: checkServiceEndpointSyntax -> validateService * refactor!: uriFromChain -> fromChain * chore: merge Web3Names.chain into Did.chain * chore: merge full DID utils into full DID * chore: merge light DID utils into light DID * chore: move validateService in Did.chain * refactor!: replace stripFragment with resourceIdToChain * refactor!: do not export versions * refactor!: remove KILT_DID_PREFIX * refactor!: do not export IDidParsingResult * fix: merge * refactor!: do not export getNextNonce * chore: removed unused isKiltDidUri * chore: removed unused alg:SigningAlgorithms maps * chore: removed unused alg:EncryptionAlgorithms maps * refactor!: removed makeLinkingSignCallback * refactor!: do not export verifyDidSignatureDataStructure * fixup! chore: removed unused alg:SigningAlgorithms maps --- jest.config.js | 2 - .../AccountLinking.spec.ts | 68 +++---- .../src/__integrationtests__/Deposit.spec.ts | 19 +- .../core/src/__integrationtests__/Did.spec.ts | 143 +++++++-------- .../__integrationtests__/Web3Names.spec.ts | 11 +- .../core/src/attestation/Attestation.chain.ts | 4 +- packages/core/src/attestation/Attestation.ts | 4 +- packages/core/src/claim/Claim.ts | 4 +- .../core/src/credential/Credential.spec.ts | 8 +- packages/core/src/ctype/CType.chain.ts | 4 +- packages/core/src/ctype/CType.ts | 4 +- .../core/src/delegation/DelegationDecoder.ts | 4 +- .../src/delegation/DelegationNode.chain.ts | 8 +- .../core/src/delegation/DelegationNode.ts | 11 +- packages/core/src/quote/Quote.spec.ts | 2 +- packages/did/src/Did.chain.ts | 127 +++++++++++-- packages/did/src/Did.signature.spec.ts | 2 +- packages/did/src/Did.signature.ts | 8 +- packages/did/src/Did.utils.ts | 160 ++-------------- .../did/src/DidDetails/DidDetails.spec.ts | 8 +- packages/did/src/DidDetails/DidDetails.ts | 2 +- .../did/src/DidDetails/FullDidDetails.spec.ts | 112 ++++++++++-- packages/did/src/DidDetails/FullDidDetails.ts | 86 +++++++-- .../DidDetails/FullDidDetails.utils.spec.ts | 88 --------- .../src/DidDetails/FullDidDetails.utils.ts | 71 -------- .../src/DidDetails/LightDidDetails.spec.ts | 43 +++-- .../did/src/DidDetails/LightDidDetails.ts | 172 ++++++++++++++++-- .../src/DidDetails/LightDidDetails.utils.ts | 170 ----------------- .../DidDocumentExporter.spec.ts | 3 +- .../did/src/DidLinks/AccountLinks.chain.ts | 40 ++-- packages/did/src/DidLinks/Web3Names.chain.ts | 48 ----- packages/did/src/DidLinks/index.ts | 3 - .../did/src/DidResolver/DidResolver.spec.ts | 31 ++-- packages/did/src/DidResolver/DidResolver.ts | 22 +-- packages/did/src/index.ts | 6 +- packages/messaging/src/Message.spec.ts | 4 +- packages/messaging/src/Message.ts | 22 +-- packages/testing/src/TestUtils.ts | 37 ++-- packages/types/src/CryptoCallbacks.ts | 6 - .../src/exportToVerifiableCredential.spec.ts | 4 +- .../vc-js/suites/KiltSignatureSuite.spec.ts | 4 +- tests/bundle-test.ts | 20 +- 42 files changed, 683 insertions(+), 912 deletions(-) delete mode 100644 packages/did/src/DidDetails/FullDidDetails.utils.spec.ts delete mode 100644 packages/did/src/DidDetails/FullDidDetails.utils.ts delete mode 100644 packages/did/src/DidDetails/LightDidDetails.utils.ts delete mode 100644 packages/did/src/DidLinks/Web3Names.chain.ts diff --git a/jest.config.js b/jest.config.js index 6ffe782c6..f6fda50dc 100644 --- a/jest.config.js +++ b/jest.config.js @@ -33,8 +33,6 @@ module.exports = { '!**/*.chain.ts', '!did/src/Did.chain.ts', '!did/src/Did.utils.ts', - '!did/src/DidDetails/LightDidDetails.utils.ts', - '!did/src/DidDetails/FullDidDetails.utils.ts', '!utils/src/jsonabc.ts', ], resolver: "ts-jest-resolver", diff --git a/packages/core/src/__integrationtests__/AccountLinking.spec.ts b/packages/core/src/__integrationtests__/AccountLinking.spec.ts index 5325b5298..6476e4969 100644 --- a/packages/core/src/__integrationtests__/AccountLinking.spec.ts +++ b/packages/core/src/__integrationtests__/AccountLinking.spec.ts @@ -9,7 +9,6 @@ * @group integration/accountLinking */ -import { AccountLinks, Web3Names } from '@kiltprotocol/did' import * as Did from '@kiltprotocol/did' import { createFullDidFromSeed, @@ -37,13 +36,12 @@ import { disconnect } from '../kilt' let paymentAccount: KiltKeyringPair let paymentAccountChain: string let linkDeposit: BN -let sign: AccountLinks.LinkingSignCallback let api: ApiPromise beforeAll(async () => { api = await initializeApi() paymentAccount = await createEndowedTestAccount() - paymentAccountChain = AccountLinks.accountToChain(paymentAccount.address) + paymentAccountChain = Did.accountToChain(paymentAccount.address) linkDeposit = api.consts.didLookup.deposit.toBn() }, 40_000) @@ -60,9 +58,9 @@ describe('When there is an on-chain DID', () => { didKey = makeSigningKeyTool() newDidKey = makeSigningKeyTool() did = await createFullDidFromSeed(paymentAccount, didKey.keypair) - didChain = Did.Chain.didToChain(did.uri) + didChain = Did.toChain(did.uri) newDid = await createFullDidFromSeed(paymentAccount, newDidKey.keypair) - newDidChain = Did.Chain.didToChain(newDid.uri) + newDidChain = Did.toChain(newDid.uri) }, 40_000) it('should be possible to associate the tx sender', async () => { // Check that no links exist @@ -106,12 +104,12 @@ describe('When there is an on-chain DID', () => { ).toMatchInlineSnapshot('"0"') // Check that the link has been created correctly expect( - AccountLinks.connectedDidFromChain( + Did.connectedDidFromChain( await api.query.didLookup.connectedDids(paymentAccountChain) ).did ).toStrictEqual(did.uri) const encoded = await api.query.didLookup.connectedAccounts.keys(didChain) - expect(AccountLinks.connectedAccountsFromChain(encoded)).toStrictEqual([ + expect(Did.connectedAccountsFromChain(encoded)).toStrictEqual([ paymentAccount.address, ]) expect( @@ -145,7 +143,7 @@ describe('When there is an on-chain DID', () => { ).toMatchInlineSnapshot('"0"') // Check that account is linked to new DID expect( - AccountLinks.connectedDidFromChain( + Did.connectedDidFromChain( await api.query.didLookup.connectedDids(paymentAccountChain) ).did ).toStrictEqual(newDid.uri) @@ -165,7 +163,7 @@ describe('When there is an on-chain DID', () => { const encoded = await api.query.didLookup.connectedAccounts.keys( newDidChain ) - expect(AccountLinks.connectedAccountsFromChain(encoded)).toStrictEqual([ + expect(Did.connectedAccountsFromChain(encoded)).toStrictEqual([ paymentAccount.address, ]) expect( @@ -220,25 +218,22 @@ describe('When there is an on-chain DID', () => { // TODO: remove this line to test against ethereum linking enabled chains if (keyType === 'ethereum') return - const keyTool = makeSigningKeyTool( - Did.Utils.signatureAlgForKeyType[keyType] - ) + const keyTool = makeSigningKeyTool(keyType as KiltKeyringPair['type']) keypair = keyTool.keypair - keypairChain = AccountLinks.accountToChain(keypair.address) - sign = AccountLinks.makeLinkingSignCallback(keypair) + keypairChain = Did.accountToChain(keypair.address) didKey = makeSigningKeyTool() newDidKey = makeSigningKeyTool() did = await createFullDidFromSeed(paymentAccount, didKey.keypair) - didChain = Did.Chain.didToChain(did.uri) + didChain = Did.toChain(did.uri) newDid = await createFullDidFromSeed(paymentAccount, newDidKey.keypair) - newDidChain = Did.Chain.didToChain(newDid.uri) + newDidChain = Did.toChain(newDid.uri) }, 40_000) it('should be possible to associate the account while the sender pays the deposit', async () => { - const args = await AccountLinks.associateAccountToChainArgs( + const args = await Did.associateAccountToChainArgs( keypair.address, did.uri, - sign + async (payload) => keypair.sign(payload, { withType: false }) ) const signedTx = await Did.authorizeExtrinsic( did.uri, @@ -263,7 +258,7 @@ describe('When there is an on-chain DID', () => { .toString() ).toMatchInlineSnapshot('"0"') expect( - AccountLinks.connectedDidFromChain( + Did.connectedDidFromChain( await api.query.didLookup.connectedDids(keypairChain) ).did ).toStrictEqual(did.uri) @@ -273,7 +268,7 @@ describe('When there is an on-chain DID', () => { const encoded = await api.query.didLookup.connectedAccounts.keys( didChain ) - expect(AccountLinks.connectedAccountsFromChain(encoded)).toStrictEqual([ + expect(Did.connectedAccountsFromChain(encoded)).toStrictEqual([ keypair.address, ]) expect( @@ -290,10 +285,10 @@ describe('When there is an on-chain DID', () => { ).toBe(true) }) it('should be possible to associate the account to a new DID while the sender pays the deposit', async () => { - const args = await AccountLinks.associateAccountToChainArgs( + const args = await Did.associateAccountToChainArgs( keypair.address, newDid.uri, - sign + async (payload) => keypair.sign(payload, { withType: false }) ) const signedTx = await Did.authorizeExtrinsic( newDid.uri, @@ -317,7 +312,7 @@ describe('When there is an on-chain DID', () => { (await api.query.didLookup.connectedDids(paymentAccountChain)).isNone ).toBe(true) expect( - AccountLinks.connectedDidFromChain( + Did.connectedDidFromChain( await api.query.didLookup.connectedDids(keypairChain) ).did ).toStrictEqual(newDid.uri) @@ -340,7 +335,7 @@ describe('When there is an on-chain DID', () => { const encoded = await api.query.didLookup.connectedAccounts.keys( newDidChain ) - expect(AccountLinks.connectedAccountsFromChain(encoded)).toStrictEqual([ + expect(Did.connectedAccountsFromChain(encoded)).toStrictEqual([ keypair.address, ]) expect( @@ -415,24 +410,21 @@ describe('When there is an on-chain DID', () => { genericAccount = new Keyring({ type: 'ecdsa' }).addFromMnemonic( mnemonicGenerate() ) - genericAccountChain = AccountLinks.accountToChain(genericAccount.address) - // also testing that signing with type bitflag works, like the polkadot extension does it - sign = async (payload) => genericAccount.sign(payload, { withType: true }) - + genericAccountChain = Did.accountToChain(genericAccount.address) await fundAccount(genericAccount.address, convertToTxUnit(new BN(10), 1)) didKey = makeSigningKeyTool() newDidKey = makeSigningKeyTool() did = await createFullDidFromSeed(paymentAccount, didKey.keypair) - didChain = Did.Chain.didToChain(did.uri) + didChain = Did.toChain(did.uri) newDid = await createFullDidFromSeed(paymentAccount, newDidKey.keypair) - newDidChain = Did.Chain.didToChain(newDid.uri) + newDidChain = Did.toChain(newDid.uri) }, 40_000) it('should be possible to associate the account while the sender pays the deposit', async () => { - const args = await AccountLinks.associateAccountToChainArgs( + const args = await Did.associateAccountToChainArgs( genericAccount.address, did.uri, - sign + async (payload) => genericAccount.sign(payload, { withType: true }) ) const signedTx = await Did.authorizeExtrinsic( did.uri, @@ -457,7 +449,7 @@ describe('When there is an on-chain DID', () => { .toString() ).toMatchInlineSnapshot('"0"') expect( - AccountLinks.connectedDidFromChain( + Did.connectedDidFromChain( await api.query.didLookup.connectedDids(genericAccountChain) ).did ).toStrictEqual(did.uri) @@ -467,7 +459,7 @@ describe('When there is an on-chain DID', () => { const encoded = await api.query.didLookup.connectedAccounts.keys(didChain) expect( // Wildcard substrate encoding. Account should match the generated one. - AccountLinks.connectedAccountsFromChain(encoded, 42) + Did.connectedAccountsFromChain(encoded, 42) ).toStrictEqual([genericAccount.address]) expect( ( @@ -498,14 +490,14 @@ describe('When there is an on-chain DID', () => { await submitExtrinsic(signedTx, paymentAccount) // Check that the Web3 name has been linked to the DID - const { owner } = Web3Names.web3NameOwnerFromChain( + const { owner } = Did.web3NameOwnerFromChain( await api.query.web3Names.owner('test-name') ) expect(owner).toStrictEqual(did.uri) // Check that it is possible to retrieve the web3 name from the account linked to the DID - expect( - await AccountLinks.queryWeb3Name(genericAccount.address) - ).toStrictEqual('test-name') + expect(await Did.queryWeb3Name(genericAccount.address)).toStrictEqual( + 'test-name' + ) }) it('should be possible for the sender to remove the link', async () => { diff --git a/packages/core/src/__integrationtests__/Deposit.spec.ts b/packages/core/src/__integrationtests__/Deposit.spec.ts index 6ac7ed5b4..afecd290e 100644 --- a/packages/core/src/__integrationtests__/Deposit.spec.ts +++ b/packages/core/src/__integrationtests__/Deposit.spec.ts @@ -54,7 +54,7 @@ async function checkDeleteFullDid( sign: SignCallback ): Promise { storedEndpointsCount = await api.query.did.didEndpointsCount( - Did.Chain.didToChain(fullDid.uri) + Did.toChain(fullDid.uri) ) const deleteDid = api.tx.did.delete(storedEndpointsCount) @@ -69,8 +69,8 @@ async function checkDeleteFullDid( await api.query.system.account(identity.address) ).data - const didResult = Did.Chain.didFromChain( - await api.query.did.did(Did.Chain.didToChain(fullDid.uri)) + const didResult = Did.documentFromChain( + await api.query.did.did(Did.toChain(fullDid.uri)) ) const didDeposit = didResult.deposit @@ -90,19 +90,16 @@ async function checkReclaimFullDid( fullDid: DidDocument ): Promise { storedEndpointsCount = await api.query.did.didEndpointsCount( - Did.Chain.didToChain(fullDid.uri) - ) - tx = api.tx.did.reclaimDeposit( - Did.Chain.didToChain(fullDid.uri), - storedEndpointsCount + Did.toChain(fullDid.uri) ) + tx = api.tx.did.reclaimDeposit(Did.toChain(fullDid.uri), storedEndpointsCount) const balanceBeforeRevoking = ( await api.query.system.account(identity.address) ).data - const didResult = Did.Chain.didFromChain( - await api.query.did.did(Did.Chain.didToChain(fullDid.uri)) + const didResult = Did.documentFromChain( + await api.query.did.did(Did.toChain(fullDid.uri)) ) const didDeposit = didResult.deposit @@ -240,7 +237,7 @@ async function checkDeletedDidReclaimAttestation( await submitExtrinsic(authorizedTx, identity) storedEndpointsCount = await api.query.did.didEndpointsCount( - Did.Chain.didToChain(fullDid.uri) + Did.toChain(fullDid.uri) ) attestation = Attestation.fromCredentialAndDid(credential, fullDid.uri) diff --git a/packages/core/src/__integrationtests__/Did.spec.ts b/packages/core/src/__integrationtests__/Did.spec.ts index 0669353c6..7af230153 100644 --- a/packages/core/src/__integrationtests__/Did.spec.ts +++ b/packages/core/src/__integrationtests__/Did.spec.ts @@ -13,7 +13,7 @@ import type { ApiPromise } from '@polkadot/api' import { BN } from '@polkadot/util' import * as Did from '@kiltprotocol/did' -import { resolve, Web3Names } from '@kiltprotocol/did' +import { resolve } from '@kiltprotocol/did' import { createFullDidFromSeed, createMinimalLightDidFromKeypair, @@ -73,7 +73,7 @@ describe('write and didDeleteTx', () => { it('fails to create a new DID on chain with a different submitter than the one in the creation operation', async () => { const otherAccount = devBob - const tx = await Did.Chain.getStoreTx( + const tx = await Did.getStoreTx( did, otherAccount.address, key.storeDidCallback @@ -101,7 +101,7 @@ describe('write and didDeleteTx', () => { ], }) - const tx = await Did.Chain.getStoreTx( + const tx = await Did.getStoreTx( newDid, paymentAccount.address, key.storeDidCallback @@ -109,7 +109,7 @@ describe('write and didDeleteTx', () => { await submitExtrinsic(tx, paymentAccount) - const fullDidUri = Did.Utils.getFullDidUri(newDid.uri) + const fullDidUri = Did.getFullDidUri(newDid.uri) const fullDid = (await Did.query(fullDidUri)) as DidDocument expect(fullDid).toMatchObject({ @@ -137,18 +137,18 @@ describe('write and didDeleteTx', () => { }, 60_000) it('should return no results for empty accounts', async () => { - const emptyDid = Did.Utils.getFullDidUriFromKey( + const emptyDid = Did.getFullDidUriFromKey( makeSigningKeyTool().authentication[0] ) - const encodedDid = Did.Chain.didToChain(emptyDid) + const encodedDid = Did.toChain(emptyDid) expect( await api.query.did.serviceEndpoints.entries(encodedDid) ).toHaveLength(0) const encoded = await api.query.did.serviceEndpoints( encodedDid, - Did.Chain.resourceIdToChain('#non-existing-service-id') + Did.resourceIdToChain('#non-existing-service-id') ) expect(encoded.isNone).toBe(true) @@ -158,9 +158,7 @@ describe('write and didDeleteTx', () => { it('fails to delete the DID using a different submitter than the one specified in the DID operation or using a services count that is too low', async () => { // We verify that the DID to delete is on chain. - const fullDid = (await Did.query( - Did.Utils.getFullDidUri(did.uri) - )) as DidDocument + const fullDid = (await Did.query(Did.getFullDidUri(did.uri))) as DidDocument expect(fullDid).not.toBeNull() const otherAccount = devBob @@ -201,12 +199,10 @@ describe('write and didDeleteTx', () => { it('deletes DID from previous step', async () => { // We verify that the DID to delete is on chain. - const fullDid = (await Did.query( - Did.Utils.getFullDidUri(did.uri) - )) as DidDocument + const fullDid = (await Did.query(Did.getFullDidUri(did.uri))) as DidDocument expect(fullDid).not.toBeNull() - const encodedDid = Did.Chain.didToChain(fullDid.uri) + const encodedDid = Did.toChain(fullDid.uri) const storedEndpointsCount = await api.query.did.didEndpointsCount( encodedDid ) @@ -235,7 +231,7 @@ it('creates and updates DID, and then reclaims the deposit back', async () => { const { keypair, getSignCallback, storeDidCallback } = makeSigningKeyTool() const newDid = await createMinimalLightDidFromKeypair(keypair) - const tx = await Did.Chain.getStoreTx( + const tx = await Did.getStoreTx( newDid, paymentAccount.address, storeDidCallback @@ -244,14 +240,12 @@ it('creates and updates DID, and then reclaims the deposit back', async () => { await submitExtrinsic(tx, paymentAccount) // This will better be handled once we have the UpdateBuilder class, which encapsulates all the logic. - let fullDid = (await Did.query( - Did.Utils.getFullDidUri(newDid.uri) - )) as DidDocument + let fullDid = (await Did.query(Did.getFullDidUri(newDid.uri))) as DidDocument const newKey = makeSigningKeyTool() const updateAuthenticationKeyCall = api.tx.did.setAuthenticationKey( - Did.Chain.publicKeyToChain(newKey.authentication[0]) + Did.publicKeyToChain(newKey.authentication[0]) ) const tx2 = await Did.authorizeExtrinsic( fullDid.uri, @@ -263,9 +257,7 @@ it('creates and updates DID, and then reclaims the deposit back', async () => { // Authentication key changed, so did must be updated. // Also this will better be handled once we have the UpdateBuilder class, which encapsulates all the logic. - fullDid = (await Did.query( - Did.Utils.getFullDidUri(newDid.uri) - )) as DidDocument + fullDid = (await Did.query(Did.getFullDidUri(newDid.uri))) as DidDocument // Add a new service endpoint const newEndpoint: DidServiceEndpoint = { @@ -274,7 +266,7 @@ it('creates and updates DID, and then reclaims the deposit back', async () => { serviceEndpoint: ['x:new-url'], } const updateEndpointCall = api.tx.did.addServiceEndpoint( - Did.Chain.serviceToChain(newEndpoint) + Did.serviceToChain(newEndpoint) ) const tx3 = await Did.authorizeExtrinsic( @@ -285,16 +277,16 @@ it('creates and updates DID, and then reclaims the deposit back', async () => { ) await submitExtrinsic(tx3, paymentAccount) - const encodedDid = Did.Chain.didToChain(fullDid.uri) + const encodedDid = Did.toChain(fullDid.uri) const encoded = await api.query.did.serviceEndpoints( encodedDid, - Did.Chain.resourceIdToChain(newEndpoint.id) + Did.resourceIdToChain(newEndpoint.id) ) - expect(Did.Chain.serviceFromChain(encoded)).toStrictEqual(newEndpoint) + expect(Did.serviceFromChain(encoded)).toStrictEqual(newEndpoint) // Delete the added service endpoint const removeEndpointCall = api.tx.did.removeServiceEndpoint( - Did.Chain.resourceIdToChain(newEndpoint.id) + Did.resourceIdToChain(newEndpoint.id) ) const tx4 = await Did.authorizeExtrinsic( fullDid.uri, @@ -307,7 +299,7 @@ it('creates and updates DID, and then reclaims the deposit back', async () => { // There should not be any endpoint with the given ID now. const encoded2 = await api.query.did.serviceEndpoints( encodedDid, - Did.Chain.resourceIdToChain(newEndpoint.id) + Did.resourceIdToChain(newEndpoint.id) ) expect(encoded2.isNone).toBe(true) @@ -338,14 +330,14 @@ describe('DID migration', () => { keyAgreement, }) - const storeTx = await Did.Chain.getStoreTx( + const storeTx = await Did.getStoreTx( lightDid, paymentAccount.address, storeDidCallback ) await submitExtrinsic(storeTx, paymentAccount) - const migratedFullDidUri = Did.Utils.getFullDidUri(lightDid.uri) + const migratedFullDidUri = Did.getFullDidUri(lightDid.uri) const migratedFullDid = await Did.query(migratedFullDidUri) if (!migratedFullDid) throw new Error('Cannot query created DID') @@ -366,8 +358,7 @@ describe('DID migration', () => { }) expect( - (await api.query.did.did(Did.Chain.didToChain(migratedFullDid.uri))) - .isSome + (await api.query.did.did(Did.toChain(migratedFullDid.uri))).isSome ).toBe(true) const { metadata } = (await resolve(lightDid.uri)) as DidResolutionResult @@ -382,14 +373,14 @@ describe('DID migration', () => { authentication, }) - const storeTx = await Did.Chain.getStoreTx( + const storeTx = await Did.getStoreTx( lightDid, paymentAccount.address, storeDidCallback ) await submitExtrinsic(storeTx, paymentAccount) - const migratedFullDidUri = Did.Utils.getFullDidUri(lightDid.uri) + const migratedFullDidUri = Did.getFullDidUri(lightDid.uri) const migratedFullDid = await Did.query(migratedFullDidUri) if (!migratedFullDid) throw new Error('Cannot query created DID') @@ -404,8 +395,7 @@ describe('DID migration', () => { }) expect( - (await api.query.did.did(Did.Chain.didToChain(migratedFullDid.uri))) - .isSome + (await api.query.did.did(Did.toChain(migratedFullDid.uri))).isSome ).toBe(true) const { metadata } = (await resolve(lightDid.uri)) as DidResolutionResult @@ -432,14 +422,14 @@ describe('DID migration', () => { service, }) - const storeTx = await Did.Chain.getStoreTx( + const storeTx = await Did.getStoreTx( lightDid, paymentAccount.address, storeDidCallback ) await submitExtrinsic(storeTx, paymentAccount) - const migratedFullDidUri = Did.Utils.getFullDidUri(lightDid.uri) + const migratedFullDidUri = Did.getFullDidUri(lightDid.uri) const migratedFullDid = await Did.query(migratedFullDidUri) if (!migratedFullDid) throw new Error('Cannot query created DID') @@ -466,7 +456,7 @@ describe('DID migration', () => { ], }) - const encodedDid = Did.Chain.didToChain(migratedFullDid.uri) + const encodedDid = Did.toChain(migratedFullDid.uri) expect((await api.query.did.did(encodedDid)).isSome).toBe(true) const { metadata } = (await resolve(lightDid.uri)) as DidResolutionResult @@ -499,7 +489,7 @@ describe('DID authorization', () => { makeSigningKeyTool('ed25519') beforeAll(async () => { - const createTx = await Did.Chain.getStoreTx( + const createTx = await Did.getStoreTx( { authentication, assertionMethod: authentication, @@ -510,7 +500,7 @@ describe('DID authorization', () => { ) await submitExtrinsic(createTx, paymentAccount) const optional = await Did.query( - Did.Utils.getFullDidUriFromKey(authentication[0]) + Did.getFullDidUriFromKey(authentication[0]) ) if (!optional) throw new Error('Cannot query created DID') did = optional @@ -537,7 +527,7 @@ describe('DID authorization', () => { it('no longer authorizes ctype creation after DID deletion', async () => { const storedEndpointsCount = await api.query.did.didEndpointsCount( - Did.Chain.didToChain(did.uri) + Did.toChain(did.uri) ) const deleteCall = api.tx.did.delete(storedEndpointsCount) const tx = await Did.authorizeExtrinsic( @@ -574,7 +564,7 @@ describe('DID management batching', () => { describe('FullDidCreationBuilder', () => { it('Build a complete full DID', async () => { const { keypair, storeDidCallback, authentication } = makeSigningKeyTool() - const extrinsic = await Did.Chain.getStoreTx( + const extrinsic = await Did.getStoreTx( { authentication, assertionMethod: [ @@ -627,7 +617,7 @@ describe('DID management batching', () => { await submitExtrinsic(extrinsic, paymentAccount) const fullDid = await Did.query( - Did.Utils.getFullDidUriFromKey(authentication[0]) + Did.getFullDidUriFromKey(authentication[0]) ) expect(fullDid).not.toBeNull() @@ -687,23 +677,20 @@ describe('DID management batching', () => { }) it('Build a minimal full DID with an Ecdsa key', async () => { - const { keypair, storeDidCallback } = - makeSigningKeyTool('ecdsa-secp256k1') + const { keypair, storeDidCallback } = makeSigningKeyTool('ecdsa') const didAuthKey: NewDidVerificationKey = { publicKey: keypair.publicKey, type: 'ecdsa', } - const extrinsic = await Did.Chain.getStoreTx( + const extrinsic = await Did.getStoreTx( { authentication: [didAuthKey] }, paymentAccount.address, storeDidCallback ) await submitExtrinsic(extrinsic, paymentAccount) - const fullDid = await Did.query( - Did.Utils.getFullDidUriFromKey(didAuthKey) - ) + const fullDid = await Did.query(Did.getFullDidUriFromKey(didAuthKey)) expect(fullDid).not.toBeNull() expect(fullDid?.authentication).toMatchObject([ @@ -720,7 +707,7 @@ describe('DID management batching', () => { const { keypair, getSignCallback, storeDidCallback, authentication } = makeSigningKeyTool() - const createTx = await Did.Chain.getStoreTx( + const createTx = await Did.getStoreTx( { authentication, keyAgreement: [ @@ -764,7 +751,7 @@ describe('DID management batching', () => { await submitExtrinsic(createTx, paymentAccount) const initialFullDid = await Did.query( - Did.Utils.getFullDidUriFromKey(authentication[0]) + Did.getFullDidUriFromKey(authentication[0]) ) if (!initialFullDid) throw new Error('Cannot query created DID') @@ -776,10 +763,10 @@ describe('DID management batching', () => { did: initialFullDid.uri, extrinsics: [ api.tx.did.removeKeyAgreementKey( - Did.Utils.stripFragment(encryptionKeys[0].id) + Did.resourceIdToChain(encryptionKeys[0].id) ), api.tx.did.removeKeyAgreementKey( - Did.Utils.stripFragment(encryptionKeys[1].id) + Did.resourceIdToChain(encryptionKeys[1].id) ), api.tx.did.removeAttestationKey(), api.tx.did.removeDelegationKey(), @@ -815,7 +802,7 @@ describe('DID management batching', () => { authentication: [newAuthKey], } = makeSigningKeyTool('ed25519') - const createTx = await Did.Chain.getStoreTx( + const createTx = await Did.getStoreTx( { authentication }, paymentAccount.address, storeDidCallback @@ -823,7 +810,7 @@ describe('DID management batching', () => { await submitExtrinsic(createTx, paymentAccount) const initialFullDid = await Did.query( - Did.Utils.getFullDidUriFromKey(authentication[0]) + Did.getFullDidUriFromKey(authentication[0]) ) if (!initialFullDid) throw new Error('Cannot query created DID') @@ -832,17 +819,15 @@ describe('DID management batching', () => { did: initialFullDid.uri, extrinsics: [ api.tx.did.addServiceEndpoint( - Did.Chain.serviceToChain({ + Did.serviceToChain({ id: '#id-1', type: ['type-1'], serviceEndpoint: ['x:url-1'], }) ), - api.tx.did.setAuthenticationKey( - Did.Chain.publicKeyToChain(newAuthKey) - ), + api.tx.did.setAuthenticationKey(Did.publicKeyToChain(newAuthKey)), api.tx.did.addServiceEndpoint( - Did.Chain.serviceToChain({ + Did.serviceToChain({ id: '#id-2', type: ['type-2'], serviceEndpoint: ['x:url-2'], @@ -873,7 +858,7 @@ describe('DID management batching', () => { it('simple `batch` succeeds despite failures of some extrinsics', async () => { const { authentication, getSignCallback, storeDidCallback } = makeSigningKeyTool() - const tx = await Did.Chain.getStoreTx( + const tx = await Did.getStoreTx( { authentication, service: [ @@ -890,7 +875,7 @@ describe('DID management batching', () => { // Create the full DID with a service endpoint await submitExtrinsic(tx, paymentAccount) const fullDid = await Did.query( - Did.Utils.getFullDidUriFromKey(authentication[0]) + Did.getFullDidUriFromKey(authentication[0]) ) if (!fullDid) throw new Error('Cannot query created DID') @@ -901,11 +886,9 @@ describe('DID management batching', () => { batchFunction: api.tx.utility.batch, did: fullDid.uri, extrinsics: [ - api.tx.did.setAttestationKey( - Did.Chain.publicKeyToChain(authentication[0]) - ), + api.tx.did.setAttestationKey(Did.publicKeyToChain(authentication[0])), api.tx.did.addServiceEndpoint( - Did.Chain.serviceToChain({ + Did.serviceToChain({ id: '#id-1', type: ['type-2'], serviceEndpoint: ['x:url-2'], @@ -925,7 +908,7 @@ describe('DID management batching', () => { expect(updatedFullDid.assertionMethod?.[0]).toBeDefined() // The service endpoint will match the one manually added, and not the one set in the batch expect( - Did.getEndpoint(updatedFullDid, '#id-1') + Did.getService(updatedFullDid, '#id-1') ).toStrictEqual({ id: '#id-1', type: ['type-1'], @@ -936,7 +919,7 @@ describe('DID management batching', () => { it('batchAll fails if any extrinsics fails', async () => { const { authentication, getSignCallback, storeDidCallback } = makeSigningKeyTool() - const createTx = await Did.Chain.getStoreTx( + const createTx = await Did.getStoreTx( { authentication, service: [ @@ -952,7 +935,7 @@ describe('DID management batching', () => { ) await submitExtrinsic(createTx, paymentAccount) const fullDid = await Did.query( - Did.Utils.getFullDidUriFromKey(authentication[0]) + Did.getFullDidUriFromKey(authentication[0]) ) if (!fullDid) throw new Error('Cannot query created DID') @@ -963,11 +946,9 @@ describe('DID management batching', () => { batchFunction: api.tx.utility.batchAll, did: fullDid.uri, extrinsics: [ - api.tx.did.setAttestationKey( - Did.Chain.publicKeyToChain(authentication[0]) - ), + api.tx.did.setAttestationKey(Did.publicKeyToChain(authentication[0])), api.tx.did.addServiceEndpoint( - Did.Chain.serviceToChain({ + Did.serviceToChain({ id: '#id-1', type: ['type-2'], serviceEndpoint: ['x:url-2'], @@ -992,7 +973,7 @@ describe('DID management batching', () => { expect(updatedFullDid.assertionMethod).toBeUndefined() // The service endpoint will match the one manually added, and not the one set in the builder. expect( - Did.getEndpoint(updatedFullDid, '#id-1') + Did.getService(updatedFullDid, '#id-1') ).toStrictEqual({ id: '#id-1', type: ['type-1'], @@ -1110,7 +1091,7 @@ describe('DID extrinsics batching', () => { expect(encoded1.isSome).toBe(false) // Test for correct creation of second web3 name const encoded2 = await api.query.web3Names.owner('test-2') - expect(Web3Names.web3NameOwnerFromChain(encoded2).owner).toStrictEqual( + expect(Did.web3NameOwnerFromChain(encoded2).owner).toStrictEqual( fullDid.uri ) }, 30_000) @@ -1168,7 +1149,7 @@ describe('DID extrinsics batching', () => { const encoded = await api.query.web3Names.owner('test') expect(encoded.isSome).toBe(false) - const { owner } = Web3Names.web3NameOwnerFromChain( + const { owner } = Did.web3NameOwnerFromChain( await api.query.web3Names.owner('test-2') ) expect(owner).toStrictEqual(fullDid.uri) @@ -1202,7 +1183,7 @@ describe('Runtime constraints', () => { type: 'x25519', }) ) - await Did.Chain.getStoreTx( + await Did.getStoreTx( { authentication: [testAuthKey], keyAgreement: newKeyAgreementKeys, @@ -1216,7 +1197,7 @@ describe('Runtime constraints', () => { type: 'x25519', }) await expect( - Did.Chain.getStoreTx( + Did.getStoreTx( { authentication: [testAuthKey], keyAgreement: newKeyAgreementKeys, @@ -1239,7 +1220,7 @@ describe('Runtime constraints', () => { serviceEndpoint: [`x:url-${index}`], }) ) - await Did.Chain.getStoreTx( + await Did.getStoreTx( { authentication: [testAuthKey], service: newServiceEndpoints, @@ -1254,7 +1235,7 @@ describe('Runtime constraints', () => { serviceEndpoint: ['x:url-100'], }) await expect( - Did.Chain.getStoreTx( + Did.getStoreTx( { authentication: [testAuthKey], service: newServiceEndpoints, diff --git a/packages/core/src/__integrationtests__/Web3Names.spec.ts b/packages/core/src/__integrationtests__/Web3Names.spec.ts index 948213f05..7f4b387c7 100644 --- a/packages/core/src/__integrationtests__/Web3Names.spec.ts +++ b/packages/core/src/__integrationtests__/Web3Names.spec.ts @@ -21,7 +21,6 @@ import { KeyTool, makeSigningKeyTool, } from '@kiltprotocol/testing' -import { Web3Names } from '@kiltprotocol/did' import * as Did from '@kiltprotocol/did' import type { ApiPromise } from '@polkadot/api' import { disconnect } from '../kilt' @@ -45,8 +44,8 @@ describe('When there is an Web3NameCreator and a payer', () => { let otherWeb3NameCreator: DidDocument let paymentAccount: KiltKeyringPair let otherPaymentAccount: KeyringPair - let nick: Web3Names.Web3Name - let differentNick: Web3Names.Web3Name + let nick: Did.Web3Name + let differentNick: Did.Web3Name beforeAll(async () => { nick = `nick_${randomAsHex(2)}` @@ -100,15 +99,15 @@ describe('When there is an Web3NameCreator and a payer', () => { }, 30_000) it('should be possible to lookup the DID uri with the given nick', async () => { - const { owner } = Web3Names.web3NameOwnerFromChain( + const { owner } = Did.web3NameOwnerFromChain( await api.query.web3Names.owner(nick) ) expect(owner).toBe(w3nCreator.uri) }, 30_000) it('should be possible to lookup the nick with the given DID uri', async () => { - const resolved = Web3Names.web3NameFromChain( - await api.query.web3Names.names(Did.Chain.didToChain(w3nCreator.uri)) + const resolved = Did.web3NameFromChain( + await api.query.web3Names.names(Did.toChain(w3nCreator.uri)) ) expect(resolved).toBe(nick) }, 30_000) diff --git a/packages/core/src/attestation/Attestation.chain.ts b/packages/core/src/attestation/Attestation.chain.ts index 23bb19857..4a6a9db78 100644 --- a/packages/core/src/attestation/Attestation.chain.ts +++ b/packages/core/src/attestation/Attestation.chain.ts @@ -8,7 +8,7 @@ import type { Option } from '@polkadot/types' import type { IAttestation, ICredential } from '@kiltprotocol/types' import { ConfigService } from '@kiltprotocol/config' -import { Chain as DidChain } from '@kiltprotocol/did' +import * as Did from '@kiltprotocol/did' import type { AttestationAttestationsAttestationDetails } from '@kiltprotocol/augment-api' const log = ConfigService.LoggingFactory.getLogger('Attestation') @@ -31,7 +31,7 @@ export function fromChain( const attestation: IAttestation = { claimHash, cTypeHash: chainAttestation.ctypeHash.toHex(), - owner: DidChain.uriFromChain(chainAttestation.attester), + owner: Did.fromChain(chainAttestation.attester), delegationId: delegationId || null, revoked: chainAttestation.revoked.valueOf(), } diff --git a/packages/core/src/attestation/Attestation.ts b/packages/core/src/attestation/Attestation.ts index d3eaa0697..288fa05d0 100644 --- a/packages/core/src/attestation/Attestation.ts +++ b/packages/core/src/attestation/Attestation.ts @@ -12,7 +12,7 @@ import type { DidUri, } from '@kiltprotocol/types' import { DataUtils, SDKErrors } from '@kiltprotocol/utils' -import { Utils as DidUtils } from '@kiltprotocol/did' +import * as Did from '@kiltprotocol/did' import { DelegationNode } from '../delegation/DelegationNode.js' import * as Credential from '../credential/index.js' @@ -50,7 +50,7 @@ export function verifyDataStructure(input: IAttestation): void { if (!input.owner) { throw new SDKErrors.OwnerMissingError() } - DidUtils.validateKiltDidUri(input.owner, 'Did') + Did.validateUri(input.owner, 'Did') if (typeof input.revoked !== 'boolean') { throw new SDKErrors.RevokedTypeError() diff --git a/packages/core/src/claim/Claim.ts b/packages/core/src/claim/Claim.ts index 71a70dd33..a01ceb8a2 100644 --- a/packages/core/src/claim/Claim.ts +++ b/packages/core/src/claim/Claim.ts @@ -21,7 +21,7 @@ import { hexToBn } from '@polkadot/util' import type { HexString } from '@polkadot/util/types' import type { DidUri, IClaim, ICType, PartialClaim } from '@kiltprotocol/types' import { Crypto, DataUtils, SDKErrors } from '@kiltprotocol/utils' -import { Utils as DidUtils } from '@kiltprotocol/did' +import * as Did from '@kiltprotocol/did' import * as CType from '../ctype/index.js' const VC_VOCAB = 'https://www.w3.org/2018/credentials#' @@ -199,7 +199,7 @@ export function verifyDataStructure(input: IClaim | PartialClaim): void { throw new SDKErrors.CTypeHashMissingError() } if (input.owner) { - DidUtils.validateKiltDidUri(input.owner, 'Did') + Did.validateUri(input.owner, 'Did') } if (input.contents !== undefined) { Object.entries(input.contents).forEach(([key, value]) => { diff --git a/packages/core/src/credential/Credential.spec.ts b/packages/core/src/credential/Credential.spec.ts index 7b834d25d..866dafa31 100644 --- a/packages/core/src/credential/Credential.spec.ts +++ b/packages/core/src/credential/Credential.spec.ts @@ -321,7 +321,7 @@ describe('Credential', () => { didUri: DidUri ): Promise { // For the mock resolver, we need to match the base URI, so we delete the fragment, if present. - const { did } = Did.Utils.parseDidUri(didUri) + const { did } = Did.parse(didUri) switch (did) { case identityAlice?.uri: return { document: identityAlice, metadata: { deactivated: false } } @@ -480,7 +480,7 @@ describe('Credential', () => { authentication: migratedAndDeleted.authentication, }) migratedAndDeletedFullDid = { - uri: Did.Utils.getFullDidUri(migratedAndDeletedLightDid.uri), + uri: Did.getFullDidUri(migratedAndDeletedLightDid.uri), authentication: [migratedAndDeletedLightDid.authentication[0]], } @@ -570,7 +570,7 @@ describe('create presentation', () => { lightDidForId: DidDocument, newAuthenticationKey?: DidVerificationKey ): DidDocument { - const uri = Did.Utils.getFullDidUri(lightDidForId.uri) + const uri = Did.getFullDidUri(lightDidForId.uri) const authKey = newAuthenticationKey || lightDidForId.authentication[0] return { @@ -583,7 +583,7 @@ describe('create presentation', () => { didUri: DidUri ): Promise { // For the mock resolver, we need to match the base URI, so we delete the fragment, if present. - const { did } = Did.Utils.parseDidUri(didUri) + const { did } = Did.parse(didUri) switch (did) { case migratedClaimerLightDid?.uri: return { diff --git a/packages/core/src/ctype/CType.chain.ts b/packages/core/src/ctype/CType.chain.ts index a187d2cf7..f0b945705 100644 --- a/packages/core/src/ctype/CType.chain.ts +++ b/packages/core/src/ctype/CType.chain.ts @@ -10,7 +10,7 @@ import type { AccountId } from '@polkadot/types/interfaces' import { Crypto } from '@kiltprotocol/utils' import type { DidUri, ICType } from '@kiltprotocol/types' -import { Chain as DidChain } from '@kiltprotocol/did' +import * as Did from '@kiltprotocol/did' import { getSchemaPropertiesForHash } from './CType.js' @@ -31,5 +31,5 @@ export function toChain(ctype: ICType): string { * @returns The owner DID. */ export function fromChain(encoded: Option): DidUri { - return DidChain.uriFromChain(encoded.unwrap()) + return Did.fromChain(encoded.unwrap()) } diff --git a/packages/core/src/ctype/CType.ts b/packages/core/src/ctype/CType.ts index 51f47a9a7..fcc54d132 100644 --- a/packages/core/src/ctype/CType.ts +++ b/packages/core/src/ctype/CType.ts @@ -22,7 +22,7 @@ import type { ICTypeMetadata, } from '@kiltprotocol/types' import { Crypto, SDKErrors, JsonSchema } from '@kiltprotocol/utils' -import { Utils as DidUtils } from '@kiltprotocol/did' +import * as Did from '@kiltprotocol/did' import { ConfigService } from '@kiltprotocol/config' import type { HexString } from '@polkadot/util/types' import { @@ -166,7 +166,7 @@ export function verifyDataStructure(input: ICType): void { ) } if (input.owner !== null) { - DidUtils.validateKiltDidUri(input.owner, 'Did') + Did.validateUri(input.owner, 'Did') } } diff --git a/packages/core/src/delegation/DelegationDecoder.ts b/packages/core/src/delegation/DelegationDecoder.ts index 2adb8caf7..2a1830e65 100644 --- a/packages/core/src/delegation/DelegationDecoder.ts +++ b/packages/core/src/delegation/DelegationDecoder.ts @@ -22,7 +22,7 @@ import type { import { Permission, PermissionType } from '@kiltprotocol/types' import type { Option } from '@polkadot/types' import type { Hash } from '@polkadot/types/interfaces/runtime' -import { Chain as DidChain } from '@kiltprotocol/did' +import * as Did from '@kiltprotocol/did' import type { DelegationDelegationHierarchyDelegationHierarchyDetails, DelegationDelegationHierarchyDelegationNode, @@ -93,7 +93,7 @@ export function delegationNodeFromChain( ? delegationNode.parent.toHex() : undefined, childrenIds: [...delegationNode.children].map((id) => id.toHex()), - account: DidChain.uriFromChain(delegationNode.details.owner), + account: Did.fromChain(delegationNode.details.owner), permissions: permissionsFromChain(delegationNode.details.permissions), revoked: delegationNode.details.revoked.valueOf(), } diff --git a/packages/core/src/delegation/DelegationNode.chain.ts b/packages/core/src/delegation/DelegationNode.chain.ts index 650fdaae3..b8624c1b8 100644 --- a/packages/core/src/delegation/DelegationNode.chain.ts +++ b/packages/core/src/delegation/DelegationNode.chain.ts @@ -12,7 +12,7 @@ import type { } from '@kiltprotocol/types' import { ConfigService } from '@kiltprotocol/config' import { SDKErrors } from '@kiltprotocol/utils' -import { Utils as DidUtils, Chain as DidChain } from '@kiltprotocol/did' +import * as Did from '@kiltprotocol/did' import { delegationNodeFromChain } from './DelegationDecoder.js' import { DelegationNode } from './DelegationNode.js' import { permissionsAsBitset } from './DelegationNode.utils.js' @@ -28,18 +28,18 @@ const log = ConfigService.LoggingFactory.getLogger('DelegationNode') */ export function addDelegationToChainArgs( delegation: DelegationNode, - signature: DidUtils.EncodedSignature + signature: Did.EncodedSignature ): [ DelegationNode['id'], string, KiltAddress, Uint8Array, - DidUtils.EncodedSignature + Did.EncodedSignature ] { return [ delegation.id, delegation.parentId || '', - DidChain.didToChain(delegation.account), + Did.toChain(delegation.account), permissionsAsBitset(delegation), signature, ] diff --git a/packages/core/src/delegation/DelegationNode.ts b/packages/core/src/delegation/DelegationNode.ts index 8a1e779ae..e2ad7a060 100644 --- a/packages/core/src/delegation/DelegationNode.ts +++ b/packages/core/src/delegation/DelegationNode.ts @@ -266,13 +266,13 @@ export class DelegationNode implements IDelegationNode { public async delegateSign( delegateDid: DidDocument, sign: SignCallback - ): Promise { + ): Promise { const delegateSignature = await Did.signPayload( delegateDid.uri, this.generateHash(), sign ) - const { fragment } = Did.Utils.parseDidUri(delegateSignature.keyUri) + const { fragment } = Did.parse(delegateSignature.keyUri) if (!fragment) { throw new SDKErrors.DidError( `DID key uri "${delegateSignature.keyUri}" couldn't be parsed` @@ -284,10 +284,7 @@ export class DelegationNode implements IDelegationNode { `Key with fragment "${fragment}" was not found on DID: "${delegateDid.uri}"` ) } - return Did.Chain.didSignatureToChain( - key as DidVerificationKey, - delegateSignature - ) + return Did.didSignatureToChain(key as DidVerificationKey, delegateSignature) } /** @@ -310,7 +307,7 @@ export class DelegationNode implements IDelegationNode { * @returns Promise containing an unsigned SubmittableExtrinsic. */ public async getStoreTx( - signature?: Did.Utils.EncodedSignature + signature?: Did.EncodedSignature ): Promise { const api = ConfigService.get('api') diff --git a/packages/core/src/quote/Quote.spec.ts b/packages/core/src/quote/Quote.spec.ts index 6f7e56b7e..b11a2bc75 100644 --- a/packages/core/src/quote/Quote.spec.ts +++ b/packages/core/src/quote/Quote.spec.ts @@ -161,7 +161,7 @@ describe('Quote', () => { ) ).toEqual(quoteBothAgreed.claimerSignature) - const { fragment: attesterKeyId } = Did.Utils.parseDidUri( + const { fragment: attesterKeyId } = Did.parse( validAttesterSignedQuote.attesterSignature.keyUri ) diff --git a/packages/did/src/Did.chain.ts b/packages/did/src/Did.chain.ts index ac00bb2c8..4d9eca459 100644 --- a/packages/did/src/Did.chain.ts +++ b/packages/did/src/Did.chain.ts @@ -8,6 +8,8 @@ import type { Option } from '@polkadot/types' import type { AccountId32, Extrinsic, Hash } from '@polkadot/types/interfaces' import type { AnyNumber } from '@polkadot/types/types' +import type { PalletWeb3NamesWeb3NameWeb3NameOwnership } from '@polkadot/types/lookup' +import type { Bytes } from '@polkadot/types-codec' import { BN, hexToU8a } from '@polkadot/util' import type { @@ -42,15 +44,13 @@ import type { } from '@kiltprotocol/augment-api' import { - checkServiceEndpointSyntax, EncodedEncryptionKey, EncodedKey, EncodedSignature, EncodedVerificationKey, getAddressByKey, getFullDidUri, - parseDidUri, - stripFragment, + parse, } from './Did.utils.js' // ### Chain type definitions @@ -60,12 +60,12 @@ export type ChainDidPublicKeyDetails = DidDidDetailsDidPublicKeyDetails // ### RAW QUERYING (lowest layer) -export function didToChain(did: DidUri): KiltAddress { - return parseDidUri(did).address +export function toChain(did: DidUri): KiltAddress { + return parse(did).address } export function resourceIdToChain(id: UriFragment): string { - return stripFragment(id) + return id.replace(/^#/, '') } export function depositFromChain(deposit: KiltSupportDeposit): Deposit { @@ -77,7 +77,7 @@ export function depositFromChain(deposit: KiltSupportDeposit): Deposit { // ### DECODED QUERYING types -export type EncodedDid = Pick< +type ChainDocument = Pick< DidDocument, 'authentication' | 'assertionMethod' | 'capabilityDelegation' | 'keyAgreement' > & { @@ -101,11 +101,13 @@ function didPublicKeyDetailsFromChain( } } -export function uriFromChain(encoded: AccountId32): DidUri { +export function fromChain(encoded: AccountId32): DidUri { return getFullDidUri(Crypto.encodeAddress(encoded, ss58Format)) } -export function didFromChain(encoded: Option): EncodedDid { +export function documentFromChain( + encoded: Option +): ChainDocument { const { publicKeys, authenticationKey, @@ -127,7 +129,7 @@ export function didFromChain(encoded: Option): EncodedDid { const authentication = keys[authenticationKey.toHex()] as DidVerificationKey - const didRecord: EncodedDid = { + const didRecord: ChainDocument = { authentication: [authentication], lastTxCounter: lastTxCounter.toBn(), deposit: depositFromChain(deposit), @@ -153,16 +155,73 @@ export function didFromChain(encoded: Option): EncodedDid { return didRecord } -interface BlockchainEndpoint { +interface ChainEndpoint { id: string serviceTypes: DidServiceEndpoint['type'] urls: DidServiceEndpoint['serviceEndpoint'] } -export function serviceToChain( - endpoint: DidServiceEndpoint -): BlockchainEndpoint { - checkServiceEndpointSyntax(endpoint) +/** + * Checks if a string is a valid URI according to RFC#3986. + * + * @param str String to be checked. + * @returns Whether `str` is a valid URI. + */ +function isUri(str: string): boolean { + try { + const url = new URL(str) // this actually accepts any URI but throws if it can't be parsed + return url.href === str || encodeURI(decodeURI(str)) === str // make sure our URI has not been converted implicitly by URL + } catch { + return false + } +} + +const UriFragmentRegex = /^[a-zA-Z0-9._~%+,;=*()'&$!@:/?-]+$/ + +/** + * Checks if a string is a valid URI fragment according to RFC#3986. + * + * @param str String to be checked. + * @returns Whether `str` is a valid URI fragment. + */ +function isUriFragment(str: string): boolean { + try { + return UriFragmentRegex.test(str) && !!decodeURIComponent(str) + } catch { + return false + } +} + +/** + * Performs sanity checks on service endpoint data, making sure that the following conditions are met: + * - The `id` property is a string containing a valid URI fragment according to RFC#3986, not a complete DID URI. + * - If the `uris` property contains one or more strings, they must be valid URIs according to RFC#3986. + * + * @param endpoint A service endpoint object to check. + */ +export function validateService(endpoint: DidServiceEndpoint): void { + const { id, serviceEndpoint } = endpoint + if (id.startsWith('did:kilt')) { + throw new SDKErrors.DidError( + `This function requires only the URI fragment part (following '#') of the service ID, not the full DID URI, which is violated by id "${id}"` + ) + } + if (!isUriFragment(resourceIdToChain(id))) { + throw new SDKErrors.DidError( + `The service ID must be valid as a URI fragment according to RFC#3986, which "${id}" is not. Make sure not to use disallowed characters (e.g. whitespace) or consider URL-encoding the desired id.` + ) + } + serviceEndpoint.forEach((uri) => { + if (!isUri(uri)) { + throw new SDKErrors.DidError( + `A service URI must be a URI according to RFC#3986, which "${uri}" (service id "${id}") is not. Make sure not to use disallowed characters (e.g. whitespace) or consider URL-encoding resource locators beforehand.` + ) + } + }) +} + +export function serviceToChain(endpoint: DidServiceEndpoint): ChainEndpoint { + validateService(endpoint) const { id, type, serviceEndpoint } = endpoint return { id: resourceIdToChain(id), @@ -377,7 +436,7 @@ export async function generateDidAuthenticatedTx({ api.tx.did.submitDidCall.meta.args[0].type.toString(), { txCounter, - did: didToChain(did), + did: toChain(did), call, submitter, blockNumber: blockNumber ?? (await api.query.system.number()), @@ -414,3 +473,39 @@ export function didSignatureToChain( return { [key.type]: hexToU8a(signature.signature) } as EncodedSignature } + +/** + * Web3Name is the type of nickname for a DID. + */ +export type Web3Name = string + +/** + * Decodes the web3name of a DID. + * + * @param encoded The value returned by `api.query.web3Names.names()`. + * @returns The registered web3name for this DID if any. + */ +export function web3NameFromChain(encoded: Option): Web3Name { + return encoded.unwrap().toUtf8() +} + +/** + * Decodes the DID of the owner of web3name. + * + * @param encoded The value returned by `api.query.web3Names.owner()`. + * @returns The full DID uri, i.e. 'did:kilt:4abc...', if any. + */ +export function web3NameOwnerFromChain( + encoded: Option +): { + owner: DidUri + deposit: Deposit + claimedAt: BN +} { + const { owner, deposit, claimedAt } = encoded.unwrap() + return { + owner: fromChain(owner), + deposit: depositFromChain(deposit), + claimedAt: claimedAt.toBn(), + } +} diff --git a/packages/did/src/Did.signature.spec.ts b/packages/did/src/Did.signature.spec.ts index b6cab6143..d7d0a300d 100644 --- a/packages/did/src/Did.signature.spec.ts +++ b/packages/did/src/Did.signature.spec.ts @@ -157,7 +157,7 @@ describe('light DID', () => { jest.mocked(resolve).mockResolvedValue({ document: did, metadata: { - canonicalId: Did.Utils.getFullDidUri(did.uri), + canonicalId: Did.getFullDidUri(did.uri), deactivated: false, }, }) diff --git a/packages/did/src/Did.signature.ts b/packages/did/src/Did.signature.ts index 8d654329f..95648587c 100644 --- a/packages/did/src/Did.signature.ts +++ b/packages/did/src/Did.signature.ts @@ -18,7 +18,7 @@ import { import { Crypto, SDKErrors } from '@kiltprotocol/utils' import { resolve } from './DidResolver/index.js' -import { parseDidUri, validateKiltDidUri } from './Did.utils.js' +import { parse, validateUri } from './Did.utils.js' import * as Did from './index.js' export type DidSignatureVerificationInput = { @@ -40,7 +40,7 @@ type OldDidSignature = Pick & { * * @param input Arbitrary input. */ -export function verifyDidSignatureDataStructure( +function verifyDidSignatureDataStructure( input: DidSignature | OldDidSignature ): void { const keyUri = 'keyUri' in input ? input.keyUri : input.keyId @@ -49,7 +49,7 @@ export function verifyDidSignatureDataStructure( `Expected signature as a hex string, got ${input.signature}` ) } - validateKiltDidUri(keyUri, 'ResourceUri') + validateUri(keyUri, 'ResourceUri') } /** @@ -72,7 +72,7 @@ export async function verifyDidSignature({ // Add support for old signatures that had the `keyId` instead of the `keyUri` const inputUri = signature.keyUri || (signature as any).keyId // Verification fails if the signature key URI is not valid - const { fragment } = parseDidUri(inputUri) + const { fragment } = parse(inputUri) if (!fragment) throw new SDKErrors.SignatureMalformedError( `Signature key URI "${signature.keyUri}" invalid` diff --git a/packages/did/src/Did.utils.ts b/packages/did/src/Did.utils.ts index 8940fc57f..873b21ee6 100644 --- a/packages/did/src/Did.utils.ts +++ b/packages/did/src/Did.utils.ts @@ -9,25 +9,18 @@ import { blake2AsU8a, encodeAddress } from '@polkadot/util-crypto' import { DidResourceUri, - DidServiceEndpoint, DidUri, DidVerificationKey, - EncryptionAlgorithms, - EncryptionKeyType, - SigningAlgorithms, - UriFragment, - VerificationKeyType, KiltAddress, + UriFragment, } from '@kiltprotocol/types' -import { SDKErrors, ss58Format, DataUtils } from '@kiltprotocol/utils' - -/// The latest version for KILT light DIDs. -export const LIGHT_DID_LATEST_VERSION = 1 +import { DataUtils, SDKErrors, ss58Format } from '@kiltprotocol/utils' -/// The latest version for KILT full DIDs. -export const FULL_DID_LATEST_VERSION = 1 +// The latest version for KILT light DIDs. +const LIGHT_DID_LATEST_VERSION = 1 -export const KILT_DID_PREFIX = 'did:kilt:' +// The latest version for KILT full DIDs. +const FULL_DID_LATEST_VERSION = 1 // NOTICE: The following regex patterns must be kept in sync with DidUri type in @kiltprotocol/types @@ -45,7 +38,7 @@ const FULL_KILT_DID_REGEX = const LIGHT_KILT_DID_REGEX = /^did:kilt:light:(?[0-9]{2})(?
4[1-9a-km-zA-HJ-NP-Z]{47,48})(:(?.+?))?(?#[^#\n]+)?$/ -export type IDidParsingResult = { +type IDidParsingResult = { did: DidUri version: number type: 'light' | 'full' @@ -61,9 +54,7 @@ export type IDidParsingResult = { * @param didUri A KILT DID uri as a string. * @returns Object containing information extracted from the DID uri. */ -export function parseDidUri( - didUri: DidUri | DidResourceUri -): IDidParsingResult { +export function parse(didUri: DidUri | DidResourceUri): IDidParsingResult { let matches = FULL_KILT_DID_REGEX.exec(didUri)?.groups if (matches) { const { version: versionString, fragment } = matches @@ -115,39 +106,9 @@ export function parseDidUri( * @returns Whether didA and didB refer to the same DID subject. */ export function isSameSubject(didA: DidUri, didB: DidUri): boolean { - return parseDidUri(didA).address === parseDidUri(didB).address + return parse(didA).address === parse(didB).address } -export const signatureAlgForKeyType: Record< - VerificationKeyType, - SigningAlgorithms -> = Object.freeze({ - ed25519: 'ed25519', - sr25519: 'sr25519', - ecdsa: 'ecdsa-secp256k1', -}) - -export const keyTypeForSignatureAlg = Object.freeze( - Object.entries(signatureAlgForKeyType).reduce( - (obj, [key, value]) => ({ ...obj, [value]: key }), - {} - ) -) as Record - -export const encryptionAlgForKeyType: Record< - EncryptionKeyType, - EncryptionAlgorithms -> = Object.freeze({ - x25519: 'x25519-xsalsa20-poly1305', -}) - -export const keyTypeForEncryptionAlg: Record< - EncryptionAlgorithms, - EncryptionKeyType -> = Object.freeze({ - 'x25519-xsalsa20-poly1305': 'x25519', -}) - export type EncodedVerificationKey = | { sr25519: Uint8Array } | { ed25519: Uint8Array } @@ -166,14 +127,14 @@ export type EncodedSignature = EncodedVerificationKey * @param input Arbitrary input. * @param expectType `ResourceUri` if the URI is expected to have a fragment (following '#'), `Did` if it is expected not to have one. Default allows both. */ -export function validateKiltDidUri( +export function validateUri( input: unknown, expectType?: 'Did' | 'ResourceUri' ): void { if (typeof input !== 'string') { throw new TypeError(`DID string expected, got ${typeof input}`) } - const { address, fragment } = parseDidUri(input as DidUri) + const { address, fragment } = parse(input as DidUri) switch (expectType) { // for backwards compatibility with previous implementations, `false` maps to `Did` while `true` maps to `undefined`. // @ts-ignore @@ -197,101 +158,6 @@ export function validateKiltDidUri( DataUtils.verifyKiltAddress(address) } -export function isKiltDidUri( - input: unknown, - expectType: 'ResourceUri' -): input is DidResourceUri -export function isKiltDidUri(input: unknown, expectType: 'Did'): input is DidUri -export function isKiltDidUri(input: unknown): input is DidUri | DidResourceUri - -/** - * Type guard assuring that a string (or other input) is a valid KILT DID uri with or without a URI fragment. - * - * @param input Arbitrary input. - * @param expectType `ResourceUri` if the URI is expected to have a fragment (following '#'), `Did` if it is expected not to have one. Default allows both. - * @returns True if validation has passed, false otherwise. - */ -export function isKiltDidUri( - input: unknown, - expectType?: 'Did' | 'ResourceUri' -): input is DidUri | DidResourceUri { - try { - validateKiltDidUri(input, expectType) - return true - } catch { - return false - } -} - -/** - * Checks if a string is a valid URI according to RFC#3986. - * - * @param str String to be checked. - * @returns Whether `str` is a valid URI. - */ -export function isUri(str: string): boolean { - try { - const url = new URL(str) // this actually accepts any URI but throws if it can't be parsed - return url.href === str || encodeURI(decodeURI(str)) === str // make sure our URI has not been converted implicitly by URL - } catch { - return false - } -} - -const UriFragmentRegex = /^[a-zA-Z0-9._~%+,;=*()'&$!@:/?-]+$/ - -/** - * Checks if a string is a valid URI fragment according to RFC#3986. - * - * @param str String to be checked. - * @returns Whether `str` is a valid URI fragment. - */ -export function isUriFragment(str: string): boolean { - try { - return UriFragmentRegex.test(str) && !!decodeURIComponent(str) - } catch { - return false - } -} - -/** - * Remove the `#` prefix from the UriFragment string, typically an ID. - * - * @param id The input ID to strip. - * @returns The string without the prefix. - */ -export function stripFragment(id: UriFragment): string { - return id.replace(/^#/, '') -} - -/** - * Performs sanity checks on service endpoint data, making sure that the following conditions are met: - * - The `id` property is a string containing a valid URI fragment according to RFC#3986, not a complete DID URI. - * - If the `uris` property contains one or more strings, they must be valid URIs according to RFC#3986. - * - * @param endpoint A service endpoint object to check. - */ -export function checkServiceEndpointSyntax(endpoint: DidServiceEndpoint): void { - const { id, serviceEndpoint } = endpoint - if (id.startsWith('did:kilt')) { - throw new SDKErrors.DidError( - `This function requires only the URI fragment part (following '#') of the service ID, not the full DID URI, which is violated by id "${id}"` - ) - } - if (!isUriFragment(stripFragment(id))) { - throw new SDKErrors.DidError( - `The service ID must be valid as a URI fragment according to RFC#3986, which "${id}" is not. Make sure not to use disallowed characters (e.g. whitespace) or consider URL-encoding the desired id.` - ) - } - serviceEndpoint.forEach((uri) => { - if (!isUri(uri)) { - throw new SDKErrors.DidError( - `A service URI must be a URI according to RFC#3986, which "${uri}" (service id "${id}") is not. Make sure not to use disallowed characters (e.g. whitespace) or consider URL-encoding resource locators beforehand.` - ) - } - }) -} - export function getAddressByKey({ publicKey, type, @@ -323,9 +189,9 @@ export function getFullDidUri( ): DidUri { const address = DataUtils.isKiltAddress(didOrAddress) ? didOrAddress - : parseDidUri(didOrAddress as DidUri).address + : parse(didOrAddress as DidUri).address const versionString = version === 1 ? '' : `v${version}` - return `${KILT_DID_PREFIX}${versionString}${address}` as DidUri + return `did:kilt:${versionString}${address}` as DidUri } /** diff --git a/packages/did/src/DidDetails/DidDetails.spec.ts b/packages/did/src/DidDetails/DidDetails.spec.ts index 0000f984d..a8fb3d18c 100644 --- a/packages/did/src/DidDetails/DidDetails.spec.ts +++ b/packages/did/src/DidDetails/DidDetails.spec.ts @@ -7,7 +7,7 @@ import { DidDocument, DidKey, DidServiceEndpoint } from '@kiltprotocol/types' -import { getEndpoint, getKey, getKeys } from './DidDetails' +import { getService, getKey, getKeys } from './DidDetails' /** * @group unit/did @@ -111,16 +111,16 @@ describe('DidDetais', () => { expect(getKey(minimalDid, '#capabilityDelegation')).toEqual(undefined) }) }) - describe('getEndpoint', () => { + describe('getService', () => { it('should get endpoint by ID', async () => { - expect(getEndpoint(maximalDid, '#service')).toEqual({ + expect(getService(maximalDid, '#service')).toEqual({ id: '#service', serviceEndpoint: ['https://example.com/'], type: ['foo'], }) }) it('should return undefined when key not found', async () => { - expect(getEndpoint(minimalDid, '#service')).toEqual(undefined) + expect(getService(minimalDid, '#service')).toEqual(undefined) }) }) }) diff --git a/packages/did/src/DidDetails/DidDetails.ts b/packages/did/src/DidDetails/DidDetails.ts index 5168dbf4b..d0237b23e 100644 --- a/packages/did/src/DidDetails/DidDetails.ts +++ b/packages/did/src/DidDetails/DidDetails.ts @@ -56,7 +56,7 @@ export function getKey( * @param id Endpoint id (not the full endpoint uri). * @returns The respective endpoint data or undefined. */ -export function getEndpoint( +export function getService( did: Pick, id: DidServiceEndpoint['id'] ): DidServiceEndpoint | undefined { diff --git a/packages/did/src/DidDetails/FullDidDetails.spec.ts b/packages/did/src/DidDetails/FullDidDetails.spec.ts index 654632d49..d086eaf50 100644 --- a/packages/did/src/DidDetails/FullDidDetails.spec.ts +++ b/packages/did/src/DidDetails/FullDidDetails.spec.ts @@ -23,10 +23,9 @@ import { } from '@kiltprotocol/testing' import { ConfigService } from '@kiltprotocol/config' -import type { EncodedDid } from '../Did.chain' import { + documentFromChain, generateDidAuthenticatedTx, - didFromChain, servicesFromChain, } from '../Did.chain' @@ -46,7 +45,21 @@ const existingAddress = '4rp4rcDHP71YrBNvDhcH5iRoM3YzVoQVnCZvQPwPom9bjo2e' const existingDid: DidUri = `did:kilt:${existingAddress}` const nonExistingDid: DidUri = `did:kilt:4pnAJ41mGHGDKCGBGY2zzu1hfvPasPkGAKDgPeprSkxnUmGM` -const existingDidRecord: EncodedDid = { +const existingServiceEndpoints: DidServiceEndpoint[] = [ + { + id: '#service1', + type: ['type-1'], + serviceEndpoint: ['url-1'], + }, + { + id: '#service2', + type: ['type-2'], + serviceEndpoint: ['url-2'], + }, +] + +jest.mock('../Did.chain') +jest.mocked(documentFromChain).mockReturnValue({ authentication: [ { id: '#auth1', @@ -90,23 +103,7 @@ const existingDidRecord: EncodedDid = { amount: new BN(2), owner: existingAddress, }, -} - -const existingServiceEndpoints: DidServiceEndpoint[] = [ - { - id: '#service1', - type: ['type-1'], - serviceEndpoint: ['url-1'], - }, - { - id: '#service2', - type: ['type-2'], - serviceEndpoint: ['url-2'], - }, -] - -jest.mock('../Did.chain') -jest.mocked(didFromChain).mockReturnValue(existingDidRecord) +}) jest.mocked(servicesFromChain).mockReturnValue(existingServiceEndpoints) jest .mocked(generateDidAuthenticatedTx) @@ -323,3 +320,78 @@ describe('When creating an instance from the chain', () => { }) }) }) + +const mockApi = ApiMocks.createAugmentedApi() + +describe('When creating an instance from the chain', () => { + it('Should return correct KeyRelationship for single valid call', () => { + const keyRelationship = Did.getKeyRelationshipForExtrinsic( + mockApi.tx.attestation.add(new Uint8Array(32), new Uint8Array(32), null) + ) + expect(keyRelationship).toBe('assertionMethod') + }) + it('Should return correct KeyRelationship for batched call', () => { + const keyRelationship = Did.getKeyRelationshipForExtrinsic( + mockApi.tx.utility.batch([ + mockApi.tx.attestation.add( + new Uint8Array(32), + new Uint8Array(32), + null + ), + mockApi.tx.attestation.add( + new Uint8Array(32), + new Uint8Array(32), + null + ), + ]) + ) + expect(keyRelationship).toBe('assertionMethod') + }) + it('Should return correct KeyRelationship for batchAll call', () => { + const keyRelationship = Did.getKeyRelationshipForExtrinsic( + mockApi.tx.utility.batchAll([ + mockApi.tx.attestation.add( + new Uint8Array(32), + new Uint8Array(32), + null + ), + mockApi.tx.attestation.add( + new Uint8Array(32), + new Uint8Array(32), + null + ), + ]) + ) + expect(keyRelationship).toBe('assertionMethod') + }) + it('Should return correct KeyRelationship for forceBatch call', () => { + const keyRelationship = Did.getKeyRelationshipForExtrinsic( + mockApi.tx.utility.forceBatch([ + mockApi.tx.attestation.add( + new Uint8Array(32), + new Uint8Array(32), + null + ), + mockApi.tx.attestation.add( + new Uint8Array(32), + new Uint8Array(32), + null + ), + ]) + ) + expect(keyRelationship).toBe('assertionMethod') + }) + it('Should return undefined for batch with mixed KeyRelationship calls', () => { + const keyRelationship = Did.getKeyRelationshipForExtrinsic( + mockApi.tx.utility.forceBatch([ + mockApi.tx.attestation.add( + new Uint8Array(32), + new Uint8Array(32), + null + ), + mockApi.tx.web3Names.claim('awesomename'), + ]) + ) + expect(keyRelationship).toBeUndefined() + }) +}) diff --git a/packages/did/src/DidDetails/FullDidDetails.ts b/packages/did/src/DidDetails/FullDidDetails.ts index 0d90b0ca1..571d45af4 100644 --- a/packages/did/src/DidDetails/FullDidDetails.ts +++ b/packages/did/src/DidDetails/FullDidDetails.ts @@ -23,17 +23,12 @@ import { SDKErrors } from '@kiltprotocol/utils' import { ConfigService } from '@kiltprotocol/config' import { - didFromChain, - didToChain, + documentFromChain, generateDidAuthenticatedTx, servicesFromChain, + toChain, } from '../Did.chain.js' -import { parseDidUri } from '../Did.utils.js' - -import { - getKeyRelationshipForExtrinsic, - increaseNonce, -} from './FullDidDetails.utils.js' +import { parse } from '../Did.utils.js' /** * Fetches [[DidDocument]] from the blockchain. [[resolve]] provides more detailed output. @@ -44,7 +39,7 @@ import { * @returns The fetched [[DidDocument]], or null if DID does not exist. */ export async function query(didUri: DidUri): Promise { - const { fragment, type } = parseDidUri(didUri) + const { fragment, type } = parse(didUri) if (fragment) { throw new SDKErrors.DidError(`DID URI cannot contain fragment: "${didUri}"`) } @@ -55,9 +50,9 @@ export async function query(didUri: DidUri): Promise { } const api = ConfigService.get('api') - const encoded = await api.query.did.did(didToChain(didUri)) + const encoded = await api.query.did.did(toChain(didUri)) if (encoded.isNone) return null - const didRec = didFromChain(encoded) + const didRec = documentFromChain(encoded) const did: DidDocument = { uri: didUri, @@ -68,7 +63,7 @@ export async function query(didUri: DidUri): Promise { } const service = servicesFromChain( - await api.query.did.serviceEndpoints.entries(didToChain(didUri)) + await api.query.did.serviceEndpoints.entries(toChain(didUri)) ) if (service.length > 0) { did.service = service @@ -77,6 +72,63 @@ export async function query(didUri: DidUri): Promise { return did } +// Must be in sync with what's implemented in impl did::DeriveDidCallAuthorizationVerificationKeyRelationship for Call +// in https://github.com/KILTprotocol/mashnet-node/blob/develop/runtimes/spiritnet/src/lib.rs +// TODO: Should have an RPC or something similar to avoid inconsistencies in the future. +const methodMapping: Record = { + attestation: 'assertionMethod', + ctype: 'assertionMethod', + delegation: 'capabilityDelegation', + did: 'authentication', + 'did.create': undefined, + 'did.reclaimDeposit': undefined, + 'did.submitDidCall': undefined, + didLookup: 'authentication', + web3Names: 'authentication', +} + +function getKeyRelationshipForMethod( + call: Extrinsic['method'] +): VerificationKeyRelationship | undefined { + const { section, method } = call + + // get the VerificationKeyRelationship of a batched call + if ( + section === 'utility' && + ['batch', 'batchAll', 'forceBatch'].includes(method) && + call.args[0].toRawType() === 'Vec' + ) { + // map all calls to their VerificationKeyRelationship and deduplicate the items + return (call.args[0] as unknown as Array) + .map(getKeyRelationshipForMethod) + .reduce((prev, value) => (prev === value ? prev : undefined)) + } + + const signature = `${section}.${method}` + if (signature in methodMapping) { + return methodMapping[signature] + } + + return methodMapping[section] +} + +export function getKeyRelationshipForExtrinsic( + extrinsic: Extrinsic +): VerificationKeyRelationship | undefined { + return getKeyRelationshipForMethod(extrinsic.method) +} + +// Max nonce value is (2^64) - 1 +const maxNonceValue = new BN(2).pow(new BN(64)).subn(1) + +function increaseNonce(currentNonce: BN, increment = 1): BN { + // Wrap around the max u64 value when reached. + // FIXME: can we do better than this? Maybe we could expose an RPC function for this, to keep it consistent over time. + return currentNonce.eq(maxNonceValue) + ? new BN(increment) + : currentNonce.addn(increment) +} + /** * Returns all the DID keys that could be used to sign the provided extrinsic for submission. * This function should never be used directly by SDK users, who should rather call [[Did.authorizeExtrinsic]]. @@ -101,11 +153,11 @@ export function getKeysForExtrinsic( * @param did The DID data. * @returns The next valid nonce, i.e., the nonce currently stored on the blockchain + 1, wrapping around the max value when reached. */ -export async function getNextNonce(did: DidUri): Promise { +async function getNextNonce(did: DidUri): Promise { const api = ConfigService.get('api') - const queried = await api.query.did.did(didToChain(did)) + const queried = await api.query.did.did(toChain(did)) const currentNonce = queried.isSome - ? didFromChain(queried).lastTxCounter + ? documentFromChain(queried).lastTxCounter : new BN(0) return increaseNonce(currentNonce) } @@ -132,7 +184,7 @@ export async function authorizeExtrinsic( txCounter?: BN } = {} ): Promise { - if (parseDidUri(did).type === 'light') { + if (parse(did).type === 'light') { throw new SDKErrors.DidError( `An extrinsic can only be authorized with a full DID, not with "${did}"` ) @@ -227,7 +279,7 @@ export async function authorizeBatch({ ) } - if (parseDidUri(did).type === 'light') { + if (parse(did).type === 'light') { throw new SDKErrors.DidError( `An extrinsic can only be authorized with a full DID, not with "${did}"` ) diff --git a/packages/did/src/DidDetails/FullDidDetails.utils.spec.ts b/packages/did/src/DidDetails/FullDidDetails.utils.spec.ts deleted file mode 100644 index 07317ef68..000000000 --- a/packages/did/src/DidDetails/FullDidDetails.utils.spec.ts +++ /dev/null @@ -1,88 +0,0 @@ -/** - * Copyright (c) 2018-2022, BOTLabs GmbH. - * - * This source code is licensed under the BSD 4-Clause "Original" license - * found in the LICENSE file in the root directory of this source tree. - */ - -import { ApiMocks } from '@kiltprotocol/testing' -import { getKeyRelationshipForExtrinsic } from './FullDidDetails.utils.js' - -/** - * @group unit/did - */ - -const mockApi = ApiMocks.createAugmentedApi() - -describe('When creating an instance from the chain', () => { - it('Should return correct KeyRelationship for single valid call', () => { - const keyRelationship = getKeyRelationshipForExtrinsic( - mockApi.tx.attestation.add(new Uint8Array(32), new Uint8Array(32), null) - ) - expect(keyRelationship).toBe('assertionMethod') - }) - it('Should return correct KeyRelationship for batched call', () => { - const keyRelationship = getKeyRelationshipForExtrinsic( - mockApi.tx.utility.batch([ - mockApi.tx.attestation.add( - new Uint8Array(32), - new Uint8Array(32), - null - ), - mockApi.tx.attestation.add( - new Uint8Array(32), - new Uint8Array(32), - null - ), - ]) - ) - expect(keyRelationship).toBe('assertionMethod') - }) - it('Should return correct KeyRelationship for batchAll call', () => { - const keyRelationship = getKeyRelationshipForExtrinsic( - mockApi.tx.utility.batchAll([ - mockApi.tx.attestation.add( - new Uint8Array(32), - new Uint8Array(32), - null - ), - mockApi.tx.attestation.add( - new Uint8Array(32), - new Uint8Array(32), - null - ), - ]) - ) - expect(keyRelationship).toBe('assertionMethod') - }) - it('Should return correct KeyRelationship for forceBatch call', () => { - const keyRelationship = getKeyRelationshipForExtrinsic( - mockApi.tx.utility.forceBatch([ - mockApi.tx.attestation.add( - new Uint8Array(32), - new Uint8Array(32), - null - ), - mockApi.tx.attestation.add( - new Uint8Array(32), - new Uint8Array(32), - null - ), - ]) - ) - expect(keyRelationship).toBe('assertionMethod') - }) - it('Should return undefined for batch with mixed KeyRelationship calls', () => { - const keyRelationship = getKeyRelationshipForExtrinsic( - mockApi.tx.utility.forceBatch([ - mockApi.tx.attestation.add( - new Uint8Array(32), - new Uint8Array(32), - null - ), - mockApi.tx.web3Names.claim('awesomename'), - ]) - ) - expect(keyRelationship).toBeUndefined() - }) -}) diff --git a/packages/did/src/DidDetails/FullDidDetails.utils.ts b/packages/did/src/DidDetails/FullDidDetails.utils.ts deleted file mode 100644 index 3c67e601b..000000000 --- a/packages/did/src/DidDetails/FullDidDetails.utils.ts +++ /dev/null @@ -1,71 +0,0 @@ -/** - * Copyright (c) 2018-2022, BOTLabs GmbH. - * - * This source code is licensed under the BSD 4-Clause "Original" license - * found in the LICENSE file in the root directory of this source tree. - */ - -// This module is not part of the public-facing api. -/* eslint-disable jsdoc/require-jsdoc */ - -import { BN } from '@polkadot/util' - -import type { VerificationKeyRelationship } from '@kiltprotocol/types' -import { Extrinsic } from '@polkadot/types/interfaces/extrinsics' - -// Must be in sync with what's implemented in impl did::DeriveDidCallAuthorizationVerificationKeyRelationship for Call -// in https://github.com/KILTprotocol/mashnet-node/blob/develop/runtimes/spiritnet/src/lib.rs -// TODO: Should have an RPC or something similar to avoid inconsistencies in the future. -const methodMapping: Record = { - attestation: 'assertionMethod', - ctype: 'assertionMethod', - delegation: 'capabilityDelegation', - did: 'authentication', - 'did.create': undefined, - 'did.reclaimDeposit': undefined, - 'did.submitDidCall': undefined, - didLookup: 'authentication', - web3Names: 'authentication', -} - -function getKeyRelationshipForMethod( - call: Extrinsic['method'] -): VerificationKeyRelationship | undefined { - const { section, method } = call - - // get the VerificationKeyRelationship of a batched call - if ( - section === 'utility' && - ['batch', 'batchAll', 'forceBatch'].includes(method) && - call.args[0].toRawType() === 'Vec' - ) { - // map all calls to their VerificationKeyRelationship and deduplicate the items - return (call.args[0] as unknown as Array) - .map(getKeyRelationshipForMethod) - .reduce((prev, value) => (prev === value ? prev : undefined)) - } - - const signature = `${section}.${method}` - if (signature in methodMapping) { - return methodMapping[signature] - } - - return methodMapping[section] -} - -export function getKeyRelationshipForExtrinsic( - extrinsic: Extrinsic -): VerificationKeyRelationship | undefined { - return getKeyRelationshipForMethod(extrinsic.method) -} - -// Max nonce value is (2^64) - 1 -const maxNonceValue = new BN(2).pow(new BN(64)).subn(1) - -export function increaseNonce(currentNonce: BN, increment = 1): BN { - // Wrap around the max u64 value when reached. - // FIXME: can we do better than this? Maybe we could expose an RPC function for this, to keep it consistent over time. - return currentNonce.eq(maxNonceValue) - ? new BN(increment) - : currentNonce.addn(increment) -} diff --git a/packages/did/src/DidDetails/LightDidDetails.spec.ts b/packages/did/src/DidDetails/LightDidDetails.spec.ts index da819fe5d..98557c25c 100644 --- a/packages/did/src/DidDetails/LightDidDetails.spec.ts +++ b/packages/did/src/DidDetails/LightDidDetails.spec.ts @@ -8,8 +8,6 @@ import { DidDocument, DidServiceEndpoint, DidUri } from '@kiltprotocol/types' import { Crypto } from '@kiltprotocol/utils' -import { CreateDocumentInput } from './LightDidDetails.utils' - import * as Did from '../index.js' /** @@ -42,12 +40,12 @@ describe('When creating an instance from the details', () => { serviceEndpoint: ['x:url-21', 'x:url-22'], }, ] - const validInput: CreateDocumentInput = { + + const lightDid = Did.createLightDidDocument({ authentication: [authKey], keyAgreement: [encKey], service, - } - const lightDid = Did.createLightDidDocument(validInput) + }) expect(lightDid).toEqual({ uri: `did:kilt:light:00${authKey.address}:z17GNCdxLqMYTMC5pnnDrPZGxLEFcXvDamtGNXeNkfSaFf8cktX6erFJiQy8S3ugL981NNys7Rz8DJiaNPZi98v1oeFVL7PjUGNTz1g3jgZo4VgQri2SYHBifZFX9foHZH4DreZXFN66k5dPrvAtBpFXaiG2WZkkxsnxNWxYpqWPPcxvbTE6pJbXxWKjRUd7rog1h9vjA93QA9jMDxm6BSGJHACFgSPUU3UTLk2kjNwT2bjZVvihVFu1zibxwHjowb7N6UQfieJ7ny9HnaQy64qJvGqh4NNtpwkhwm5DTYUoAeAhjt3a6TWyxmBgbFdZF7`, @@ -83,15 +81,13 @@ describe('When creating an instance from the details', () => { it('correctly assign the right ed25519 authentication key and encryption key', () => { const authKey = Crypto.makeKeypairFromSeed() const encKey = Crypto.makeEncryptionKeyFromSeed(new Uint8Array(32).fill(1)) - const validInput: CreateDocumentInput = { + + const lightDid = Did.createLightDidDocument({ authentication: [authKey], keyAgreement: [encKey], - } - const lightDid = Did.createLightDidDocument(validInput) + }) - expect(Did.Utils.parseDidUri(lightDid.uri).address).toStrictEqual( - authKey.address - ) + expect(Did.parse(lightDid.uri).address).toStrictEqual(authKey.address) expect(lightDid).toEqual({ uri: `did:kilt:light:01${authKey.address}:z15dZSRuzEPTFnBErPxqJie4CmmQH1gYKSQYxmwW5Qhgz5Sr7EYJA3J65KoC5YbgF3NGoBsTY2v6zwj1uDnZzgXzLy8R72Fhjmp8ujY81y2AJc8uQ6s2pVbAMZ6bnvaZ3GVe8bMjY5MiKFySS27qRi`, @@ -119,7 +115,9 @@ describe('When creating an instance from the details', () => { authentication: [authKey], } expect(() => - Did.createLightDidDocument(invalidInput as unknown as CreateDocumentInput) + Did.createLightDidDocument( + invalidInput as unknown as Did.CreateDocumentInput + ) ).toThrowError() }) @@ -132,7 +130,9 @@ describe('When creating an instance from the details', () => { keyAgreement: [{ publicKey: encKey.publicKey, type: 'bls' }], } expect(() => - Did.createLightDidDocument(invalidInput as unknown as CreateDocumentInput) + Did.createLightDidDocument( + invalidInput as unknown as Did.CreateDocumentInput + ) ).toThrowError() }) }) @@ -153,15 +153,14 @@ describe('When creating an instance from a URI', () => { serviceEndpoint: ['x:url-21', 'x:url-22'], }, ] - const creationInput: CreateDocumentInput = { + // We are sure this is correct because of the described case above + const expectedLightDid = Did.createLightDidDocument({ authentication: [authKey], keyAgreement: [encKey], service: endpoints, - } - // We are sure this is correct because of the described case above - const expectedLightDid = Did.createLightDidDocument(creationInput) + }) - const { address } = Did.Utils.parseDidUri(expectedLightDid.uri) + const { address } = Did.parse(expectedLightDid.uri) const builtLightDid = Did.parseDocumentFromLightDid(expectedLightDid.uri) expect(builtLightDid).toStrictEqual(expectedLightDid) @@ -211,13 +210,13 @@ describe('When creating an instance from a URI', () => { serviceEndpoint: ['x:url-21', 'x:url-22'], }, ] - const creationInput: CreateDocumentInput = { + + // We are sure this is correct because of the described case above + const expectedLightDid = Did.createLightDidDocument({ authentication: [authKey], keyAgreement: [encKey], service, - } - // We are sure this is correct because of the described case above - const expectedLightDid = Did.createLightDidDocument(creationInput) + }) const uriWithFragment: DidUri = `${expectedLightDid.uri}#authentication` diff --git a/packages/did/src/DidDetails/LightDidDetails.ts b/packages/did/src/DidDetails/LightDidDetails.ts index 5174ead8c..6189a403c 100644 --- a/packages/did/src/DidDetails/LightDidDetails.ts +++ b/packages/did/src/DidDetails/LightDidDetails.ts @@ -5,30 +5,176 @@ * found in the LICENSE file in the root directory of this source tree. */ -import { decodeAddress } from '@polkadot/util-crypto' +import { decode as cborDecode, encode as cborEncode } from 'cbor' +import { + base58Decode, + base58Encode, + decodeAddress, +} from '@polkadot/util-crypto' import type { DidDocument, + DidServiceEndpoint, DidUri, + LightDidSupportedVerificationKeyType, + NewDidEncryptionKey, NewLightDidVerificationKey, } from '@kiltprotocol/types' +import { encryptionKeyTypes } from '@kiltprotocol/types' import { SDKErrors, ss58Format } from '@kiltprotocol/utils' -import { getAddressByKey, KILT_DID_PREFIX, parseDidUri } from '../Did.utils.js' - -import { - validateCreateDocumentInput, - decodeAndDeserializeAdditionalLightDidDetails, - CreateDocumentInput, - serializeAndEncodeAdditionalLightDidDetails, - verificationKeyTypeToLightDidEncoding, - lightDidEncodingToVerificationKeyType, -} from './LightDidDetails.utils.js' +import { getAddressByKey, parse } from '../Did.utils.js' +import { resourceIdToChain, validateService } from '../Did.chain.js' const authenticationKeyId = '#authentication' const encryptionKeyId = '#encryption' +type LightDidEncoding = '00' | '01' + +const verificationKeyTypeToLightDidEncoding: Record< + LightDidSupportedVerificationKeyType, + LightDidEncoding +> = { + sr25519: '00', + ed25519: '01', +} + +const lightDidEncodingToVerificationKeyType: Record< + LightDidEncoding, + LightDidSupportedVerificationKeyType +> = { + '00': 'sr25519', + '01': 'ed25519', +} + +/** + * The options that can be used to create a light DID. + */ +export type CreateDocumentInput = { + /** + * The DID authentication key. This is mandatory and will be used as the first authentication key + * of the full DID upon migration. + */ + authentication: [NewLightDidVerificationKey] + /** + * The optional DID encryption key. If present, it will be used as the first key agreement key + * of the full DID upon migration. + */ + keyAgreement?: [NewDidEncryptionKey] + /** + * The set of service endpoints associated with this DID. Each service endpoint ID must be unique. + * The service ID must not contain the DID prefix when used to create a new DID. + */ + service?: DidServiceEndpoint[] +} + +function validateCreateDocumentInput(input: CreateDocumentInput): void { + // Check authentication key type + const authenticationKeyTypeEncoding = + verificationKeyTypeToLightDidEncoding[input.authentication[0].type] + + if (!authenticationKeyTypeEncoding) { + throw new SDKErrors.UnsupportedKeyError(input.authentication[0].type) + } + + if ( + input.keyAgreement?.[0].type && + !encryptionKeyTypes.includes(input.keyAgreement[0].type) + ) { + throw new SDKErrors.DidError( + `Encryption key type "${input.keyAgreement[0].type}" is not supported` + ) + } + + // Check service endpoints + if (!input.service) { + return + } + + // Checks that for all service IDs have regular strings as their ID and not a full DID. + // Plus, we forbid a service ID to be `authentication` or `encryption` as that would create confusion + // when upgrading to a full DID. + input.service?.forEach((service) => { + // A service ID cannot have a reserved ID that is used for key IDs. + if (service.id === '#authentication' || service.id === '#encryption') { + throw new SDKErrors.DidError( + `Cannot specify a service ID with the name "${service.id}" as it is a reserved keyword` + ) + } + validateService(service) + }) +} + +const KEY_AGREEMENT_MAP_KEY = 'e' +const SERVICES_MAP_KEY = 's' + +interface SerializableStructure { + [KEY_AGREEMENT_MAP_KEY]?: NewDidEncryptionKey + [SERVICES_MAP_KEY]?: Array & { id: string }> +} + +/** + * Serialize the optional encryption key of an off-chain DID using the CBOR serialization algorithm + * and encoding the result in Base58 format with a multibase prefix. + * + * @param details The light DID details to encode. + * @param details.keyAgreement The DID encryption key. + * @param details.service The DID service endpoints. + * @returns The Base58-encoded and CBOR-serialized off-chain DID optional details. + */ +function serializeAndEncodeAdditionalLightDidDetails({ + keyAgreement, + service, +}: Pick): string | undefined { + const objectToSerialize: SerializableStructure = {} + if (keyAgreement) { + const key = keyAgreement[0] + objectToSerialize[KEY_AGREEMENT_MAP_KEY] = key + } + if (service && service.length > 0) { + objectToSerialize[SERVICES_MAP_KEY] = service.map(({ id, ...rest }) => ({ + id: resourceIdToChain(id), + ...rest, + })) + } + + if (Object.keys(objectToSerialize).length === 0) { + return undefined + } + + const serializationVersion = 0x0 + const serialized = cborEncode(objectToSerialize) + return base58Encode([serializationVersion, ...serialized], true) +} + +function decodeAndDeserializeAdditionalLightDidDetails( + rawInput: string, + version = 1 +): Pick { + if (version !== 1) { + throw new SDKErrors.DidError('Serialization version not supported') + } + + const decoded = base58Decode(rawInput, true) + const serializationVersion = decoded[0] + const serialized = decoded.slice(1) + + if (serializationVersion !== 0x0) { + throw new SDKErrors.DidError('Serialization algorithm not supported') + } + const deserialized: SerializableStructure = cborDecode(serialized) + + const keyAgreement = deserialized[KEY_AGREEMENT_MAP_KEY] + return { + keyAgreement: keyAgreement && [keyAgreement], + service: deserialized[SERVICES_MAP_KEY]?.map(({ id, ...rest }) => ({ + id: `#${id}`, + ...rest, + })), + } +} + /** * Create [[DidDocument]] of a light DID using the provided keys and endpoints. * Sets proper key IDs, builds light DID URI. @@ -62,7 +208,7 @@ export function createLightDidDocument({ const encodedDetailsString = encodedDetails ? `:${encodedDetails}` : '' const uri = - `${KILT_DID_PREFIX}light:${authenticationKeyTypeEncoding}${address}${encodedDetailsString}` as DidUri + `did:kilt:light:${authenticationKeyTypeEncoding}${address}${encodedDetailsString}` as DidUri const did: DidDocument = { uri, @@ -113,7 +259,7 @@ export function parseDocumentFromLightDid( fragment, type, authKeyTypeEncoding, - } = parseDidUri(uri) + } = parse(uri) if (type !== 'light') { throw new SDKErrors.DidError( diff --git a/packages/did/src/DidDetails/LightDidDetails.utils.ts b/packages/did/src/DidDetails/LightDidDetails.utils.ts deleted file mode 100644 index 9db3363ba..000000000 --- a/packages/did/src/DidDetails/LightDidDetails.utils.ts +++ /dev/null @@ -1,170 +0,0 @@ -/** - * Copyright (c) 2018-2022, BOTLabs GmbH. - * - * This source code is licensed under the BSD 4-Clause "Original" license - * found in the LICENSE file in the root directory of this source tree. - */ - -// This module is not part of the public-facing api. -/* eslint-disable jsdoc/require-jsdoc */ - -import { decode as cborDecode, encode as cborEncode } from 'cbor' - -import { base58Decode, base58Encode } from '@polkadot/util-crypto' - -import type { - DidServiceEndpoint, - LightDidSupportedVerificationKeyType, - NewDidEncryptionKey, - NewLightDidVerificationKey, -} from '@kiltprotocol/types' -import { encryptionKeyTypes } from '@kiltprotocol/types' - -import { SDKErrors } from '@kiltprotocol/utils' - -import { checkServiceEndpointSyntax, stripFragment } from '../Did.utils.js' - -type LightDidEncoding = '00' | '01' - -export const verificationKeyTypeToLightDidEncoding: Record< - LightDidSupportedVerificationKeyType, - LightDidEncoding -> = { - sr25519: '00', - ed25519: '01', -} - -export const lightDidEncodingToVerificationKeyType: Record< - LightDidEncoding, - LightDidSupportedVerificationKeyType -> = { - '00': 'sr25519', - '01': 'ed25519', -} - -/** - * The options that can be used to create a light DID. - */ -export type CreateDocumentInput = { - /** - * The DID authentication key. This is mandatory and will be used as the first authentication key - * of the full DID upon migration. - */ - authentication: [NewLightDidVerificationKey] - /** - * The optional DID encryption key. If present, it will be used as the first key agreement key - * of the full DID upon migration. - */ - keyAgreement?: [NewDidEncryptionKey] - /** - * The set of service endpoints associated with this DID. Each service endpoint ID must be unique. - * The service ID must not contain the DID prefix when used to create a new DID. - */ - service?: DidServiceEndpoint[] -} - -export function validateCreateDocumentInput(input: CreateDocumentInput): void { - // Check authentication key type - const authenticationKeyTypeEncoding = - verificationKeyTypeToLightDidEncoding[input.authentication[0].type] - - if (!authenticationKeyTypeEncoding) { - throw new SDKErrors.UnsupportedKeyError(input.authentication[0].type) - } - - if ( - input.keyAgreement?.[0].type && - !encryptionKeyTypes.includes(input.keyAgreement[0].type) - ) { - throw new SDKErrors.DidError( - `Encryption key type "${input.keyAgreement[0].type}" is not supported` - ) - } - - // Check service endpoints - if (!input.service) { - return - } - - // Checks that for all service IDs have regular strings as their ID and not a full DID. - // Plus, we forbid a service ID to be `authentication` or `encryption` as that would create confusion - // when upgrading to a full DID. - input.service?.forEach((service) => { - // A service ID cannot have a reserved ID that is used for key IDs. - if (service.id === '#authentication' || service.id === '#encryption') { - throw new SDKErrors.DidError( - `Cannot specify a service ID with the name "${service.id}" as it is a reserved keyword` - ) - } - checkServiceEndpointSyntax(service) - }) -} - -const KEY_AGREEMENT_MAP_KEY = 'e' -const SERVICES_MAP_KEY = 's' - -interface SerializableStructure { - [KEY_AGREEMENT_MAP_KEY]?: NewDidEncryptionKey - [SERVICES_MAP_KEY]?: Array & { id: string }> -} - -/** - * Serialize the optional encryption key of an off-chain DID using the CBOR serialization algorithm - * and encoding the result in Base58 format with a multibase prefix. - * - * @param details The light DID details to encode. - * @param details.keyAgreement The DID encryption key. - * @param details.service The DID service endpoints. - * @returns The Base58-encoded and CBOR-serialized off-chain DID optional details. - */ -export function serializeAndEncodeAdditionalLightDidDetails({ - keyAgreement, - service, -}: Pick): string | undefined { - const objectToSerialize: SerializableStructure = {} - if (keyAgreement) { - const key = keyAgreement[0] - objectToSerialize[KEY_AGREEMENT_MAP_KEY] = key - } - if (service && service.length > 0) { - objectToSerialize[SERVICES_MAP_KEY] = service.map(({ id, ...rest }) => ({ - id: stripFragment(id), - ...rest, - })) - } - - if (Object.keys(objectToSerialize).length === 0) { - return undefined - } - - const serializationVersion = 0x0 - const serialized = cborEncode(objectToSerialize) - return base58Encode([serializationVersion, ...serialized], true) -} - -export function decodeAndDeserializeAdditionalLightDidDetails( - rawInput: string, - version = 1 -): Pick { - if (version !== 1) { - throw new SDKErrors.DidError('Serialization version not supported') - } - - const decoded = base58Decode(rawInput, true) - const serializationVersion = decoded[0] - const serialized = decoded.slice(1) - - if (serializationVersion !== 0x0) { - throw new SDKErrors.DidError('Serialization algorithm not supported') - } - const deserialized: SerializableStructure = cborDecode(serialized) - - const keyAgreement = deserialized[KEY_AGREEMENT_MAP_KEY] - return { - keyAgreement: keyAgreement && [keyAgreement], - service: deserialized[SERVICES_MAP_KEY]?.map(({ id, ...rest }) => ({ - id: `#${id}`, - ...rest, - })), - } -} diff --git a/packages/did/src/DidDocumentExporter/DidDocumentExporter.spec.ts b/packages/did/src/DidDocumentExporter/DidDocumentExporter.spec.ts index b0ecd42dd..97c5b3383 100644 --- a/packages/did/src/DidDocumentExporter/DidDocumentExporter.spec.ts +++ b/packages/did/src/DidDocumentExporter/DidDocumentExporter.spec.ts @@ -19,7 +19,6 @@ import type { import { exportToDidDocument } from './DidDocumentExporter.js' import * as Did from '../index.js' -import { stripFragment } from '../Did.utils' /** * @group unit/did @@ -63,7 +62,7 @@ function generateDelegationKey(): DidVerificationKey { } function generateServiceEndpoint(serviceId: UriFragment): DidServiceEndpoint { - const fragment = stripFragment(serviceId) + const fragment = Did.resourceIdToChain(serviceId) return { id: serviceId, type: [`type-${fragment}`], diff --git a/packages/did/src/DidLinks/AccountLinks.chain.ts b/packages/did/src/DidLinks/AccountLinks.chain.ts index d0ba4f2ef..8cd1466fd 100644 --- a/packages/did/src/DidLinks/AccountLinks.chain.ts +++ b/packages/did/src/DidLinks/AccountLinks.chain.ts @@ -19,10 +19,10 @@ import type { KeyringPair } from '@polkadot/keyring/types' import type { KeypairType } from '@polkadot/util-crypto/types' import { stringToU8a, + U8A_WRAP_ETHEREUM, u8aConcatStrict, u8aToHex, u8aWrapBytes, - U8A_WRAP_ETHEREUM, } from '@polkadot/util' import { ApiPromise } from '@polkadot/api' @@ -32,8 +32,13 @@ import type { PalletDidLookupConnectionRecord } from '@kiltprotocol/augment-api' import { ConfigService } from '@kiltprotocol/config' import { EncodedSignature } from '../Did.utils.js' -import { Web3Name, web3NameFromChain } from './Web3Names.chain.js' -import { depositFromChain, didToChain, uriFromChain } from '../Did.chain.js' +import { + depositFromChain, + fromChain, + toChain, + Web3Name, + web3NameFromChain, +} from '../Did.chain.js' /// A chain-agnostic address, which can be encoded using any network prefix. export type SubstrateAddress = KeyringPair['address'] @@ -42,15 +47,6 @@ export type EthereumAddress = HexString export type Address = KiltAddress | SubstrateAddress | EthereumAddress -/** - * Type of a linking payload signing function. - * - * It takes the HEX-encoded tuple (DidAddress, BlockNumber) and returns the Uint8Array signature generated by the provided address. - */ -export type LinkingSignCallback = ( - encodedLinkingDetails: HexString -) => Promise - type EncodedMultiAddress = | { AccountId20: Uint8Array } | { AccountId32: Uint8Array } @@ -125,7 +121,7 @@ export function connectedDidFromChain( } { const { did, deposit } = encoded.unwrap() return { - did: uriFromChain(did), + did: fromChain(did), deposit: depositFromChain(deposit), } } @@ -189,20 +185,6 @@ type AssociateAccountToChainResult = [string, AnyNumber, EncodedSignature] /* ### HELPERS ### */ -/** - * Return the default sign callback, which uses the address argument to crete a signing closure for the given payload. - * - * @param keypair The keypair to sign the data with. - * @returns The signature generating callback that uses the keyring to sign the input payload using the input address. - */ -export function makeLinkingSignCallback( - keypair: KeyringPair -): LinkingSignCallback { - return async function sign(payload: HexString): Promise { - return keypair.sign(payload, { withType: false }) - } -} - function getUnprefixedSignature( message: HexString, signature: Uint8Array, @@ -247,7 +229,7 @@ function getUnprefixedSignature( export async function associateAccountToChainArgs( accountAddress: Address, did: DidUri, - sign: LinkingSignCallback, + sign: (encodedLinkingDetails: HexString) => Promise, nBlocksValid = 10 ): Promise { const api = ConfigService.get('api') @@ -268,7 +250,7 @@ export async function associateAccountToChainArgs( )[0].type // get the type of the first key, which is the DidAddress const encoded = api - .createType(`(${DidAddress}, ${BlockNumber})`, [didToChain(did), validTill]) + .createType(`(${DidAddress}, ${BlockNumber})`, [toChain(did), validTill]) .toU8a() const isAccountId32 = decodeAddress(accountAddress).length > 20 diff --git a/packages/did/src/DidLinks/Web3Names.chain.ts b/packages/did/src/DidLinks/Web3Names.chain.ts deleted file mode 100644 index 361121726..000000000 --- a/packages/did/src/DidLinks/Web3Names.chain.ts +++ /dev/null @@ -1,48 +0,0 @@ -/** - * Copyright (c) 2018-2022, BOTLabs GmbH. - * - * This source code is licensed under the BSD 4-Clause "Original" license - * found in the LICENSE file in the root directory of this source tree. - */ - -import { PalletWeb3NamesWeb3NameWeb3NameOwnership } from '@polkadot/types/lookup' -import type { Bytes, Option } from '@polkadot/types-codec' -import type { Deposit, DidUri } from '@kiltprotocol/types' -import type { BN } from '@polkadot/util' -import { depositFromChain, uriFromChain } from '../Did.chain.js' - -/** - * Web3Name is the type of a nickname for a DID. - */ -export type Web3Name = string - -/** - * Decodes the web3name of a DID. - * - * @param encoded The value returned by `api.query.web3Names.names()`. - * @returns The registered web3name for this DID if any. - */ -export function web3NameFromChain(encoded: Option): Web3Name { - return encoded.unwrap().toUtf8() -} - -/** - * Decodes the DID of the owner of web3name. - * - * @param encoded The value returned by `api.query.web3Names.owner()`. - * @returns The full DID uri, i.e. 'did:kilt:4abc...', if any. - */ -export function web3NameOwnerFromChain( - encoded: Option -): { - owner: DidUri - deposit: Deposit - claimedAt: BN -} { - const { owner, deposit, claimedAt } = encoded.unwrap() - return { - owner: uriFromChain(owner), - deposit: depositFromChain(deposit), - claimedAt: claimedAt.toBn(), - } -} diff --git a/packages/did/src/DidLinks/index.ts b/packages/did/src/DidLinks/index.ts index 2ebc3503d..879eeebd5 100644 --- a/packages/did/src/DidLinks/index.ts +++ b/packages/did/src/DidLinks/index.ts @@ -4,6 +4,3 @@ * This source code is licensed under the BSD 4-Clause "Original" license * found in the LICENSE file in the root directory of this source tree. */ - -export * as Web3Names from './Web3Names.chain.js' -export * as AccountLinks from './AccountLinks.chain.js' diff --git a/packages/did/src/DidResolver/DidResolver.spec.ts b/packages/did/src/DidResolver/DidResolver.spec.ts index c83546f1d..e89266036 100644 --- a/packages/did/src/DidResolver/DidResolver.spec.ts +++ b/packages/did/src/DidResolver/DidResolver.spec.ts @@ -24,19 +24,15 @@ import { Crypto } from '@kiltprotocol/utils' import { ApiMocks, makeSigningKeyTool } from '@kiltprotocol/testing' import { ConfigService } from '@kiltprotocol/config' -import { getFullDidUriFromKey, stripFragment } from '../Did.utils' +import { getFullDidUriFromKey } from '../Did.utils' import { - didFromChain, + documentFromChain, + resourceIdToChain, serviceFromChain, servicesFromChain, } from '../Did.chain.js' -import { - resolve, - resolveKey, - resolveServiceEndpoint, - strictResolve, -} from './index.js' +import { resolve, resolveKey, resolveService, strictResolve } from './index.js' import * as Did from '../index.js' /** @@ -124,7 +120,7 @@ function generateDelegationKey(): DidVerificationKey { } function generateServiceEndpoint(serviceId: UriFragment): DidServiceEndpoint { - const fragment = stripFragment(serviceId) + const fragment = serviceId.substring(1) return { id: serviceId, type: [`type-${fragment}`], @@ -134,7 +130,7 @@ function generateServiceEndpoint(serviceId: UriFragment): DidServiceEndpoint { jest.mock('../Did.chain.js') -jest.mocked(didFromChain).mockReturnValue({ +jest.mocked(documentFromChain).mockReturnValue({ authentication: [generateAuthenticationKey()], lastTxCounter: new BN(0), deposit: { @@ -148,6 +144,9 @@ jest jest .mocked(servicesFromChain) .mockReturnValue([generateServiceEndpoint('#service-1')]) +jest + .mocked(resourceIdToChain) + .mockImplementation((id: string) => id.substring(1)) describe('When resolving a key', () => { it('correctly resolves it for a full DID if both the DID and the key exist', async () => { @@ -190,7 +189,7 @@ describe('When resolving a service endpoint', () => { const serviceIdUri: DidResourceUri = `${fullDid}#service-1` expect( - await resolveServiceEndpoint(serviceIdUri) + await resolveService(serviceIdUri) ).toStrictEqual({ id: serviceIdUri, type: [`type-service-1`], @@ -208,22 +207,22 @@ describe('When resolving a service endpoint', () => { let serviceIdUri: DidResourceUri = `${deletedDid}#service-1` - expect(await resolveServiceEndpoint(serviceIdUri)).toBeNull() + expect(await resolveService(serviceIdUri)).toBeNull() const didWithNoServiceEndpoints = didWithAuthenticationKey serviceIdUri = `${didWithNoServiceEndpoints}#service-1` - expect(await resolveServiceEndpoint(serviceIdUri)).toBeNull() + expect(await resolveService(serviceIdUri)).toBeNull() }) it('throws for invalid URIs', async () => { const uriWithoutFragment = deletedDid await expect( - resolveServiceEndpoint(uriWithoutFragment as DidResourceUri) + resolveService(uriWithoutFragment as DidResourceUri) ).rejects.toThrow() const invalidUri = 'invalid-uri' as DidResourceUri - await expect(resolveServiceEndpoint(invalidUri)).rejects.toThrow() + await expect(resolveService(invalidUri)).rejects.toThrow() }) }) @@ -249,7 +248,7 @@ describe('When resolving a full DID', () => { }) it('correctly resolves the document with all keys', async () => { - jest.mocked(didFromChain).mockReturnValueOnce({ + jest.mocked(documentFromChain).mockReturnValueOnce({ authentication: [generateAuthenticationKey()], keyAgreement: [generateEncryptionKey()], assertionMethod: [generateAttestationKey()], diff --git a/packages/did/src/DidResolver/DidResolver.ts b/packages/did/src/DidResolver/DidResolver.ts index 713318c06..3d73c5a4f 100644 --- a/packages/did/src/DidResolver/DidResolver.ts +++ b/packages/did/src/DidResolver/DidResolver.ts @@ -17,12 +17,8 @@ import { SDKErrors } from '@kiltprotocol/utils' import { ConfigService } from '@kiltprotocol/config' import * as Did from '../index.js' -import { - didToChain, - resourceIdToChain, - serviceFromChain, -} from '../Did.chain.js' -import { getFullDidUri, parseDidUri } from '../Did.utils.js' +import { toChain, resourceIdToChain, serviceFromChain } from '../Did.chain.js' +import { getFullDidUri, parse } from '../Did.utils.js' /** * Resolve a DID URI to the DID document and its metadata. @@ -35,7 +31,7 @@ import { getFullDidUri, parseDidUri } from '../Did.utils.js' export async function resolve( did: DidUri ): Promise { - const { type } = parseDidUri(did) + const { type } = parse(did) const api = ConfigService.get('api') const document = await Did.query(getFullDidUri(did)) @@ -50,7 +46,7 @@ export async function resolve( // If the full DID has been deleted (or the light DID was upgraded and deleted), // return the info in the resolution metadata. - const isFullDidDeleted = (await api.query.did.didBlacklist(didToChain(did))) + const isFullDidDeleted = (await api.query.did.didBlacklist(toChain(did))) .isSome if (isFullDidDeleted) { return { @@ -128,7 +124,7 @@ export async function strictResolve( export async function resolveKey( keyUri: DidResourceUri ): Promise { - const { did, fragment: keyId } = parseDidUri(keyUri) + const { did, fragment: keyId } = parse(keyUri) // A fragment (keyId) IS expected to resolve a key. if (!keyId) { @@ -174,10 +170,10 @@ export async function resolveKey( * @param serviceUri The DID service URI. * @returns The details associated with the service endpoint. */ -export async function resolveServiceEndpoint( +export async function resolveService( serviceUri: DidResourceUri ): Promise { - const { fragment: serviceId, did, type } = parseDidUri(serviceUri) + const { fragment: serviceId, did, type } = parse(serviceUri) // A fragment (serviceId) IS expected to resolve a service endpoint. if (!serviceId) { @@ -187,7 +183,7 @@ export async function resolveServiceEndpoint( if (type === 'full') { const encoded = await api.query.did.serviceEndpoints( - didToChain(serviceUri), + toChain(serviceUri), resourceIdToChain(serviceId) ) if (encoded.isNone) { @@ -218,7 +214,7 @@ export async function resolveServiceEndpoint( return null } - const endpoint = Did.getEndpoint(document, serviceId) + const endpoint = Did.getService(document, serviceId) if (!endpoint) { return null } diff --git a/packages/did/src/index.ts b/packages/did/src/index.ts index bb081a265..904c2e8f7 100644 --- a/packages/did/src/index.ts +++ b/packages/did/src/index.ts @@ -14,7 +14,7 @@ import '@kiltprotocol/augment-api' export * from './DidDetails/index.js' export * from './DidDocumentExporter/index.js' export * from './DidResolver/index.js' -export * as Chain from './Did.chain.js' -export * as Utils from './Did.utils.js' +export * from './Did.chain.js' +export * from './Did.utils.js' export * from './Did.signature.js' -export * from './DidLinks/index.js' +export * from './DidLinks/AccountLinks.chain.js' diff --git a/packages/messaging/src/Message.spec.ts b/packages/messaging/src/Message.spec.ts index fd08eda0e..c7581fb59 100644 --- a/packages/messaging/src/Message.spec.ts +++ b/packages/messaging/src/Message.spec.ts @@ -125,7 +125,7 @@ describe('Messaging', () => { async function resolveKey( keyUri: DidResourceUri ): Promise { - const { fragment, did } = Did.Utils.parseDidUri(keyUri) + const { fragment, did } = Did.parse(keyUri) const { document } = (await didResolve( did as DidUri )) as DidResolutionResult @@ -814,7 +814,7 @@ describe('Error checking / Verification', () => { async function didResolve( didUri: DidUri ): Promise { - const { did } = Did.Utils.parseDidUri(didUri) + const { did } = Did.parse(didUri) if (did === identityAlice.uri) { return { metadata: { diff --git a/packages/messaging/src/Message.ts b/packages/messaging/src/Message.ts index 6161855d5..bd5d972c7 100644 --- a/packages/messaging/src/Message.ts +++ b/packages/messaging/src/Message.ts @@ -56,7 +56,7 @@ export function verifyDelegationStructure( if (!account) { throw new SDKErrors.OwnerMissingError() } - Did.Utils.validateKiltDidUri(account, 'Did') + Did.validateUri(account, 'Did') if (typeof isPCR !== 'boolean') { throw new TypeError('isPCR is expected to be a boolean') @@ -131,9 +131,7 @@ export function verifyMessageBody(body: MessageBody): void { body.content.cTypes.forEach( ({ cTypeHash, trustedAttesters, requiredProperties }): void => { DataUtils.verifyIsHex(cTypeHash) - trustedAttesters?.forEach((did) => - Did.Utils.validateKiltDidUri(did, 'Did') - ) + trustedAttesters?.forEach((did) => Did.validateUri(did, 'Did')) requiredProperties?.forEach((requiredProps) => { if (typeof requiredProps !== 'string') throw new TypeError( @@ -213,8 +211,8 @@ export function verifyMessageEnvelope(message: IMessage): void { if (receivedAt !== undefined && typeof receivedAt !== 'number') { throw new TypeError('Received at is expected to be a number') } - Did.Utils.validateKiltDidUri(sender, 'Did') - Did.Utils.validateKiltDidUri(receiver, 'Did') + Did.validateUri(sender, 'Did') + Did.validateUri(receiver, 'Did') if (inReplyTo && typeof inReplyTo !== 'string') { throw new TypeError('In reply to is expected to be a string') } @@ -253,7 +251,7 @@ export function ensureOwnerIsSender({ body, sender }: IMessage): void { { const requestAttestation = body if ( - !Did.Utils.isSameSubject( + !Did.isSameSubject( requestAttestation.content.credential.claim.owner, sender ) @@ -266,7 +264,7 @@ export function ensureOwnerIsSender({ body, sender }: IMessage): void { { const submitAttestation = body if ( - !Did.Utils.isSameSubject( + !Did.isSameSubject( submitAttestation.content.attestation.owner, sender ) @@ -279,7 +277,7 @@ export function ensureOwnerIsSender({ body, sender }: IMessage): void { { const submitClaimsForCtype = body submitClaimsForCtype.content.forEach((presentation) => { - if (!Did.Utils.isSameSubject(presentation.claim.owner, sender)) { + if (!Did.isSameSubject(presentation.claim.owner, sender)) { throw new SDKErrors.IdentityMismatchError('Claims', 'Sender') } }) @@ -318,7 +316,7 @@ export async function decrypt( `Could not resolve sender encryption key "${senderKeyUri}"` ) } - const { fragment } = Did.Utils.parseDidUri(receiverKeyUri) + const { fragment } = Did.parse(receiverKeyUri) if (!fragment) { throw new SDKErrors.DidError( `No fragment for the receiver key ID "${receiverKeyUri}"` @@ -333,9 +331,7 @@ export async function decrypt( `Could not resolve receiver encryption key "${receiverKeyUri}"` ) } - const receiverKeyAlgType = - Did.Utils.encryptionAlgForKeyType[receiverKeyDetails.type] - if (receiverKeyAlgType !== 'x25519-xsalsa20-poly1305') { + if (receiverKeyDetails.type !== 'x25519') { throw new SDKErrors.EncryptionError( 'Only the "x25519-xsalsa20-poly1305" encryption algorithm currently supported' ) diff --git a/packages/testing/src/TestUtils.ts b/packages/testing/src/TestUtils.ts index 888b7735e..d9421c9f9 100644 --- a/packages/testing/src/TestUtils.ts +++ b/packages/testing/src/TestUtils.ts @@ -21,7 +21,6 @@ import { LightDidSupportedVerificationKeyType, NewLightDidVerificationKey, SignCallback, - SigningAlgorithms, } from '@kiltprotocol/types' import { Crypto } from '@kiltprotocol/utils' import * as Did from '@kiltprotocol/did' @@ -148,7 +147,7 @@ export function makeSignCallback(keypair: KeyringPair): KeyToolSignCallback { } } -type StoreDidCallback = Parameters['2'] +type StoreDidCallback = Parameters['2'] /** * Generates a callback that can be used for signing. @@ -168,12 +167,6 @@ export function makeStoreDidCallback( } } -const keypairTypeForAlg: Record = { - ed25519: 'ed25519', - sr25519: 'sr25519', - 'ecdsa-secp256k1': 'ecdsa', -} - export interface KeyTool { keypair: KiltKeyringPair getSignCallback: KeyToolSignCallback @@ -184,13 +177,13 @@ export interface KeyTool { /** * Generates a keypair usable for signing and a few related values. * - * @param alg The algorithm to use for the keypair. + * @param type The type to use for the keypair. * @returns The keypair, matching sign callback, a key usable as DID authentication key. */ export function makeSigningKeyTool( - alg: SigningAlgorithms = 'sr25519' + type: KiltKeyringPair['type'] = 'sr25519' ): KeyTool { - const keypair = Crypto.makeKeypairFromSeed(undefined, keypairTypeForAlg[alg]) + const keypair = Crypto.makeKeypairFromSeed(undefined, type) const getSignCallback = makeSignCallback(keypair) const storeDidCallback = makeStoreDidCallback(keypair) @@ -227,11 +220,11 @@ export function computeKeyId(key: DidKey['publicKey']): DidKey['id'] { function makeDidKeyFromKeypair({ publicKey, type, -}: KeyringPair): DidVerificationKey { +}: KiltKeyringPair): DidVerificationKey { return { id: computeKeyId(publicKey), publicKey, - type: Did.Utils.keyTypeForSignatureAlg[type as SigningAlgorithms], + type, } } @@ -246,7 +239,7 @@ function makeDidKeyFromKeypair({ * @returns A promise resolving to a [[DidDocument]] object. The resulting object is NOT stored on chain. */ export async function createLocalDemoFullDidFromKeypair( - keypair: KeyringPair, + keypair: KiltKeyringPair, { keyRelationships = new Set([ 'assertionMethod', @@ -260,7 +253,7 @@ export async function createLocalDemoFullDidFromKeypair( } = {} ): Promise { const authKey = makeDidKeyFromKeypair(keypair) - const uri = Did.Utils.getFullDidUriFromKey(authKey) + const uri = Did.getFullDidUriFromKey(authKey) const result: DidDocument = { uri, @@ -278,11 +271,15 @@ export async function createLocalDemoFullDidFromKeypair( result.keyAgreement = [encKey] } if (keyRelationships.has('assertionMethod')) { - const attKey = makeDidKeyFromKeypair(keypair.derive('//att')) + const attKey = makeDidKeyFromKeypair( + keypair.derive('//att') as KiltKeyringPair + ) result.assertionMethod = [attKey] } if (keyRelationships.has('capabilityDelegation')) { - const delKey = makeDidKeyFromKeypair(keypair.derive('//del')) + const delKey = makeDidKeyFromKeypair( + keypair.derive('//del') as KiltKeyringPair + ) result.capabilityDelegation = [delKey] } @@ -302,7 +299,7 @@ export async function createLocalDemoFullDidFromLightDid( const { uri, authentication } = lightDid return { - uri: Did.Utils.getFullDidUri(uri), + uri: Did.getFullDidUri(uri), authentication, assertionMethod: authentication, capabilityDelegation: authentication, @@ -317,7 +314,7 @@ export async function createFullDidFromLightDid( sign: StoreDidCallback ): Promise { const { authentication, uri } = lightDidForId - const tx = await Did.Chain.getStoreTx( + const tx = await Did.getStoreTx( { authentication, assertionMethod: authentication, @@ -329,7 +326,7 @@ export async function createFullDidFromLightDid( sign ) await Blockchain.signAndSubmitTx(tx, payer) - const fullDid = await Did.query(Did.Utils.getFullDidUri(uri)) + const fullDid = await Did.query(Did.getFullDidUri(uri)) if (!fullDid) throw new Error('Could not fetch created DID document') return fullDid } diff --git a/packages/types/src/CryptoCallbacks.ts b/packages/types/src/CryptoCallbacks.ts index a6c8e54f6..5931afa1b 100644 --- a/packages/types/src/CryptoCallbacks.ts +++ b/packages/types/src/CryptoCallbacks.ts @@ -12,12 +12,6 @@ import type { VerificationKeyRelationship, } from './DidDocument.js' -const signingAlgorithmsC = ['ed25519', 'sr25519', 'ecdsa-secp256k1'] as const -export const signingAlgorithms = signingAlgorithmsC as unknown as string[] -export type SigningAlgorithms = typeof signingAlgorithmsC[number] - -export type EncryptionAlgorithms = 'x25519-xsalsa20-poly1305' - /** * Base interface for all signing requests. */ diff --git a/packages/vc-export/src/exportToVerifiableCredential.spec.ts b/packages/vc-export/src/exportToVerifiableCredential.spec.ts index 654d5f61c..a8af95bd5 100644 --- a/packages/vc-export/src/exportToVerifiableCredential.spec.ts +++ b/packages/vc-export/src/exportToVerifiableCredential.spec.ts @@ -17,7 +17,7 @@ import { ICredentialPresentation, } from '@kiltprotocol/types' import { Attestation } from '@kiltprotocol/core' -import { Utils as DidUtils } from '@kiltprotocol/did' +import * as Did from '@kiltprotocol/did' import { Crypto } from '@kiltprotocol/utils' import { ApiMocks } from '@kiltprotocol/testing' import { DocumentLoader } from 'jsonld-signatures' @@ -232,7 +232,7 @@ describe('proofs', () => { id: keyId, type: 'Ed25519VerificationKey2018', publicKeyBase58: base58Encode( - Crypto.decodeAddress(DidUtils.parseDidUri(keyId).address) + Crypto.decodeAddress(Did.parse(keyId).address) ), controller: VC.credentialSubject['@id'] as DidUri, } diff --git a/packages/vc-export/src/vc-js/suites/KiltSignatureSuite.spec.ts b/packages/vc-export/src/vc-js/suites/KiltSignatureSuite.spec.ts index 91339dbd3..c1798b772 100644 --- a/packages/vc-export/src/vc-js/suites/KiltSignatureSuite.spec.ts +++ b/packages/vc-export/src/vc-js/suites/KiltSignatureSuite.spec.ts @@ -16,7 +16,7 @@ import jsonld from 'jsonld' import { base58Encode, randomAsHex } from '@polkadot/util-crypto' import { DidResourceUri, DidUri } from '@kiltprotocol/types' -import { Utils as DidUtils } from '@kiltprotocol/did' +import * as Did from '@kiltprotocol/did' import { Crypto } from '@kiltprotocol/utils' import { KiltSignatureSuite as Suite } from './KiltSignatureSuite' @@ -46,7 +46,7 @@ beforeAll(async () => { }) documentLoader = async (uri) => { if (uri.startsWith('did:kilt:')) { - const { address, fragment, did } = DidUtils.parseDidUri(uri as DidUri) + const { address, fragment, did } = Did.parse(uri as DidUri) const key: IPublicKeyRecord = { id: uri as DidResourceUri, publicKeyBase58: base58Encode(Crypto.decodeAddress(address)), diff --git a/tests/bundle-test.ts b/tests/bundle-test.ts index 8ac665334..75246c35d 100644 --- a/tests/bundle-test.ts +++ b/tests/bundle-test.ts @@ -16,7 +16,6 @@ import type { KiltKeyringPair, NewDidEncryptionKey, SignCallback, - SigningAlgorithms, } from '@kiltprotocol/types' const { kilt } = window @@ -52,7 +51,8 @@ function makeSignCallback( } } } -type StoreDidCallback = Parameters['2'] + +type StoreDidCallback = Parameters['2'] function makeStoreDidCallback(keypair: KiltKeyringPair): StoreDidCallback { return async function sign({ data }) { @@ -66,18 +66,12 @@ function makeStoreDidCallback(keypair: KiltKeyringPair): StoreDidCallback { function makeSigningKeypair( seed: string, - alg: SigningAlgorithms = 'sr25519' + type: KiltKeyringPair['type'] = 'sr25519' ): { keypair: KiltKeyringPair getSignCallback: (didDocument: DidDocument) => SignCallback storeDidCallback: StoreDidCallback } { - const keypairTypeForAlg: Record = { - ed25519: 'ed25519', - sr25519: 'sr25519', - 'ecdsa-secp256k1': 'ecdsa', - } - const type = keypairTypeForAlg[alg] const keypair = Crypto.makeKeypairFromUri(seed, type) const getSignCallback = makeSignCallback(keypair) const storeDidCallback = makeStoreDidCallback(keypair) @@ -150,7 +144,7 @@ async function createFullDidFromKeypair( ) { const sign = makeStoreDidCallback(keypair) - const storeTx = await Did.Chain.getStoreTx( + const storeTx = await Did.getStoreTx( { authentication: [keypair], assertionMethod: [keypair], @@ -162,7 +156,7 @@ async function createFullDidFromKeypair( ) await Blockchain.signAndSubmitTx(storeTx, payer) - const fullDid = await Did.query(Did.Utils.getFullDidUriFromKey(keypair)) + const fullDid = await Did.query(Did.getFullDidUriFromKey(keypair)) if (!fullDid) throw new Error('Cannot query created DID') return fullDid } @@ -229,14 +223,14 @@ async function runAll() { 'ed25519' ) - const didStoreTx = await Did.Chain.getStoreTx( + const didStoreTx = await Did.getStoreTx( { authentication: [keypair] }, payer.address, storeDidCallback ) await Blockchain.signAndSubmitTx(didStoreTx, payer) - const fullDid = await Did.query(Did.Utils.getFullDidUriFromKey(keypair)) + const fullDid = await Did.query(Did.getFullDidUriFromKey(keypair)) if (!fullDid) throw new Error('Could not fetch created DID document') const resolved = await Did.resolve(fullDid.uri) From ab598133feaa03393769520b13672572b94f0dfb Mon Sep 17 00:00:00 2001 From: Github Action Date: Thu, 22 Sep 2022 15:16:22 +0000 Subject: [PATCH 30/36] [CI Skip] ci: publish prerelease --- package.json | 2 +- packages/augment-api/package.json | 2 +- packages/chain-helpers/package.json | 2 +- packages/config/package.json | 2 +- packages/core/package.json | 2 +- packages/did/package.json | 2 +- packages/messaging/package.json | 2 +- packages/sdk-js/package.json | 2 +- packages/testing/package.json | 2 +- packages/types/package.json | 2 +- packages/utils/package.json | 2 +- packages/vc-export/package.json | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index 4f27bd046..ec03ead95 100644 --- a/package.json +++ b/package.json @@ -68,6 +68,6 @@ "typedoc": "^0.22.15", "typescript": "^4.8.3" }, - "version": "0.30.0-14", + "version": "0.30.0-15", "packageManager": "yarn@3.0.2" } diff --git a/packages/augment-api/package.json b/packages/augment-api/package.json index c8e16739a..790f2f4f6 100644 --- a/packages/augment-api/package.json +++ b/packages/augment-api/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/augment-api", - "version": "0.30.0-14", + "version": "0.30.0-15", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/chain-helpers/package.json b/packages/chain-helpers/package.json index 02134f78e..0d322f538 100644 --- a/packages/chain-helpers/package.json +++ b/packages/chain-helpers/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/chain-helpers", - "version": "0.30.0-14", + "version": "0.30.0-15", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/config/package.json b/packages/config/package.json index 17425390a..ee1389295 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/config", - "version": "0.30.0-14", + "version": "0.30.0-15", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/core/package.json b/packages/core/package.json index eaec29e57..d9a33a93f 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/core", - "version": "0.30.0-14", + "version": "0.30.0-15", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/did/package.json b/packages/did/package.json index 1013e4bd6..a0d7f9360 100644 --- a/packages/did/package.json +++ b/packages/did/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/did", - "version": "0.30.0-14", + "version": "0.30.0-15", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/messaging/package.json b/packages/messaging/package.json index 1888ed2ac..d4b3bc433 100644 --- a/packages/messaging/package.json +++ b/packages/messaging/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/messaging", - "version": "0.30.0-14", + "version": "0.30.0-15", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/sdk-js/package.json b/packages/sdk-js/package.json index 1c268a2c7..bbc474e81 100644 --- a/packages/sdk-js/package.json +++ b/packages/sdk-js/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/sdk-js", - "version": "0.30.0-14", + "version": "0.30.0-15", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/testing/package.json b/packages/testing/package.json index 52c1a98a7..4ba5b6014 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -1,7 +1,7 @@ { "name": "@kiltprotocol/testing", "private": true, - "version": "0.30.0-14", + "version": "0.30.0-15", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/types/package.json b/packages/types/package.json index 930c15a0b..a226bc754 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/types", - "version": "0.30.0-14", + "version": "0.30.0-15", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/utils/package.json b/packages/utils/package.json index 0e3551bcd..f344c63bc 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/utils", - "version": "0.30.0-14", + "version": "0.30.0-15", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/vc-export/package.json b/packages/vc-export/package.json index d9ce83daa..81a7a79ee 100644 --- a/packages/vc-export/package.json +++ b/packages/vc-export/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/vc-export", - "version": "0.30.0-14", + "version": "0.30.0-15", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", From cce62a648a193fa55e1b600d9a63ab97077bc6ad Mon Sep 17 00:00:00 2001 From: Tom Adler Date: Thu, 22 Sep 2022 17:56:12 +0200 Subject: [PATCH 31/36] refactor!: remove queryWeb3Name --- .../AccountLinking.spec.ts | 5 +- .../did/src/DidLinks/AccountLinks.chain.ts | 60 +++++++++++++++---- 2 files changed, 50 insertions(+), 15 deletions(-) diff --git a/packages/core/src/__integrationtests__/AccountLinking.spec.ts b/packages/core/src/__integrationtests__/AccountLinking.spec.ts index 6476e4969..ca1494143 100644 --- a/packages/core/src/__integrationtests__/AccountLinking.spec.ts +++ b/packages/core/src/__integrationtests__/AccountLinking.spec.ts @@ -495,9 +495,10 @@ describe('When there is an on-chain DID', () => { ) expect(owner).toStrictEqual(did.uri) // Check that it is possible to retrieve the web3 name from the account linked to the DID - expect(await Did.queryWeb3Name(genericAccount.address)).toStrictEqual( - 'test-name' + const data = await api.rpc.did.queryByAccount( + Did.accountToChain(genericAccount.address) ) + expect(Did.queryByAccountFromChain(data).did).toStrictEqual('test-name') }) it('should be possible for the sender to remove the link', async () => { diff --git a/packages/did/src/DidLinks/AccountLinks.chain.ts b/packages/did/src/DidLinks/AccountLinks.chain.ts index 8cd1466fd..9b0dd1e55 100644 --- a/packages/did/src/DidLinks/AccountLinks.chain.ts +++ b/packages/did/src/DidLinks/AccountLinks.chain.ts @@ -28,7 +28,10 @@ import { ApiPromise } from '@polkadot/api' import { SDKErrors, ss58Format } from '@kiltprotocol/utils' import type { Deposit, DidUri, KiltAddress } from '@kiltprotocol/types' -import type { PalletDidLookupConnectionRecord } from '@kiltprotocol/augment-api' +import type { + DidLinkedInfo, + PalletDidLookupConnectionRecord, +} from '@kiltprotocol/augment-api' import { ConfigService } from '@kiltprotocol/config' import { EncodedSignature } from '../Did.utils.js' @@ -132,6 +135,21 @@ function isLinkableAccountId( return 'isAccountId32' in arg && 'isAccountId20' in arg } +function accountFromChain( + account: AccountId32, + networkPrefix = ss58Format +): KiltAddress | SubstrateAddress { + if (isLinkableAccountId(account)) { + // linked account is substrate address (ethereum-enabled storage version) + if (account.isAccountId32) + return encodeAddress(account.asAccountId32, networkPrefix) + // linked account is ethereum address (ethereum-enabled storage version) + if (account.isAccountId20) return ethereumEncode(account.asAccountId20) + } + // linked account is substrate account (legacy storage version) + return encodeAddress(account.toU8a(), networkPrefix) +} + /** * Decodes the accounts linked to the provided DID. * @@ -143,18 +161,34 @@ export function connectedAccountsFromChain( encoded: Array>, networkPrefix = ss58Format ): Array { - return encoded.map(({ args: [, accountAddress] }) => { - if (isLinkableAccountId(accountAddress)) { - // linked account is substrate address (ethereum-enabled storage version) - if (accountAddress.isAccountId32) - return encodeAddress(accountAddress.asAccountId32, networkPrefix) - // linked account is ethereum address (ethereum-enabled storage version) - if (accountAddress.isAccountId20) - return ethereumEncode(accountAddress.asAccountId20) - } - // linked account is substrate account (legacy storage version) - return encodeAddress(accountAddress.toU8a(), networkPrefix) - }) + return encoded.map(({ args: [, accountAddress] }) => + accountFromChain(accountAddress, networkPrefix) + ) +} + +/** + * Decodes accounts, DID, and web3name linked to the provided account. + * + * @param encoded The data returned by `api.rpc.did.queryByAccount()`. + * @param networkPrefix The optional network prefix to use to encode the returned addresses. Defaults to KILT prefix (38). Use `42` for the chain-agnostic wildcard Substrate prefix. + * @returns The accounts, DID, and web3name. + */ +export function queryByAccountFromChain( + encoded: Option, + networkPrefix = ss58Format +): { + did: DidUri + accounts: Array + web3name?: Web3Name +} { + const { accounts, identifier, w3n } = encoded.unwrap() + return { + did: fromChain(identifier), + accounts: accounts.map((account) => + accountFromChain(account, networkPrefix) + ), + web3name: w3n.isSome ? w3n.unwrap().toString() : undefined, + } } /** From cc70e1042ba5245a8be104af08df871b63f7d2c1 Mon Sep 17 00:00:00 2001 From: Github Action Date: Thu, 22 Sep 2022 16:00:50 +0000 Subject: [PATCH 32/36] [CI Skip] ci: publish prerelease --- package.json | 2 +- packages/augment-api/package.json | 2 +- packages/chain-helpers/package.json | 2 +- packages/config/package.json | 2 +- packages/core/package.json | 2 +- packages/did/package.json | 2 +- packages/messaging/package.json | 2 +- packages/sdk-js/package.json | 2 +- packages/testing/package.json | 2 +- packages/types/package.json | 2 +- packages/utils/package.json | 2 +- packages/vc-export/package.json | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index ec03ead95..5f7872f74 100644 --- a/package.json +++ b/package.json @@ -68,6 +68,6 @@ "typedoc": "^0.22.15", "typescript": "^4.8.3" }, - "version": "0.30.0-15", + "version": "0.30.0-16", "packageManager": "yarn@3.0.2" } diff --git a/packages/augment-api/package.json b/packages/augment-api/package.json index 790f2f4f6..0e9be4379 100644 --- a/packages/augment-api/package.json +++ b/packages/augment-api/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/augment-api", - "version": "0.30.0-15", + "version": "0.30.0-16", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/chain-helpers/package.json b/packages/chain-helpers/package.json index 0d322f538..54335c34d 100644 --- a/packages/chain-helpers/package.json +++ b/packages/chain-helpers/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/chain-helpers", - "version": "0.30.0-15", + "version": "0.30.0-16", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/config/package.json b/packages/config/package.json index ee1389295..a43007da2 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/config", - "version": "0.30.0-15", + "version": "0.30.0-16", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/core/package.json b/packages/core/package.json index d9a33a93f..1d4805932 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/core", - "version": "0.30.0-15", + "version": "0.30.0-16", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/did/package.json b/packages/did/package.json index a0d7f9360..6891bffe9 100644 --- a/packages/did/package.json +++ b/packages/did/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/did", - "version": "0.30.0-15", + "version": "0.30.0-16", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/messaging/package.json b/packages/messaging/package.json index d4b3bc433..3289d2b48 100644 --- a/packages/messaging/package.json +++ b/packages/messaging/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/messaging", - "version": "0.30.0-15", + "version": "0.30.0-16", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/sdk-js/package.json b/packages/sdk-js/package.json index bbc474e81..36901b327 100644 --- a/packages/sdk-js/package.json +++ b/packages/sdk-js/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/sdk-js", - "version": "0.30.0-15", + "version": "0.30.0-16", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/testing/package.json b/packages/testing/package.json index 4ba5b6014..65900d62c 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -1,7 +1,7 @@ { "name": "@kiltprotocol/testing", "private": true, - "version": "0.30.0-15", + "version": "0.30.0-16", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/types/package.json b/packages/types/package.json index a226bc754..ee5a2e11f 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/types", - "version": "0.30.0-15", + "version": "0.30.0-16", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/utils/package.json b/packages/utils/package.json index f344c63bc..6c638ee22 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/utils", - "version": "0.30.0-15", + "version": "0.30.0-16", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/vc-export/package.json b/packages/vc-export/package.json index 81a7a79ee..a4ae989c5 100644 --- a/packages/vc-export/package.json +++ b/packages/vc-export/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/vc-export", - "version": "0.30.0-15", + "version": "0.30.0-16", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", From 923722584019d9e62f2be08ed13629133222ae03 Mon Sep 17 00:00:00 2001 From: Tom Adler Date: Thu, 22 Sep 2022 17:58:59 +0200 Subject: [PATCH 33/36] Revert "refactor!: remove queryWeb3Name" This reverts commit cce62a648a193fa55e1b600d9a63ab97077bc6ad. --- .../AccountLinking.spec.ts | 5 +- .../did/src/DidLinks/AccountLinks.chain.ts | 60 ++++--------------- 2 files changed, 15 insertions(+), 50 deletions(-) diff --git a/packages/core/src/__integrationtests__/AccountLinking.spec.ts b/packages/core/src/__integrationtests__/AccountLinking.spec.ts index ca1494143..6476e4969 100644 --- a/packages/core/src/__integrationtests__/AccountLinking.spec.ts +++ b/packages/core/src/__integrationtests__/AccountLinking.spec.ts @@ -495,10 +495,9 @@ describe('When there is an on-chain DID', () => { ) expect(owner).toStrictEqual(did.uri) // Check that it is possible to retrieve the web3 name from the account linked to the DID - const data = await api.rpc.did.queryByAccount( - Did.accountToChain(genericAccount.address) + expect(await Did.queryWeb3Name(genericAccount.address)).toStrictEqual( + 'test-name' ) - expect(Did.queryByAccountFromChain(data).did).toStrictEqual('test-name') }) it('should be possible for the sender to remove the link', async () => { diff --git a/packages/did/src/DidLinks/AccountLinks.chain.ts b/packages/did/src/DidLinks/AccountLinks.chain.ts index 9b0dd1e55..8cd1466fd 100644 --- a/packages/did/src/DidLinks/AccountLinks.chain.ts +++ b/packages/did/src/DidLinks/AccountLinks.chain.ts @@ -28,10 +28,7 @@ import { ApiPromise } from '@polkadot/api' import { SDKErrors, ss58Format } from '@kiltprotocol/utils' import type { Deposit, DidUri, KiltAddress } from '@kiltprotocol/types' -import type { - DidLinkedInfo, - PalletDidLookupConnectionRecord, -} from '@kiltprotocol/augment-api' +import type { PalletDidLookupConnectionRecord } from '@kiltprotocol/augment-api' import { ConfigService } from '@kiltprotocol/config' import { EncodedSignature } from '../Did.utils.js' @@ -135,21 +132,6 @@ function isLinkableAccountId( return 'isAccountId32' in arg && 'isAccountId20' in arg } -function accountFromChain( - account: AccountId32, - networkPrefix = ss58Format -): KiltAddress | SubstrateAddress { - if (isLinkableAccountId(account)) { - // linked account is substrate address (ethereum-enabled storage version) - if (account.isAccountId32) - return encodeAddress(account.asAccountId32, networkPrefix) - // linked account is ethereum address (ethereum-enabled storage version) - if (account.isAccountId20) return ethereumEncode(account.asAccountId20) - } - // linked account is substrate account (legacy storage version) - return encodeAddress(account.toU8a(), networkPrefix) -} - /** * Decodes the accounts linked to the provided DID. * @@ -161,34 +143,18 @@ export function connectedAccountsFromChain( encoded: Array>, networkPrefix = ss58Format ): Array { - return encoded.map(({ args: [, accountAddress] }) => - accountFromChain(accountAddress, networkPrefix) - ) -} - -/** - * Decodes accounts, DID, and web3name linked to the provided account. - * - * @param encoded The data returned by `api.rpc.did.queryByAccount()`. - * @param networkPrefix The optional network prefix to use to encode the returned addresses. Defaults to KILT prefix (38). Use `42` for the chain-agnostic wildcard Substrate prefix. - * @returns The accounts, DID, and web3name. - */ -export function queryByAccountFromChain( - encoded: Option, - networkPrefix = ss58Format -): { - did: DidUri - accounts: Array - web3name?: Web3Name -} { - const { accounts, identifier, w3n } = encoded.unwrap() - return { - did: fromChain(identifier), - accounts: accounts.map((account) => - accountFromChain(account, networkPrefix) - ), - web3name: w3n.isSome ? w3n.unwrap().toString() : undefined, - } + return encoded.map(({ args: [, accountAddress] }) => { + if (isLinkableAccountId(accountAddress)) { + // linked account is substrate address (ethereum-enabled storage version) + if (accountAddress.isAccountId32) + return encodeAddress(accountAddress.asAccountId32, networkPrefix) + // linked account is ethereum address (ethereum-enabled storage version) + if (accountAddress.isAccountId20) + return ethereumEncode(accountAddress.asAccountId20) + } + // linked account is substrate account (legacy storage version) + return encodeAddress(accountAddress.toU8a(), networkPrefix) + }) } /** From fe56e6bac2a28f30e44643364ec814e1228e02dd Mon Sep 17 00:00:00 2001 From: Github Action Date: Thu, 22 Sep 2022 16:15:33 +0000 Subject: [PATCH 34/36] [CI Skip] ci: publish prerelease --- package.json | 2 +- packages/augment-api/package.json | 2 +- packages/chain-helpers/package.json | 2 +- packages/config/package.json | 2 +- packages/core/package.json | 2 +- packages/did/package.json | 2 +- packages/messaging/package.json | 2 +- packages/sdk-js/package.json | 2 +- packages/testing/package.json | 2 +- packages/types/package.json | 2 +- packages/utils/package.json | 2 +- packages/vc-export/package.json | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index 5f7872f74..d2163ad1d 100644 --- a/package.json +++ b/package.json @@ -68,6 +68,6 @@ "typedoc": "^0.22.15", "typescript": "^4.8.3" }, - "version": "0.30.0-16", + "version": "0.30.0-17", "packageManager": "yarn@3.0.2" } diff --git a/packages/augment-api/package.json b/packages/augment-api/package.json index 0e9be4379..f935d8ab5 100644 --- a/packages/augment-api/package.json +++ b/packages/augment-api/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/augment-api", - "version": "0.30.0-16", + "version": "0.30.0-17", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/chain-helpers/package.json b/packages/chain-helpers/package.json index 54335c34d..ea8dd7ffc 100644 --- a/packages/chain-helpers/package.json +++ b/packages/chain-helpers/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/chain-helpers", - "version": "0.30.0-16", + "version": "0.30.0-17", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/config/package.json b/packages/config/package.json index a43007da2..72c6d7a0b 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/config", - "version": "0.30.0-16", + "version": "0.30.0-17", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/core/package.json b/packages/core/package.json index 1d4805932..1cc9966ba 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/core", - "version": "0.30.0-16", + "version": "0.30.0-17", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/did/package.json b/packages/did/package.json index 6891bffe9..7ac193b5f 100644 --- a/packages/did/package.json +++ b/packages/did/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/did", - "version": "0.30.0-16", + "version": "0.30.0-17", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/messaging/package.json b/packages/messaging/package.json index 3289d2b48..72acea5d0 100644 --- a/packages/messaging/package.json +++ b/packages/messaging/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/messaging", - "version": "0.30.0-16", + "version": "0.30.0-17", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/sdk-js/package.json b/packages/sdk-js/package.json index 36901b327..0895d672c 100644 --- a/packages/sdk-js/package.json +++ b/packages/sdk-js/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/sdk-js", - "version": "0.30.0-16", + "version": "0.30.0-17", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/testing/package.json b/packages/testing/package.json index 65900d62c..82353e41d 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -1,7 +1,7 @@ { "name": "@kiltprotocol/testing", "private": true, - "version": "0.30.0-16", + "version": "0.30.0-17", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/types/package.json b/packages/types/package.json index ee5a2e11f..b089a8207 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/types", - "version": "0.30.0-16", + "version": "0.30.0-17", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/utils/package.json b/packages/utils/package.json index 6c638ee22..c8c15a6b1 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/utils", - "version": "0.30.0-16", + "version": "0.30.0-17", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/vc-export/package.json b/packages/vc-export/package.json index a4ae989c5..d6d48e581 100644 --- a/packages/vc-export/package.json +++ b/packages/vc-export/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/vc-export", - "version": "0.30.0-16", + "version": "0.30.0-17", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", From ad166704c063a5cb4a089cd62a036d3b4da98d8e Mon Sep 17 00:00:00 2001 From: Timo Welde Date: Mon, 26 Sep 2022 11:29:22 +0200 Subject: [PATCH 35/36] feat: message.decrypt does not need did document (#645) --- packages/messaging/src/Message.spec.ts | 19 ++++++------------- packages/messaging/src/Message.ts | 18 ------------------ tests/bundle-test.ts | 3 +-- 3 files changed, 7 insertions(+), 33 deletions(-) diff --git a/packages/messaging/src/Message.spec.ts b/packages/messaging/src/Message.spec.ts index c7581fb59..9b28b5b7a 100644 --- a/packages/messaging/src/Message.spec.ts +++ b/packages/messaging/src/Message.spec.ts @@ -191,7 +191,6 @@ describe('Messaging', () => { const decryptedMessage = await Message.decrypt( encryptedMessage, bobEncKey.decrypt, - bobLightDid, { resolveKey } ) expect(JSON.stringify(message.body)).toEqual( @@ -210,12 +209,9 @@ describe('Messaging', () => { encryptedMessageWrongContent.ciphertext = u8aToHex(messedUpContent) await expect(() => - Message.decrypt( - encryptedMessageWrongContent, - bobEncKey.decrypt, - bobLightDid, - { resolveKey } - ) + Message.decrypt(encryptedMessageWrongContent, bobEncKey.decrypt, { + resolveKey, + }) ).rejects.toThrowError(SDKErrors.DecodingMessageError) const encryptedWrongBody = await aliceEncKey.encrypt(aliceLightDid)({ @@ -230,12 +226,9 @@ describe('Messaging', () => { receiverKeyUri: `${bobLightDid.uri}${bobLightDid.keyAgreement![0].id}`, } await expect(() => - Message.decrypt( - encryptedMessageWrongBody, - bobEncKey.decrypt, - bobLightDid, - { resolveKey } - ) + Message.decrypt(encryptedMessageWrongBody, bobEncKey.decrypt, { + resolveKey, + }) ).rejects.toThrowError(SyntaxError) }) diff --git a/packages/messaging/src/Message.ts b/packages/messaging/src/Message.ts index bd5d972c7..4ced6dfd8 100644 --- a/packages/messaging/src/Message.ts +++ b/packages/messaging/src/Message.ts @@ -7,7 +7,6 @@ import type { DecryptCallback, - DidDocument, DidResolveKey, DidResourceUri, EncryptCallback, @@ -18,7 +17,6 @@ import type { IMessage, MessageBody, } from '@kiltprotocol/types' -import { encryptionKeyTypes } from '@kiltprotocol/types' import { Attestation, Claim, @@ -292,7 +290,6 @@ export function ensureOwnerIsSender({ body, sender }: IMessage): void { * * @param encrypted The encrypted message. * @param decryptCallback The callback to decrypt with the secret key. - * @param receiverDid The DID of the receiver. * @param decryptionOptions Options to perform the decryption operation. * @param decryptionOptions.resolveKey The DID key resolver to use. * @returns The original [[Message]]. @@ -300,7 +297,6 @@ export function ensureOwnerIsSender({ body, sender }: IMessage): void { export async function decrypt( encrypted: IEncryptedMessage, decryptCallback: DecryptCallback, - receiverDid: DidDocument, { resolveKey = Did.resolveKey, }: { @@ -322,20 +318,6 @@ export async function decrypt( `No fragment for the receiver key ID "${receiverKeyUri}"` ) } - const receiverKeyDetails = Did.getKey(receiverDid, fragment) - if ( - !receiverKeyDetails || - !encryptionKeyTypes.includes(receiverKeyDetails.type) - ) { - throw new SDKErrors.DidError( - `Could not resolve receiver encryption key "${receiverKeyUri}"` - ) - } - if (receiverKeyDetails.type !== 'x25519') { - throw new SDKErrors.EncryptionError( - 'Only the "x25519-xsalsa20-poly1305" encryption algorithm currently supported' - ) - } let data: Uint8Array try { diff --git a/tests/bundle-test.ts b/tests/bundle-test.ts index 75246c35d..f94bbd543 100644 --- a/tests/bundle-test.ts +++ b/tests/bundle-test.ts @@ -332,8 +332,7 @@ async function runAll() { const decryptedMessage = await Message.decrypt( encryptedMessage, - aliceDecryptCallback, - alice + aliceDecryptCallback ) if (JSON.stringify(message.body) !== JSON.stringify(decryptedMessage.body)) { throw new Error('Original and decrypted message are not the same') From 100158bf2edbfb767ca4d00954497a1b5e497836 Mon Sep 17 00:00:00 2001 From: Github Action Date: Mon, 26 Sep 2022 09:33:33 +0000 Subject: [PATCH 36/36] [CI Skip] ci: publish prerelease --- package.json | 2 +- packages/augment-api/package.json | 2 +- packages/chain-helpers/package.json | 2 +- packages/config/package.json | 2 +- packages/core/package.json | 2 +- packages/did/package.json | 2 +- packages/messaging/package.json | 2 +- packages/sdk-js/package.json | 2 +- packages/testing/package.json | 2 +- packages/types/package.json | 2 +- packages/utils/package.json | 2 +- packages/vc-export/package.json | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index d2163ad1d..a7e435a93 100644 --- a/package.json +++ b/package.json @@ -68,6 +68,6 @@ "typedoc": "^0.22.15", "typescript": "^4.8.3" }, - "version": "0.30.0-17", + "version": "0.30.0-18", "packageManager": "yarn@3.0.2" } diff --git a/packages/augment-api/package.json b/packages/augment-api/package.json index f935d8ab5..de164cadb 100644 --- a/packages/augment-api/package.json +++ b/packages/augment-api/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/augment-api", - "version": "0.30.0-17", + "version": "0.30.0-18", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/chain-helpers/package.json b/packages/chain-helpers/package.json index ea8dd7ffc..ced105df5 100644 --- a/packages/chain-helpers/package.json +++ b/packages/chain-helpers/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/chain-helpers", - "version": "0.30.0-17", + "version": "0.30.0-18", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/config/package.json b/packages/config/package.json index 72c6d7a0b..d2566bec1 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/config", - "version": "0.30.0-17", + "version": "0.30.0-18", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/core/package.json b/packages/core/package.json index 1cc9966ba..fe506cf53 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/core", - "version": "0.30.0-17", + "version": "0.30.0-18", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/did/package.json b/packages/did/package.json index 7ac193b5f..9d1df64a5 100644 --- a/packages/did/package.json +++ b/packages/did/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/did", - "version": "0.30.0-17", + "version": "0.30.0-18", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/messaging/package.json b/packages/messaging/package.json index 72acea5d0..287565355 100644 --- a/packages/messaging/package.json +++ b/packages/messaging/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/messaging", - "version": "0.30.0-17", + "version": "0.30.0-18", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/sdk-js/package.json b/packages/sdk-js/package.json index 0895d672c..1042d1983 100644 --- a/packages/sdk-js/package.json +++ b/packages/sdk-js/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/sdk-js", - "version": "0.30.0-17", + "version": "0.30.0-18", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/testing/package.json b/packages/testing/package.json index 82353e41d..6fd38d24e 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -1,7 +1,7 @@ { "name": "@kiltprotocol/testing", "private": true, - "version": "0.30.0-17", + "version": "0.30.0-18", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/types/package.json b/packages/types/package.json index b089a8207..7c5c5e1e3 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/types", - "version": "0.30.0-17", + "version": "0.30.0-18", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/utils/package.json b/packages/utils/package.json index c8c15a6b1..a9b8d387a 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/utils", - "version": "0.30.0-17", + "version": "0.30.0-18", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js", diff --git a/packages/vc-export/package.json b/packages/vc-export/package.json index d6d48e581..c3fc50570 100644 --- a/packages/vc-export/package.json +++ b/packages/vc-export/package.json @@ -1,6 +1,6 @@ { "name": "@kiltprotocol/vc-export", - "version": "0.30.0-17", + "version": "0.30.0-18", "description": "", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js",