quantum-resistant-rustykey 0.13.8 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -0
- package/dist/index.d.ts +93 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +594 -121
- package/dist/index.js.map +1 -1
- package/dist/opfs-sk-worker.js +5185 -0
- package/dist/opfs-sk-worker.js.map +7 -0
- package/dist/sqisign-accel-worker.js +118 -59
- package/dist/sqisign-accel-worker.js.map +3 -3
- package/package.json +4 -2
package/dist/index.js
CHANGED
|
@@ -1922,6 +1922,40 @@ var mlkem1024_default = {
|
|
|
1922
1922
|
_isSupportedCryptoKey
|
|
1923
1923
|
};
|
|
1924
1924
|
//#endregion
|
|
1925
|
+
//#region src/opfs-sk/browser-gate.ts
|
|
1926
|
+
/** Dedicated Worker name for `loadOpfsSkWallet()` — the only browser realm allowed to keygen/sign. */
|
|
1927
|
+
const OPFS_SK_WORKER_NAME = "qrr-opfs-sk";
|
|
1928
|
+
/** Static OPFS slot used by the pqc.rustykey.me wallet demos. */
|
|
1929
|
+
const OPFS_SK_SLOT_SD_BUNDLE = "sd-bundle";
|
|
1930
|
+
const BROWSER_SK_CEREMONY_ERROR = "Browser keygen/sign requires WebAuthn userVerification:required, PRF, TEE, and loadOpfsSkWallet() (ciphertext in OPFS). Node and server REST loaders are unchanged. verify() remains available.";
|
|
1931
|
+
function hasWorkerGlobalScope() {
|
|
1932
|
+
return typeof globalThis.WorkerGlobalScope !== "undefined";
|
|
1933
|
+
}
|
|
1934
|
+
function hasWindow() {
|
|
1935
|
+
return typeof globalThis.window !== "undefined";
|
|
1936
|
+
}
|
|
1937
|
+
function workerName() {
|
|
1938
|
+
const name = globalThis.name;
|
|
1939
|
+
return typeof name === "string" ? name : "";
|
|
1940
|
+
}
|
|
1941
|
+
/** Node / server REST — plaintext loaders stay unconstrained. */
|
|
1942
|
+
function isUnconstrainedSigningRealm() {
|
|
1943
|
+
return !hasWindow() && !hasWorkerGlobalScope();
|
|
1944
|
+
}
|
|
1945
|
+
/** OPFS encrypted-sk Worker (name `qrr-opfs-sk`). */
|
|
1946
|
+
function isOpfsSkWorkerRealm() {
|
|
1947
|
+
return hasWorkerGlobalScope() && !hasWindow() && workerName() === "qrr-opfs-sk";
|
|
1948
|
+
}
|
|
1949
|
+
/**
|
|
1950
|
+
* Browser page, SharedWorker, and non-wallet Dedicated Workers must not
|
|
1951
|
+
* keygen or sign with a plaintext `sk`. The OPFS wallet worker is the
|
|
1952
|
+
* exception. `verify()` is not gated.
|
|
1953
|
+
*/
|
|
1954
|
+
function assertBrowserSkCeremonyAllowed() {
|
|
1955
|
+
if (isUnconstrainedSigningRealm() || isOpfsSkWorkerRealm()) return;
|
|
1956
|
+
throw new Error(BROWSER_SK_CEREMONY_ERROR);
|
|
1957
|
+
}
|
|
1958
|
+
//#endregion
|
|
1925
1959
|
//#region src/signature-common.ts
|
|
1926
1960
|
function toHex(bytes) {
|
|
1927
1961
|
return Array.from(bytes, (b) => b.toString(16).padStart(2, "0")).join(" ");
|
|
@@ -1940,12 +1974,36 @@ function asBytes(value) {
|
|
|
1940
1974
|
}
|
|
1941
1975
|
function withStack(module, run) {
|
|
1942
1976
|
const stack = module.stackSave();
|
|
1977
|
+
const regions = [];
|
|
1943
1978
|
try {
|
|
1944
|
-
return run((size) =>
|
|
1979
|
+
return run((size) => {
|
|
1980
|
+
const ptr = module.stackAlloc(size);
|
|
1981
|
+
regions.push({
|
|
1982
|
+
ptr,
|
|
1983
|
+
length: size
|
|
1984
|
+
});
|
|
1985
|
+
return ptr;
|
|
1986
|
+
});
|
|
1945
1987
|
} finally {
|
|
1988
|
+
zeroizeStackAllocations(module, stack, regions);
|
|
1946
1989
|
module.stackRestore(stack);
|
|
1947
1990
|
}
|
|
1948
1991
|
}
|
|
1992
|
+
/** Wipe JS-owned ephemeral secrets. Do not use on caller-owned key buffers. */
|
|
1993
|
+
function zeroizeBytes(bytes) {
|
|
1994
|
+
bytes.fill(0);
|
|
1995
|
+
}
|
|
1996
|
+
function zeroizeStackAllocations(module, savedStack, regions) {
|
|
1997
|
+
const heap = module.HEAPU8;
|
|
1998
|
+
for (const { ptr, length } of regions) zeroizeHeapRange(heap, ptr, ptr + length);
|
|
1999
|
+
const now = module.stackSave();
|
|
2000
|
+
zeroizeHeapRange(heap, now < savedStack ? now : savedStack, now < savedStack ? savedStack : now);
|
|
2001
|
+
}
|
|
2002
|
+
function zeroizeHeapRange(heap, start, end) {
|
|
2003
|
+
const lo = start < 0 ? 0 : start;
|
|
2004
|
+
const hi = end > heap.length ? heap.length : end;
|
|
2005
|
+
if (hi > lo) heap.fill(0, lo, hi);
|
|
2006
|
+
}
|
|
1949
2007
|
function writeBytes(module, alloc, bytes) {
|
|
1950
2008
|
const ptr = alloc(bytes.length);
|
|
1951
2009
|
module.HEAPU8.set(bytes, ptr);
|
|
@@ -2493,39 +2551,49 @@ var FnDsaWrapper = class {
|
|
|
2493
2551
|
this.variant = variant;
|
|
2494
2552
|
}
|
|
2495
2553
|
keypair() {
|
|
2554
|
+
assertBrowserSkCeremonyAllowed();
|
|
2496
2555
|
const pairPromise = (async () => {
|
|
2497
2556
|
const api = getApi$2(this.variant);
|
|
2498
2557
|
const module = await api.getModule();
|
|
2499
2558
|
const seed = crypto.getRandomValues(new Uint8Array(api.seedBytes(module)));
|
|
2500
|
-
|
|
2501
|
-
|
|
2502
|
-
|
|
2503
|
-
|
|
2504
|
-
|
|
2505
|
-
|
|
2506
|
-
|
|
2507
|
-
|
|
2508
|
-
|
|
2509
|
-
|
|
2510
|
-
|
|
2559
|
+
try {
|
|
2560
|
+
return withStack(module, (alloc) => {
|
|
2561
|
+
const pkPtr = alloc(api.publicKeyBytes(module));
|
|
2562
|
+
const skPtr = alloc(api.privateKeyBytes(module));
|
|
2563
|
+
const seedPtr = writeBytes(module, alloc, seed);
|
|
2564
|
+
const rc = api.keypair(module, pkPtr, skPtr, seedPtr);
|
|
2565
|
+
if (rc !== 0) throw new Error(`Falcon keypair failed with code ${rc}`);
|
|
2566
|
+
return {
|
|
2567
|
+
public_key: readBytes(module, pkPtr, api.publicKeyBytes(module)),
|
|
2568
|
+
private_key: readBytes(module, skPtr, api.privateKeyBytes(module))
|
|
2569
|
+
};
|
|
2570
|
+
});
|
|
2571
|
+
} finally {
|
|
2572
|
+
zeroizeBytes(seed);
|
|
2573
|
+
}
|
|
2511
2574
|
})();
|
|
2512
2575
|
return { get: (key) => pairPromise.then((pair) => key === "public_key" ? pair.public_key : pair.private_key) };
|
|
2513
2576
|
}
|
|
2514
2577
|
sign(message, private_key) {
|
|
2578
|
+
assertBrowserSkCeremonyAllowed();
|
|
2515
2579
|
return Promise.all([ensureInit$2(this.variant), Promise.resolve(private_key)]).then(([module, sk]) => {
|
|
2516
2580
|
const api = getApi$2(this.variant);
|
|
2517
2581
|
const msg = asBytes(message);
|
|
2518
2582
|
const key = asBytes(sk);
|
|
2519
2583
|
const seed = crypto.getRandomValues(new Uint8Array(api.seedBytes(module)));
|
|
2520
|
-
|
|
2521
|
-
|
|
2522
|
-
|
|
2523
|
-
|
|
2524
|
-
|
|
2525
|
-
|
|
2526
|
-
|
|
2527
|
-
|
|
2528
|
-
|
|
2584
|
+
try {
|
|
2585
|
+
return withStack(module, (alloc) => {
|
|
2586
|
+
const sigPtr = alloc(api.signatureBytes(module));
|
|
2587
|
+
const msgPtr = writeBytes(module, alloc, msg);
|
|
2588
|
+
const skPtr = writeBytes(module, alloc, key);
|
|
2589
|
+
const seedPtr = writeBytes(module, alloc, seed);
|
|
2590
|
+
const rc = api.sign(module, sigPtr, msgPtr, msg.length, skPtr, seedPtr);
|
|
2591
|
+
if (rc !== 0) throw new Error(`Falcon sign failed with code ${rc}`);
|
|
2592
|
+
return readBytes(module, sigPtr, api.signatureBytes(module));
|
|
2593
|
+
});
|
|
2594
|
+
} finally {
|
|
2595
|
+
zeroizeBytes(seed);
|
|
2596
|
+
}
|
|
2529
2597
|
});
|
|
2530
2598
|
}
|
|
2531
2599
|
verify(signature, message, public_key) {
|
|
@@ -3068,39 +3136,49 @@ var MlDsaWrapper = class {
|
|
|
3068
3136
|
this.variant = variant;
|
|
3069
3137
|
}
|
|
3070
3138
|
keypair() {
|
|
3139
|
+
assertBrowserSkCeremonyAllowed();
|
|
3071
3140
|
const pairPromise = (async () => {
|
|
3072
3141
|
const api = getApi$1(this.variant);
|
|
3073
3142
|
const module = await api.getModule();
|
|
3074
3143
|
const seed = crypto.getRandomValues(new Uint8Array(api.seedBytes(module)));
|
|
3075
|
-
|
|
3076
|
-
|
|
3077
|
-
|
|
3078
|
-
|
|
3079
|
-
|
|
3080
|
-
|
|
3081
|
-
|
|
3082
|
-
|
|
3083
|
-
|
|
3084
|
-
|
|
3085
|
-
|
|
3144
|
+
try {
|
|
3145
|
+
return withStack(module, (alloc) => {
|
|
3146
|
+
const pkPtr = alloc(api.publicKeyBytes(module));
|
|
3147
|
+
const skPtr = alloc(api.privateKeyBytes(module));
|
|
3148
|
+
const seedPtr = writeBytes(module, alloc, seed);
|
|
3149
|
+
const rc = api.keypair(module, pkPtr, skPtr, seedPtr);
|
|
3150
|
+
if (rc !== 0) throw new Error(`ML-DSA keypair failed with code ${rc}`);
|
|
3151
|
+
return {
|
|
3152
|
+
public_key: readBytes(module, pkPtr, api.publicKeyBytes(module)),
|
|
3153
|
+
private_key: readBytes(module, skPtr, api.privateKeyBytes(module))
|
|
3154
|
+
};
|
|
3155
|
+
});
|
|
3156
|
+
} finally {
|
|
3157
|
+
zeroizeBytes(seed);
|
|
3158
|
+
}
|
|
3086
3159
|
})();
|
|
3087
3160
|
return { get: (key) => pairPromise.then((pair) => key === "public_key" ? pair.public_key : pair.private_key) };
|
|
3088
3161
|
}
|
|
3089
3162
|
sign(message, private_key) {
|
|
3163
|
+
assertBrowserSkCeremonyAllowed();
|
|
3090
3164
|
return Promise.all([ensureInit$1(this.variant), Promise.resolve(private_key)]).then(([module, sk]) => {
|
|
3091
3165
|
const api = getApi$1(this.variant);
|
|
3092
3166
|
const msg = asBytes(message);
|
|
3093
3167
|
const key = asBytes(sk);
|
|
3094
3168
|
const rnd = crypto.getRandomValues(new Uint8Array(api.randomBytes(module)));
|
|
3095
|
-
|
|
3096
|
-
|
|
3097
|
-
|
|
3098
|
-
|
|
3099
|
-
|
|
3100
|
-
|
|
3101
|
-
|
|
3102
|
-
|
|
3103
|
-
|
|
3169
|
+
try {
|
|
3170
|
+
return withStack(module, (alloc) => {
|
|
3171
|
+
const sigPtr = alloc(api.signatureBytes(module));
|
|
3172
|
+
const msgPtr = writeBytes(module, alloc, msg);
|
|
3173
|
+
const skPtr = writeBytes(module, alloc, key);
|
|
3174
|
+
const rndPtr = writeBytes(module, alloc, rnd);
|
|
3175
|
+
const rc = api.sign(module, sigPtr, msgPtr, msg.length, skPtr, rndPtr);
|
|
3176
|
+
if (rc !== 0) throw new Error(`ML-DSA sign failed with code ${rc}`);
|
|
3177
|
+
return readBytes(module, sigPtr, api.signatureBytes(module));
|
|
3178
|
+
});
|
|
3179
|
+
} finally {
|
|
3180
|
+
zeroizeBytes(rnd);
|
|
3181
|
+
}
|
|
3104
3182
|
});
|
|
3105
3183
|
}
|
|
3106
3184
|
verify(signature, message, public_key) {
|
|
@@ -3160,6 +3238,7 @@ var SlhDsaWrapper = class {
|
|
|
3160
3238
|
return getImpl(this.variant);
|
|
3161
3239
|
}
|
|
3162
3240
|
keypair() {
|
|
3241
|
+
assertBrowserSkCeremonyAllowed();
|
|
3163
3242
|
const pairPromise = Promise.resolve().then(() => {
|
|
3164
3243
|
const { secretKey, publicKey } = this.impl().keygen();
|
|
3165
3244
|
return {
|
|
@@ -3170,6 +3249,7 @@ var SlhDsaWrapper = class {
|
|
|
3170
3249
|
return { get: (key) => pairPromise.then((pair) => key === "public_key" ? pair.public_key : pair.private_key) };
|
|
3171
3250
|
}
|
|
3172
3251
|
sign(message, private_key) {
|
|
3252
|
+
assertBrowserSkCeremonyAllowed();
|
|
3173
3253
|
return Promise.resolve(private_key).then((sk) => this.impl().sign(asBytes(message), asBytes(sk)));
|
|
3174
3254
|
}
|
|
3175
3255
|
verify(signature, message, public_key) {
|
|
@@ -3194,25 +3274,6 @@ async function loadSlhDsa256() {
|
|
|
3194
3274
|
return new SlhDsaWrapper("sha2_256s");
|
|
3195
3275
|
}
|
|
3196
3276
|
//#endregion
|
|
3197
|
-
//#region src/slhdsa-kat.ts
|
|
3198
|
-
/**
|
|
3199
|
-
* NIST FIPS 205 SLH-DSA known-answer vectors. Source: NIST ACVP-Server
|
|
3200
|
-
* SLH-DSA-sigGen-FIPS205, pure/external, empty context, deterministic.
|
|
3201
|
-
* Public key = last 2n bytes of the ACVP secret key. Verify-only.
|
|
3202
|
-
*/
|
|
3203
|
-
/** SLH-DSA-SHA2-128s (loadSlhDsa128), ACVP tgId 19, tcId 162. */
|
|
3204
|
-
const SLHDSA128S_KAT_PK_HEX = "0fd12c3f990748cf9b1426413b64128edf9242e50b9e29378bd24cad4d547540";
|
|
3205
|
-
const SLHDSA128S_KAT_MSG_HEX = "c0666252089b9e469f0ee398b8c1bd89aeb63ebcb794bc68de8738a93804df48e8cf6cf936abe1dddb02178f0064f8e06ea827a79e6ee02c5f98fdea797948b79ee4fdb1a12c31d55edd2b98c11c01dc71b12381bc7d2ce6800d2667813fba079ad9ab01406a91922ae324cb54603a86007f2a3481e3904ae53d1c33bf5bb982a880f8fba2015b9ce6a5644cc712239c41e5c33ac2638893d44e039c0677388f2fecdd78fd7b6bc4b9ec9709766598e8d923abf7ebe86f85f9f6760ec514897eaedbb160fbfdbfecddae2331e981894b5dc9b08ff5e66ae14cd876bd674973dc1e808affb0f5b18ab3a1de55cabb5e6fb3de5739f1a7ff39da6256ac88728dbb04eded47f13c2ab402a237f5204543a285fe2ff50477c90cc87c3cdaaab32cea96fe9a0e5ee36ee2d35cb0bbb4c7b5163d0060b45d23ba9ffb4c2a5f1ffe10b25decbcd65c80a3e6b38d18be16c558f3db5bd9ba6689d652d4f68f02c92170ec1ac7800dba917216bbc73e34768f958a4ef4818fea2b7addf97768ce965eadf2c18f4dac50a7e75debc3e6e067d0c93dc526607614327c6874d1b4a2ee5ddaa1a8a60440cc5bb0af6b95c16794eeafad19562c71005599c6d01a08015652f2ac2b7ace177ee393f19760ccadf84c827cd20bf4e10a051b76bd82235f4d470f3742bab4166a81b90d3837761ccc5749f37a554966893567df90399837f0cc290d7c98044140fcd11b717e1671e4acb056ba142c76558ccf47fcf4133c9d2a8c4fa85bc87cad0308a6cb9ef3597c63d3a47535627d1bd1694514b14548a29dba64d893d5b851258c1c914748bfd2e4f9413cb6d9578f64e27e1419a1392099ed145dc53d75a5105a4f8df1e2fd507d5fb6eb65e28fb2182a15097ac8ab74190d7345983c329ae4a71e468b6fb97aecf8ddc516532e0d32ac9af7d75a4c2fa0dbfdab5cea485b24cc3f93f0c25eb321ed64c7f84b4f16b8d02fe1985666243b0f08ea22db6850bfd510666ae6de618e324e3e7f883ea8c62086c53b08303532a97ace24ede6702be34f36f416363f956ae9c88c98ceb6dd2cd7094b94340f0c057ca12673cc77fbdbd64d3e1cd59e29d2596f173d3aae4aa142f064e14b02318e52c9b45f11eed90105c7471857201d3ceb9796659d5fce30013762a67901a21e66963cf2da1469f0d4b59c09df4bd8a596dee3ee2097248fbc8f747adeaeb7a2d1266430c5b41ace85b7fcc2ee8bbf75b2415530a37444cbc601a7f5e2eea8d1788a959fc18ae6ec0e87626562eb906485566886802f2c66c525bbaca02955e71d5fad7fef45cb1bc8d560d0da0af181ae471f38d5c531260985e48ca6afc16f573d70536c3eaca58e3e4cb15636ebaab2615b6299ad248eb31abe9bea5a5a1587b707c6b4a4e209aab9e5fa54e441c720cee700c549265e0325f84f48565e7439a19697fe0c789a6121abc00b28b4ab6a06f248ce93b61d4e05d32d3e442b557af1220890abce1316b6937b677564d753369373acd8655ca92643cd208f50f49c1236700007e1fe7a9e2134ef604492d3f3bc8f39c768b061220f71aa49b138ea83dcab0837cb0fc5cd3b1589c67fb998ed16d2c73b7879bd3ea7cb16a7cbb6b3aafb6f1adc80eac584cab14126ef09ee261975ff65e2e5f2f68788219193907e7c3b78cf6de0b1631637a9216a6f45c7c95daa374a33ef22cbdcfa8ee400fd2dec1cb06cb6d24bd151bf335404b0cff1156c228ec17c9a2da82ea2b9b203234a8caed239605b34ebeb6cb4e46097516d95ac91074b8adbbe5511c7eabe373d05a494ec561e659ea7746d199d3af03f6f1960f0ef08c8de7804f09efe02a8590509efd59f076bce869c99cf2903e0aff410ca93173c47f57934f3c1eceb3a4144961c7de9e54f3aad782d36fd42126cc5dd8a3943edf02187d9baef411846b3d397123b6fa68c7f4a0e80085dcece332335d9339f0ed856d28b23766499482d808a05cc7535a29f102a481c43c2adaa4f1e898a46c73ed864887112459ca9922ac3ca0a791e52acc020fadee73dde439e69130d2b73f14b957eeac8e263c00b082f5921054b14622cb5fe3812d4574e50537506a8b1c184e5d0568d807e62be580db23e8c2e96146fbbbfedf8d71beb0c6b4644221818ba6de6509c60841eeba2f60f2dbf63ba9798981ec16c2f6a366cb6129f6a05b5683b72a146c52fac8e7d2c1d630e87a21e0bb149d780542d0f2c16cb0c139b18c0591eb56181c548e2709f159a3f974d37c3253b82c50f86f0d4230b0e111c2d92c65cfa5cbf654346330fe7074401323824dc29402ddf1d547a74c7c50b7cf157a6599b72cf7214ec666962e36300659be8178a0274d4ec62cecaced451aaaf95f24b08aa9d1b50aedf9d141a42ec1e4848186fbb11e3a2ae03398d1f21f38a7a83a4cf8249aeb458d39ce61782f09b5ceaefc7dc24333ac1ce51585173234ac5b5970ade48083810f594ee4ca570005c8a01436cb83f118d82188b81bfa9ecc2e88b88834c265d2d5b801c36c1bcda59d317fb60e533503d1a5604a636939111caaf097fcad4748661289f097d2ce487bfc21550bbb771f10b5257c0acbf56fa8a9963a544991ce868b71857245c907217b1668d8e1bab2e554d19e6bddc3d7980c3660d9ffc39254fa36c67e5c73e2539149cea39d7bef0a702a27dbf6b8cd41ffd1e6381c987b49ca0644c0c5230f8cad85249b05d779f27e8d626b0d5c5b4f078ba16bf09fd8b5d4d47b176e5d87e285352841f7c4cd913de6c7f55e401e451da32e5d1594b1d5d72c5fd378b7e93672b0bb2b9178f235d8b6f0b265afd234a7e3cf4793faa33060c9cae9faa6583ea92d952084c638ecfac257b8c5129f92165a79c0e6826407e13fe1da55ecf8206fc5d4f541f89f21b4b5d9f8029470529410d6f2d6c7f47e22d72923e7eda2c4ca5a4d456533b2ed4d5088eb0086ef1a53d9c7f8b1b28aad1b4a38f4d5ec724da0da8ef1aed42c6c1988a561750fc85bcbff006a3b43af494bec29919fcc75f2b20dfad8e2bb096433f34c510bd69934dbd8b14bdf344babb371aca838605f55e9b1380e44a4348d4adfae86ef52baf8845201ff225fa3fa0c3f7d17385443e27a3bb3b6cf2d86edc7d3ab833e57eb2088e50c7c42d9919d78072bcb81fc60f662ecdeda8343dd90de54d8b3fd1c01280aff13a94aa6cf5906370aacbe6532909798af4f8fe62fac8e4723122297d472b3da30b49cf88f122c5eb0a2e06bd7f1670b4bd19ec5023bb3a091d9b8fbb7c6d9eb188666999bd36a3e148221d34d2010dc1dda5ebe6ddc60975e38dbf94040e0e2763d9bf8dd74e5aa8ffca172c301e97dd3094c98a95018a48f341e718dfa3ab604f4d5369df3e55a72f80e8680ffcb6cba59f38b06e5d75b6429ecc2df58929e7322629e6e93c7c694438e70ab8cde7bf6edda1088bdd8678343ca65ba799df178ba035f6bc25a847a7c38ef5d6a9f2e9fa73c6d5a0b488681de60b9283242dd22dbdb3aab6e13334b242bc1346a35f40ce297fd46b0dd43e4becd8f0595b8a64d7d49935e9c1137a4831e275f2d355f6d665ed0d8804a6c6f39d6cca5c7c6695b8afe69b9a36a5bc3708d912d4c8dcb7b6356cc0f14213be6f336b8f7d4b822144b63ecf8a0c2b4326de509cc216fa5f2ce915df9daa4cf67e71a7c579cc9a88a49c28ce2708a0cb14096b3d39923017f8e55b18d327bd6c8566d72bd83f4d921c8a2ff32df2448801e8075b17d15d569d7f05c65eb712d48f55c16c90a2b41b65820f96e8cd96fdabbacfe6fb4dc246d268cd8c5bb2152c2117c0c4f0f042d1ce02a8d91830be6a0c607873e433eb5019b15cd273831e0d5c28c6a638a25d242db41ae79ddcf82f3b411079bf7154e7bef9674e147085e9ea45b5105ff9ac1cd938e5391baa4981007143f96c0952113926a0e4be375d13ed3692e65df9a17e3a7c8212828d0e5fdd26867183731f7d2b12090177e6985c4b67c62a0926a787e3c66c8b867e23422718ca5793a87ab4609c0d04808445a7080891a6d03677a87d1a1afe277f1938168a86bc8da164dc0e976080cf24a1fdc5940b9fb73accadd458f9f884894cc11cdc2821820a3b14a748e09de44c0076129f87734136143fab08c6c8b50c25ef3545cdcf9bb39c4c084cd5cc7978b69b21ae04aa788106eaacc4d51e5643607d155a159ae82225174900f54720c10480271d0c16893b494bdfb5f2c0cbe64cfd94f58d7df8ddb92dc48ee5c1cce69f9e85a005a341f572a3d70e78a150e9a52fc2c22dbf5f89212cc14d0bfcde215a585742aa71150fbfc2b4ed071a0a7b7bd08ac3e3263ef6e130121ab300b72790df29831dcbba30f2a5e86cb540ba3346744ec2236e0083db740e65a108b4a82e6a2dc14e51f0ca93ad32e3a91a6aef95b42267a9e592bea177d40d964dde25899286203050e769dcf8a8b52ca1fab081a4b2802d3e3bb58a5e1235baccc23b635f85a4caec9448344fa5e59a1d1cb3ac8fd9588941840f36510cc5991cb882dd43d24955a73f5bfd3bc1b14d72069723ab52734ea07f35a8db4b09489284f501f357a1b4405fff0228f908772cea825a54571d12ba7535e4878ab4a64284f64439de38f460ec7bc9642dc4d563bd3290f14bcc89c92fdf2b4b01a1bc286330edce6c345f7b73a621e1e74199a080e62846dd097271c5b16d3db367070e5db0a5c765564ae5796dfbbe3e4e7a9c1cdeb309af19d808f75224b71ad8e96e65602f61deb67f34efd85fb6126ac4e96888169cd66c6e8c11837de58a3abdd9240d290337e325337b8a761da6ea8c7537aff1d8b20d7c8e63674403e9fabe65f506a09fdffc985960c8aa52fbd1f4568766e0499fb3dfc5ad0900d03c85fc25dc71ef9a4113dc17f8918c91d2299763378189e5209bd7e5a1e2b3bb1490eaec5a7c7c93352cd7104c00e5779980a760c41461277256a2590525c718242818dd082512798a5c7899a8fb3cc2f4dd0a68fbd7e42d6ef3126df606f0aec5800c89c2d954a4e9a238a942cf1b85c3985ff5d38c9930b2dbb75dcafb1bc206ba68c481005a54d2def5940796082551dc6912c8f6692d448d891d2e2782de363f404af46c612daa28ec3cbadebd3cf9e5844cda520146055d30e32d057dbe1bb073c4d2010bd6294365ca3c6e8a7570b723abe59e8eaa04134c00428b7010f228ab45542df31d916aeb69fd0659525d736e9e166fe7c7f5c8f2c61f9d4115ad62d096c0e7e9de55391bcd658472f6d96b9d83a01e72c3bf6c2d3e0c4856ad3850ee6ffd33bdfaf70fbc8833a7332306fe0f764a79659bd2cdc97ee2e1ee12c24e7498a779f5e8e1e7fd06ba459089ea0f1ffa5b19fbace996e9f21b9fe1f41577cdc4301d3226f96a8f46264f31bbc0e51dc4d603899012a4b6da9fee52712d2356ec00516e07d4f6fee5aa0e519f7088e16e100f186b63ce159e25071cf74f395577efa243a1532dd3ee6fed5f2843dbe1bce5a2aa829b458f44f2c235a8e46dd30937957b5244c711bb92b3b1f21308615baf016423428c0d6af4886865e966a120e07230a53690bd4ac5ed0ea8af83cd5b271e0e868eb37b673ab1e30112d7a8a15b6176e063897abd87f3d6bef3481cd78a7a3c9207fd825753942eb04e453e9cac02f0cc5b57d664b01683110bcffb69623146507455a34c2dd2383aed2bd30b04e28deeb17e09d1cbb0e7ab49af2a8bce1bdb2250437f3af1a24a6528a11498c1cdc0355ac9843d539793f38f94ee783760db01c394d8c518e7b836bc5d685fa3763f372761eca91d9eb729089721a9d806c29100b80e0004e8974673a2dc0ac09c8ab13dc67ffaf2dcbad195ddaeaf2e2bd8996829fb2e277dfea65cde86d7704c06b64650d4b1a02abafce6367e028ff325f9794d57c653d10112771f25add8a00713df3da3532552e6bff04eff299075c5818c5f777860e6f4eaa3fa0386eaab4ae55f0e785575b158f1c5b7ac47bba50d7ba50f5823866722589219047e44ac779c96bbce9df16b91e482fedf823e8703a87847326247e0a12dab6ac00795dbefa53aebcebf4e85c3d771a0042795cec253209a5a3351b188647a1d23b44303858725745001da2443d27b8414d0451b4bcf1e030a1b6315198beda9e391583e5c86704a42e09de1572bb5bd486b3c750e5eae7bf39f89f6d26854ede3324ff990c4ef51455479f94a12a39411357d6e78d0db328ae8034bd7b69fbcd9e7f3fabfc7f3c6dab545ea903964f6ea60ac71242ed5d62c0fc0838ac9068b3f0a33ae088df5bea6a29d4ea708414b6b8d15de41dec70d96fc88b48599687704ecf3d285cf84ff3eee4feb3b6bd2b5c4451df3400b7832ddb87e8c8d34acf68dd9b97abe0691888155e9ba10a4c6148816e93190f650be66b1d81658055528a86090027f5bcbad77ade991c9dee3b6cfd792e35c55561edb39d589b308366ae7b298f45a95eb1afa4587e7142bf73c3b8c1f8f6f3cda4154ea976b76c6f2fe94fdbcc11b1f42ee6601203796ab0872a54c50a607cb68a373b4139c83511c1a7d1d921d9d9c898b32265ad8e04ef568871abc93e1701c271a5a5da4aa7415c0da01868c13908d62e0311624f283fed158bd119811f71c03aaa6ad2bfe69bc484b4c5bde204e2699b3ce8afd73c7cec8855c0d67bc600d35e0a6db3a2940306a2e89ebc04b832e6624cef91f2cfca985e0d76b2fd4ebd1370da7624eb44b67acedb7fa1c4caf9ff18ce1528e971adc42f58f8591ed1e2228a53870eb74bb48775d9139093f9e156568594ef614776f7d92d70afcc2c43d27c039bb6215084adbd8660607986f1aff8c47552b46e362619a85f4bf9620dd6398d278599da1adbe8595d976d80a038797a11d9f27d6fa39935904c2c6cf71b1dcdf119cf6b1a0a9e77d01411cf5ba9e47bb8f08d2ba42aa6e6f0b3e4b943c87d7f66b93a94a4226a9ef596a8069a99e974f56025648a74872bbe639d74a9941e882abc59452ee9ebee6507a02b56555a9e388e4d5240982bcffe597e9000cf9695c1fe5bf528120342c2760ca64485752d039e443029d08686a18157223cae5461ade4b0db826e2c7cce7732c71ecd41557bbb3e5531447a82c9de53549ec1c9f53d2b7385eaf0e841f38584a463506504d5f5f3f6a3918d116a9bcc6aa02002432b961783c2174b7fb1d1f6ce65e52e964903749114e58b54af45ad26609a23ea43ea8981e6ae084a8708ec2ee62c5717c23d04c40a462db5180e21da61d2789e00eceabcfcf0d34dc78ed7329aa362d1100f08e93834c73ea78672c9fbdfd96e3b86d258fd7716db163cf8d174c53b9ac82daa3b40b414e335e83413cbe97ac0505c07d64e3afeba4a499d4d180d16db9a3eb3769039ca435d2083fc216114a38a10de9b90d5d98b944a650af76203b9d45584e09d04e13ee798ac17b682f4bf5484bf2bb6fb212f2f507b8168b1dbf9383a7f26207938393c9596c1f4f8dc0fcbddbcd36b4bf4537ba559d53e2dd48e6a91108292c09d01582a67bb5eacc47925b9af4d30469a58cd11e6bd7a9063a440e57eb961f1b97b1aed19f594b1756252c46591c22573d95a82845c3bb7fe72200c6cc41f174d9b5b7162a41ff4db416e2265790283a0bdb98dd0bf9d14ec8d9139fa6002d394b84d782572d32d673b32116128359fac1a6c6fa7a3df8b0370e445d187200d62df4a9b08be9e1d2d6131b04a9085d0c362b11a7d65a2df534626b380008e98eb7cb1e70908f26d24e9d55a8332d13a24745660101b8a14b653a3fb1bb2f6f2bbb4f31bdaaa5519c2d136077a6932f741427687034a4dee988c915e22c53e5ae15fc3b63a227c9afb59aa6dfa12a147b1c6c05a1de8527f7b2d3e473550737d3f202a2bb0e4ce119c846f55b9c90bc6d3d6be96326d8b0b7b74aaf834192f6abf642705e9752e606d02c7a8f3cdf41625626064cb22d166261390df552b14543d5323bdef2139443b79c913d3b11f1c53f023487d5ccdd312062722b959ea26169b6a02da481648baddc18905f37c5d365a293f512affa7660df5f579f411fcf2cf07401e55668d3f74736cf423d1080ba126db46ecf";
|
|
3206
|
-
const SLHDSA128S_KAT_SIG_HEX = "1bac90ab7e6d50f9567f015164ef5b141262de517969edc6938943bad9123ba5a31236e9c99e6470cc1bfc44edced879efe625c50f8d2cd117192b84a7fe9a3a5753806774ed59a7c91a63a96888ef5191fac1e293017dcb40be1f48c538efad2c058342505a906e7577227f2b003b597d7deee3bcdea9292550cdcdaddee7c5f38322295fcb0e98daa4bdf4f250b87714108432b2df23f5ef7affbbbd71677f39f8923531bb60332e78da03dcafa85395b82fa4699dc4b1952ec8bf58e6ecf6a40591ab1ca423bdc9c6c63128abc968b61c88590f5fa3bda9654baca75ee1192d9e77649f4ab344d9e1643983a41b751e093a402b23c434b99b1692d8525aa06250f199ce369f3235d5e2521176bda3a3e514af3b69899c7dce41fb6ffb4eccb4335fbc71e1316a1cb9c112ef62a7d261de37ba47115c1b5a9576c33697ee24aa218e113376275de3d87e9107f8e4f10ac21334a03203bf1729944c4f3f22492a3fdbd9620259fc44008af6507ae7516421e228031637c91a1969922a4fea0aa005e08eb26740a3f39778b207a4d0a83abf211d5a311fc3f96529a587a9ee9d2cbd484d210ae9ce401873a4e8ca4f91c006416964138a2fb08a53ad58e1b7a27ee2e0a40f2e5f92f365838e67d2823d3d60957909d78552000e4ac78288e665a3cc97b4c9e7ddf14067e63916d305d8a0ade48e1069fd6523d5d4bdceaf97525dd0169baec2c53bd58c56ccfc7116eb79bd6c420962b2667bdbd4b27857dfb6513145e0336b5a4d4976fac5568a64c12bd2844f7250abef88196b1ff02646b43478a613a58377e835dc19660d7cac97b5b581e1d99414cb2211d2ad205eb40d77ab4ebdb8a8e36af955fc62d6ba5ba3438ac55ed7910abdf45170ada52143a56e2d4199904187c7b51a073a6ac896c0e030a1f0701eb85322ab7152b2b08e9cc39a9c4bf104e86a71e82b487e2ed3bc235c3ea274f4fe4db4e8cc9dbcbd5b8077ea4859d7f81e1b4c4c2539eb5870098197c71de4fa9a92ff54733f4c6bd3835a2922a9858bcbf792d6ed77204b72986983f0f88324ee99d8a3f110bd94d7bfad2f89d8fb192d746df1e4fa1384ed8cb1b2411dfd3fe886fabf3cefde776f0251ac889ac6596f377277c1e74c6939a7a675dab42cb9aef370ce078d19061778d1098d783f6619c4e199128504ba2f02bb142cce9b0797205fed1516882e2f35fc6d4b2875cd5f652b5338620d1356b2588aa9a3a71e4c888174e402b626ea9649734f157a17beee0651694febff3203c37703931304d1f95b4a993adfb332ae34834bf942c03593b54d9bb3bff31c852b5e8f72538e29ee4507ae0f5260494dc53a814b655002a08a5ec8513922dc22de3d85b7e381b79560d806861ddd03924a5c7972add7b12dece20533a77f90c5d2d8fce4ccf833f57509d29850a93db1416a145eaa6c910de596282a7cbeaa911de582078b6bdfda0678c4ad31ed76faf04d770d5a60f730c6b5b27dac7e9939270c239ede4ffc5f21ecad060274af574facf24a951b1e24ab0d60b90ffdb90f95390161287611436e3f73be9f11069c01e67cf8e48b1cd4556aac7ba1cd7e7c038a1dcc7e1c0fb0ac9505998aad9ab74359da64a3a8bcbd229f61aef207a546f1190d798b2af941abd7be06f60f406291f14ad2eb0bddf0c5225ff9dc75d5b2e762a4a7ca07227c0641ab6d2b58759c93838d3ad7e2502db56ce75471caefa43efe435a75056fab3a4107c58c2530d7f78a58eab6af1aeb4622f42dab230c09f31a9ebffd910a75aeae9ca9a6559dc7925666d2c63ef2f20ecacd3ac4745f1c4aa0064e6ee3ac40c8c1b6b98a9980ad9f41abae9f9d7d2d52ba0b39041aa909ae045878738abde787a1630aeaf22d2a73eeda1dd3733356d09d256759b298db98a300e21e8fd13dcb1b81d725e38fc874ebb53d58d7943ac0f20907b4a1603f7ffce22339cecef60accfa91394bcc495a9a2de88f999cbcdf14ee756781c5bf68fca81c28ce968e07ba84c8a615ad310215b4adaefc0706b16a88ec127b9f70f739770d0d53fdeb9d376bfa7cf0f6299800ada7a9c697c4716872c5fca02734e0fa7d8872389a314e1efbf7c449bf37a90ac2a16a6feba60fa21327a1b95c9ea134e38625b9f9a9b7bb60751f79df2c5b4deba4ce74586a4d66782f75dde07c22adc8fb01c3a83b7cfcd53c988ff90c59b3505fa7733dbeebcd72edaf815431d21499d650d9080424cab6c01cfefa1d1754352cec5875f65d80c5eb8f5d47343502824c6cb84f0c50afeea2daf72e16b79146bbcbb3b1511ee327ddedc4ae0e88fa0a184ae23add39cc5014aaef247fb2dc846c088ea44e5c066140ad9bfa32da47e4dc294afe11e9c949dfe29c3672bb8a8c6e37c494747ae3b8d551c602a7c971835fcceb582bf6dee85a998bb1ac08a040d8bf90f7dc4922269dbf44184185111b922f751013ad4a902ee2f853cdf4fe50cae3a742a35e5cd3753aa709d7c7bdd3538f0075d3d18b90919f5e40bdb8020b22a9e32d2e8fb254692db0d1b4d4ba9781c2e50dd9edd75059b203157a938fe233fb967dd6d568efce66ef2dc4b2b3ff0cff6ed5101b146fc828e56980cc2e0eb510f13cfe62dd896aa66c3d7ea34fcc88ded688fd4918e8ea9f4d5eebe22f837164834b5e979fd4d0b2d97aa6101aebe4521b9e3a9200b8231476a37c45d3d4b20edef0cb9e049b671adaa9dba965aa210dc6cdb95ba12cf335ce9619bc90c0e5a9c147dfa8f2bec0dd07a3f0d9d1004ababad4accd9bab1c11c3e474457f258dbd544d9d835ac4ba9fb2a1539c6ea6469f2a8d3821672554188d3652205ebd1eb55e8704380fa78b732aa01b3ab096dcc063df739e67b309f616d570a08b6756f6df7cb09ef95a720c6cdf65e210845d065858b358451554aedcb6d74f5fc441643027dbf90449087a0f61e9aefc09c95bbfe3d16e1a4c8f2d5de2bdd1242854229d0978eaee295504ae72dc310b8e64d8ac0ce91ef46e4050b12f71f5953eaf80a320dea58b99fea38567daefeeef66ac16ba1b3e8f39afea623cb63cc99e9d7adbf575daa61b355bc85104276436c9a7c6b306d1937d34084f0645a2d62c08339773e7cf8da3a8c6f81f93ee0a1dc8b28898ce2a76c10879e03f6ed4712ec812d0605b365397524e957630c0760605ef11eebfb1178c9b295989c379817a92bb869bcf5c61cc3763cf6ce1c3e9322d85e50c8dd117bc1929f3b97893c83b004c5a739b38f478df458b8eb7cad667b76c15013bdc85c19c9ace0d6475e2e03e0a76b4a4dcffe6adfb4ef39c1e13ede2f53eeb0ee6eb58b420ab811ab154a63541e8ebaa57157d97aa2b61d29206c73fb7ab3abac729686494a34898c7f522985b3d25bc56fc1b46b5e0554558eab5e014fbce93c62aee3a73128c3ba387ef33c10eee20fdfe3062c47b3add94c3659c2b7595e4dce9199496dc478098b1d589f9d4ee0305302e212df042b1be5d35659ce575cd894241befde9e2567a6909ccc3d576164704b752d9e71fd283348f272b1fc170c6e588d50be984311b7625ad451c7057663d03c773312081f732fa2a96ea3c6d92cbdb5f6095ed322fbf4b809df811e4be50beccd3f7d675018ab932c23d661f3be515f08679840ff988b98c090cbed33a75ee079d0b06c8b2cefcf4f59b1f028adfcb21a50fad667900538452fab52c63d6c2b633859b2b9426eac4e2563db23c7b92aeeadfc83aa04f9cc812bd5211771c879bb7d44acf00157d6359a7554ca29eaf255678dfe2649f4e3a4a07dac415cb67c1763354d14a75910e688b0c0e75e39696333cc9597764fc190d5e7924a8891cb6ae7b0fed7ff1468eccd3f5a7e4a955c12df22438bf8f1c52cd2411c8ed5e2ebd1887a3b33cc565354cc1a3a30706867393c219bdba6c60bce984a3cd084e51c50a05e006fa26d4e5789dabc9b820e59d9a05cb0c3ae294009059ca1bd10732c4a6ef4a094d6ad3b8ede1c4049fad9dba92075bc2f5491040c7eb8974ab7b5c412abf442b033d4330baf8e523ef07541c62fea80a4bedb99092851b16c36bd7b5fc7d95b39d4d9c720f8d99f025865f49fb2f364eff6d8bb03ece10253e1bab2fd89e0b285d69229fa118561380f7e4fd6322acd10795d46b983d07c61289f98e654f8b962b3f389338835fa240ce686cd7a061dfd914512632c448bb3b8a430ed5137326134305f3292ee7e3eec82e324816863d2f384f0777c3eac0e65e7f5d7f4f6d4605deaded5b069f59ef790996f1d30a9ed2ea121de1ee3cb82a438e5bc81174d8c0adc968f3ef1cf047f36fcb4a488eff4fdfa6e8b7611e57272445b4350470711bd8fe884c664672e295f094477bab5f4e97e14ce5e1b5ccba84bd85cf14b306712eae2eba9372ee44fb524105be864a2105c1ec5df84067ca2517cd6011c65a533bf56cc7db6d3b0f211c8049cd34f692cd4fe189b8daa2b946c00874f6dbe664794d8cc1139f66bab4ebe1572aa6fa2ea699d76765a19778130a2b1b3f6d023fdacdd7fc2026cf14d24db7b3ea061154b5a51a0e7adb1210ccef08a57e67c7964d084efc747764b7c39c8ae52ea437c4399f6abf27e40dc4a908d3c07b4012bec9aaed0700d7d11cafacadd37650a75a513fa52cbfff632aa707948ae7596836ad1e0ee39c069d0df4b25496619a075e12f15a49a65909d9ed702bab5811b4214956e2cfdc5ac634bf06369017095ed29a0918df87ee25ca68aa181a47fa020544ea62f153b4fdd5513f8955fb8df3ab84c0302cf9e48d87e2b7d916223c4469e5b44b6572d2d6565a349427b7d60610bf50313da25da6ae1613a08515768ac2933fab753a1563cd2a5224b7e8988e94e8269380c0256efa7d40921b8a7eaeacd06db1a94d41dffa4ef8fe62481fd2d37827b577e4c9cac4ce740b97971767fba90f2705f491e697e3a315fa92389c6b639da671974f9b2093fd6ba8cd6be452343268b4cf0643afaad3fa20af818b524378512704f2c8bfdabeb444df9e2d3b7f0ba8a7a335b60f91daea15fc50984281172089cc10a25b590034a81d3962154e240e9cde26c89e77e36715d9efaea5e15a3d65ee7505a278d131f753c312d3f7f61faab70c3bed14396c47608aa7781975658294b779ef3ece395ced7cbf3b6d267d9a6640048a6441fafa8e38bcb1401e015ce114a66130f2bc42f0be2ab37fde126d2a59bc39f69490b23275739485b4e408cb64e43543e1030863317a60e6e60d9e144a4754d1fe6da38a0bff9ff8bfa099a25f21a0d4d2e5f97b4778a507e4f2b87cf6d4db2c0dc7e0d306704aad29aaf7a794e0057b9dbad7f13ec8b082c52f97d31c72d5d48d30ccbe0803a633abcf5ca9aebc6123a62c8e18eee0814b2747f969dfbe1d38f504e5b31754a6882f7049268351d93d9cf6ec2e791883a65f1dfb73344fd83fa15dfab488818b2cfbdf321986e512422315c2f1966a08b6d885511e19628c26bcfc9d08bec86c7666edc638d0df720e1b47c3a1e1adabefb13e8cc6cb2fa8101c770e212a5a99d3babcfc24970f7639718132d58cfa859640ba14c13dfbf759fe2c0ee26aad56a1ee4298820d215f6cd969f891d049ada72aed65ea8863bc6cb859c91f5eccb87a21d680137bb7447063908e6a4f8c979c1f7d467b5997503a8e61282f08eb99b8f6ce1f5101e6d8fcb2d790cc9c443b031b7e71cd20b91b849fc3d425d5c4d924611999966fe0f96a90011d53bd0be140d78d6406e01c53b7c86bc796ed0e35eab658178b811fc4d35ebd2b4b8090627092be464247d88bbc202645190aa5ba7feb893ba426d0750f5206204000253c21ab4746e8487c4c8fb8e22a493a54e2645346c07a3325799b2b17535765effc6fa8cb3f7f04ee9658884201933b3bef8f718a07925867ad5fa32a5942df40e122625623e6084acdfdb5def0e8cb4d53786321b6a70c486f3bc6beaf0097209d0a7ee682365ba6078ec295ed3027d19e0db6ab59196eca6e22b845fac233d136e31ff258de58eadfef5fd45783a2ace044c29cb8be57159584f9d7b9571a7e4d3e7d258768bdf310823934ec51932fc4c7ec66aa661138240abf534e63673a2324b439aaabf1b83815d70d1f1dd51cd502a8746f10447c122d82027c6c0283e02e1fd83a9aadce0da8d87fc513db2ef82a721af1991216f3179591d09b41d7803e071f22d28b378e10a69eb72a57d7db60149bedf130b869357ad24fcdc21997dea759c5846e58e28116467c4fee76ca7e57662a378f5a615766c7a6d38c89af8645747555b54d2a790922c2fd8f9f1f3070da84772a5a3dbaf5f54bd4408c8da0e465c44fbec4bd788111529f290928dee69d6bb727613e5c5ef222c41bad1841d8ccf19914c270d37e529ef0bca0cd921312d5ee8371b65b3c83dd6ae0a4f75c4285e81a8c6bc83d935f58aa6581ba061625a81aece4775d5cd5bcd2f0b29bfe351dca928fd90f37e731d5ffa744c028987c97d2d040f0d6f20c6825d16ee79980a8797e3ca924a6f53b48dffce55b8c809d2727638a86149207fe9432eb26053820f8d65c0ececfc9460bb967d27753cf2ad373336c38f4f27527c4d8348523ba56e54961b393277afe7c86acb80ef89b3c62c05c9b930f06c76fcd1fe1ee6f7a6cf97b7a2ec0c1806fd3b616d19ab4c748fc142bcdf6d338cb22c5a5443dee31789f7e5655a02750318a851ef8b3080358e36f72f5371b2e57f90bde3a68bb4c4aa5c9e9737d121f854ebc4466bc683ffaec2df62ace60f188de5a4037e64aec5d59b31e9e75eb0ffeeb9bae281fb790f4ba3cd75815f8f292b37aaf73ab10148408b72c28f0e9cbf910c20ab86764429777196bc0f80147945382028a0d358aa6db3cda35c539994ea3e2ba167131e0802e84146bb75efb55f7f6d6de2be958a4f045bff626281ee0cf015ad7ea26f3bb6b6a0ea53d70b69721ac6bcdd897270938c27e8d37befde444f9ae7fbb8921fadfbdf7f946420fe3223d1d55364d7fbf913c3eb46a5b0c8898150f8aceb0896c804d94ff8194fa3f5d5d625688ccaeb8ddb9c4cdb33ae4530e3ab22adada5cc9d6bfc8371350107cc142f801391e6f375f80f45e6adb59e4288a210e402aa0901ffa8de03b8a9673e36ff0d92940487c4ad3feb579b6136c8ba829111410299818cddbc81ace1cadca73c83eb2167081e28e0fef489b42338b69e1005779579340fec8ab20e75ea7bc707b9693f4b25efea6f1812e13bbdf1dbe095c08ed818f87ae99416213957e81fd3f0f2803cb317ab9d63d2c256e8a16cdd3fab509faaeb9ba2ff38af68dc468ac85bfb97531dd0c644838c267054d5cec54ffb650dd9ad87cde7b822de425c5a6a578c8e85d7d0e3e8c1ca0e5410baf766aa2d8bfadb6219b228298342b32bb5c230189603caa5397510fc91932b7208c3137038307d3b6bab7370731a286c05419cf2b1fda06a1ca54a4bf1612ffe10814ed2d17052466ef9c3e594b5a5121f0bbad98335430a25019c1a8fcb2b1626eec0fc191719902a93e5f5b49e5932d8af3918f65ed043a93ec737b47dc4c654e2c256eb9ea1f054ec38428afc553ac4915262dc16409b5242efd18b57452933466ccd738d030664b6a3e5f30eebadb29bef2166817650d811f7bd57a5485acd8785723c4f47ab6f1ac6a5493c5c3074bef7033e2d9f58f57b082a711cce4f06d4f504619fb9ad1824eb5b0fce0ed84db1632519f6cc0ac12569f13180b1db3762841803e05718dd21d4c84786812d7f157e48b96e5e7946759e4a400a86662f7ca22d19e705c7a70eb79d863ae3e63708fc79d664193035ddce2593f5b2398075d7c82ddbc9ed596bbbdc28ce2a25048a162d46c99c4de1087d7063bf436414da8f3f52873f66b853658f95a9305ce622ffea72e4122b26c49d7540ccb99254ebb9e43036b1bfd661b78c2e0e220e8e746896271b5501901ea34658fc19570f3b3a70c2d6b57d9403b652e8baf79c42aad077b3cbdd9ef4d65cde865744c9dfc618565de6538ccb3968e0fc77bc0147632cbeaafca903361d0ffc4d76ae4c184e0c4f86a9187d4c3ddb164dc4196d09e68b16c841b5768411174d54cd9466313ba617b2880ae735053586fe0d9576275de8732a7bd938b40654c700503b7ee5722cce0bb1644357123d5877b01df4ee19ecd66797bd41c6232416914cd4a35ef69330c5279ba214a78a7db3a800c1cd6d6dfb31f8e811989288606ec467ab9c9879093ef1b67807ff5ce5b502c2eb8c99e8d99ca63b3921e53c04ef6db94f0a2df0bde1332d1592098fff590d6add19a2eac6a74563bf51e2f6c6e6a97670fc1e58b3c4ad3b387b51eae84f1e63a6100eff29fd394f7fb897595012f384eba7e43382c3859873a77f22d62893385c724ad29126a66f235fb2864b0011095d322b849e2e919486d1e3ab2c9daac3d2a0bb609f8aaeb0c20fb169ea89cdd979f44cff1a51280982adc594b74cdd211e044721de4bd23a3fdf28f5117d9ffbcb4f7d0cd379d19ea6647d18491cb04fbf8e16bde9d11e7e66cfe50e4dc2bec9172401fc76c358b4752815906310d464192bbb6684826d921a25f890cbb857be2e32b313e96e2bc6cc330efe6203f2476b6038a6e48091e4dbc4dc5d1d7b7cb9bd4d41235c9ffedc5f2aa57c004bb5756fa35946916c388e26f3df804580bd8307771b8045ebbc04c6e6adeefe118a9743ed8581e5aa72682d7010c3f4c414f27360d7a6e3fc50670d811e65cf4ed4472665cded8e0aef0d0b5f315e529e85fee87072fbca4b8f27b025a5189f80eec7033533d0fa11594cabe096fa337525aaeda733053d0e9459e4dea33d4b2ac91237495a2ee7696225ee93e6358a6fd2fdae1f56696287732ce7aa7f41c11d6b513798d4dd0bbe4b055c09b8371612afc3a497522776f7909b71c6aef75373d969d71c0185a8146a096d04357ad3245fa962ed918c164995dbfc385fd764bd95f211b071d184e2544f889e2154476051dfce9279919756c098a2d2c07f70dc66fd6a6ffb3c134b2fd8874844a5fc5e0d15f4d6c7197d4677edc883426748d452a8dbada7962cefdcb8df1100162261bae5818b91bf82569f31207684840a573568d1e889b84248a2cb8ef9fb82f621aef2fa6f4731158169572396536e267b6dbffb525b8ee9cb501efca26655750549e44b92a8a2c21a48695a307e793fd57ae844b0c4f5db1b77e8d7819f07a94235118b8b645ebc9f914603ab92561468d0b493af3fd9963fb1e2ed253408e6e43ae796b8f7b8c6592b5af82b4aa772b3220e49d66926a9371e20dfe0aae5a50b43fb6a4c418c693e03e19624cfb3b6427021d545195610352b4b15248cea6bd320c4a5a8a031956b051f29f6e6dcec1ef9fb92f68eba0b5340b082fa51bc73122dec7b5a987dfa61a73464c5839ddab7c59a222e313123a9e10163acda40285af47955e3664567896d8860d4159803c97c206dfdc468ba85bfd85db132c424771706e0e26801054c477fee733ff59501abc33f0d58ff67bf5d9b010307c468c1f3ed5641bead0829f0473a786f80c112ddf0017e7e859bb7c7afee95fc815ab880f94ad43e2518d18047eb83d1d77b9d42beed20d3e357c79867c56d584770fa0f7974ff83ea7d26ccb6319a320bc3e763b332f62680e4fdad9b22c17af154fe1183a732e5d4dc084443b1097703dc7640db74c595f3b6d0f1986502f49b3ce72694e95b4c48f7b8c3dc1c4544401d22e5b6733dca273d7743ca177161a1abe2f0880b9a1407e71eb67296b7892ceb435d2be6f989dcecb4874fd73a492757404dcb02bb4704e908b0d5a4d7f494e2711e2c59a454eac15183082ee6090c90568e966d7bb1d4a55127f996ff64a0f3fa918d3e5a2c0f4b3f05a7c41039e5c850a3ea9ae0e795d507fa82cdb4169c02deff2e6990539704cc85afa2bc4b7ab3861049eff0f2d2a8a1d5584391e91b9f99b0f7a5046fb8a6e6c00973ac9c3ba053c35c0de582045ea951164951df02e8b5155fdca9af868a1f76e9be7830f56f1df755375aa9e05d0b4182576bad750b22dddbf9d9f3948eeb3ed52b16ed1213db2daf16ac6e0684efa85b41534db0357a2aa51a858bdec4c78f315bcdf96eb8056d797da4ac1fb50fc05698cb64798231b0acd7536eb8a3939867a5f11f4e6ef82c75892a7ce74d29d5199f25454629965f4a1215e428bd02ff466d7edc79eb2b4ab2a978a9f09a94bb306cebf9783dedfb497a3f0e1f24086847c60b25687abc853a2806fa70aa04dc6839285cc360248a2a990c5c1ae7e3d6cb10bc08cc959e552fa671c033a7081d7baa23e193b917ebc6f837c493e2785ae4e4bf549b879d4f40cc1ceab28aa2b14a8459decb2d00bd554b5ce6e9caa9212124fd9b1e16e057d4e17dd77056c188e0df53ea2f679994325706cf440e49d80f5150d8191c53c2638c2b35892b8f66f5dffa1506df4665513d2a8b000a931610bf695cebaebfd80cf2d6cd225fdf6515e5f5d8bb3f3da49c88797812d1479255dea2dc1a663586df4a50b7600357a671650624f264bd6ee7a31ef1fe4c8b7a902813413f6c9146b211b8e32e2ecc50ee3825aa03515b3bb171338a5b0dd618bd4b014abd5b52a08843f84a6b04e551b40edefd7de45c071988be1f50b71adf056a461fae7b5ccf6c857cc85b627e327e0464536e3b4707d95fda5217e14cb8b022a5e400133147608421c1b1aaa62424ce7b1f4a613d371910b92e36ef5fb7a051532b6a48f51952ec39eb9173ddc90f29776ba1b3ee2a7ea961bd2b6c9a1329db9e5ef0315d8d8e5629469fa7f2c7192816d2eb0eb7bec2e325e64d2dd0782c0bbd6cc42dc728106814e50b7ed5b8865d1a1655f7afd8ce0bc7e8ee3163527be4180842164673503e7558231bb1782f35a60975892e627fcb3c777cd8a2a5099bd21f9a2dc335517621316a9cacf5f74739dadbd90fe3763215ac754915cebfb2bdb11511be0cc362cf439005a00d50886f04fd5488b61013c59cf8d2b8fb07c17e79ec93bf09886a9474d5f5111fdbff6c137356bd670d75d72d53a";
|
|
3207
|
-
/** SLH-DSA-SHA2-192s (loadSlhDsa192), ACVP tgId 21, tcId 176. */
|
|
3208
|
-
const SLHDSA192S_KAT_PK_HEX = "72156900e450cec7b128a9f953c8948d620f58d51f8c631af405c811f4a03bf0fff8495e4eed37d12bd5200cd597d08f";
|
|
3209
|
-
const SLHDSA192S_KAT_MSG_HEX = "bbe7062233100bae1a0ec1f920b03ff49f73d018878ad19bd8b1be89d42b90fe8e758d896c6350036d6b02429f9fb5ebc67982da442204497172858314781a1d516098d69c056d224e153a8cd3420e5e35d202ee48e15e274c2a8eda859e18a8f8d685adfeeabec868cbbca3495073004c0b212d2112f4d70e96c15bcdd6ed0ab884dd47425b6956ff23013cb86cbd0d855cb073a9d12dd51dc8086741beec69087510075ef95cfd7ecafe4ee7119f17fe0319b940f67fc88b3b409f58e821fe72e94e5884bb109f16f069299ab8105e68615063bc5e5257cd94c36e9873eee7f39807f87007784e66d518924d4d5d4eaad91346d015967ae1bf5ffc0a76752f83b776f707ba377ba8207852d934162d90cde50ea2719f6a8f0fb3a882206edf28f2c7647bee1b8fe7b6b86f7f25899467e21d78559e214a1bf1e5234a1f31608ff87862c87d10ae463bacc4bcbb5c7432fdc7b481fed7a1558fe18b9c62ca937a742bdc9abc912e969e772d3f76dafd7d818514b3acd5bad4131f5aaca74dbd69eb3b97b9d9f6b8117b6056b9acb474ea8e32e91f337fb60be4b69074a3aaf7f530daf4ebc48cb06ba5483362e19f8ba394fd569e42ee43df275b4589615e5aaec23758375808e7e5d02c0e775fdd67293ff2d2fd58b92d89124cf4ac718197b3bf934049c9cb9567fbaf586f77562c1b08b70af8111a4103802102ee6fe394289b85cd8cf970e14aebe4189abdaeaa153a649006aa33398d1f39b9aa15814c1349151d226b677f98bdb42c4ba7613c3acb186fbbf7de3eb9a739f378099eff1730c0fbfae8762eaa2088e4e8ece1c712b2c24815987cd3450f06999a119f21a29d182c6f74effc142e0738cb244dc041d304182a409d2f5c2f70e9e58b5db158530935ac229b17caec89b3c7d903b5f8eb24f7c3f874abd3c54f0a8cb9e99ee2cf11ceda45ab65cbc7109fec70f5ab39fca2ce293f806a22e37b588866dfdb8b7523bd853cb29bba4e374362978e4e1ed7716c957513058c960b8ce166b4030b72367abe1383aa6838443d440d002d6f5dbe3d69eb4ec2f0e2d108e61ad3fe8c7c5162c5feabdc14db57e33803e75d9ff1a6b464407f5dd5fc786af09785c01b7c412c6ba01f1511237de94924be684dc1a06bdaee7acda9bd03e414bd0092c4a107f76c351f3f5d81a3df0d281ad8e18c28f02a49612273ad618be07d97b5028b1163fca0f575b2cab53c11ee7b0a48e361ab73031dd505049762aad20a13bdb5cd883363bc43389cf3481f66270a100c5dea90546bd01444c7b9e32d12a612d4a238f88b17a6cdf200ded3321accbd7a90bc781de860eec6144a098935387bc77a3933e484a0c9d60878b55996288fd14218668d6d8d0ed61d7d2ce17cd66ab5386a5ba99d0093f64ae6abf6360b43402b865fa0edb432d6e3d1e4189713bcb36feb65da69bb57a2b85341a064f2a70295c3f43889d9a09e45c465f5a34c4a8b860fe9dd0ed90320bfe97a8e52779a48c68764e19f42c358c974b46cdb168c33e19417fe3a6d8af9a5947b4c326a12f931400c2f7f2c1f9e0e234b98d3a8b53b36acf86571cc89d2b7e30dbfe1d17c150c87159051c3dfdaf989cbc44041dcb2535d1eae801f8147d15ef35e061928d9e88cdab05b0898555a7884f3145b30ab4214d909ab64a2e6377199ea183a537e7ddf1f71ec1ec72c66c9132205b9b96b480b995a98a5b908fec7cf2335fe1f6e9b8aaccdc679b6db6f71ae656ca0ad0695cfe937a8ee0829ace6eaa3fa369d152f80c2b3bf4e3a31434249a1ce66efe86bc95ad3134eee5d3d6b1b01aafa1db8127dcb5b8918d0efa2fc85974c4695c8e8959e17efb092fadc4bcb8f3ddd2ec9d996e7632ed77e09e14983a648caa909fb59ded8c3f64ef9e0fa330721b13926a2ce61f64f9021c76e610e3ea972f40f52ed407603d1973a8c36f44f9eec6aef872d183dd9fcf63ccfe2aa5a31da30d549d1f38ca0c053bb0b3bf246cdf1a918bb3f18da483ee14679e137578da2757e7dc2404704262fa007617bba42701e073937fda759ad978a19f8b2d0615b1d86f635b6ebf8e24fb8e77287e0c9fa3f2bb199b2aa296cb333ad392a54de16128f4144b5829ccfa0ebe226130de145c3434d91e674ea5fcbabb753bb98ce31dffa7f68258d3e8cbd980d9d09f5176b8669d2f886be1091f767d1f40e5968ad88eb1b2b7868af963cd34ff705e2c69da0c6ac2346571dfb25f7d0d5237b5f0c8f127fd092b731338d184fa4b93689c83cf46f6e65f8c008bcaee2a99b3cae8c77082d8eab03920f34121b065fd9a908a16c11d107d715bda12ad324c76545a81faf7d623e2a344ec676467bb5613390d3aa0fe0e5cd3bf56b6cb8e05158867a8dd16892697cb2b04df69f43cd802a5a0b257d4de0d37a8741e7dff1da824565ba13fce0bb3eb551f7efb45f547ddd4b5e936296be408e89b223d11fcdaaa00156f3c0aacb89ed6dbc3c8e6e5c2dab1307ad9b7b839b597abec869a9ab728d855e118cff90e5f8fa0fe53218bb4c521ccd7c925b30ff12e3f35190c483fd52ef5449bbaf49788f9908cc7a957e4dcc4e8ceca6fe61e1cf1ac0d678207f00c68a7ab165879bde09747bf43dff19d2b96c720fc54987cda0b9d0568d52ed0b8d45cb946738b93e5d51362ecc019b9f714d28652c0d46911ee2e91ec5f9303fa248f5d89f8a1fe1d19e1c0bdaa5af89d89650bd918f53831e6a1f87198bdc7a5d11d47c8b7436c10bbaf5809065fb3e6902aaa2738e5076c4814dd54c2b9bc71ead71d6e4198c8339c34be20618056c3f6bb2b552fb27cfe7b89517f77084579cfb9896d13baa1bb8fd9e9a5d372e59994545d18238c2b64343118e344480d75da91a35729eb1853d35ed15b26a12f946ca5c7848e200b6300a3483c1e750a51250046f317524f5bd8db383eef3c177c6d37585ea932862184baa96946e13f1b8dc0973e2d8ccbc50470b70451902dba0c8f1d5d809821bc3e748fe31743cc8fef99cf1cf6140b7a84e8e6daeec4a6149dc0ad03612ea54cdd8d52290750adfb4b95c8f7a4cb8ab9928e7c25d4ff3990ad9733c53f1825a89173d870cd9df9010ecbca285543abd195ec2b86d736c0a5fe2fc70061bcb715ce1e4b50ad1095be05436ca5a537b074a79571f62de3c6dcd47581635c0e447b617f6005b8437707d2497a9e03952b8f83231ea62828852e23f3a4242877f77fe1703ac0b73397b64b9a2ea311fad07899b9db538e35ebac3017494009c2a1f0ec8c98e41db5396e769cec03c4c5456d43ade6ca68e40c7a544885f0a20e4337ade36857582426807444378ab03fe4c607eb5e4d0a5fe454e3e1083435bdb2ae17ac43b98b5d48a1faf11a5d38e06b5c7cbbae54bc5ad3e1acf3a4a0c611719ea1706b1b8c6171b6301aa7ee3181488881ce55b74c542e82c7c01b0d0388bc92df5bee8168fd2ac272faa8eadd9bb1c7f0a82982a450fa8001d418b733f4a0d8f58579f3493930bb50fa0846d42056d0875ef1a461b218594f27caa9a87bcc7b317d0b347c3916e25c8b34ccaa39b7cc7dc133007fd255f0b9f62c602b8d3695c6b2708bfcd491ba5f6186b7b2d24f7b97f636ef11933db208f8090df37653d342e7aef9a54fb2b4a04493ad846ef8c2f42fd67f60797d65ac25dbaf8931fef31f0b26ab95439b6e6597688f08d9e7d4a7924ff26962ee6993343d40be284c08d3ac876c43a05544123fe24ee310a9d97689d7d54ad29f96776a4bfa87adae47e64bafa2b35e6e7f678ac508f965c3ef3eb4fe5c702254735f4acaa22fccced748dba4b6ffe89e64e648079f45eed1420c7bc74684e7238af2af9b51c344c77f2a0af7daa7d05b060b7343a3bd4712ea9c8de6e73bf8e230b65c875aee99e829ebc4e668d97dcff353034f6727e9e789fa89ebab7eb3340073c14867c3be094aea7b8da4c11d648829559a7ff956020ec45b08f7e4d2a56969a7764df5f958fd7338cd29e8abd4f381d07e142c9db7fa0f4e512cab8c83b7a56640a610e658a779b71da140114d2577a484688a4adfaa5d87345e90c2b490ea1d4b35c15ca80639085efc481571439cf1ef502d7dd4e09c0202b8fc91afd8a355c6c154ea1766f4a1d65f2b6bbc604030e0409b67e6a0ee901fd8c3acb81f678a57f475c1748d428ab8142eb370bbeac655b4b117530b5a3c82c97759f1bcb5f512ac17973695e59157fe6340ed71699732b5597e147a367f9bac676a2e9a791b550c24ea432d8bbf32c581997af5d8ea33a5f46ad81af147966ab4b2552866e987ee36b66b9d3d2720219915b1ccda505ebc82857401099bb290878044abd0cbdb4366554627a6c62b787bd1a6b3d81deb096e35f4423cee338cee025368af9c033fc999eab569bce286c7b0ff4d189092dae8e447e40ba4ed411aafe4894cf3296b1ebf546af8d3fda61a0fe71a3f5e3cc29ba06bc90721ff1e04d3895762fc86becb2e9b45632e8b44bd4f060ac2e214a4074785d3b1e499ba04b7997428aaf5100ab9fc43f2341a11741dbd90dbf3d59e47a202581c9168c7728d898d400f626aefd20ea8806c56199fa2652aac0c378e44d9738b15d4f209528ca0484db9b3e93869ad13821a77cb3d283d1eaabb4422c5d73703e8aac48ce580b2f8278331ccb11fd5f02f0d557bdd6c35ea61e79a1584d7db8f8674f91e59cc20d796553773029ef634d0c8faa156bd78e1c92e591658595d5ef6346bb744a6b929aeac29565dff08bafdf26ed236c1b3e22c4dc512e5df83cfbb85620b49f4373f9b31631a9f953f8e313ee5ec1908e4683fa5ab7be6546b11b6c8fb8d8d39f9d3de77eb2b39f397c7c9ab7740e13a88a712ff3533c805b7865c9d0e376d0939a88fc716a1bff75774e973819ddac7bec4f05896c6e289aaf5199b128168813b5b494218a00f890fa9b617bd72fad1117f2e76b8a85482fa9877262abfa10d9ca6e67c6eec36ed3bb900fb49dd12121b444ac39ef53821d7b83e4f8d3b320094fff4df9506155c32bd6be0ca2c3b38e7f4516cc0460d81868b82844879aaa799db1785060a166ca11b099c86cead5a3c86c927d2dbebbc74fae9ab72c6673c59f2af778677bfa12c2448abf2828c7027054abfb5f49a4952adfcc5bb4290e9b70c2f033ed46f87467f2c6d253e6a71c094fe13b02e4878f5ee5be5ff062048916dda6cf44d052518faedfe7d9027ae83ebdbdb8b32579169135043f97872347d9a0d4cdcee5d9c70794607cfa19c5622456e713a9de29ebab74b41e985ae6f02bd9009f649f3e25d06797dd10258b46549c997d784e21da3f396c0d0aaa2e9f7170a1856019ffbed35f61cab869251882bfc8c7f95761cc5f61b8645d128432325046353d0d061c6493d5d91a803bf89dca208fdc61efb8a6df9266366351a9387c4bf461c3e3a24ea528e91007acf2c7efc7afbbbdae7d44a7f821af54c28c7ce5e0c77203e7657adb4c8bde34609e0042bbf9f0ce8f1943bdf748285e7e9b31061d70a6ac3582e8b77d4ad6f23b3cf0217f2deff39399568774a885d01cf826227e197150c07f70abec8368e5a0b7657d194556a4beaf208ec1662ca62ed53be52f77aaa1ba0966d5d2ada3b32817eda04eb4a657de569a28ba2b5a26554359903790fc8d58b431bf9d35fa58d8daba1b8c82e9876672762c050355ebc8030acc067b8ee2327a23373b0cca55829f2c0f16232960105f0cc5732e087beb6dcb678a7cf704e9d03eb6e3f9e67237ea5a0d7f4058946b9549fd8077b371300630227e023fddacab4f6fb795f5595d8c3d279f38821c8f496ac959a4af3940f54bd95344fe7511fa46015ce8ddd55fa3a130b1f4677cdf84667c7750d7f2acac57946a55fdfebcef1b06b561a0f6c6e21a31965ce6988ab62e5043bb642c01fb62fddea3b779d5388c988cf1330dd4a937dc7dd9ee0faa363822ced2374987a7f8e86e749ffdbe980b856b90cec3d8fc227a04ecd4fae4d1717ea17612e0bdf8295bb50b0af6243cc952d4d2e01cb4da98e0b2f541b103aef4796bc33a87eadf574cac839d70ddd56f469dd7a9d84add42dbfefcbf1544d6de537ce8cc9382662a7daa2bf9f6b696dd720a8687e10170613757bcee155c0277a6795407bb477acc25b9ab49ab159a98ec121c17bb7c58a784a3130e4e8be328f3d60f904e83ef8f2142043aa9f4044b660a7af985f64eb50aa28aabd79b0e29f3543eb06100a3670ba20d0a32624a0e4febaa5cb5d77c32877090f1eafb312f4c379cf303543610672fd00228d5269b9474a608cb5a609048410497100a96dba435e058fede82f6f375b61568c5738c08a0fc80d6d5652c8f9bd2864a2a851e4438c79c612e3c91f57dde3087f02b1ac74ec29529db146bd142863a6f7873d2a63e0593df3bdaca36255ceb41376f16d541febdfd2b5c4acca7d73cf872b651682067f606015cc60cbfc18525e112a97f7fad26c9dcf30d340c953b02e78af8ab81cc54e0ee968268c79af039905661e2d924826b61d3357548e49d83c48ea6affb167c43f583a30218889c11685519a91800908e3af3c1fe0f4a6491989bf064ac588faaff7ae36ab2bc5e23d145bfac76351fb5f352088ac07cbed9ed56bf77ac6e5728028fdf38b583e0427d827acd2351e858129cd203819139deb299ee93ffdca54b13e3fe5e8d3152c5558a1bfa5b7072dbe9bf5451b96a0b00ee6c69084936cd997cd53e952dd11766ee8c6d8d91284b1ca137c9cd76222151792b30a5984152c317ad22a78d1313b38cca74dbbc852b1f1202499cf9e4479f7ccca94084a33163682912bd475d1fead3c3b1bdc19e1e226cb548caa4baec296b6a04adfde7763d883679daa798d45acced57e60db209817aa728fbe1b999e104b9561bb8ecd72aa9bf70cb1f98c994b12a833d9cf0e3c186bd99d51120fdf9029973712c8585502af3d7f1748f3f147c391cdeb39b7a772a83a13e3c021e81b0e55b5fad46cecd0937d917680e4427fbd6d830a1adde5df820b7fb538e87040b3fffb8b73beb5569be8c92f97397e27ef4ccc40629c0af9e129a989b388b95c9d28b00f1c21bc89bde59625c7c7093b85333df2351d6963ff07bd2038634c320e80e69065036b2d3f016dcbfff9f19e59e1ecffcac7ed83b91502774efb8b1bb1961fc965531d7232f8ba12911279017f0c2bc38efdd82e5a5be37285ae25f913feee78fb70aa75a57bfd92e637dfac97881564e4af1aa00f1b3a0fc8c2ee308ba05a60bf00899471006299add749946bbc3563dea1997e6fad8985151b761815ab7a3fdc3b58dcfbf4168e1d7a5d98a05f2b4edaf3ebf5d026ac17ed8598978e8013fb7ff9e3870b1067caa779950bc5671aadb3049829a6ea29bfc263ed63bece07b28612ffcafcee53732d82e009d66e8bcae9576586329a1e6fb4e0656e83954d97837b7a41220405289adac3b549de9037c270f90c658b3df06421cef206fe5de13829d876964e3bd253cb01609a729173d26c5cd17685c15bf2009f6de658e3ac4b5e27eb4272a41f426f8226d72000f39fa55aea9a994f60152af93a6d8e41d5e1e890ab6621193d56e77ac5e5d686eb4afcec283ed584dc099e0c6baffb06cd3567fd5e0b5be08bdd89c02f7548fe11869935645b874ddf469bf746ace6b71716f01ee3f80d84806147bf8cb4db77f0e4b94267121dcd445be56b9fdc41c38d0674fafd49d2dad900578218cba9c4a22bd3986063cd9c01fd58c6c2d694d7e3607b26798da3d47d19b634be2fcaad12a84224a43523f82cfe78a11e5ff48f4505a1e368bc7ce44077dd946bfa8a8a9e7726b765d9dd9543e3e2f671f44c4abe223f48aa6914496fa7fe81ca67ec1fe4eaa56aaaa2a1744e4c4c8cf5dc9c4f09980c580a7f7533e1c15a074e2be18060e8d30e3355e2ba7a39b81facf60ac9af3cbdabf84cf8b7e8d8c09d5d1bae066be97300a63b7bb743f494f3376e1ca26eb722fc224d69e3e97949bf1d36af0f3cef7db9a87970d228eff96230e2213287ddc40c2aeaf5e9932b8a171d94974d56d5d55890a48032c35dd718270d0f73905753b47405e512480e6e28ac442ffff8206f3055b189eb8248120ffd3df80144366b3d949f6dc6063b1a1a80027ad55dc4561f0e43a9fb94e843d1dbfb4d6228ee3";
|
|
3210
|
-
const SLHDSA192S_KAT_SIG_HEX = "d77bdf452426e085edf5dfdc2f207b9c5e931b1d3ea3daab79aade8d109c13720a3dbad9cc7e54c65a6315c6d3831ef6de22d4e97004d92576fdff3d5e0a867374286418bbbac60b3f7b7aa3652fe8ae15ea7a1ceb77a0016eb19f90af10c78e972a654f980338aec5896ea544a205a114bffb62160e3568687b26224f3fcfef0b68b01f9ab410e677f109b2ab49e1965a4b4b5cd44c572a1ef7016ad27e2be7e3a5caf6d9f85fff69f479767d415b1fa90b825c19c8ecbac78665b15c30c2da632b7aa7d44d35ec78b0f2e053220af1a187bf0f2f2842db2f084bbb834e9ee457ea83b89ee103ecc2090f1b5d0987683364a4f46886d48eff392286f0dfc0c101471aa37ec9c8b816a2c21c07677d3ccf62384499866b485fa07b0a18758daa51c309490eb33174b47990d0b13cb76cf447b27b3091a411f622b5b36ee8d7d17f03715e8e7e06b12468d1d61370c644ba761e4dff978862169561dd54362c853bdf2b4f9a27cba5e76e32d260d7f1b08e97c4df79dc4d791c3dc3f74069604ba61f37d27f3018aea623ef10b88c1a1a9bc7f8503d8bc082358c48d530cb5a8aa93d313b1ff63b243c8079822d822d7392f28f17d507697f1a3f12b61e60bc8fc40eaca3a4d8de072a82a6531dfa182da34e8f7fe15587ed54a81fd776caba151a7b3ef22649f9f91cfd5b373a18d3be2bf05c178b13ef3335f579f46bc180734df2872185003ae2ad587a0910d8a346cf60ff742b62797355cf3d4091ac714ce9d276d03fbac7af95f36c9075f3d973401105f9e28b313b5844b199f178e95852ae5b41d25abb462dc58ed6323ef754dc2df2e077f81fa47cfc40880b2bd79026cb8073d10b9aae955ab1f177f6e30f37a5bce0c4b0c0938d35652eaf15dda0f1e12c7bc46b1577803cef0b039b09c852c2075fd7bb888a85a6d6a10890fc93682691085c0124269cad1a3fbff01693fcd58232ef72e86eb783d2d4c333f3e5b57ee6b8eb741725b04f99281e79382ecdea1aac43dd64108afc2b17d5f2ae1bad7fb3b356c00821dd43ff7a5b332e78a6f60502706465ef8c5590275d6218218dafbdd67f444bfdd0dd80413c4c202615e02ebca776f8863b76b13783b7cf737cff4af0bd48e11405c4b75e868f37d82e52bb4b1ff36977c1aaca788aed2860d6ec21d20d2f5319f7667acd514ea2228191f9750e25438bd55ae596f17c15db7a32951b2c750e5e77cb5838985478fa3d347782efc1f919b8dd8b5d5188e491ed3f769ee30e9b5b311f24fd4a0c523d74ca63cebd3eaeae0bf004cc15697d69bed2da03affda7e22e343657f9588192c3f02aec25f7a22da576c3b80a1cf5eb04f4e8953032559eeb77f944d94d11a8fd8517f62c7c5ec9b1dc0336b27ee52c07d8828d7f34f143da8503d26828b6422f6e1c51eee343019db1872c2d90af05a3d504b2738c3e42b72800c9b603475e272189662f3d67480d0d811b5af274c197070a88cc5fda07f152647be4e25e35acc36712312dae707bb2721def9387e8277ddbc0a58be6f2d4bf4991e966a0da6b2283a13f664d5b0e89db274d377f44c26bd8c4c00f28b6144b8eab018acb3d55b5ccec55773ee1ae105246f10ecccf33c8bc7e70e5af805e018a144c2c9ec99a227f1a8e498e86b177dd55b32b6bdf787b8a8ee56ce9ecb2aeba11b475127ccc737edc11a173af991342e05b4885860eb9a5dd6708db2315906d7a0c59936a64a7754ebd33330401287aa5d3fdf142e89abbffe9e65193c39e55fda801608a2bc066dda925a52c8aab78a58ddfb682f234aeac0e0529cc6db77ad3a22515401e0b2c69ba2f2bfca5835b7e80a69210c75663b482a3912dd5ea83873949246fccab113e3a4d89c2a9e4369134bc5dcc170851ffd88323b3c8c3a5b2ae51ae9aa992055151329f916f1395c8fc2554d9a1843d8173aea4ef6d609adbb0f097187750cdc22dfd7a378510f33fb67389ce52c3c864eb9cc3836609864bde394e16462d60999544645711e9ac7f55b648c48af6876b98f28836707cb6a8a06dca524d85f987691d0639308c180dc4a19d37a7ffeb0ecb3e80025f76f0d12c150bd0c6ffe530d1a8b8b8fbe18dd9f3bfb0fd168f9a3649c3390dae231a5f4009a290db7ee3485f2b2fed38a25f0a31c755ed1706cae31c6d810b59705d40b3db214700fef11ebc4025064718dbaf98ffe363f112e516945bd10003efbd6c9aa46188f5d8306bc236ba1bfa476927e69d60575b4f5bee9597cd5f2959d7e89a510bfe2b0a836cedfe1d34e09137d3b0274646f39faa83dbd8b49824db87d38536c7d431a60aec5e93183614b657fb0d74c2ce28b752339b284dfab08d01dcfb17df2ae99b1747e072de212fb715d817d9dd46cdf66c0c246b760809792014cbb6edd48c25785ec0f5f732b7d60f710153c19104f755ca49e2020a3969aec3e6c3dabbee7f2d6506e6549377996d06a710db29b9ae63e545d480507567185b450a445abae192e18812ed75ef9f7de3575fea23bce9129ac63500eedac678de72479893507454f8f3e04c52aae6e16f43d4e654ee5efe81897d282791acd9d584a969cd4915d4bd87d6f540d639cad4f7c478e018bcac149e37c81d1695270ee0f199cc83cb458e96863d1e77e123a5b891ce90063913066675f8b27d25cc47844d3b8054a86851e6f656b5adef84cc929e14cbd09d8c7d3a699fe3b7f59d1c54152fe54eb541f0fe9249ef07f4b7fc399aa495c1e87429c509987ab1641ae444580cf82d8f7ddbb0fd55d026c17e22ed3a20e6d406ec81eb1478a15c2d30728828219a5bc949d7da96f23d091103342b003ea4a1ab9f6a9d49940a85f3bbbb7db326a37bf729dbab56ce40c40fb71571f6a4e9998466dac9c204bacbbad51c9103481507cb482dd6bd5bd5460c22db3a81b1889bfcac863b7bb54a451a70f7810637b57837c81cee67970d299cbcfa313aa6602cd81cd31d3f5d1d74d79e3c1652745148ca0f84944c1433d68485c16fc2c180f51da90ce05fa0d694f1829c65dc5800fa773f4d219ce6b923d33ff5364edd0ec889002f90964dff6b5afb1ad70c07a88e83dded9dc3540bc14e47c2fc01e149d0a581aef31f191c77517f748d322cf4b28ffb46d69edc0e5a0f54b55fa79d585d2f72d5e14d7788ad0635166a384be16bb189192c9a3bffe5928eecc8c1320b1a8dd46374a09db5f4c3d77499b63ceead4134b6a850f7695cfd07c2bbc6137e505e066ebbf7d2f8947340eba1447b000bdd25c9c7a7450b79abb7c562dcc0310ec5b1de062640c6870ce984174bdb8a2cfe997425eff2eb2144317c67bd269918f2747d05b86912525d07c17628f583d4ac774cf87520486057f08b8a0665fe439607f52163dd22ac92896419fc4c60a43244477e2ff94b2c4197fa4a750d4875caa395432373988efef39f7bd97846dd80fa0a15d9c9083afa6736bc2b59890282c85a2bbaaf721acf3a8ce7c0dccb156ef9486ae9b125d32f3bfa70b0e6922ac9fe8953d9a693246bee30893fc6abf3da8c21ce7cca12a135f64886ed63d9d199886ec2adeac7308205a15ef001ad62fb8de37bba0dc30ca25009a141316732e13bc6d46421a50e1f7c0605502be46ba52c4d0da8aa31434fe815458619fffa06ba33a56c905cabfda760e8d865606e3bda6fe4fdec7c6b9a585105c9b3a32436a36b08426bca31c36eade1affd54bb1dbd539597c8f976274c35fdb3ec5611441ca4081a771e70da5340a16a111ac8d2814efa1e18753297673ffbaed2decbc42f6c14bbf7b72d5ccfc307b0310f870c20160c16dfa5a81295ccc2603769f14c6ac2a61f0ff85105f4bbaa539d200c67e6223b5ac0f6c5fca0b534c9ba9eb834978467c03bb1a7125d225de381f5aa23990c17f29476f7dae4428c507d6954ffb2f936271d9532c2a81fa68417763a70f068f472dfb1830f8e86aefb93fb1bc0a8910dc0e123775b8fd85f6aca2c9a3f43a527fabf1f2011632e89d54b90e688e93a3be7cc0fec1e0decf95278976b2832d0a08bed6cd2bf7aae65696566f446882abb090628db5a09cbd7e54061e0acdfab3bbe2e5b7ffd7e30c7baab69d03aacaa7f0c41ececa64dd041b51e1dc55ee958e3e7cf87c19168ac783ee8455592d1c2afb642572b7fb5d48d634f52c26ef616deb27c2a9745014c303723bb248737798bf3716618ca0aa02d5d7a042d72ff755aebbfd750dd4d3003a3f9f9faa019672ead2e7471145041c876466167fb2488de7ffbee4da26105bf35cc5bd2314624cf853507999f2061faf5cf867c3405cb4d44753eaace77fc4bd2833d5083798143980879e9ae7068c245cc4783912a7bcf17099df6eda842f91c6f6fa78fb62b48f9f5472dffca4da8aa01de0282779082606a7eb40c3d4b4f1007cf68a7d63e739f4c50e61fd7a5c92b15c81f7da7528238c9c5bfe6954c4b2304c30ba12d89114bda412edb26b82e4a755abf358fbed9fbb0e920f33d1a48f8442ead476bd10398f4cd664911ce779e7a4f43627451459de445c0752652954fcd7d599eeda7bf5d3e789532116efa2747c05127194378c8b21d8597755c0e4b0b6c958bce3e9ca5ed0c34e5e1f9a2b6d255353355b129487d2dc03dadd58f315f0074036359db872284e5c0ed6490ea5bd738297fffdc4822d0662436a91ed30f1e15eb8728861b158e62c2e2230a80df833152fc13d233755a17afb8ae8df26ade1df722312e4683ea7afe12458e85bd270ecf2e3842bdd05481cf7f9144cd097ff32e349acb0627f18fc9aa23e189fa26450197dee142ca7a09fb3f292ac26e59fd605058bb7caa4aaeff5dcc979af4f639467a3a4adab48b8d9c5686a5b260b66c53f8b770eb0e49fed77f177b0267d15bc0603e1f36ef6a84a459a4ed10876343b5604c281cfc42cd234403cb0aed97951e37f41a2f4bf91d823f0cf0df06fb5e3dcfc4d6ac7b4ddd73aafe66ae13abe36f7cc72bc74a0189231c513955d15791ef3c83d5ec86084c663967e1dba70cf3913b7e9cc8f837e08f983a12e5ccdccbc0957e10d64cc711fe34270fdadfe9c1931895ae69ca7b94ced9291b0c809626bfabf4f9f26c9743d4d436ca3e4e0d26d7b42098d4ebc34cac1d1c3e3f27f6155165fb8f3a2f27ea8ddbac5e778a15f3efcd64a493603526096add92c3d5ac45306cf7e721afbac3aa20cd4652c3050c2c7b3106cb82b5af283931dd3d863d396508328842df894701d55312976c79176c44fa94da99367542e4bf77a6e62f25aca77a718d8f7a79ffa55e0926a9f88ceef87921387412e6bc75da67d6d4ef87df70001113d740ce739508da5504f11807ea2bbf9c39628950ecf8939498a1b506456b609146c42dc77dfa9fa629f2d2c3dd58b24cb36f81b578b57803f0f0222bc8f3dff9930a6cca8ddcae66301ea155cadccc56c274c4e04721401fbe521d55293e8dd23558f004974d0a6b67a4658c84a60255b01b91aef597d1153377e22d9e3e392022de20317adeff0cdf4df77f04a5c356753054167394e9ce6c925d0215a6d91c3a699abd99e7b0663cdd8b9a4c71484d51f2c55ee74e1516c7659c2d214795a071ff5d55e5faddb36cd2163423b170f890c0c56a7cfb7f45347a7a3899efc84ccaa61291e1228e3e544dbbd76b858e13d61d81a22a51f75b409ead0f0d4d5adc343f5e0fe04cb191dee6d5de9e587b4486a5d0c93a4b38ce8bcd8915d0089a371ef0696fe60b8663aac93746da297c7d03c8733f75d33c9daa287da8a63de030b86e2d0c13486569d9c3ed8b0aab389acd1d12dbf9487cb66d02338361cb7b1648b39e345faabecdae9bff533bf4250faf2e9c26705f2523a3c72e2a52819ede12e0c84586544c3bfc205c12dd3c97e3ed9f2e100e1700d66e69486d5554567e75777dc095ecef8cd49f60364bb734702da12d45766d2511ea7e7c6fbc8298df14c927172fe0b2f9d81d1bb0a278c4e14256cc8762804f47a0cad1cd4dc294b1c50b174a01aef5fa0726f5ebcc28194dbf3470d4747ca11cb67eff5cfffd3e4742f28fc3a5e98a123adf01a67cf276c5e2bc60b5887f950cc8319364f2791505522570dc93c63ac546f519f160bf238b78cb05a0103bc8975b2cbc611b5c5ba3c3a2c0a87a3fa56faf85f3f1ee84d352dd74d67bea30b0fb0f16d87958ec069cf534c072b9b9350281ebc71959be1a25d4faa24911681c707944ed94e14bdfcbf244a33a8b56b72047f87a4b40b3e3f3ec88d7244e4c685c53f55b4bb2d54f16fb68403e99edf203f9a6ff8ad57f98e21ebeb78cfcc1c42bb62029008f6c6e666f65313719e16cfbcdda27acc623be231b0650c312b92e62ba270a46dd0668c4e8a8239e9107f9f00252ba770250da0c8cd3aa61714423d130713f635c0a02c51e170fd15fe286e6d9f2aa7c241e31421569fc6b6f4440d9e7463adafbb5d061c3d17547af6818a6a1d777d30726f08a10046d71c421b1364a545969e35b65a9e81c11f99191c098a6aa8de940156db09a8ff31d595eb7ad2765a82dd8a6a94bd1b887d6d7699fb6deb19d13b8a612411f8a78cb667bcf53cc4fa3b304584715a9fd6cc794d0997367ed800b85e7be80730ebf1a6d83acb75dc83ed7c1445ac5b9402b71df27819cb641159b8e6c1e559b9bfe7679d7ee9906fc07f7586801a1ec7bcfa07555136dfd6920e818974e9ce31ffcb2aaa72bff4ae819c56f700e3dd0595f4e7c134394a100ed755c088df33aac476b64b6fd066e2f53791b9c1366c4bc79e86ef0c68eb761ffb81849398841aa56a01e8e31684d466a4add4703342a50859dacf4943e5e266600c9e84f430c92b902566c5bbe342d36d83313417509499519818c59b23805337bdda880806888f587956d75cb2b785e4a40101a81f8d3a2d523bab0caaac841ba7ca5ecdd24e81e7ff9d9f48c2c004f92ac532d4da7f2dbb895bf7d4a06dd6ef72e00971b435023938fcf3083d1f2dba5f93b2710fc13a4dbc29df8a66555916ef36828d29c80b3c8fc2ee194d5e05b79d79a257e620744db8daeea0c6e35764c21991b54ba9937bee1776aaf34ceeaa535ec7c1d7b78112ab318e57260a49114f57c011793d5b344825c1cc8370f220d4620968f9dec6ebd8d7eec801a8c6b13e599f0da26fa247e044af419e67b1fa543af9968221045eafdb7677a232f4632320e159daefba6f880409472c36d1231705f652144991f9eee53861905716865350ad359a371baf2ad9418b439c059e250ceaf68fc9417ccb2b4ecbbf68e8ada5ae38226e390efd4396b161cca8ba1188f9762a4b41d9937edaee79672d387cc520ab47c11225ecc5e6ab631602fce0fcdc31d6afd97e0701e60e2a46c02c9e2b4c1eaae651e9575c65d9a5ac8de73c096428d05a59424d5cbd02cc288044fa1df7d1439a62fdf050d493b5861547ec42075aaf26a318ba9c399c663997e66ad26a0e329770c81c152b7ec110937e9a44a8905eb861329ef26934892198228bbf813739b294dd273207e666c897be5eb803605d6c7c3f2bae316879af868ce108a33b924f81013018dd7c85a887bef52f2969951bb552d2b693bcd797de81978cafef95dc5d173af0f4274a820646c400a5dca379980b99256d6b4c0b573a9cff926e3ee40ead702c5effba0a2f545595db4ac0738380e26b40724e8b1ccea8c996e94513cdacd03eedea8fe6a9646bee8ee32954cc8abf21c82ae9923886291852ed0a89ec2e1c5df91d5a1ed2ca64b5d565b7416737233f42ebb3e7afc643e1c0a14dca31716f0612c32b4fc97ea99dda22173cd05cc85ce173809a9e21996eaac8c6e3861ec6558e5f6e759b115440b85e777d27f0b79576a41e82e2ff3d38619fb45ef9f8127c327c418443cecd0c25bcc4f9994798f7523a227a0c05025a262ee7247c4a647054d35baae0b1a04d1e555cbcf3aa4dec66122d38f12e673b812e1fb8ab2e73dab864e15e1696161cafb761d6340c594548f326573cbd81503ce09528a4bfbdbfa4f56d52b393e0ce95d216d025a643ade12f933ce91f8c38dfa7fc9b9075373ac4c33ad626e3c95d4605d38ff438fdf4ce2b8c5759d6fc7109f47fa6060a48698230fbd2c71fa0e15a29d7dbacb267321c602693667b6c6150ebdb0acc0cead1ce719cc679a5f7f49ffcd8957df34fee233a72a18af18f0bbb8b889b95cb9c4a7cd9455c5eb29c3c55c911c12ec7bddd5b1eff291f247a5c8991b8004e8c327e1898fe4ea2b51f82a50a4fa5e3d16015df5f03618d213d25e030baa21a59fc43f429f3c471b7e9b0be59ed4f82feddc888a7ca7dab25600005c6269c3cd29a598189695fbe13c46420061f8786a3a24b5680c7475a745d5a1e701c7f2c9534cce54d779548e655135bc34ca846293ccbabd0145d871c5c37d41b2f537df57e3022fc686dd771861347984c637b5f0b66223f45baeda318a79560d0068939effab6e0a40375e9be7393c04c33b33037971363207fa2011f387649183e6f2d87eb053811edeb38bb479c18622d7579cea9f7eeef130afb8407451af20d3deb31dc82624e447311583172840373159ba4f22bfb32209b73453062e26dc9076cf5af71e6349048b1819d32310c2fd81757506d8e9b6692fd810bfcae9b1da4faa609b8d92525232b57776e9a6bf10cf1faa3409495155fef22d200793527ec21176fec5bc6aa78d0f5bb00aeb737d9ed750e6199684df41435a2b7d1804161dfba32685cf2912ea97cad4160e8faea40b0d5ba6deba51bb8604701d084a73aab2bf23950a5d54ee40e3d15226b9e1686f97a1aac804bc9f9ffcc8539fca6a09c53606d9d92fe544761c8fc7d5d32687eada33771c2a9041830354e908677fd6e26b3a368609b55e819fa5a348a21f6c8077792e45d7f1f0d9eebfb83f8d7dcf905f4e651868c15772de4813a7f65d1b38f8ee20fbb85278b90ef05cd1750b1a6f002d1495a8739d116a4dd2784c4c43102d19e62b239c1486b7eb2e0ba93466c003a73b3fbfe345753f08149a6a309b335e71bfe57b27075957747a22beec6c77edc477b6ecb2ef5b545862f778f2ba0decefeefac9d31f6f79c2ae2b2a8a9a35c66a4cde333c9e138dd0e4d7c19d231e3f5a0a02077b293a88e77045d37c302750aeac842148071410a6dc6aa99d478598188125af0d09d7fa03f04b77ae4de363c4111c08e7d92a098b2ad6ca96fb82ba119d601389a55fc2bdb236fb913243ff9d88d8caaa71afc5fbd891b5b0254cae1cceef468dfd488633a9b154b06839c2699bd29d2ebe1bee20add8b82953f1683da70d77b7eaef73161e2ecfc1a71b7e7e3216b1e5c10a10860dc1a293173087824e8ddcd936812ac37912d80d9ef717e9c27b1b1a5af36829274bab16897e32656108e045c21e7395bf5de499d27344251ce5772169c49f137a07f5ee903c2d1c95f24e43b2852921cc7a0624ba0fca822e781587df576b35bfbcfeb81ed3ee050dec65744c44a1186f2ee31efce76425dfd57e6080f0aaa1d1e73f6720c63d79ce60dadce5facc2182b094466ee538fde238a05902272a67f46a9edd66cecc421c8dedaf709dd1f90139673190b8725523c26991f58fd2e5229112889b849dd91fce3f3ee75c0c1417c4623e4b9bb06b768c66da623e9a3d703222716aa098a803f6ff8b1cbc0bbf33f30510dae5f2c31323a67508e42bcb77568da78059825f2c516163a4619e9537514b7361e493dbfbae4fd2943bab535921508abc7625570c246c327cc93dc1cf6e4dcdc44d895f2bf6c7d07f379c69b78d1d0dfb4295d9866f0faf13f2421f6f0417f04e9c3677e67ac08a40bb56b1bd37c04342c20cce812243fb4abace5a6604e54301c762db15d0cf7b42ee9e61470eb92a8d773a3fc3a66f997e098601c48c2b40c38ff5b71a076f1825d9c8a4baf86882c3702a8ba16085f9eacbd836253cdcbdcff51fe569131fe642a810a027ef5b9f3bf27e5afdd9b321396ff28c6963abf3fcf39082326db008c20609771e13aa7909c1360248d0c4af1f6daee3f51ecfdd75bc66c6a755e2992f099c8086029f796b692e21636e72aa8f3a3901150fa0f5f3830b73c790b81d2a8c02f5452b8784ebedac78bb3f90445cd7b6db7536baf128548938d22a368be4bb5be6f60273ca3f98216714a587407f78c54586053f5b30e1aaf1c83e42675c0da5a8754c79c54279256a9b1527312f35cd63d25549ef43f4dddd0846d669caeffbeb0c57eb3de35abbd784a880222f0944be18972172bafa0d5431731d28688b5bea5bae320d7279e3b016d6a775b5e0c7e62093a72342b1713a7aeeacb78e180e762f5b4d3988445014318feb2f8cf192370ba26e32a6f658ac0f164eee485891222dfc56af6af93290c490a2d24f993b17b390012e52569728725fb117ecfcb53830308926fcc3cae5ae25b1b431811771840b87a46628e9191dc63830c5d89f5deabded0db0e4d1fea07ee786de31cc4da8ceddb5367c3f628b5b1654ca1485993156ac6e3ad9203d4537d4bc51b97ed3c2e87a26a881a95b5d23e23655b7d2229fcf002f12c439b521bc9c8f316ca77a5805bdcef2022a06a4143df818e59014cf7c091a88d5441b71d5310bc8182a27ecf04a0257c7b2217e2b43a7fbfb94dfcf54a2fba01f8ae5069a5bf54cf083df3ef24f243f7aaa5c8d66b0e60809732a54292673107ff33bd9188e09971ef4347acbdde939840ff080d449297e47c43bb404da2403e3751a842666c2f67a419a7f1faf4f48bf0be74fba8fad6641f1a0281eb15c31e8a0df130f48b1bf27685ae81a2ec8cc984a9817957b32e8061269ece78aa8c4f8112959a82c5dfb3da72cea6c3f82b3005644eb6842e8e0aa4afc2998f18223495752f04fc0173337b4bc5bab8ee46ee7d606cda026801ed952fda505dc748d93f2d28d9996603a9453a9fa18d14961892ee2b44b0bc1120ba156eba079e016393a102a9d7e6468126c41d7690c5adefaad3d52a36bd7b52e34f9135ea4a5ab744c044890dd0bd26ff4052ecac0443c54f96a808fde7bbeb3585b83d022144272d55918de687203d82ed6c9afc07047bedd2681a3d93ea9b7d177199432a8048367fe90ef41845d892ef09ae91d0e5ffae10ea3cf05e0292931c44347a4efce931aa1497fdd4780578db82fe4e1120eb57df77126c7426b74f41cd636d0d29c46536ea31610d002da0090b28777ac20fdf1f339f1cfd5df79bbce02064f87e7b3a6890b690393d6c7714bbb374dc698a3ffea29cdcceef5979f2d386101fd280b92c84bbf837710d84c6f0a0e9e50a8428ea4e59e6c90b4570cf0a1167888e002b6e4ce8d982fe2df168771eb8c7dd2385525147ec7e601d29d5adb351776476ededbab7502439dfa1aca2f6f34b89198756e1122a625f116924cc06a3e024d62cfebb85b0a672e4a79d92aabf5c803c593eee5747cec670a5411c40af8b9becf3f92fa8f51ce47e2071bf8696f6499a7a86fd6d2d35beb5e3cc3d209161bea004c950bda58325bc6c2e9aa18f71d63852c532dae96969720cd400150e7028636c640bab9153223b4a3853d1a54b40ed80474ab041ed647adabc1878d1e75e9ff3a7db8bb34cdcc40cf8be1f9d8fb3f5dd9cb2bc83a1560f87a1e855d4e7f814044f80c88c66886f0d4aaa8cb642cf309abeaac6e379261028e7f3470c5ed7f1ed023921a205a4f11ff2fa57b67930d2f59ea440f7080d840441c70456fa191bb8cbc91c809de44245dcb9371140966d1c8f4e819c03ec273ca2ab031f462aa93e4606a3f518df6490c8f1ce311906edd3e2822e844d948f10784f7f4865905b162476226fa6613d7050e7e3f5662d7626951048271d5ca9b55b9f71ed34f3d78546168c61276405ae6d2a3d15bb7751839cfe2fd050c85ee6becbb728ab2a33773672e5e77e2037a9945b04a54c20e0273bd5f5cf6cfb5b85a0b3db729357fb6ba5c237ff9adfd7c6e820881e30fb74ea16fbf03c2a0359978d1d2ec0deb8f9ddb9f1b000c58825a680bddab8311f3ff76365e6787313ef2d91b96f1fa082311493bddc5fda5dc4d11256bfe8779144ce0ab078ed358444fe15320a1ac190c036f4c743309b7903bf28c5739348e8ce138bf291b5700e92c3b258ed88da3f15ccb60b2dfbf278559dedf6f2dd1fd428b4fdce3dde298eb34d5942b4a782a22477426e7ca3a74bc35bbd70b4f0a11627df91942d9abfbf6f0dae1c7fb2da125df0633ae7177bce5fa80ead61045746f6d1367b42023b6f829c1b51ff067720eb60d34fa75df93857f89d7612f6ae06a962adbe163e28e3dbe45ac15dd90405eb4ce3cbf95c971e542349e08eb5ea6f9ca9138fc81f0777eebc24ccf5d25b9d6e5ea315b7fc0ccbc7bd91a34c7bbbe32677ba4f6645abd1efeed99f08d2eeb3500a92900c5ca18c6cb30cd5e142dba7c13025cb8a7d6064587e4bd5921211861a7c742db6465dff9aebf17fd1e346b003dd9b2a71c786e5a4bc7bf5456d529e5be04058a35f500e4b01be2ce847c1c33fd186f84f055f615369607332bcdc2f79226c89d4ea2f8241c4772fa53a0d65bf8ee110b664b67e033aaff42107f900cfa87f3fa6fdadc425975f8400833f5e77873e2ad9a2f100d6950c5e65d411213ce5e66cded2b06ed15eabeeb1c1106252342a13e65aa213f27d9144c5c341c23707017aa01a94d6b1a7531c5fe8ad99aec4d5a63b62f2856318d50fa33c8e1f4a3fd8d0e8f93487a897acf9cd726292e520f08752c4296804b857fbee7fadcc1b88e2d8305e9f423b5ec80c25da2411bc8a0f4086a44bcaf8836e21e05d0ac8b81701c68fe3cf0bd6da7bffacff4335eadc9a2a034da19c432435f5da825c7a13ed1ce295a658544263a88c3c761ab1ad29552275068ea8c7d0f5d7c18e8199f9d71d9594c0ba0cb68e6819c97891ca39097bb1b6f854d839b8dbb166ceb848617fb85700e8ebf61d29eb9c32b5c81e93605917e8bc93e80b47c460e6478a6afc18b53a060ce05bd9d393daa4d9eef86ed703e282a8c9860ee4429f3086658a65dee1310f0d5b6f0f5fe05f22f285c8b16cd2fa780100b01be93b522ac39163d2b80c8cbe8baee634312f7a7fca72f058205efa94ca1423029483a0b9db3f3b58efc101779aadf703fe45296f6676db8857ce356c43a22548dd819a3771e6d475a116e0e0d4beea64d23571e316883d7e30260cbf6289c6b58d909746cd4f3e624a483c217c6b4fac8ee1baa5c0bba239d5785ab16ed2a06d8808f48211ce36e4c5719e3f0a8e9db60da19cce86106055e94a9ae9d935d5c232c08ea6527c401924f822f33202b0e85e6342d0f9091cc3df1bf94b7f6234e6bfae91d4c1db6fe5235da25e7d98d68de875a4db9c980f550ec8c0cf7b38edb8eeecddfc200561f2f2599073e454798421e66b5024714ee7003475719cf95622528765b43c66c1c445b67b7891f86e527e8c4fcfe0680f89a45950d7e1ac689c012432ef20e05e27f56f9b4ce61677eacbef86fa6fbceaa252dc4016a4a2c58bfe1eb8dbdb382ff46cbfb57ce79268326852944179ee7299361318e1ba92a93e32a3ecb1ea6b4990a9c4badb2c5fd41a951e01251380de760e6bcb7ae5767fe71a0def87a445fcc4709a58760ad2099428f1c4fa434be3b1fe135e091a8d870b5847cccc7d6709756e1fbcaedeac3a44a2dc3adf59cfe8a338e3c90a2b293ed27a388d8a90501a7f149ae2d52018630930c10d9ab7c7dc45069aa88d669e75c208235d55c81dcc28858d1a9bddcfc31f7badb43c97cfb1aaf7c0263a52b0e4174077e4c9e6bc39d42728f5367954e1afcc5370961ba59dd073d4425daa63eabc36dea1db5ca9bc7afbb3ed5eebd076dd8fc895d2e0e3d5d448129e22b245dfcbe6fd3b64558a9b64e9f930df45159615881411e2ebfeff04858653baabe47b243d740568a9f030edffe97c6e6bcedfcd46dbf79d9a72deba23b32c1fdfb493359001e7b242137daf3f82e0d8b53809d12f92c3733926aba7d4cb7205fa7e6e8c7e749ab6454ee8b7261f61aea4deb27ef7b94015e5e83c03144895ecfcd03a5a3f4901b99bf7537ce734aae3c68f3535faf3d8b7ec28fec77cf8110af6687c28c6edd3dbc2d24114f247d2ecf10bd48fcf536dc0292104d1dbd6cba8657df1730b8337da283e0d309a895b0bda0881a926679a3641d9f401adf745eeeed93b229d59773980dd3e05aadb64efa080a334a9e640a42c3d73a1843fbdb8d8e22d2650f12f33e83bc821430e90a755d8fc042ce7d7dc1c85d4c23ac39634428ee153e061c0e117f5ca823e30e3b9e85fee79bcbc56cd799b3be48854f7668fd59a7a2e5ea0ae90542d535c7134861caed396da664bba211affd1cdccbde1f68c12848b7b86a0a0da4efc89d5d2a493ab2b57ab1bc43c9a851e21c5801aee0f2151f4d4ba6a487114d85ab89de560ebe3170e68eeb170dc821cabd6eff148c2b45bf449786337ef38093e7422a1afcc76d0e54953b6cce811d5a040bc5c943accd1853b28e4fdec5594b5d044c42c27ce40f770b212f1928f7b76c93fba3a5b119f0da522f9f786668ffdeeb95f617181377c5024e9ded6e08e0784069066887c9f87624f276a80cc85ad3407102e31cf71caa9706c041de5df1ccc3f6f8f50c9623b8f16ae70e6a2f8de0af5af7bbfee963dec02bbc5512acbaaed1ede532bec0305495ea262be56de516d2baa2079897a4af39759a498cad9d5651ea0d232c2b742a1f5459743e9a364ea265cae9da6649c77a0376d802af1b9f024210d6093af16fb683790722279d7766c94452769b3afb6fd82e3dcae2882a0c97578502839af23770dce244ee05658b0f8feb9c1aeb7fe72e4b177c56cf2b86fd4483a79014bd8e3e1f658134afe14b8865e47f70c657820a30726926972b375eef7629dd31580cb2b4bee7821cd8cbda8004e4ad96a4cdfbba06689400216c25fcde2a71db559a24285f94af87407762731df9106346bb3bcaf616e00146806cd8bf6233365a28ee824cc620681705d45171790c04f54a25bfa47739745cfd4c0b7b4c37ea88319e72f7311cc8494809ea7732c6eefdad20865261e0f7db68aed39eab2c55d75f2b3a27dbb8f6912ec624601ca759b0bb12609ede46fd8b32c38b715961edeaa9fac4d424b89091f9ab5c81269df27cb19349d5c73625b5662b12ef6d3598e61d039573c41d2079c0d082d50b2b83b4e478fa4b783374fdb54fee272911608020e535a2365f32b287b515f9739e9205c09eb292b258a7e10dc248784950ed961a506e005244ca3114210609a26cde7ccaea67615cdcf31f1696281a9a244cb6c3ac8894801f3b69626ffe8b8c7a6cd7e26d5a69c603f31b33fdd3e148400c2e18b6e75e36aa18eeb581fb4be5d1ce290d21ce1b2ad74f6624d3f3d07c48654458631ae44c6ad42a4522bd86a461334554c6397c67e95683f16c468b23c7fd12227195922683818659916eb2b4543d00ac51ee631c6ae1ab08ece4c2732de1f0cb09db2d0d02e62ff9d31df013f0187e2cf744f824c67f70ef2bf39c6d2ee25fcc5803a66767679dc098c32e3fba5e3364323f13734b22e12936e5304638ce250c25658cf210a0a629ef4e44e118392b1398ef5a02470d9f34e6e06ef8dfd82c7a7c154b005d84e2b709eb54fa3423bb99ec387d19d33ff991ddb0c34d39baf170400d02ab1f7b325c50571b5d4d33d78f872fca04d5207eee6eb10a96ec97441d72ea3ba1fa5bc8dd56687eba088f0f06245bf36628557419501d1e186bca4880d422dd213e22dc3fabe944a7696157c7971a5f9ea5049440e0ba6043ae21195067e24137ad1d94beca16da8982c3e91ff2bd69ad3a5897d6263ac34ba8678f06034d9123785681721e6b5ac8092cdb8cd960cddc241bcd11390a93408b193e5c1b8894dd56d460a729aecada7c17b2626b79c4a5ffd53dd0517ca0066bdd47ef72ff9db596b5a5b4e18fe62ce60ed3a7e9f38205aaa7ea3f1c9b8564ce6b9c5e13da45cdb6091943916489b3c23277d467e1a442b5ddcd79d7ad7744b1c61838971d47077a8ba6de7efa4d12972d7c9a0ba76bf9fa894d3b4fe495ec29d20506398e2f4cdad2fa3fc86105f9885bff040c9a2dc289073b1c083e11fb9a5346c7835701d70b7b221682920c3d224bc8443507ae0a1589a3c63f422648f1329313aa7270e43656212dffcb7d4141656c1f00c847d5dbf9b3208e30ce23a4f64e5da994f1b485cda49e068d6032f69ef72fdb0a50375d735d044ce2b0a587688d3cc3d3c4dbfba4affc81e33e752e4a4534f5b155cffea4fa44f387f3cb40e715832046ba7bd95e1608deb0b055e77a84608f923e9557d657e04346acf1f74a18df9fc847aadbc868dc33ca39c4fdf4b5864fbd0ccdd3021ea3c1b0fdc1928cb3d32da17a5a3f5ab49eef4121b5bc4c7e9643b2c07eb9f535983b3fc1b22728343385e8bc5c82d592d2dbf82f8d101b30a1dcaea9120992531d0ee6b3d6c28cd3bf3845c12d0c51e9ecf606856b94a5839ede3d1a5b370f7891d77394434366b2d5f07ea848dca4976d0a325e6d9edc4897f80f499962a4ecb2f31acf7ddff59e161395af841b5741c2184e974117958ae347d99df4af296078cd291d603a2cf4f8fe97c703411850b797cd5e4c586e6c12d0061b7df6bdb80e814d26477c807614be870d7efda8b6782dae2581b5f018c416925ce445a6092772453bbb5f2a55bf3a9c7b15bee5db248ecdbc5e4838f0184396a7f15ca7f28003eb473c5ca130602fd9e419566b51ea51eba0afa3604c9bf50f3d0a52527d8e1ac9af42d9a2f71bc5e1330e36d8b601363e2b3fde47d8930244b08cc03be5c8a167fd1fec3b08571d83efe9853313816e796d16b6edd9dce643e3597fe18b8ffac1d78f1651d0c528ea347976a336d7d73ff8fe7e02d3aca38eb140be7058656d893f17ab46728ef8801972510995886c74e34a811784385824c4a8c4e56c79a4286c9b7c248302de9baa5c76bc02adb5bebc2f6893459122133b61bbee205c2d00cd905cf5bdc34d382b568a54f61362f39b2ef2dd796cd99124c35582098dea1204379e92ae5bae9cfdabaf0ceaaba5aff4b7a5229d604fed3cb78ca4d8db20aac04e03094e669ab759b13a2ad1b7707ad2325a937056322f40479cb504196666ed4f885f5dc0d4e749ae1e28da65dc1246476a9e12060df6d517714889519ecd61079e73bd7a5e487b56772c7a0492a88e80a99d164ca1c287fb3983cce0cd753958a7498b5eb01ae7a437a6c80a8162b7b1e5563321a35647a131b9bfe92a113563bedbd20b290428f9979f0b867777718398af505a2a09a8536d7afe27017fe4f1e78da307e11c59ea54467733409e9455206bff0a159732cfc2d54c5bb2254f17243094e2487d94b2769503c748517ba9a566b1bfcad5c083c076b9f799f36afc10084746186b108890bbd1920e852931199033771d9f8a6bdfbb5f4d68125810dda1ffc856472395dd955d9da2031c79a4ad0cc4073e07f87053a8a8bf9e9210ecc8bf054d4ee3bed789eac930ff21e1e2b2e912b5967e0da9cab98d77a8c5bf8dd342641dec30fd6ec40e2723358cc057115bb3d61d90b1aa3d7c78bfa919f04ddf755eb8a1a7c96d83ba419fa0d0d801784b1a2512e6421848c84655cbfee0677e40720d653c72e1c2f50b92b92258814b6e32138053f3ce6daf6e374d88a8e8b35cc23242f6cf2a3aef8e2d4c1240ed514c809ca473371e5204eece62bb8d2961ef6f9700ca1342c1b8e4ef96cde615a6574ff0d70797c7170b3e7554df112f741cc81b917336ec0611d700242b563f04f20a052106d13ca78895d18295e696edb3b5c54850be5dedb1bd114078cc555cd6a6005c850749c19a9f931886a2a8980703ac70aff9f6d56387882813e0b2814b4fccf12d8b0786c5f2b41cac7d2a394757a311c63d54bd663898b0bcb07093da7b475ceb34c438f4f588040bdcb77ed12f70c851608d66eec929c1440e45248c117ea68c37fc569588e471d6edafea8099c2d0806cf321d92abb40a6bc45092faebb480354962456b3a09f001e6b00e7ebb39d2c8dd792e76237f4cade93de3e4cae5484664ee28b0d06ed347780dd119c07fbb02fede0b6e6ff3ed7115ab50773a10a534676a58d94f519da6a9ebc2977be03d5e901f356b7d776d78c61accb2f9ad1aa13d61624e3328b24fe98852107886e30f44e151ec907e61875b1401c5579362302a8ae4bf33902da7c58a7690fb502a1ce4fbbe1e9161f1e8e20cb4dfd57948929ea041dd5772ca02d3245a1f01d6471aa1d507eb2c6be3e5527186d646244f443345ea4f7c63b49dc2c49d9f54e39abab747de6fbf1c17050d5756e9d9d6844bfc4890d0631a83de89a732f8d4827abd25875ca794639011bd2043a2415b60e425d39fc37000a81c925c41dff1e338ac6a7c70adce65a87df739e4b0965d908d37ebd9fffd2c11893595175cc7e694e1c29d63373f657066feb2b64da6aee2701d3facbf93e493b5573e11ccf51f2973042c23d26af8fe1d30c2def431ad265c9f0617c17cb30d12e76d16881fe8617dfd5a3e6370fe376a0cf4052762427bf7c88e1469745c9e045fce93564f8df0b8d95b7399d2c1fc23ac70c70b526774eab75bb56bf57615070935a79287cbab1533b64012bdae164b0b68b1ed0a5ed7ff5ebc5f48558ed656be6569247172afbd37d47cf724fccd4d28b8917bf6f88303c85c96f6f9c1e35e28489f858a407961cec60cdfe0b16aad333edc3432e5c75dc18338b1f4e5c11b01119edf64a646d1ed4d509a05b0daa43779afbcb8df78c1a2bb3584acabe9c86066812d3452ced445f6aa3afb42d50fc6c839b4c476a276a02b0b4853760c137f347bf4afd1a35cc8677fc89cdb64ed0a6bfb037ada77d595a057b5414ec11f6c6f527836e60c0db580b73f46161f17ed8c58850c8dccadf60a1a3e161c1fb842d81439c4821f3cfd2fe60da35aa881a9e91101763252e9b6acf4d7231ea745d61fa592a057215c5b88a49353eef22f02fcfbb2b82a66f6d435ea24c80e8a5aefea138653ce7bf255ec0183b1e63655ca396e0fa99699c999a7592f7172fd5263706409407faf6f85a45f611336ab3b38ba70051dac651af28baa1fd6fbbeaffab539409677f4d759f326da21b81012ca82858d760cef5b533ace03e8eec69aaca0418b067b3a85596b580945326acaa17b85477250e6dc82361fed3d56770b7cf57c688f7824f2fe89098355af144e2c555bb70984788ea4c266df2c96595f0046ca3aa638e53934042c92a78a4cc83c324ee49d45751c992e454f954295030ae8f0ce597d6e5069c772623d7fc571347f8b418a6015c617e6e37912ff504ae383b27bb2a4fbc4724a73d3bb20269810e3eac735dce71f24194b539c2ecda20f311bdee7a35cda62a6f7a43574ddcca34cdf7259ff0c75dd1c9565138c20df743f783b778c8550df6df784f89641419944db38281efe63972090934a45cc42d83bcbbb02e44bb5b687801831a8d8150fbf71dbb5e529689d494c88a814304c6dc46b669c1ffd831236408a1a1b547b753ca11b19861c49f68b78e87541d8f42d58c8915ee290188272b3b6792959ccc160ff09b7c85ca62114bf4baf16f87f7d1418ab4335a5eb6f0fcd8e6a7e489d6fa9e11c02a9081f12da8726a6e19a904f5c21456197b471093e6cc9fc1c5babe709f81737d4a6cfed40479266f02f9b9ee5e2cea687d07917315438f1d36d7ed58238bb05d9c0514f04529a75faaa404422df03335edae61c9085c8b4074bcd265342e9e31b6b9e0e64c46a895906b19a8d61b5b0bc47d54f8667c9ccaffa95b4ea7549cc9b34ec4e2c18216bf072d3c49480e5d2484379819b78ce3a08672f2b06f2c51daf97aadb7cb67b618f0dd3b099950578bae95b5e2c93fffd5a9e37dc3d49ed5293d6d83ed19a23974c7fc6fef82ff8b01d4bfe237979092f126150edec1603b2c75fc7b497da84966799c3731741df9bb14643f5d9fc9b870bd299427df0e179ba7f224a75ab599f197d4de76ed234ef14639052221b23b2c0a18ac55b475d0f4bbd7e03f41053623518ccb6310d2662e6ee9eb17228dddcc393f4a98ba12da6187ee780a6fe68196a26e5d31992f4843e87d5b40aa78cfbd1d88cb7ced0067a861e4cd1e10760cb21edc9a4d37e2328e97c358555ea4d2808958be6fd6a3c372aff02c8da7cca78da6d18921b0104a4da662d42a991c16fca900d685aaaa47eca094a8993ee4e1d681d276db46be73f6b5cb803a95507ac85ec985402438e3021aadd4cfdf5c225e73564010487362b2b1b38d682863a2bc809daf556b869bfa2311f681feeb23d185b5dd0c9952ba74e1d22d69801a23fa7fb56fefae4cd6c4cdd717ede06a9bf3ab344f2a0a618d2b5d1f06d38ad10c0b56d7f507513402b88d5c631201c61b3c95e76b172f965e846ac88aa3065c8bc4bc5848804755b9433b579d73d0794e91bb818abfac01549eb8ae61749bf45f9719e40997dd56279b5857a0cc4acbc3a6766cf4925ed63511679e74528bb1170736b0a287110f0ca745827ad98e9d273862bfd42095cc89790b19b2b884d4d66589e0faa476bea4129fd80dcea3030b2a0bf21353fac811c975fa2dc8287ec0d142edfe6509a4e8ade62297fefa12d5c65106d17ba5dc24c55b33bc1c1944dc32e7980b469dced174e1d78566ee89cacf853eb39c745e8c390b94016f31e9fd0e2031794ad23a0117b37fc4db55ccfda6b08ab71ceb6c1f5fdd981a6057cf7d6a26fd1c9c81e0c64968ef9e73fa95ce585284b3ea1d833c410e2465daf4a94ecf792aa0066aea99f5f677128b84e205002367b7d9eb5bce59128f88d8b906a108e9a45d0ceb1698dec0347e870aa5680bb74bd936b7a3ba1f91206f4b7a8a905e41bf114760f7daee1a4c9a1fa139cf69a42dbddafd277fda400d52efd3d6c57399650882129cb3335d90099a5e8012d0ca7d52e629fff935fe7435abd77b07e05ec26feb82b8774136e176b707fc35bbdfd6454d0e9a155bf3a8153c308f423fd993a35c80467ae12176b6f6ee53d094104a86ef3f4d789e716a491ed044da2f9b2bad16a3985b46463438b1774ae383f59f6b344b2dd21124220acb57b64622fb0e868c52175ab9c8e4154550ad09fcd7f3cdb25ad0eee8c47b6b64350be1816e4189ca5f965e407e304315392f17ce602f367f068f378e9d370c9f530974c4c5c2a055f413ba7eb66dd0ee7f3bb4c3e75fe64c6773bd36ebfdb4eb42d93e29786ba42502ada481a395b019c61f39fb04238a5ae37ee2973a7c1df498ea82d7b62863ba0b3ffdfb4e191b1638c537c687f7538519a79132e01510f8cc71c4593718b0b318a2cdc8e747e3afd58e068a83db205e3e5c07da2ab8aa7fd0370be778502bb6f3ea9e1c804050a4e3d863e1c940363b5d1da537961d7ecb43f5cf5ab425a2a15490b44f665a6dafffe4751acc6c116a2cb61feefedb76a79b0c2f2ff9c8a6538fe2c0108925dd5421419c86edd935a1750b9f045f8ae43b94b02403dec2d67e8a968e89c3c9fa14d1fba3b078dc7fa24b5a2b1fa834060154961dc3faa87a1840150491f601d581c21bc00a31f587f16802fe27a932c5bc2f0be3b349aee3304b7803f3a7dc3681eaca7fe298a994fcafe04b94186972d58d9f014d2d42956380b2ccc6a413975ab40af4eb4fcb953d1021c4b04684a928d7e01564073bc8702fc7af5b16e1a845baa9198a15e705a94c25572147ebbf66488b5f8657ff39ffb3bbcd9f7aa61f069045d2351d4dbc9a7d830f0a02c832828eb1647bbe1a0ea6a6ce528a3d107893121dec362e7392251b52a55db39a9d2b0637c0d0d876a517e5b83c17723291b2d21d04b50e1d25fa9776a201addca1df7d4809a05b90bf984d53fe3d2729bb666a4fb2c32952c85040a0ba93db02d34bf1830b6f3bdf78f9b6202a13c1acdc615a9f1ad1862d294d981ee48fb3b807a5537ef94b1971fa67c0044b0fb84fd9d3df39dc007e03bc148eb18954f37e558736b51f2bfba495c1246efc12395da4a117a263d295f61f5ff7bf0ad99937a187d4b066ddb0f973a6fc3150e4ac33b82c0675ff607c7c73be0e128f83c7e4fc60e5ec9955f7ba3285aecc2f3e8f8a9d7d05e03714efa9b3d81b4eb2e56387e5af14764bf1cbc0cfb025ee35dbac160010a5d22713837edbb2a8b3fde4c633912b1da87a7a80a1141b3f2f04fc6a209f7f4044eb6dfac2e7378e30d07d38410e3beab74d990db243409cadee9007821c9438aeebad88d4a890924766f2457dd27a9082e28825faccf6434e1a3e354e379b51873d8f8a79458a76b9a5336d579fca57dcec4daed6c08bc4336557e3b2d431e51ff9477e1de373cb713d5f8746bcbe4615fbe19d7c72f29814ae44758a85e8a165a390c7a9328c8d189bcb78550baa3c65440f99ae4f07d1f78949713fdfc60c93293c72763d07b18ac55f4cee43e8c55d2e75439fd1c8e7fa59c4d7dc12beead25adb8099314f3dbed87ff97bb4ebd76d1617b48ce7a9e2a08f7e34d8dfd6a7d275e3a2b3d81f42550814b8eebf016a29fca289c61f25c0795a0e4d185eab47b9f2979a34d8404a0333481329e0d62c3907222204241d704f81a524034b98f4974dd541fde4d440ffa071d2fa241879eb60aabb61546512cd44efb8ae97381de7f0bbaa198e4b3c74a6e5147b7d97e95ab29d6d03856107a39536bb27631cb1c212e7816e7b4ee8c7043d8844bc227e44a52f02917f28f8837922dbce4afc5640868ed69f94e502fefb567af0be37cf941d997a2026051d5836e7dc8a07a4303311b0027ad4c0b1";
|
|
3211
|
-
/** SLH-DSA-SHA2-256s (loadSlhDsa256), ACVP tgId 23, tcId 199. */
|
|
3212
|
-
const SLHDSA256S_KAT_PK_HEX = "b2a7d53902aac9b2ce4216e8b238d801301e274eeece42b900b1451f9018365d0cf1e72f43161c09918bad4e64f99ce85c7ae665d4b992a84b6c4794b22f44f4";
|
|
3213
|
-
const SLHDSA256S_KAT_MSG_HEX = "e0ffee016f82c9464154c24b3e2d0f0d5eda0dda41b8f96b95fd9d604316f38860ef12c19d51bd240b088de782385c1ed6c69778f4db81f2c18b522da6d54fcf3b44849b4ce6d3f65202b6c2abbaf7e82a433692e62fcde58b5ea770471026c2cb39a2792187620d597ea7c2c10c5168fc9a3dcc971a09ddbea623aef32d74fac478cffc23f4836810cdacef0d8c8caf0c9a9ebc0aea3a9a36c56ea5f072da066db44e4ebb5d039b5648b7d2b440a32d4c1421ce33e2ae13c68b5a278fdab0c7a0612fb0b9d8c32d69d29eb9fd012591ecfe80a1397b679d6508267f8b6c6df501b4d3d9d1902bccb55a499b7f131bec0ae694fdd0b27c733b0141e5a47888b26e1ecd19ee2f7780fb5053b5efa29ea6eecbf7141fdb13cecec1094811271c0910383e1eba0ab801fab3d9e4814a35444a520dc18299ebac3d8723a6317234d434d50024e7e9f8fb8c79ad0b885155f2673aba45fc50de115d2508b205447ba8be6135d63c9d7e0598091160aa48d2453929ebad1af33669ab3dc165ee91059eda58535a968f1b53e7d53933ba8a4e1e8bf6430be2560112bccc6658f066dad13ccbebf9675e3c7d34ce031b06f3351295b1ccc9624169c552bbb9d30d5021ebf03f26ef9ce4d057bfa64d4c1c53ce759f73a91151cb1062bb87dd38b5fc24811a206ed468d5853fc31d9473a4254d2ff46ecf31d23c0b5f138ec5222394755419f1716982c2e46ea47c4d5d2a24f181aa01cd2b503d738c8af1974d442abb117abf9796a6f731c19a1f6e46c89551aadc0a4ddfa6f013b1881861b4847e8e13c216f37bcfcd8bf7e0731b63eefba4eba51bcbd33e7d286e3b666331ee1134b5835d416d81f6c5a7dd8b5cce5e4e17eb4950c5b834117104837472947568823d4279b206e7ee3b6bd3ffe4b082ace3aefbd99a714f762f3564295bbd6299a7c13cdf7a41fc13c4e3c1152f6347d52ddf32d52e1d2abf1cbcbbaf19acd2fd8003632c86af8b15832af6c4306b33eae47dd52dbbe29d0beec28e0657803dbba8f280634d2c53030deeb8cc281881abc2122f57677bf00167b058d9b298033bf61eddb217f6fc14d53da8abe404bb469c419e5abb33da86a5985949402840b5999cd0e45e1ded616ceb8b41019599c0fa9902f34e9dd8c7033cd004576900607ea9417ec5b6df9e34ecf893faddc2759cb1b34189be5fdb1a959a3ebc214e657f861fc30b3672adda8bb1ae79f35c9e7b8d26a6ce7fe69d6d4cb53764ba2ae69b7186577b3d02c35781c06f5ccd28cfcdfff8e708e9d606de9a01";
|
|
3214
|
-
const SLHDSA256S_KAT_SIG_HEX = "a72685bc923c477a21c5ef77cb26387fa0c18ec189984e9062c0c6cc48d3b2eb97708908dd8e3d3ca6ae000cff6b03a45f013dd1e386910218312b1e1870a944123510ab24f8349aab15bdf66d1dfe4b3e70a68de06c4694f487d3868c7519ae617ecd5c2d7c684227579ed8068c5c4986a099402d2d4afdebd0ff8333f13a4591e3889aea7e0bdfb0a1fea8200f46004ba8eb4e8f95b1a11acf44bf32f0e3679021b540cb56390a65668267a343da90ce2c565d6ab8a80722da2d52d1c7863835bef546c39ace546f315040883d393469539bf79f0f5e17a59ea5112ea4aaccc1b860a3d6502c9b9c7bcaf4c792b32ddbfea8f7bbdfe7a01a9a9d1db7846f2acb86c57b85ac730e9e25d52beef10d4df682d4de3a4be5a51926abf5a9dda76534eb0aa231e734ba26b050c66b2a6681da5babbe30f6df238c2cc1732222be6a1eb046f9e5507d75fb585de120a1ca994c2f0a0de4d983b07a2f909eaf7eb3b652446ee5e8980ce3a534a1d3c3aadb15538181fcab89ed817f8bd69b47d0327aa6cb89ceed1d4888a88c0891476d47fc82f0c457b25f0ea8bcf1ac8804878395e770bc3d75b7a3d29a154f4d0f1dc8572f52d1c948982d46dbae86c710ad4242d05e43193f854ce709a09f1b0d48b15b6bacf40bbcc30f34b496563b7b47159d11f414fdd096deb84c4259a4d8cb01ea416ba861b2381baceb50974017d1a6094d71141c265b5746844e1b9fb2b689886f5a869992fe06385edbce6c107eeb46bbc60641951aed9af0d535fa2b98fcdaeebfc2975e5c85e6704dff431bbd050fdce29a763f9e3dd572046bba126cb2c29778dd8f6b329cefe9395c0cac348f2d24842c0b4ee037d71124ac839b3e73c14f1a30cb8bda46e9c18cde4c3d73d8429cdf3cf26aed5ff4a300ac7a7f7461c2d2a2ca0751623b0e24bee34973ae1aa525331ccaa3da36d02f683aa528a2d5896469b4a43ccef05bcf0060bcb107fc3d553a2c5695611762b0d6772b5bd567b2e618a2a7e660d5d62cc11da663e7c7242b8f1aa4a14df2b4f4e92effd95d8a08486f29e0582fa89df2a17c2f03fcd64fcd0f1af2b73574f7ac16f1b9c58faf91b6f4dbe2073e10c11765ac99574f568f8264d8bc799e9fa858914b57c25da6a0d9012ce52ccac5b100eb975caf51eef27a4d08e077fe216f63668f5ae04ed061161edb862fe4b240a214bd268ce0f60698962b06b55c54c42fca1a6b05cf10166cacbe4fa52f2b3eeac03331d5614765a3fd48ca3e9933b6a6f4daeb9856c6008cae158216b72cd0e2abe32c8f5a0c67e8bff2345a397850b244f9b9060fc956bfd8242f5a7ec4e0df155b6962eab5d92dd12c31dc26d8586b8e2922db20215c51a83a2f31211e777f40ad636752a39d023981b9592d3dbcd998f597bc446092c4d951e80218e3b4f9e0594e92fc55c7a85deb5a60bd9949df42eea7cca7338c1c4815df39287df74b3908a83b9b65135c4567506832dd332561cd770e4420d18e1811d0048c67840e8e906d28a1767dcde08a64db398b549b134ffc6500bf603edd7bca40264eb1bfceeba25bf4e0978fd11c125e91a1445865c35483030536ab7e63552236e16dc6fb7fa2f08f3697d639cb7ce9040c4e906f24cf783ee9167399d3a2f3f2c68634597ce6f7fa469564513a233d2ac78d0b47ea7565b91e7e1f49bd055246b834ada289c2893145bcb0b72f613f441aad4e6a8ba0b63c143f25dccbaa2dd26e4662f280cef78bc38627ed92da6d474e09cb09160a9469f8d8dcae0f91de9e9e3353d2650df5d75c4ebdb58ed556c9b4f08e59f2abf82c16d96c6c8b27585016c13d1f8c5e60091decb8512f43c07ce4ae06262f814c633c7ad6697acc9ad2fa7373814345b8397226ffb471ad6c887e3a285fc486ce0387302f087a622f903847a1c532da95d98b4b6b5f79fcdd286ed0f745ea0d2f06b47f1741c0cbbe221cb539944f30e46840363bf20171fbcee1ea48430f1466df831482f29e2721e70dd5fbf9c022bb4f2423597e68290fbe25037aef5f77cb5b78c82c368f176bb32b0bf94e5f2dc84b98f08c3cba427a060ab95ef3911de19455c507d72aa6ec230e8623b79a4d5f4d26189b4a9d79972c1dc134f03afdc6cf52698f9e4416b39b47a39f7af30808935a69a72f5043831d9ca9b04b6e5c1bbe049d4ce2f7eb496ba5500f984b3038a559ddf07ddd84bd1504fc227bd75d980d4b115ac17d3f0cb9e6dafb418c357480fe7edd01095cea5b2628865ffd965bfe4ad70b5734d162576eb7021d4234b520645153cdea4a3827d28225a0a902c5d05267ae6cf281e5c01ad3a8564ec091788892a5c3d79dadbb086f150c11d9c679b3c521ac8de705124025b4704049a6fdf577ff677114b4f5591ba386efdbdd0759bc0b449c4fbd65606ca111acb82417234c2efb06411c4cf2d825411e21053fe368ddf0c12dc6565ddd5ca5e048e4f7b5bc0c052aca85ac517d293492b262f322e2186dc8726d601b2e718dc549606ce30b12980648a69207b981092adde6b49cfa8d21455d30bb7dbe948ab6b66ccbef737c72e33db91fd060f36ae0ba5828c5772a4e021dd2709929dfb5f2d64acfec54f11756593785ee5cc85a8aa914e2db0249aa05c7b17c386271243b700386c66487a6d25a914c9b62f56809d23f1d2ab9af1fe7ae9a4bb661fb817a17d6f9de5f012c2e793b5e2e3ca0cdcb392f8a9313a822bbe4bcc6123d6c88dcefbd304c60030ace7977f9b4eeade8febfbde001a21c67c1b18f5db7cfa6b6eda2dcd6c21636a6059b08ce63d819a198bb8da5e61fad26fc1ea0c914c92614266ee6e0c6fc0f353675fb36abf2241ad843dc17ad822dff3ce4ca6fdbe31078e2f5bd9ad7a4771c3ff6bded6a5f68a33acf97cea04ba5da4cca7e636a03057969b0ae38e280f23c944ea19742e17c696a4b8c816b813a2b31c68ae0e33eb1e3cb6cd472d420527df3302ac012334705106bf4e4d408ea69f6a7e4c521552fff75caf816bed8105277a0121138889da8a4cdeb120af1227dd1d96a6ff149d4aa9fc8f644505c3177cb985883a1d8695e35e701904d316210b95554894298c3448a57242aa8b130babd60c1fbbe26eef3c386f719a480ff167409b8f25538df63d7cbdc5dd5c6af0544aee3b77c0f0cd7dfa81c635ba77e4bdafa5a2d9e9f887dd22eaef09b86ace393e2e0066db85721c5497fe9fbe9276c2f5393342b0c74f1c2cde2eb7fefa186dce05f917b5e25f118616cbb165e17d407aa9187108179891cf0ba2b2059be7d16a926408abe0cca18e3efd2b44790aafb907d2ce7b55b2a66ca6564a1355501f745ba6bb0a6b609095e9838c969d69c8586b6c221988e50a750f182f4697af63118d8f377cb07754c6fdde13f10dcf92c0aad8db5ca62c0b316b2b4d97298f4b5578f319a09b14b1df3c81937afc8daaf4d85e605ccb8a8820ddc70fac0d3ad2b47492aa4f418983176604824a61c4e7ba0b0bfc358b3bc405e97bf324cc80d4c749953ec7163c2159b887b7423e95159d7da302f41e073dfe223a05fbbc93fbcb1565ec73b7b50d128c88167233345f55d1f07913b131fafd4bc4156ee72c85b8129f9331ad06e8e549c16739dceaef9d4e0f43cc30af57036ec1d0ba44b9759279d18fd3c14c1781036fded6dcb67a7616103aab3e4fa7ea50eba8393414648c0f0e15c74173fc12d93257e77aa333005b5171193fda471341ec6b51000b4ee867084853e64885a28467ba7121674ec5bdad7e274907755bf0e60813d53149362bb72b8ad2393e42e7ced237b7667c8f15d14843c2a38f74b90015ad7683e1e7dcbd8b031e4e886e4e35ae634b512cef56c0589ece8c4d72c52d8307800acbb13494417c0621836349f35194c79a38d888e1ec5c0115fb8abe48a5a745da2d17d5c67b52539e9f0e606d029a1530f5702e82226b76673c56e622b85a021e5dc81f40491b0dcb36738d9ac6981dbc5132b61937db45d91bb6ed201d1847c5206fcb332749d856e4daf7b1334c3821897eedd0317e14809953bbf7d6b55ee49fb2eee87bb6bcdd13329494b1e3caa62d5f1b888bf37993b3103623800ecd71b91400283e3dc6a1f4b045aea0f4ba3d88bfae61f5b416819465f541be7d30a69232d3e69d711daaabe77d2d2999611a5c304bf6a9e5ed95e2cce453c16be03aff624b0d2678be671059169c37fd20a9e4160db3dd4983c860ab9053d5815689df2f28d5af9140c9ff71dd80d5eac28f92b80215eb37d8a5cf48ea2dcc5dc269eab2adac267dedde9a324c94a7b37a0de0a3124ab9f6de40c52d653669800f6addac86041e95105b4da0c898c8ff43447f5d82d16c3059ad5eacc604c1b3bdcf19a12aa9a369de17a12a77bda200d1bd33d81620b6ffa626cf38223d7bc1ecd8db760c3c57098efceeeb72b4917a41a80f5901c2ec75f7feca8d135cb9d7cf1ae0673853a14065494d6060e34d0d6b937157b2ddb8aea9a3368e3ed3b4f1e7a55e1ad02c5872cbe29f60bea7f570599bc25798b2b02f97955d41d80cc217dcaca83bd0e342e1a3c78c91a0ff4baa7209ab8d85ed4058e9ef6931017c34b8bcef76e33b56a04743e9aca86b3f362be19b1720851a008ef716a13b6873c495ea0be36bfee15d97fce3816c34ed65977da33986c4a772d3e79abce25b6679509fca3e70e82304c065e21bf527256699aa1fdded0a8ad816a84b7b5e860f72141bef337415ff6b4efb20382e6f0c66f0526cc68a37859a73a545b333dafe53f1a029f4ae7a2faec510e302f926611d3415706e9694d71c8462577a33f8d98c43a2ba659124f8e7d04af5ef1b6341808592039223852610d1352a78f1da4ca2430c0449cc7faa81730e6345d834e2394017f3bbc6317469c5690f4a777b619b416a45e586fea7a4b5f16ad73b5c6b35f2e64e224b8cc4adc0aadd57d0d8a5b2ae589df6723180df269ff381b8956536dbd3415311207a760b6ecc891951119f08b6405d66f70da3a5e6f17f222398df7a758caac9c847a80a28190b684fbe73b462124acb1650c56a727cd38849ff6903110050f298b1d65a1de286546fcecdb9ebaa4550edcdb4cd5045a34d00fa015ebb49387c9dfadbd1ce67b60f853e9eaa86e5bdf47139a1d7e131e1d20e83b7858639ece0705616b054e67fbe3c82bb5e085c8755730d1b16ed32fb6ddc1cf5f737c55ff9080719b9b6efed9ae1a09337e1f28ef728376484cd3dde3cdf50bac154432f461d979abaf82bc331683b82e7bb9777cfca3d7673dd4aeb7cab163ec8fe9aec6b0ebbac1a0adb53a0e88f4d85af1bb0b26a095f96140c079d2c1a8846f59f1c42d945512cdc135244c5cff89492d5aff2a5b85794f02995c036cc77e1d172c56848897149bd8c168ac9caba973c8eafee3111317d8025e6ad6a8065d7270bdc982cc7a1efae22727a5d68d787328bfcd0880368ced30076f1c561b3d82fef77e23d2b4fa162c4fe49a42349ca8bc2f60e69bcf64a0c79336e04fd82ad3675867ac0eebb438a1f21d1a0c7f02074846e78dd7b9702e32f88791d4f721ae8e1744334a47a3655c6cbb1897eefae62965241dcc59853c13fccb619ad4151617f3b7fffb1e14ee71b0ecabb8d483f83bafc0e8f0aad2134f247aa9d13137c0efc077e8b43c97a63050118f5027fc05846db88b4f73434e6ba7b779a08dea0eccb0db60c6567c6a3d9a2ebe77a65dd61908aed3ea1a40297c75d6c5ec15574fd6526350be6270b674ec1487425560064af92084485644b472428e7a59e132f0d8d26f432adb654ba614d217aba763d3011a250627a3e5628f9656aceeaf2c87a415688cbfef863e8b5c2c4b32770261552bec0adc378f1e0da8024419d1b0c4d11db2fdefe1f56768142f64c5d362e7a3181d80214e594259083cb895509c50ac97c045f9248c4fbcaac3d593c471ae45689c9dc940893e1355c7fbd19bbc100885cbd2e7d641f4305b2485ff37f6903c72b5ec9b4c1caf32fa5f1a13b70f12130c3d7212a9461c8d891a59125cefc3fb15ebdb5fcfb5530b60bab2d1d81a597f676f189b3492698d9e02dd20f584363b57f113038f743f365d22bc429e1874df1eb9f941529ae041d0fe13492431ef8cf1f364f4cd178ce1584062db680588a536b57eaa64d80a7cbdce95f1d220da1fc1de98865db7125944472566995261ca6a3f4eaab5ba2800d78c9476e60576400baabcbfe79dacced5089a6d42831ed0cffab5054a04608e206271c10d004e04742e21e7d2a1c77e19177c1f016a02aca01331e9f2d833f89ba4ac578d9eccf8306cae881a4b451a3bb61c5a0579a612ad59021976cd41ef9ec8d70079e778afa27b1bad36cb1c10bb17a13d48594195ad11d582eba28be14be8ae7439a042a24ee6c466d09959bb02ff8fc72a5886a33495db60f98e6317e9ca8b879f3fa704ee29c81ea9d6accaf05fe30b2d0dafadeb778188c4f540fc7f1b467486896d691da6d4de6a5847dfd1eae60ca49853f9b6db845237e9c687390287fa3eb9b54da941acc2ccb06eaecdb4cc6149c357df480a1ce2d51f335e0bfb74eff839df2135aa6b567835e14584f5110f566309b8292f0d04d437d3f0617cb42408d916121930e0c8baaaf1c20c229d1b1a6dfb8fd75cc34ea7f64a615d20251ddd83a4a0b7de196579ed566fe66fd5c7c9d910fb517a9af378b5fa0715a27622ba00a0b48cd96aa427af397ebf5c75ce61d218e0f42cddf73d0fc7f4675c114979f6324cd708ca22a9c832c5630dd6e4de1d640527d23587b81820807f06abeabd43db2f2ef866882ee4af6d68f5f30c6bc28060465753804b538e2729fbe55b7b1f9191c9ed298a4b2f9072199f4d5499ddae0995b5e955862fe871fc48f392d49b77e98be8670158bfbab1e7797a3ec0f704665c62d55d1cb6b58f801c7eeb86ad5eb463019037cc4b26788d4151f26c78dfdef88f1e226b10e03c14465a593019c5c158c4568b008456bc7097490218c56d85788eb8a88f51b5fd127b695bf5d8c137a6aa38eebfd312fdf3bbf368f06ca5c9ba8c338a7b0249e6bcd9ef0cf5f556a1fcda2d665138c733bc12b5d3bbb905f49426705feeb363dce8b0c3b47aa9ce582d5aa5c7c10c0d6eb9061ac5600f456b0c821d0484249c3b7b61999d49689905f931022f0b00ffa2a3cef340703f275a07665c007be5c42e3d499246628d570af4e584d65ef14c56ef13af466a2e6b21cbe1ed8bc998d799f0cb527bb71ff3ae1849b684f228425b1fbd979acdc5966b7693f3f52a455bd221b40ba4d63eed7c64ee75c5e3e046103736e72c81f7e6f2a7f447e6bbe56fcb09fd8d5ba283023753f231156def66557a094210351927f2960cc6b84841b3f5e9920ae4ade48a41a97c112e72778f191011b116f6059c14091ae6980993a86e36fb6a1c1f362970ff6c676f63d70cbcda97b08309307f5182d62f96ea84175ff613735d8282320c62bd1e94679b3aa90c4a8847ef7e7d620bf42dd5cf983d5b5d09916434f9ccdc5392be5fb7a28a5e15849d16a4201eb7e56235e650a5af31fe609529ca0543925fb66f483d8499622733a3d4a8c078cf7ddcf4828b10addadd68f824e6835f8ba0ca44926e6ce1ae7c28265a9d75764bcdea135e994c11a6b52e0314cc4e5ef288d2ffa09f3a82b36667889fba1dea4db55762bd8185eba1ca98b0d2c8be9fd6a84285ce72205080845f4026b237d373ffb9816b5bff529cfbcd688b35ad14d0e21e38bcaa93918295eef89a899a87a9b9fad7aa2e39c57788820f0c0d6f3740b8e6f4ac3302b4c1805f28e2efe952ae3d8afb33bfce086ab9a0349a360404656461e1b65bce1e7d92dfa250a68734bdd98e3754723461adf7b8e13e6d33d8c9e87dbc0eaea4eb856b59856da1ad6afa2318b882920a8216f512ccce6bae8faadd1824c55d986d2e1174246bf975bdbd5b412fd2b9c1b9fbcc5816f6468dd8896d956b7610d6f027ee0a013f7f1fa5a73f1db06ca7b61571101dd587f46c700d93a97728cf113d51f1063f7c44e4ac78b589e970289c4a370f21406425b179df6a2a895b7dcd324332dc033b9b7f830e4f0e558a86b024a50af6f9109af9da05f322347953b31a07ec7203cfac061b4d85c5f834bf94a02ddba067503de0e68a3816e037c99a88e6fe76d9e7892235e28309dcb47e563d46ae87f6b131b1b2505596d298126ad698083561e7e2788f6d3bd2cc9687db33a1533657b03dad27621aaac5d1cf1ab33424bf24c06f3207a257506f38fd820c0a16dc69eb9b2a1c9e1d314c6183b3911149aa6bbf759c5d1106fd7341c1ec9cce34a3e13252b7219c6619f1e2d3cfda65d7278d630ef0718ee9142451923df39b8f571b0973ce2fb557d84b7becf57dee178464e735753ac764c90d1d1e21253de51dbf0a0a9833dbdff12ef840f5a7e1cddde60da2475f13f60cfe53b518ee190402cbb05dbd8f7afef69a57ef888dfffcf6d329760289a74184ddb238f6746a63ddd9a435f820b3e28a1c7585a6e71a5b3b4f4ef9db05a9c41961aada3db89add9473449cb2dc1f901fff51478782b5bac9d2c461f3634aaddb55cd3b542bf9bc5df65d5f951514fc385edce1635e2de3062dc02d30a0fa55969a1c001449e9c23c4c556312d92b1a72563e4d01615614053a495a8673caa2f9ecc318d570a205aba8e6da877c9ef234137a7d416ad4513bf6a82dba58854f513a31c9b0afda8745bc0965273c693da3398c7df2abe42cd0efb4d09c94de3244fb4c6a754739be5f9439fa7e20ecaac8939e83570277a036afdee437004d3d9865b28fba486bfcc5dcec881dc05bcc2af548ec896f9ff730febe71c366e6393602db4479f87af45efb7fcb1b022efc6b380e0d102f3f1c8c21e74299d5d7db64ff5bef68f80c82d14337444c24bb27efb19a06757c7075002160ab535f4951a63a272d4e316fc2817e8f1fcfd1b27e0fbc73f4beadb23f15b6ade27027e18eb9ce0d1acd5d347f152a3c22f565ad718c89af4d4ff3f7f1e83ba1ad73d741c61fa7cc4bd84c4a25d6f444d457a92849175f86225687475e0e0f4230d9ece6902802c64690e5540aa4ed0e85f9dbf9aa7bce254f5f3aef3ddea2af5f657001d4c42b88c6a8b211720bb15e06144498c2fb684afad63918d6196ef3a70ec89ce9951fc53c284d0358052e09963e955f68656ce10958fd5bd90337c8fe76177b5fdf995cab2b1a0d04a36450be332e95bebf1c674a40cf2d3b8356f0ebcdae1ec2e6980b426327510299b50c702c7b13da9362d8d9be250a741350cd2e671ddaca60e0ee62982bd97d8f2588eeb22b55ffc4e07e02f5f0065a0bb29bfc638397f90b86791fc352bc8881a6d7d73b188e2c48e233c83a9d9980a967e76d53cdd8bb0058f9a3816cb440fd28bf031d0868db6a68d9f610aa27d3d11cc7a5c01d89c11f29ca7c4dc32cbeac34c19b0b7dfd15007f41958aaa74f9a2dec78cbe38d5890daa8158aa01b1cb444b2e214098da29bcf7197f75b48984a4c73b8e850a1e2c96db70b1473110b38fe6ff952a12f3e1c3e0b566bc93468578a65fe253986d1712c045543dc93a517ee75505e254b4abf0324eb56ffc43865a3acc0010c4caee7b29c113243575421116e1932e96bf2d66274b88d3ea018657c3e88752ffa34ec26679c87070437455354c9634273aba1bdd024c79e1059278831d78f7add01e4e7212357b51ee3489647c1d380f11a870480c99408be6560da78699b7ecf540e4896ba84c2a89bfe0bcb93ab822aa0b2ee5a2d6cc281a9aff3fc0302e2c4926e24aec92a8b5520554cb2aa21b093303c112d36d559a3da6152a004c542f04769766869d00b9f9c22974b6c59219c77996f232bc94b5fe0bca213234d502e0881d61e1fe00a5b153af9b82c151cf47b5713da724694d04961330426e8d0328383837e19a6d9a96f8e7734290aa5591faa81c20b941aeacb2b202e5d2d5cdf2f76dc142be7f3c03f7d581c9af920f582084946d1f32812d0677509e4d7286084518d4ece233a2093a8b3317edab1bcdcae02fbe4cd3df5c03a4bf92eb0b068939e3cb13c68722796d660f4140ae057ba8694337872e0319a6f9fbdd25ef677e932565278cbf5a63b6df16756466e3c974a23798fe94f042301a4077b376de09ceecc320057d14469331a2b9ba035633f95db3ca2f353f8698398c5bbeb742bd36aec2d5964b36005efa4c1237b625c9f7dde9a76340fc0bbeb640ff51c4e54394b5825ae226f8d03a0b549b1f74f4aec0120f1e702aba44112775471afbb430159b9d45d9522f6616bbd8990c741039e3540abb9708eba955f4256c0d069bf0a36c0e9d1736f76b52120dafa029f567774ed65e9dd0b976f1e5f7016a5d7768861cc8c7e0d0e612bb3e9a0669e4bb8d8b5509d45b7b72686e85bbe7b901a58d01fbfe6b1f515180e37582f4b2393973cf7e5c11ddbfa95de2010354999177d884ea5fa648ea6212718b7d4381254dbb22ccf10be53b7788d537652292fe274f25bba079e495f3ff56f82e72b7a4dd00c3d16da5771fda3f4773f57ebffc20e6332dc78a59a62900afbd80f8e147d8b690b79d5a151b420d9469da4d2fa5ee1ca6b24103883f3d645b1c0473744a8ee5beea390ff9b7bc1e22e704338a59df285ba3b14e4c3437baa8d405cebc8ed272ceacac1f47c640b6c3cd76cd4ece8e208d6cbad0f528a786ae41cdae2f8be9e8dab509a7759803b4be4a4ed21f380991770ba17dc34e9e28720f3390a3faacf8add22afca5e55b49e367a4bfe42593bc1cf3cf35d78e4d63aedcf51edfe40a660638a1f111d4e7065388f42447d154df70b485ea0008cb909643f60bbe22a242e9fefcb594c8cd13a40908b982cb4929be4a520fbbc96c47f9400ade33c07273bad47be034a17cdb6172f9dc3044014eccfc9c3c86e2b2d18766c785b5e113880e1299fddede1c4a9e93ec15cb314712bdbdb8f583888a9d3b49ee8f910365cba8db3de928971ffbaeac7a69077740c35c391388d76bebcee9ef567d09ccfdc3430897c3a254dbdf9be919c4a861798a644fb15215335d0ce2d21143f7e0eaa4a8042eb425b69592f460915bfc99a8e70eb7e7eac6679ec0fda038e86da6d2cdaef4f301e418735c2ca7b7635833bdcb922fe3e50828c189950ba6be952c605b31436cc24a40684bbe96ac403a334e215b0b7ed04880265d21eb208114857a2c4213d7291bdbd14f5a99574c1c1c2ba02cfd9ce28b4f6ddcd5c4ceeaab229e2dea4907813d0ace24137158af474aabacf5f9be8ae00899927754f97a4ab70f8db65d5deeba66e922fdf3098adf0fc7fd7accbe93a67f19b2233375ef16377a06136818e62e43c224073a8988bccad4c667d948d68f779ebe7cc572e841375c8eb8176b8d7087a018e8b8830f9f8bb545877854bf8df2229eadfa72e4605bc3beef4311bf25d6b6f7c025c5e2a6cfa67e10a72cfedf7c4730feedf6459929d04140a8cd0d680f2029f8c479d7fa1e3559963a7c18324bb8ad5c64ddc2d102d09e3447b2957eec724286df89a9a900c406839ccb649d5791086fd4d06464c3506fbbd308f17b14953d162dc834b82eee1be68b2f4163c3bec3ccd627fe87b666dc498b7191a2c4688aed1432b260e8b014e32b8777e93d74455006e4c5f7483c6bc2f23944c3bf4c79e8c55ccd3bf47c53130dec4f2b36a8e6f77adc578154f2ff453c487867d6e32f44dc24a662c40fdba9e45fbc734b981729d5b146cb6dd107b089de37aa7e5460c0b0835365eb8f7d4f9ad5485d08812c7123f159c0f70663053d46eee1d189533df1a96d63dea92e2a18619e3ae8db2db224f05a8757c75a30d1801d32b70ccc60f1e9106df1589071bbeb71149292b41de76ad91b763c640f5ccdd1a40e3ba8752369e2cc4ab92078540da470b0c8533ed48f4cc4f6a167956b4f2fd7a4fb4ff9b1949877e5d9134efba3330d58f8f049d97d8e54fb6518388595cb7b14c82bcc5866412fada573b38acba4a8cb7110ae7dada51d43c7f798a916b0f859f0ede0255dc03e2814ce5f6c45f80142d6b4ae1f8f060ce8faa55e488278e3834f15097d3d53ad07350c54fdb07b5b68d9a923db9b4e2f1397ba474d574040bcf0363f9b2fa72357ac4cd23dd4af6cc4e3da69080839d0ce8a47d724658bc53d668b09dac3c7d39d0e72eaacb11ba8d87d9909ea53933f546be163534a0bc6e9746947aab9d875b99fb5cb5d34c11920ee2780d7b8a53e6e117d5a25b9c38e3105033a030b954dde0262e8f9e5badbc61dbc569fb65641d3631b297dfea467bf614750a99dd5e27df5f473f8dd3123f6d1ea9de902691c17962d9aea6d7a9462e4b29c97a58c7dd9fb35ce2b6a320d45c46f039d519d64e59d0fe129b481757e1d940231269297303c860e52f4eeaf8240b52138bd8691f589953e5b019f4c0ab2e84a5f7702b8a5c7c48dda73b8061ad54367fe69495f51969d2dcc1ead1c077279a02a10a5d4ad064161c5d324e918fa6a795379166c6a5b9e842c01f770a1e4cc588cb659f44fec11cdd1c4b2afe42d64dab284cd47ee7729fbbd5e8bfaefeee5f7df3faef767dd583252805480165b9ca7af52e7136f974a998541ca50b3f91456b0cf87889c05c63b8e954e4525349e1f484563b3682441a5e22af8f29f756b9a8aebae9340de41880e9ecbde44e05b97c398f6a980a92c9dcaaa536fb8e453185585620a61f48b50396a70bfd0f7e7ee629f8319376d54ea0f6b5a35b68692d970365ed5216e287ff26589690c4171240c1c64190a886d7ecb04370852bd93dd1dcb4a144780cd63517cc608aaf4242145a08cd46bb57b438e622721d6d240e49a0bc82fbfbe51f2d0fe5d8ba7e9345acd79921248792bd2caca47e4bbe933872afa488fd956271783caeae0276e05d1c68ce2e65d7a145d4d6037e26ce9a444e86cf862580bf6672d98d1aa9bc908b1f366d63d8fb96f8d7a1d8f25f6286096248a2f8342602f1b3733d827751eafa4dbc952251e2fa9f15afed6a37e8d4a6a682a38b700eb74cfbf45596da4b7ef2c063e2fd2484941ed062031c1e14a6ee634d6337c6abfcdc28113b4764540dde252f9a020a481e3e8e8a2273e0a96ee18c4f40162f6b32080a43164ebfef445747332c462c44a5e6dba8fda0eafbd4798f95ddec8e5360275bad767bf10e81614f0b2213c1a2e6ae86412a6b113a8f19ab170c114c4c92433504e322c1a6df5f7b6d4d01c190399ce3497e7fbfc31dfcdd4b930eb2df3732d6bdaa4a260c678d288ade233354345160c714b522e4cdf4a25aeb4d7b596a5c58c597e88aaa68bc52509689574886194df00d456e1b8965e11e6b76f8fbaf876f878308195af6690b319af6910579e5b7fc9198c3ea096318f0d861e9fbe04ba762f19bdcf42231e8ca9b586c0a9069da73151277a07d138f83bbd7497ee6fb309a25020efc1133ab41f55debb87aa09478b569947b1d104c17d21788e6e1660a204c1ce80845116d685a35f78bc67903b859f74e7a7d7b6e10740e6169a7e3efad87bfc989e3b33c032ff64939efac2fef26618062a5b94ad3f8326f8a25339c334f220a52024c2846e5196670c47403d2ece6335f281bbc4353df1b096fd46c7e01289a3f72f9f700c13b6ac66891835113613234fecd63a00f3eaea0af939ad713bf59233444c2193a08a357843b38d920d89c66d17a16d6a4281617701c019e018924aa315d479d4cef73a785d0e70b26fb377eb1a9cb927d3fe1c01d1b7c237cc296b6925efb856618978bf428f4f320ee779318fe097c8d009cdd06c1677b35bc9ccad7e1d13fb806b2413928b08822580e10fa4f5845c1274318f6e936c9796825edc6c6029e3c6075268c3d0e61db75441a856523a124a80f8d33d3d46e0a4b05f26f8e7648467511701b26c4a72ba97cfe0f0eadc116e73c0312f7d32f35d62628bcec54bbf6356b8db34be488c2746eb91c581ff65e334d9dd650206b28d30316343158dfccc5424893d877921f534cec32ba73f3a7c01205ade260305baba4027d355aedf0b738501b2a3c03181c399a3b180e7df46da35153f46e9cef750d34b8af1715cff9e812705b25e9ba52e24f6c3234cf3a690cfddd2cc7fbbde13f57c67aae3186f9985c204598e3706a39730ee91ae556add15a6b696d0bbe3145d3c5bda6c599e58e5d299497a18d139a7bd85bef5ea98909d453f49565ec8bb1577fc13502f99ed8c5c9b005472e5ad2e299615a2e4fbcf95aab1e0355d4d6f8e89fde0a73aa50a47cfbdd0d8afe821e8806b97fae2f3fdaacd0c2c4173decf68413b4ed6fa7551b96548756984f7f8e358661ce5e161bdd775c118b68a1f06be32e74ca4cb7bdab9c5aa524680405f92282c529ce2931b96052910460f417a617a27b2032b851e6295656904e2e6d616d03b1732b8e9bb3602370634d0309ea1b17d06b884ad4ca429c51075eb1f01c7e3a300e3bdfeaac94950b42ede019df9d34e7255e3c35db12243aee51d5ceeda3a68a52f759b6d3c0da7e63474aa10941672412bdf51e07880ad8b84d835e5fb17ecf22652b39e2d7c0cadc2f56b7e4bb8059eff77d99fee3fb615b02f3887f1faa025fba6e4f1fade7095622634a0db4b22941ea10701da30c7c556d7b8d66cf91c831d7719c826f1da73df24eecbe173fda94e46ebc6c7f2d45b2d92b2f91f83039d7ed5aedf11d1930ff137f7b0f3d4efbfc97ca4cd43ea62091fa219028891a4bfe85bedcd9994a4f0fcdc386d01d74756e271d9f252c69583b5e961fe9123c51b2512145cee7f66a3241c1d1193fc512e3e25778d641771b07119d13a03f70a079f5295cff18ad180794b8d365dcd838cdafa8c8f6bbbf48adc770fc0d2f3fab7c8b607813abd4699f87ee66220d9f208cc343c76b7869012577af9efe7422362786e4a7be313d002c4695c43ff6fea75f78f1a568ad799521d1ea1757ab77d13ae0d5580fb9f88b61848efa14847ec872b7dc7b30ba78e2108f5d3469622a49b9728687a321e40e9a5316904350b054f55010ad917f752af5cc56d5c874229e32f85282af2306c678ff35042913b28234095d946e5c8896964705c60e3f750c981bee6827c11eb848d7d77e13becb8fc34739eda264dfc49a444f403c1109ac0717fb6712ce817ca2c81044bccd9eb9f8fb2aa87a8b03b72b99b6af7ded2b3cc7b67e6f6d532463bfc35f366b1ec45db5a1fd6cb238b62d6a8c920dc688c4c4f3dfef7784eb53934bf8fb603fd93d90e41cf681076fd45630d10af49889311526c82ff7779eca13e5329efdb9200647b0013551378c5b9f8bbe72ebd439d94a00994fd5c1ec9c00505f8b3c204e0fb8d78a37dcbc1e3b7d1107fb2edf86a53d7b6dff4a3efe81c30c14a839add14408d785550fc284d55637f719a9d1b1b385369e7bb0b38fd242c069830cc0c678e9549edc74621c2a0b7ba75315e073227cfaaee702258e70b739dbd1b64c153afcf411b6febd7b66903df1969daa9d2b448bacdfb7827bfa0f73b10ea57f08f1f3f899b3a1329fc67d78c367a4e59175b4b3c9b31b520756955a32ebdff06691c4265973bf116b9a90e8a3dbdc5fcd84957bed2b3b2bc977c2707798c804d087781db91fc3d23f42881eb3df31599447c96c73a9877907109bb88a6e80867baf5ae54eeecd7107f72c62bc410f41a09ee143d994eac12f3ef7bf6cf2ee952966a789e8744c0ae986fa1188370551dcf996d3c0a1756cb7e359730c850dff1be56153c22407b7cfd0da80b07fe146aef8763629507e725d617155d23bb90e077e16c9dbf74054393e907e574b4dc9012ec53e9e29922d4dc2ce65c5822ac0f40eaf587f411cc8058cfc9d76a580184fce1361fd2891d0b5bb880ab4535ee71d95feb993a6264b986aca2870191a31fd883448da780e476a1410a1b4a961f488890534a48dde7c2e4fe5c4bc66eeb27af399efd51bc40ec74cf920d41f548f6013663af4fb3d83f9f5c5ba6d12aa8945791be190a10aa92ec30036a54e1b64e69b70da4606b037730131f8a79651aae6615bd6952085b43b60482399945562908cd4cf2a629c9d073430a16ca12ec56690e12920efeb2e6327f02d4b9c173208d3c4a943dd15886aad15da8674fafc1614778766604b4fe58704888c98f27316a748d023dc7543e3a9ab3baa6ae3c71caf3eb7c80ed5f36860e2cf5d1929f1cc9ae68c8384641ed2055a933a76be5e55b58f97525ed079d6e0885589e49d802f953be33d5903878ffb1deecbece46855293a6ebe718e9074898e424b53f8bd8b97851b5f2cb246cf0983d5d5a80c9027b7643bdf45ce6b07ebd2888c8d3b28bbc1bc67d9cb9d473f470ea4b9692a3aa20eced297bf6dec6d771015f667774d32ed6fa2d21b6e1c7fe6d77b294189bc576f5ca409d2e6e733bcd18994bd1f6fd8782cd018ab32aa8dda3c901f995adf8b475caefbc8ddd258e5f74200f8f73fbcd6192b7f01f6fee01bf8578d12e61da35ea3ba5f065513bc1abcfd46b4435aaf169a69c68d97dae2b3a35a6af9d64ad875d05b5daab6d34cab97bd9a66e3f94f52dd54faaf83ff9182c39c7b0dd4752b8607fdbd7304f2553fabc555855897099e94d6e794dbbefc1215da267b5fd22f9eb289dc019868de9da72beaeb9436afec8732e6a48b301334236c3e70ebf15f7767460e13e68f473c7b69fc5f2a6b81e6f7552d917e54ab0e8b095a70ee3f59acbc326ead62bab78617685858b12ba6cf182420008da49eba1d27e34cd5518997db8a4b7c9ed9d1d4e7534b45e193f731448805e1b592cd1db7388c68533c94b5ce3a85b78ad8a0c8e523c6ac2c80a921707746eb2f06f5bd04f27f606ecfc065108ebc40a1fe0e3d18b9b6856e32d4f44260e32289fddc465ad3cf6c8fe7d1b18324cd4550b0e6c7aed07a59c302a10470fbca074c032bd929e62bcf0a76d19d74b7882995f1e713c0fbb478d7c2f8bb846e5a4e563191250c8294cb22532e50b14ba60f0605536c479863ae00f42235239f59d4615c3ee203795cc4b50c0a6d7a7065abd9cd516a9d73ac26dff3c30f7be9d11cb362a48b06b5ac8ef8891b990c8a0aaecc41bbdd7d2f276ebed2b60497f08983d9cb156fc5486abf703a91cc2e80e46fd5e247e91d821afe6ab8ace8bce83c0c9e5a4cd592bd5589a468fdef13bd3bc527da7902bdb6b49429c2782f127fecf75827e2424206deeb5fe45573a24dcc3cb10fce7fb1c3add3d17532f9c61219bd480c5b42e0d2caed05cdd4d6ce753aaeb884ff8e1dcbfdd89733b618efc69d1c9e2a407d274d4b9a1f3c87f7858c7ca9ff10d12c023ba28fe34410cc20408ac73c5e88e0d8b5838e6ee002ea64722eb33f9f53beee85ab7406ad0f9df3bc0792d868da8084ec58e3aa834a88078768798d6d0add002812036d77b0e73dd60862f3d8c286f403f54d6fa1c61e0bdbf52bc958ef2b6bbdb2a8caf46ef45fd399ca8c9068edda753fc559b322b74123762a3dc456c24b37cc77907a9883487f69b66043ddfd24a22e5c7a4baa29a7d7a7a5f9e864c7a0c09c2f1f9c864d4188bf60d860f1e52cc4c547ecb779ec5299c5f42b31968114a631c0bcca3ae6ab51fc75b21b77dfd628e6e3544258b0014781fc1b593451420ffe1ccae5ffbc80caa3cd40cac37c92056b078940865fca7bfd7dea82015549593503e1d3beb7467eeb04288cdc4adddfbcb4b3ccddc8fec000f097d1df6b7a308a15936a6275c561b9274abc661f2eda1ae07c36818c0266e8920f8bd3887fcdf263c2d7331245072d68c93abbddb2a10b40fa00f693812940fee15a99af88e7885718313b75e6f8b356499b50f95d04a45c5ecf1a4ba12363d06e8bb73fb3098779c6b742ad63f54857c77ad57316e8f4b8dd435e203a85230fa7173a25f556e7f0942b907c248f02f7d64c61a5572e2002a24699cdf3ffed46027f1c15528af390ad66f166802479062f60ac4bb321a6f5e90586add523745ddbb5a03c83400b642ff761fcdb59c725d39d141187aba27ee9d03598a2b3deee6e3762d0ec6af20d9bc47768359e796501cbd23fa0c0565df946a1425e20e65d4a2695cbc6769d889f8f507f3d1e4be3d64724ec8ef9fc1d755883b36f87c70d1403f7910de3ef9c13520cd81cac06599d6bec70aee878a92d9a9cea3445c606c5e6de9d5bef0611ca5528a25fe6d85fd3aa20fe38e1bf648a110a84d1d9b1c3ef8fcfe17198da4c3a8a667a0cc23a616d854cf061121d35ad1b4647295f5897e3f2bc0ab2545ca6dc676e3df7ea37583d0dd67092e596b88caa767f8f3ffd43767d3c786b7bcf2b3c1b1c1d47e5a4a9693264128199ded9ee3ff17a223064db455da0a19bbbeaece68d3b51e248920296eac7751074b5bd45637c637e690a506daf89739ef753c7c731f94c83537f808a153e31382d05d171d855b5785f7da2c190de56187cdf81dbd847f3a5f6ed58293df785fa8e91439f617921db6c4b828867aa2c8f578a4b6f6c787a1082db6cfa88f9b1a85cf10d06d7e4324d125077fd5e21ae52b1406e599aa4d512e2f537d1454d54cabe59e43b4c11ca2429cfd3677f2fadbd3250aae2b36efcca65b3e460c4e17ebe17249f455d239663470e6786380038ff36f077e3d2cc8b67f34f627d1e5401b2f47b7789632d64f63338975a9a3eec6e185334bd956c3127447f17ff19b381ad7d387626c27b599c7201e69e5310b731d35c4f01391db51977d1f636963ea3ee0b341afa838b55e053a355e20d672ba83dfbd0ab83d71cde66c6f3b576514b2da8b63dcd493719dfede06a56ef76935852ee7a53b632e59789fa6a62e82000c124182da5eab1f07921c1479ee212c1f32ab6966178c7a9191ca9ebc3f7e7f55fc201578a28cbf934aca8bc2c2604365bd68c88299fdec33ef0c463a02134c577e0d60dd3e92e1b6654a1188d6630bf134368f9ccf7f804812697e7bf1079908839f980a212676562d4b39243a1999e60663947dc948cb5002fe278dcb02cecaec128262ae22ef64af458540c3a79c8aba9d4be2d4a9fc5fc6d84a7766cb60240dbc0ce29a43a3ade04c2527579f32c2270008ef7328f7a798ec24d2da4e6d18ca9f987c08835429ae3e076a16243e729a778bc6e768150595fb649d25db63926fd4534e027599f0c42870c5c6bece7a7502c21896c36a8375c4e498f86f99f376b2b8cc0d802f9e7a7dd933701ce696c5bc3c81eb735bec18ecd2a1265d08d193246840364562de80888f207e1ba568cbe861a1370618941d3634200b2b4638073c5fd940c28d93fd1a13a5ef598ec522c785aa8ca3fc3d93d1360a0c15696582a5b1cac4cd2a3bf07f7ff922efe54900232d2204b79e912ca2bcadb504504124c39e021d2b8e652bb1809b8c71f1b32fcb3a3a0c1c9e1a8bfd287e7ab58a8c983c21632f74f64635a653e8020cc2669fbef817b876d60c375b3519ccd12b448a8866fef8da0ddf546422e5c15d0960f113a691c8302722db3bca5c2bf5e26fa0284df6077a82c80b4c9f30f874128e773ed252603b966f84f03b2fd8d376aa643b8cf7163dbed8f90837daf747414576de7b0ec2d11f4e0e1e208d850412d147d9f9a6360df2858b5a940d71343763fde22dad3c68fc93a31bde45e3ac4d02a0537fd391e8e68a47da1d322d477ba1081bb38bf03a39db020f6832488be0f43447b4b6ad3bc210c7ca3392698fee6353f1ceacbea1f984734c80f360d04f754df5740b77709f229cda3fcce8a315c5f74e9b7008fbda1386250a177485355d95c851f6a87eae1092faa6e1b1425691ae5a8908a2f1b7e7f08ec2721fc7c8fac509bf8e833a9da7a43bdf4dfa8b7ced55c6912679798387ade0278fb49c8e616e069cc11c73eaceab96c702fe9edbe9b749430cad54c8c245a216635f78b238e0f58711cb918854d7514b88cb911670db0dd4edaf1aa8c02037fa240ca9a065c9f6633101f39d703c6d3648a3f7b79a7031a791c2fd6e35cadc6d325761a9d599d604ae74e383fe0b79779788a50356319daf4699a80fd51765818071c51eb00e1df4bdda6c6487055b321d51af01cf71afea3618c2e98615a2930de07af08f28408d768062ed0f23c6e695ed3545a150904c4eaf159fd1d7659076be8f860232daa2f466decaef2edb2dcd4d86a1a59bcbdff32f70986c01afd76a5ba8168c105cda5cc7c0e727e9dc4a6d0ddd8291e873f4018ebff058ae78a1c4adffb3643eacf6e8e697bf4535cd8f04b7c857ab347473cf38ce48a2e41dca7e837aac1dac8c97070e748d8de49ab26064b0d7aa28fb14bde390c59c03c363a2faf16f798f152c7e0428a830a935552af603429140f1ee42d94618da10413cb8e4bb843249909e6886758e30f5e65676737f44c96950f94305922cdfa9ead958f1a25394f36c9f8df43d0c92d8018f87cd5499b4f0308db5253059d405c75d4f2081e64eb57032df45f8779cbdd3fc51f9deac8d24c7af488cf784a937664f2e2fc8e01f523e15cab46f9d8a796e49aa906eda43815fd7df1610019d1191f623ed15e9892d33cc5b266bb0cdfe9972b620dc615de292d4d5fff6ddeebd039b45c76c93618c7da33cd699bfe4464793c0df4b282aff3819a4625d3b44220d2d6767e1c10a8335e7a897beaaa6ada8fe8d13c2e723c05aaceadbf1408e811de60fb204a16e75d82ab96f5f92b64de07014a2a6a8d5ff20922c23ff39650d1ef4b3d94cb9aba0b615bde4e1a013b089b26126fc76c4078bb925d61120262feefaa3312d9721cfbaa9fe55c06fb3ca9972d6fed5343b48713adaa4c1886926607debdff37cb9e4e6f58ccad68ce02a8c64531f13f7d3d6ca5e5b3c06aaeb6f88f6f653d68ee2255d43698bb82744de03a915bd23b6c1f7473bdecd536193bd7d45279d73fc12eb4c372d5519e6356854f0e22fa201fb91bc439d79478844aff09e861ebe0df03bcc685f061b3dd995e841af39094aeba7f36fca5b6c2c3dc1365cb637a56e009317806bb3fc9f7811cbad61a41e8a4390c456f91a178488cb5a80a155a506e4a538e7f6367243db92e156c818bc3dbfebf90ae4571e7e840b8e5fd2edeb9c30b11a92ced549fe7c577c9af54cc4ac2908dadb3201d39b01314da3b44a27c3d8e58c7eaa0025433da4a64e065a0ab5952e2e8e034a6ea62aa302b5058a73f77e5d35902f1d44c630d6dcb3d8d719f0fa46d041291b5a7f3ab917c773ca36bbd832a7b4f7504ebe66efa960ccae221e95e5147e89e183e4c24e36aa20f7fb123b539bd861896cf63a96f6a624c8b79a18c77e1739111ca8e5820111921fb260e6a48388564f2afb69aeca0a2fd0a78eb7f49193fe7238f483dedf5a778bad30af52e04cdf8e9370e6f38f23426640418651b83b8ec0598d36dc27afe060edab5762186e5b08714983a55a6c308a5c5720b1a5bfa36e93ed1e336f5cc4b2a99394bf4479436ad83f775c281fbc1383f8e9a6e36d4e5cd6c8ea6ff92a26614374bc9e479cf8a12c5971ce751a6a289d24cbeb67ceb4754f4140acfb3dd73e8c22aa0352a9999a39ba1a9b110ba2e564e84d515bdf2d49cb0b5ff4dd02eeca8974633401d762dea53af7e485e20b90812d7f868d8bc7517f1814138d6857741484791f6c497e11865f6d134b01f574adb084c21c3e0476b3c47c9674173c241470986f3864f0f8b65b7e3d13d4caffc7d2b698c3d624507150c01ccac0171f4b6849165612abdeb24cf8943b7fd80333aee377d480fa8687dd3d911c2658ae859a246c807ef3c76b0f02dfeffe7e91200dcffda87726f2453e694347605b924f21d218fbef49cb1d5cd3f97cdceb594f180f395ec44fa96006f98bc7beba43cf498ad14f706202b5acc117d2de46ca52d03bfad74dfdd361dd4f934ed6350d4510447d2c6487635f1bbb86c38c270b408eabd5229cc6fd5a9c59222e793cab9f0f3bb3f2638388c678c99147e6638c60a63dd6dfaca6e32068b18818a79d8fad836dea4df61d22370a9d0dc6900cac2be30cd872eb18acaf9f52398f0c85ec95ee928f19d942b4e542463d0165752156e6f5b296ada791be3ca5c61c891c470bd0318f995491dfe39482745b164c11ab9e58c5dc7e1046f33b0f42886a579d4a215bcbe06025580afdd3a40e5c0dd656c29892f0f1b35e04547c31de30b1fae260a14ceace655d79bc6e9ddfd3b7873eecd9f4099318a9484d7fd0379370b17943dac3ca145229e300b6124270da5291b629f9563c2b1627eef6eae1627cda13f1a7e8f12faf08f2ab2b2c8f307027e9ce84fe66f5246263c743c7123bfe9bdea822558892e32c9e625e73448050acc3f8aae244e055c5733199d0b82bbbf93f2ab7436c60d591ce4ab0565d1385e006c49fac0927ae67815c49d1009c3ccc563b9e5d6b20354271f32a398d5fbd4c9b0b14137ea9815958231fa47eb0dc0f3a01cbe82b24421b19b2d1cab1024ae1f4a10ca3507a371cb81014680ff2d650d2e270008dc5dc8810025514120602a6174410d1f715c2498c3265ff62862527c45bfdbb4696bf51c1557c6ab0aefee4bdfe9a8f1469b6e2550d331b611d84170b0359b77c7e378f3e79b906831bec8df202c8be50ad0a9e777f3d9e3854c5e3a2b1e81d152c45c1296184021b877ef33d916b73249a205450d0adba715a8dc26eef992cb7b5156ffa641debf18fb1825f33b4e79daf3f8b70a1c6639f6bb8de22fc8dac39353aea8eed357470bee526c54c909c00ecb647c823c46d0309ce179fc90f8d71926ae8b40a6cf2362167c20da97625d930a240ea4f3c547d09f66d851ab1b36be8690e304a17be8062dc1268b2fbc1f4af83ea58bca83dd9937988b8659e495ebf4408ec8d2fa191680b126d1fed860b662af8c6e274e30b1a9268f90d5ff8ac5fe959bc8c8fca459445cbd24cb7668f890ec307fafa1609b5df89c09d9f9722954c7c6a31ad0751d0cec8702bb9f79c2245d796e2b0c712d16d1f830035fa3c30f5939f8d4cbecd45374ae55b383e6e1e070fc6e092e41585b970ff844846766fb07337ebcdb34294ce2202dc129d28ddd6cf73bcb1666f03779cf76ff310062f1490b7ce36ad2448d2e3ae172109ccdb2c1aed14f91f546cfb6b171b87b65cd7f6e66bf043f609f9f64592057611357b207ce952dbb7f7d5fe49b65af84717cba14e35830b35873f35a7f9a6744792b2fef4d18a24f426c4e6e91481a1cb0cfc79e660b2e0e3984e75ea64185d1b196b7958b830b9a585e55bb84cf624d73002c5144be283de6b8713cde91bc4db1b7c57604181e7a56fbcb91890f7e7cda492cd7f03f3836ea226e7115412e8439b9855c69da780df81a2d94ddf080ec027f9dac9063d46728bacccf1b858ebf7823136d302b9225a6673575ddc64f5525f6051bcfa03197e747cc618674b109e4e8f915d067428e35acbe7b007bbd363c859c0ac78aa4e1cf8ab81b4b77e1667f759f8824385314910cbaaf6648a7a0dfac37e0361eb9914122fb4dc3f467c82534dfebfbffa4dcacda5dc5eb04f4da8cd79b1bcf0ff2b0490062ebd38793ac9fe36e7a118705cf4723a09560c812f82b811f31596fb246c4b566934acdf065a74f9ea181a04bcff31f814acd3216cca2ce1c340d2ba826b4d0bdc72dc116a06a5c65aebcf3639a0d78e16a89848be61a6b862ef32144ad97cd8b75f62fd8d681e1be58b00e0b53339ff19d6f81929b693c1f46621e0ab0e970bdcfeb71a88b9d8c139ccc92233af21baa143ce0fce068231d608382d5bf13e4fdca6c2826d317880443a0ec48e0bc77d848deac6f5600b276a3668eba0d51ff3089ae48639e2a58c0ef0d0737cd3d8206c688318b9c362c82b3a0af74622462b396423d798b0d954acd83013dd75d495dd26bacfe392683cae144dfec0662c81ddf132513e0bdc771fb11eaa6cdc7688915575ee52123cc150954ae517e29f4d128d146b0a35bbad1b682f56384eae410f61f45ae57e5698e8c14e3939b8040e83a3113f97c73c1d99e21425ac2ac68a0aff530aae26f6765c82955620fae14f8f2cadddae106c8c1a6f2e541f446bd0748d1a3d396c3983ff2715d89729d9aa9b6ccaeae06150096930d4fa526296f9e3e219b0a8e6f4a0044ef44c0dd26eedcb73a495f713c42e4eed81361fc522b4342a1a1630b771bdac1b5da4dd2f676a452a78b5ddf50364933bcbc475b62052733c69cb3540d25c8eaf00d064430c8f05ed205f4615581dcaa9c3bf4a62ece54e826329b1eb2d47c38c8d637767f92c26ddc9156a74a64eb8a2f58c450d94af360e17bc2577777c88e0ade31c44c731962c29180399d7e760d7c9f474db4d25140fb41ed76b6ad6f7511c087b7d6feda75ad717b2b9ddb235ac5712baad058ad977a7f4d830db4b2c299a731af4a03738eab87c9dbdaa10b1d4d320267c0c09fb88fbf5825cf6e978221f52b920ff675453c79537c685c3aa827354f2f1934842d0b62eb7e1bb89efd8814a9d84e69080180bcab9136c212d69bf2a34a8dd0c7f9e1218041c6d9b2d320427ccef89fa1eb6adb0008461d251a20cdeb77ccfba6d4e9796c1694a8874064e9acb2abe5ffd57edaf6a0e0062effed1943ea9956b660674b58783b11bfc91231b6ad50d9a4737cedc8d0814d15b262e61a688eccf926d360981377fc20bc59782753296004ce5773ce2739ccd81db9c63e5fc8026da31cf7ceb46ec2ae80c0058bc6ec949a5b3be17aec751c4fc89548d1e2501df81c2a3c172d0a56229ff0cb4b6cc782fb303f3661ef9ec4e65f6bb0586ed5b0f6e81120b0507214fbd30f00f9ad0ea418bae8467eaf40fb1e3f214f0ddd958f18ee912d25234f0fc4d435737312d6cf3ebdaa4b6ee6a3f3eb7d2750e181999899ba1ccef9aa46a848f5aa36dfee2ec504b677f62d32c2db8e080bbe35ccb1dcba70a621fb884d7dd4526f3f30c328b74f2ff57e1324023ca7cf4635ac2f10a9e21e57807ff24ef4d7448b00e5e243ea69f1134c96dff3b58f357d7ded38b37f054dcf84b697ec4a722dcbe266c5245c5f907465f05f00e773e80c7f1dece5fd0fcf2402eacde756855a034395e832a29373b6d3368afb86380e47091575500d4bccbd9980001546554b73aa64d88e43f5b6c7b4e20478569e3fa402b9e70e88952d9497e94d1afa72257d59f6c78d93eb22e4f3f121fe5488a53a9417ffa30ec7f7c6f56fed2dcd9064c5c83d7ddf6cded0bef9e82936944d5b607ccff663d1cdcb68a1ef5e342cdea1ae120176131510ff9a94d7bd4fe92abd49cf6cdfff938a006a1e51e595b654ed85612a188e2199d8e6457a4c2821cd25805bd01eb1765a22992c967e536f60365577c0bb1067eb3fc80efab259e363028af029c540b330a0065f8f9c74bb4406976d5b6e330adb8319822bf2675a2592327733070b7ea0586aa0673517b371710b7f6ca075b003b3f8fb2bf5e3ad4004bdf220e54e9155b1535a5e756eb3953272593c3af27d61de4e600624ad734e7446768949125d70b3a51bae9a187904b20010cb7e22235fec836e7dea95745e8881c7c895b17194cc50ba1f42faf9f7db2645526962cab7fd015cc56aced71ad353ede391beba59f00e2094894e3eef3cf8d4cd21db04f7a063989690b2ce083640a8e16772341e969b33ac6d44e17d836d63d927cb15fb918d305b700579d562874e806986bdec896fa202aff773e370e735a6e1697924123085b2b22205d12cff2381dbc9667f119735af863f134bd9a541a3b931bcf9c2b7edfe0f668a747fc3a0626fafae7a76af825268721eaf1ed415e18db5f6f802c7117a66b757ca69d8d49858c0a3ecdc7e8d22a96b3eec2ddc627ecfaa8c329572620258a910856cd7c31e88dbee07a1550e8efece3bcdfed84e96e1eb8a346371169b8e63ffac29d9d13af82211b3855353ab1a092d2f11509b99292c2ed43921749ad5888563ac4701d1bc0c3204c1a05264a66e14dbf368e07054c637d25a330c3fc3e650dbb488f2aa2c942d5bbdc60f454d2fcad4f2596eba9a0205f93c52bc745a0c6cb610e59cfc7fbc323fa4fd3eef5b4494600c0e30b3c4ee3a6e9644e3a5d8c58e3954570b34c60642057336d622eb7309ee9daa0c391ea7767aa227e7417c9a4eab7e443e994014b0a7be3a6b42ab42c705026961c672c5195fa43ac8682cf65f725c17eb3dd5b4efe00710e99c034e93de311ff784355c955d859d675ad737f45f97a514acdd8687993cd9e7d3c27ad8889e49160755ef7287d3a30094ae32cdb5693f2ede57bce79834c11ae15780ad1d9472df0e85226c079607c5d8c1fa565ec63d7bb1bfe3b0f5cdc23401b509f34f9a836475a1367a6374dd2c10a0aece92c4eeb17511886fab90634e0810fde873887a9f206ac429f3294f65eb3cfb38915f472a13e67ea1c331fdef32eed17e79b79aa8649762b4a877685cf160a955d2dc878b187d660b0de1c4d14af9d47bd3bd9a2a0e090b2714a55866d6cb18519649e3d4e000434629570ef65cf9de35f6f86fcf0b430dba33d9ce934515919a6721c6675d6040307a59c414d8d1ca05e73f735cec19c4e999829a922b276a4d3fdc2ab8911e3216bd373e7cdcee555301cc79cfc90a8fecbd51ad96ae2fc909e7f51e539371a79f19eecaf47e86cd8a92cb36ea4a7b29353f68eb0db128eca840ff40d389f49dd45c8dca7e4ea04ca6088b25c22f5dd8d96e8af10f4c5736113cffada16c254631e9219a9443f36c5e498905ab7e04bb72d49457e813499cf7cbe13b01f6702a755b8f65afb3eea570827ef788b59bf9a69f2c881664851fa699361b29860704745626a09e7cf88daae1e1187e88c34223c0ad2486c76e1ca06d746266af389147b14992264b72df4e704090143f273955343d3407353a77a1ff2e6f93f124e88415411bd0cd3682de03714a622082444f0505af3e00a5269ffbbfac4edacd74f7b235b71f43c26dbc635de8667a2586e7e35336c19c4863224169dd496befabf72b072709c46a22536d8f74b0394271c227fea7710123e0efb3e8b85e974d4a21de63a415080379cc96d26aebb0c869950802e01dac2cf38e5bcad98e9dc0ecd473d68627ba6a14b4d8fff9ec7712d35301ed8631e7f433b2f8e30c213f85aab327038fb74a0b50b56ff2082c6b474589367c2b3d7a8510b867a8230ccb54a0fa802724c777e816ac74284ea8a867632da6ad2cb6dd9f7ea296a267d84547506eaa8ed59084e8879396c2dfa402d5669e70fbd743d06cb0f33cdd9a8df18aeaf2f6c0987278c228755600f9b9ae85104c76420d0ff18b3e4e77074c2007d0a3a1b35b5bf4759d0f35c25a68be405e562bd2ce0f6ba61f4e6bb1958f7972547d20a644907d7a0c1f47ea754afbcb71d4e6d702f8df8350d813201571910ea5020af8718ca833b77c61f569df76aeed5406bd708c2ca0572703728e6ac4b9744e92baa45eb48b407d2629b5e4bdb1a67470feac58b29b948f5e389ab60971918cd9fd4d6d7bc80bc5378f3670ac20aa6f74caef781c5699798be99b2c0ae08ccffc3f237ff41053d4930ae6a5e29fd9ba31475fbea697fb9cf4e7d4637468d3ddab1c84f9907c08e075ee094e4fe9af295be5c7744306ba6d10c491df5db3a8d6bbda979af795bf61b434978c51dfc85a99fd68b8ca040cc7cde0077ac60a362ebe393e36d799d164c25e192bf5ee67e58f1b1c4242b57818f43f89cf19f925afc439cd911bdf735ee31c600a3bb0ebae132c9fbf73b949e0588d786b35ead9bb4825014f361a3deca6d59683ae434a6a118b90adb62f4cc385f4e0aea338c49106e95210aef4ff05857e03ac5c47e159b50541a697d14386f29e301c06d8f17bc632d928ff09ef80a62a9c97050395be0d887f8929746261e74012abb48b3c5ed3df60d569e228bff62e4976d6486e1efc48e0d6a96a20a5eca61bbc9053acd14ae609e550aa065f799b57483090faaec33af7c3244b70bc614cd3186e745848c8dbf125fe5d2ff68db83513a8918be4d13800bcab5a2a83dbcdc0f775c13d05380000d7fd474537522cb89e4c620a0041268151ebe32e2bbe788534317f7a78c75800bec3e8579367cf2ef43b4638421270da4078e3828564a656e102297d8ac62b543dfd8be88b06e61ac927ef728f226f0839e660322ac7206d110c209faba863edbf5f7fef1ca3dd9a4d1b8348ddfb2e1e5055a64e41f51c63744227ddd8a25d1eeb58d3dfb2a6400bcad851027a494d6ce8c192b2356f207eb99e02a3abd185064c28146f31bd021049b32448741c8d92340601adbcbd2c9a7cdf3e2e1abbabff502c55a2774d85a95a05543dbcd22e36f3d90e34b9039e824a0f65e1f541648cf944c01c6c6a211055bd1aae1c3de0a5d3404d8d9efbe2133774562fc98dce89ff7b09603f064c35b9ea072dcfb8f4abcacbd8fd0a69bab7fbf1500f82f85f32e2872704e6247cf381dad917029c3345e55f70a2b248a9411d92cac8fa3b05ceca5db6bb96cbb84e3f49daa4714c49c11603a664b97551c19fc3b7026ae62297874705ab1f4bcb17e094836ac92b880fd7b3ca8de40b1eeb42570a11007690f7f3e47fbab72406d3dedf239a7d8d9054636559948e72fec334cdd86a4310278b86249e19053f9f847037caa71ba5bdf2a6ea75adc1a1c560bb8828abb2ce288ac87958ebf32ccacec8c576eae2c9efca23ce4fb74950cd6bbc4dafe0c429adcb6f845607849f0fb88a3f1f2004a92c502c86e8fb806a48739284514ddf1b8c8e8e26ae8c95b7b35f7d90e5df0b19c4d497045a600d0365484cc2d5992fc251d7c6201dc31c8dddf29ffed8b95db438236213438a71fe059680ffd4215cf5ad218df3f0671892a75c22b1377f9b725930f05febd7d27babf5c75880f6996933d915ab99e4e2bc50e3f5f2c4246019b217c3cdfb62ee97321cae04cb8375bbf3777086676ba4391d1679066efb1f57b81d9a95ce51cb50ad518b68128924f2869142d5917a7395b9082438130a92d8d82e445045a80ba4010bc30380457bb01b214fef6acc238cfc9e8a09691a6dfc6da90f88d4dde8861ba388e18e1aee8df59134c01603301b9d87c89e28e5ab7fb7d711ec3fb0e53c37b5ae52c26fced9feec594b4dcfae027d93dd09fa9bf5e2db1d000d9d5804af270feef74b0cb3cf4ade75ef39c1eea6efc0ae2efea8e37474c293674d0fee40353ba87a56bcd3f9bda76946104b92e9f043b7e0e8bc8dc28a3bddb5f4cdf887f9c3fdd58e455068e3d0ceaa4e0196705a212e25a9af06e93f6c5be5bf8ffc4beaf2e83f516ef829ccc97eeb8c53f8eebb1c63b76abc8f77154c68ca69e0fadeeb80da1cb7c745dda61adaf2240948f058c98f7325a3c5ca0c271333c08b02ef873e73ee92e65ab74343624cdaee389d45dac1dc9a2cbdeb9506395d3347dbd5a2e2e41a0dae525fce69dcc0381271e6c1abe2780406407abfede6bfc82f19d99b58c86ec4d777a2f135420c4bc4abb4a5886b2d0eb3d93f62ae62bab075c52bfc1aee548c538cb5df4f28689b723fb0f6dd203e52bf47be1948761ffaf64de31a7a459a8119bb043e90a47c25910ab4fff793375b638b7977f16d8154e1ef77f8176340a345a6d19785f2c25b0f094e07afb5cc17e1d85b75017767d9bcc56b857a89c411e17a2e1578da153490f22319b6bd4bd0dc137809fc36cb619f13383b5f0b75588ea9a539084ec02c905aeb7db695371e03f9a4211c4f50827f8f461702549dd89035ba4a2345cadfee9db2181f47d5ddb1740ddd5187d67a90f1e36d5d706e4ac4d830736434092df6a6a20aedfe96c7d7ab218c86bfd113579df3b3f40db098b05a66e77be10e36da3072e4faed137215e78af258a82dc308bd27129a23e49d9a20b96bcb1f9fa8634f795025237a0b3ba580bfc13d85e151ee88340a8b66ecebe7a65881d7c98be45a304740c5d61aa0e193a148b3d63a052dfbb7783c59b581a3feac790e16e2e2bb4e194892f423d0b4bfda77c996a94d1ada1ea58beabc2bf22638497748dc6e6702a48e2a3e0d634a9bef648aa20afc63b66f9dd2a2b33f0d50c8c25496dddb956419c6cffda0180f27b2fda787219905b998cde17145abb4ed42b9688e06bc386467308e29b87c7b863ac2b97f5a11e02cfb3bcc1b66297de5f2214b6a56d70efd58cd05d63cfc654e1b595de6319f1bc7e6cfaec44ca84f2c8ce1b4823b5b68c5e2fe53006e5cc9ea80b140e73941b272635eefd6c6e8fc565645360498d5d5387238d1882ed2ce35954ef0df97d2af7bd0cf592bf07f1386af72feec2c9d31392ca0fe462b3e9d36b545e74178087c5f782011eeb0edb89e288e7a8ec636c5d6383acbf79b2ff481bd6e2a7e8e1d937984b5d04bbb79fff4f64d847ba6a66238cda96a9ddc6dcc074e8dce1cf9d57a4de8cf43817052d7940d6fdf5a807cfbdd8b9ec3aaf38b3795d0a5a2b8109f1aea5fd7a4bf1b2feb223ca7d14ea5ef0d94dd2f589bfc80fec1818166838241754e88c4ff041a590209e0afe093c7939e0c76e285bd02a0432497aeea66472708d314930d08467cfb02a74d93a79c79db5dd5b837c6e85e55bc6814ea907729543b74c5dd1fa096aa6b72f8bf0b851088d0eb6c1c951b1dc95aea8f4fe9ed75cf15f57d14814652be1c5d9f4bb1ca2654407c1ef772de0040317612b6a60b3d11359d0fcee938778ca660b27cc3cabf1b7a90e5e93d3efd9c29752104bc230ea00504d7915e2ce647e0671a9ad37d5d86ca54dd41fff0a964b94514ae6b43f537a47bd2edb7b324d07b09a486891652b4c45a5abf9e96934a9cddcf3995d2b0b2240e89742d21942f5f997d7133c94db9cf75206f919a315d9d4a3f6ff27031ad3390ac79e0864442c74cf4d5fdc574bac7672d272e6f14bfb571f911798ab88e13720cd74a3c6fc59f55b6b3c7d37653c6035f0e41b9ac2149430b1f868a389675083d4ec40750721000caa664b1ef05719e3ec59beb61089ac4cea07a11e4fe701abefdfddd43c3e4c7355721c90fe7a28c3d0d1f409b6ee55a22b854ee73223c57eb3513c2bbb9dda5ab439a563a2b764b72b0d4956922e30bf22ca41e87baa46a5d7c507f552f0e5d35f87f28e374e5491b30e05db2b6c2e2cce38ea51aea7e6e49216babc8bd37bd76c648263d49273a7770599865dbce9e16ccdaa8835cf4e7ecb1bc3992df51aefccdfe62c3d138dd5789a84643d5d25cbd20b0767749c9834a738c16bfc67bbc76f159085f8f241ab8218752a17a414be9bf468f9691cb0c7cde08e83e307cfe2fb25f14cc6541ba413b82fd2f90950d0e7a370d51c74c3540b05b516268d8345fb15d0808f3c2d60a768cc1beedeaed959ab5fa1ab5083ab9ae64bd060975299c853a2b8d2f6ba8c2032bfdbf164e40e984ebad1597cc371c676ba6b309ce2788f06304dcb46009c4280943c45b81b86ee0e7ef501a554192512a0e065d3a9bc797d8e4d663cc23e81ce318cee299de027869372380877b4660a846379eed2efd3c49c80fc4c44c9397c6e0b8ec35faffa7def624112b2af884cfb884fbdd99364d72110605d015b37745face096f87f6d071782e1fcc97cf9b3af84385145c1734ee52a2144ba843b7ac5df059e794c1363edef59f6d8418978fd164a5b1a3a2f8b3256556453ef2e60f8dcefa233a792e5a98abfb8daca722763997f33078330746ee1461b78bd44a5bd474e025e03b7015bcd4213a891f3e2fe9d277ee29271f0655688bbb38d4aea064eb254455f88e4930db4d5e9e6c7bff2996676f9421edc462f28cf58554d2019f33bb6fd66871727c81caf8d4bd0edac00917a8dc41102b05a314bb346fc53d62f06147bb4134b1248de5ec4649bcabae06a89720ed8f99d58243b6d55cd517acfc8f67704ffb88a35dbbeb1ef5d4e156a53ac3dc87b179a0dd1d12e8cff2343ac3e1e320179b0d10c3a1c3ff36bd38fc2114b95be42c44ccf9015fc3c8325b8db31c3e08ee541880f6cac7590a5f8128d550d90c2c3f6ad2cc048978b0dc0627eb37b47bcab25b6c615f71cf287e91f01ae4ace2989224f220d01e22ca3b1fd8e152d17e5e97b815a3ae12aad8074301e68b19bb3e6b31aebaa3a7805d0d496cb4296068a6caabf0ed776d54bb22a0ac08b73500b1b249d5a4a0b03f4f34b55c6e54e98b99d33199c0963586c196e64c8dae9ae42539899c4a882c5f0ca4cd4e5b6db8b3b216f1fac2e50fd830a4d65337a347194b0e2a7a3a7df6fc47f0c4663abb3ddb7750ef6f488067d37a65f01ba69569e771edb1a097d1fd31da4c5bccb98c80dc47a974f3bdc9eb0be01bbdf274641d4d60d762cde6b98c78d0197fa575816f804d63d2f16891eac68617a406ce404d15f9fe37e70caa669cafde8a85fad408dbe0bbcb63a69581e2753206a0a95490d895f1a3378d43c51b4933c91efba261c650f9e9ad68e2676493b3f162db760f1b52879b389f206255c00fe9ea2359b35d0fe4377f0ac53243628265855873de713a74b5d979ee3dbc1932833e10c686b41570e448a6defc298864cd4f53278f96dcbc57ce1e0e365c42a327c716ec9fa7f99eab7c5b33a27520f78f10a23d9df11f072d7be0c4571ff4086a6de4fd2e3e129f33e877dfe049aabc2d57410ac4cbf13aa38addd4867cbdba28167a0ccb8b7258303f67b4e9fc5b855ea6160ca9601a5fab6f54ba985d2ad0cc1e166f0c4aedc54f8644bff4d05b65f7c843145850ca2239d3c839c3625e6b39ee8a2cd8fb935d745586c88450d73cb91598108bc259a8af0e2dbdf78369c3bb86560ceb2546f15c5b1dced5bd037171fd512035aa1ea90ef54f9b2f1514d2d0e41568680802aac08f01654dc099a62e9d203b28268aae82ff1c9b0224578ee220caf37bc930f0817f0c9424462ba3ee73d878be0f4ec61490268cdc40d1cb173598c16fd953ec19a75878a0e74e79c858a06ded879b5760eb986fd39ea7510c31e7f6638d5e58d8c4fecbf65a0e3d215f2fd14cc872dfd4bdc6c28a96a68904dbabc8fedb2635c1fec668161bd1c5f000a028b7aaf5ef802320c6f1305e0ecc51d508f8e2a85819ac198986bc1d886c248fd3881546a8fbfa02a9d64eb26336977737ab05d0bb8bf4f4ba9541b493edc5a5131e57c4e2c109b93b38c6ea9de0e706d4feb126edcaedb8ccc3f0ef92aea85c031150d15982e1dbaa319ff2bb58e52c6cbe307e03ecc0601d726796bab689b5414a9c86b7132944ce7ecf6d19d700930a88f8da824d010ca91616b3d4a24597ff7f65ae38a3ee9018b4230cf9602bb0d42a3b78d73b6cadd3ddad78aa735e7aaa7feee08eaa513110d9f4b415b8777bb6a3c432e7cd5cfe1b267f5aec555e25db0e8418eec308731ae8421fb4d3aa3ff926a74daf0171694d3c0f80e32fe9e17dc2d4e824cd1e032e8b912b38bc5157e2257313b2be3e08e0ec25d683529ca2ec558746a07a4990ae745cb828aa787ca75d044cadaed2ade4fa936c124515c491e5ee30dc59ab7c8bb58f42c2bf0e90c817fa53aaaa4c2d70ae66681bf151a6778868cc25da51f0bb04c8c3beddcc1fe4f51b67fe603cdaeed78dc779a42c5c67b7d7cb21941b373561655fe226119bddc8f37e6a611bd6ef79abaed01cdcbc8b7b0db2e752f8ee8f9de2f2ade97d7ab2ec31df4464752a624e4bc66d170b1e9015e389f458754733886eb587a6bdc32cc4e797daaf64c36239ad18bb7b771b1baa55f1ea5ac4c9836293772d691b9f3a91cff29e98ba79ac9f14bd5e09169a2f13fab7a6f1417307cdf8eb276e61798c2bc068807318faaef3470f6b1e30aad8726c8bb8ecd14d922aaff885d1f1b09623865604f4deebf84ae44b0690930e401de291312a59b14cb627c5dad5764253315fac5cefa789f7e58af809fc5d34bfac5ab430e2d27b07f449edb740f2aafea71b7ff62431517c8b48d5b4df83f1012012a89664472797a2efd2267988dbb91b31f7c1bd2ed68933b041043d29582320c951d23e5b09f6ac2d6229eab85bd48f12f2fbc833e99286db807e981c8944e460c1c82658bfd7d61496f64a5a84d573777b2ccd98b6e62118cedff9667c4618930d0d756b82ed0eec9917620fc8af91e9b77ec68981123c65a01300c2b414b1e354e196f253c2c8da89f4bf794f6d90fae5e6d222b26f8cb84190869541dd8b57c3b0b4755749caf452fa7f0e938ef3b89878c5993f5f6609844c662d6da6aa916d94f3a61e445dfc2df6d7e958f430642770551215bdce4788e88e376e63bf5899ab333a615e42c80feab13b6a6cd560f500e15dda7861e349fde1fbaa65474e9573338293062f83f34d09c54bfe92c696dca74f2832f87cff72060053cb8212767915e969fc3aa647357021119961dc72583640ec49990453d89df538f6cd8bd6a0a438cf0a921331b1476dc927664c91e0b6f4496418bb56b4e079bab992bb4e6a3745e69cf81ce46e8767ef6283a8252a6625d18c6176a92e261513b2d7e2c92e702a5bf34886c98b6195fd670da045e409f19714a7d0c2d6926da58368f717e85ac8424be9757bc3f83232462cafc6ffb95182f5e9cda7d7a80d895a5de7b087d293b25ec73a669d81f082cf5da2f4a32f00200ac2b0af5ea27c265f58cd60550c914487e58eaee348eddf17bffeb7e98d7129f489b8667b7c18a0c1350b63edd66951bf3be6da68100df79261250daebbd16e929de1d1c312aecf2f1237c68dc9cc9b81a1147e4a2a37347ecde60eb19e950aa9c2b1180e4de9d1c4d40d0cf543c0125a924b50496d0732a214b03bd392d1927b7ba5500153c7443fa5d12d2e584f60befa06a7df5b7ba7ba9e3e3cf922a44f6e17ace701897ce8a384ecb2831a26a5fa1ec4e1cdd08ed97c10ac5b110293c79d9a6d94d9483884eeab08d425225f3ad0b1eeddbbd2a8afb9924b2be2ca6fc9c0cac8178908a27eb936a2fcfe51858a5646bd92db4929fe70aa3cda7824f8197645bb04525c0af958cc31f3a0383a663d17024658561ac1771f9a7f0678024f64094b6e0b7ccd980fb3ed3bd92c0889ea71cbd398b40c342fb635aae128c153b357e1797774c246442b1655904f9c15fc7d0a9a3d6d54c1b394c60240e5ab7a34f5458f5f637a652d5f98a8fd0fc6f5a76ee484eede5299582f9e494cc44e07fab974b6f346d95038f6a24effc2b7fc40895e07dca345fb3b176cb96f6a41b4784ee66ad0efab9bc923ba9ba3cb4baf9b21f76d52482f5286b36b90ab64136e99210768f50a8c76d39ee589023124298ec77ec64f56b35f04e4c9ceac9324249014e6ce6afd0ebae66f6f76431ad440b718227812142449c89c1785fe974192cc4b2a7f96058b8c8d6075fb1b38bb2bc7b3661b3a037c0c503bb3c3d75191beaf3365af9cca59f512f618afda11017227ad8170e32d328fac60d7aaebb71d8dea96bb5ca7924bec38c39fc59c44b4563304e3d878c8ab7ab3a22c3aff4d86368a27fb3a529bebbd520bf54180b35c55970abc88685c47eb093af85a569b3aa6d6c3b4d077c5bde459a64408dc5f0d6c30980aebefbf3d32541d6afa392992530c8bb440a9d3530bb79cf5b54c0eb6be3a232ce24c13cc10b3398ea217f5b8bc86535351a434a50e3c7b837516583021054381d706103e4f2ece9699b5130a807c002e5c420de9841b10267ee280326ed3d8373c99e3de8d7e525a0ed42f68bef4fc0a2a6229f6e0c4ad580dfcbf9170da3ef512cb549474abc3718807331a342a0e819731302ec719aca8bbac0999cda352121679e3ee622db28b65f5fba96b74c0576b8153373d129ca3e63bb0aae7bff2129e9704fe9ccb70802ca4eb9fff5914c298978a855234eb73a9912ef417d1a4aea392b868beb250949bcb640f3468d0ec078277dab2d162a43acafc17b53b19925c309a10589fb78d7112514fe75ced48cac379278ea858b7624a5cf6a14ff8d10e0438e5861c3588a1eb38d714301383e5b3c79174106a845d332dedd24d37e573c23e8ccd57289323619a93fc063e8b096bf007ec8799a9b18d235dedc6aa1e1e27fd8d27d270a784d825f7f8d80a085ef3768a1579a37165bd65de4f567de9ba550ef08c3190a2b5595ac8d3701fe9ddc4cee1fcd9fe346925c955ad2968aec9d88ed3b4b6a4d2adb2e7769afb8634dd655cf15b1e29697f930a442c75c84ae99e45f55c79d1d45e2108a42ea8ca57a15d55ed2f6dd0f931b9e79ae354f16431ccc6970ae7587464fd7525fbc1628d087109aa341d50d5a146532e56971e067a73ddf6f47ca3866d3a724b82bf8442db7020a6b9c7a79668400d8c783ed5acfb92cff2270f51eca821fb895a4fffda48b91ea1845360143a2dcac8f9d06be003e6229226937121678a019d0b11d9d96481e5d09fabe134c2ee60024fa9e12ce5112a29ba162874630e31beb68d97ac591bb8416ec4ab40442644885da49f98b5c4803a15df0b5b63d43cc29a1a1dc3ab7a940716ea376f8237db8eb6028c954b767f363f9495e8f280e703ea627316b63285bcbff8aab980ab614b4bf6fce950f844e9ccfb212b691266632b14e6ac88ae0251a1ee2b581047e631afa39cb32764c8ee329c9ba1f375a03ff5d1bffb08f7482b7e83d92d3567221b3b37eca3d956f5d8d7cb4ecff7e2d2ada24157d27c0ca0cc7a6dfeb4d70f94245a63e8db528a78c6b1f5add3daf3f2d014b811010032a109ad133d425fac69d01b4608386812ec679d5309db10bd76a7d381f750691f92f2720345d73db6a33a5c9c0f0c6a0416fbe31f70bf37f4361ff5383351a09992424d8d44649caec0802c3850485493c37b3cbdcb33badffa997e27607dbce8a55d8ad9742305764215ffc25074a3ddb092aac3f1df7e85d809f29358ed457889534b7847bf76914297ec9807920146ae32e7458035c56c2d7ef5a481094ba781835563b37165f6d10d121b76411f734557584103a1451e1d1ffd0bc07f4ce3492eec66f579d23d9f1e3440288abf5f5465d1ec18cbfbe9a70ba2ea6f52e9b386b10b3eb7b70a800499a2f7c3bdf842bb44673f8401a6b21d5af641cb4e609dd3c0cb4f69a26600c8811aa3fc9a5ff28e38d2048131412a888b7ab08ae50b7f816cfeca576105bd7848f2649370cc6d9b44ba2a8149527ff8e23197c47c8bfedb2213204235409fdec0c5b8884f6aa8abb0a90b0849fceba0ea18e6917823185467c332b0180c638403ee538bc3c68cc168fb6808fa4cbdec82f3e3e2700ff432ad1d68ead6c7393133c0d800d0694364fffeec99e874fe5f1896a07be8f2e65178212bb3b30be04cd82480f0e67e40cd96384c828b19a336d3f879aed66ffd86e6876da0c405591c2b127ccf75543896d85684e09fa01fe1c104e1a036b8567849bf23174c0a9d39087a7bf39a26dd65e4f5ed41833df47a9b3f0ac3b7d78a1e807da25da29cbcc1269d12a26913d03e73b2d4815fc4eab633fbdc3da0268f0d72dad0bb1f42761412b430355ca23dcc1a349a741dac870d52b7d2423e66a43394d9ce071eef492ee87e3948f27b40f3ac1ffd94bb9bf8987386800a33ccb32794b005225a93e7166350603b5d78df797d517b149b1b520787984a4ca6404965c4bb20ef1d2d4bcff92aee1210998e3fa4cb9ada98d193bcea4ad05f01784910cec305fc7e0fe9afe2f42e501e40e12d1e08e748a4564e7d33eb0cdaf52ad0c9a401af7242a10660685bb7ba9a2f4fe9b9ab95ae7672a4d7e87902e035b96fc9ee997402ffbbea7fdb896332a4ff67ef9dc2d111fb5c275f0a58fe7aca85a3a23632a3ee3edec96fcc4668b1d795c6ccf7b58442eac07300e29900b8db6e4ff277eb17ab59c099dfef3a9d9fcc2e2bbf707ab3d13643dfb7f7977cb06f1309b5c245e76e0db75c5cd2818a58c1e497dd00e76f0409d2cff25f035a03db6a4c113d382438c9a09646c2469a27ab0ad6ffa625748685cdf57d38ac7ee2b0bf55e39c3d9deb3c65765dc084c81bdb6510cac1be81c2b1b63f78e7c3bb4af01e45485d3060765457fb44a5640175cec8f95796d7bea81c66257429f7b8484eb9b945a538423517756bb948f1690aba6a1a6ec33ec96fdd5d1f4674c8fdbe46723ec30342685444dd62c527f00bf4bae0f9f5c9809ac2c4f7a9355f38647967835f04dcbb942a3f8054b6cf0793347f8d6510e369be237a89c899564fbbb1008a4ee51c8888e4bc5ec615f09f3709fe8915d311e4fcff087020f4c647639a29955ba349cdf309fa85fbd8ef3acf931a330d57fd51dd3164ed444062bafb350ff1a2cbdb68f0d065c787ff0662ca4133c228e98171a1188356b6291e29309f3f5a137b51b095f9955fe32f9e27131efdf995be6bc8b2ce199afa13d9879a9317faf9f16e307bcdbc549a7a1404d8a1f0ebf2fa8e3a4ce6473258a37898673c5033dfc04c0366ffede7b4335b4d776f5dc2a35e17e614cadec376461f11df2312b07fc5fbbfd524a6e7ea8a1469bbab45697db1f15eff40b0bc9a0c919853340966389c49a713285650066654f3207902afd9dadf06c4b5714c553840cd3ed4335fe17f4c2027965339a76635efa0c63035bf5edb6e760c20f14b66cdcaab4f8154cde371be4d60d45b28188b545600e7d53b2a8686d2130811b7f5259032354962af56d0a1f0c612e30d4f39781da020ab7a6102e8cf673089beb361be242f8fc92225f456b608a01ddcb32c3cbc6e806acdd37725ecc121eeab6d0164178d337afb530b68f3052dc17e669bb0d2352b84bae41ba085e60199d4863c6dc3c97fd7d574f69246dd16458fd0b836250e59a0e247ce80179ef6d2a59d2b0142d3bfd0d73597ecacf716e6e19c70ffefaea694290faf969af95e9e8c9d7224d19ea65092ede86315a4b1dfb3a17aa16a7073dbe68cae25bbfebf338e15452bb7331fbfa90a82170a9ea6ad8d8d0bd22470b52b304e5b51f5ca550fcc97a5f276880f20ac253799acdd40d685415c1d5d3bccfa9ba2fdad2a1199eb662536d210d4bf9c9c82f299a2cd0a1bbeed3c20ad2127f8791f09355876780eec985c2f9c9cd8f2d90291b88212d06b11e439a05fce2f8c65e8b1fe05eb845bc5163411a53a7829f87971ad454a295a2f407c730aabac55ad9417ea05b82e51d3642220e406f48125105ce37861b3239320d0c62e5ae18db9d4907dfdc4931f3066bf519b87617b27daca0217ae78f700181eb65acbb0682db8d5aa68fa6216d8ee51be3e42dc17f23ccd1292812727869d60f7a86b3f7a7a3d0d677bf9326ac1aab7cc043c0eaff1337f65f52bc60077c7cac0fa10c2560fcf781bc8e47686078d8f8c91d5739d969737ef302166cc540c9b580a977bcaceecda31a4525d9c3729130ad48485737ca29fc88353511faf09ab59a930656f87c02891c17aaa6929e1352202a5d6c3b70b3a10bea31a3c314ed3851595faf09a2f222d011e1e136d74a2142b05e096d70a3fb79ffdcc9838126e2a05a5255375899c0d40bd2191b7dce588e6cfe471d62c34a4973ffeb5359e55a540bb08c1e47959884cb2ae9f77ccde39a05a90d7756c2e5234dcda97663fd405abfeba2f61c6e7171757f10e362e60bc56207145568e6c917309382a75c50d6fea0b79f1cb25155cd3e354bb322105487edd1ded510d27c2846a9a68350f338a9cbd2da0dfb4b8b2404e5e7f653314cd9aefdfb7892340915607bb31709169e28e9e5df7a28778b8cc4214f5df24f6cfeb4f13ad63eef134888e9b608240db6ac6b3d1d5daea55bbf08cf2f090fd23d9874309949cc931e55550e864a7a0d63576925412864d870a397c4ef6d1ba6bbe4742b86f23899f5abd52bd34510ccd9bcfe47843cd7d3ff18691231502b5804d00c37f9769e4681875634aa20bef45e0c1ea4acf7688eba9eff330702b962ae08fd37cc6de5a5735b6fb00ad04fd35f499147f7a0af065b22a519b9cc6a7f3fafd7f16a3304cf20e9eae8bb3b120b8cbb7e167a911c37f944be1f732193a2095bf483b04b97931a974e3c8085d9014b143b1a02cc732db663bff7331e2f73f799ce0a9e64bde81c2ea13f910874d8a1742201811e6f9d26ca1f7b942128dae01ac26665e823a98bbf09e52a818d374223cb11ac6a0bf28f783489b68e133a974294e4b9ea1c01dd89ee1c14199e95f3b414afc41802c0615cce52f53559bfa81c16fd7c7d031c96ea4c26a57712e4ce6f4b37b143a88f55c21d6320456353e6fec85e5e9a8df2a9698888f72ee01bb72e57e21f52e48cb31f22376f08e5b64aab8e4e26c1382ea1cb41a1d88c56ad2b2a97e8e9c354721000c818412ccc4c44d8ba012ae4c957cc42250bdd5856cfc2e7577f8315c79936d535dce4db45f774437581ae9486def5d3d8527e93434567573ec04adeaf11d0f52ab7de962866b8a817fb01c4b5485b08217c39c955c1c121e5cce5e2fe6a4ea479ac6f06b4a85f413563d5226a7df4d8c8c00386d6018cd6d0c8cbf27dfaac42d26bfc82cbd50b37a91b32db689b7afa317d03c0b6039fd408d27172f78f3a9efa56b445ddb74e6c313366458957881b8462c611ab49f7230620bfb87efee37fb5fa14fcd27b20a34cd5efba6a719cf87cc649b6c4548278141c337f48cd2051d8f9daca634476b9119e1b8df0667e542af42e82d39cff46c47949db490aa05552543cb1d36c4fa74818b6724e0d5627ea899fa5aee0bc66eb4103c8179f0d4921962457d890f2c6b66a71120f0296f447458538245e6cac5388b761f46eb02b2ae1e09aa5b91001719a23eb3dc897fed70421258ab467db9ee0df593b967488c6542ab65e0ed207846bef7b9361d302ba4874741ecfad01a208a6b3911491e1cf3b62eba5603bc781b854be588989b2e63efdade4006c54ed7d0eaabbf17ffd24c37ea0bff043cdadc0c0172454e696d126420533a7d7210e5b19a9661f62494b8773f450b866bdccc63a36fb42c5a5ab04c236820b46de4f242b297b631b17d4c4fad7cde343385923724c6a1e13fd286b261e96dfa01e55ec724f1dce598112408b5e930cb7f461776aca6962866d2f54e40076619784f213c2d582b63a88408d05e19abc120d1714bac2dd75836c3b38aed9f88f922d9dc7654f878cc31c0f9f9a00c6b252356cf26977c0a127e3c50d6c101ed8c5a6fe1a122e189c911776ca1b50dc55883d4cd62a96a4958f90c9486e979a2ad0e5654c95ea18ab08d1f295d7e006a7babac58a186fc5f24d868e81a63cd46996fe5794857aa4e39e504c855e03d054c406ce1df752042a04c00297edc5c8c34a59ecc8d1968ec07e2754f1b0020e92970c57bae78c5b20c3f0e18aed20194e34069b147ff33358563d70ae9581e45b71c84242f1c77690e0fc8c09c7a3f3d62e84db6500332b4e64f3126fed6a070fa2d084394b7447b5f1f206be6a29e3fe4cc501d11d0746f5d0977fb32a48490aa612abad360f40faced42a420b8addfbd4b4d9f6144e6093a9100fbf24ca85b923f9ae7febd60f5bb1ab5a7bd63c396a4d464d420e14a8091772fbf1220081bd358a0c80ab99a07344a82bd2c273eac9d7123bea7725b3e1686ee58bee7e82b8ed3850345911fae7b88c48ba0b3c2d01d0f3036f79c176668ae17418c287afdfda207f161a57c17fd05c0f40d8425629782c1730bfd543aebb82541d429eda3b06b7705740a656790b99b8ae8f9feb8d40dcb782f250b0eb35ab22fe5424a31cbac901070a8f71a7e2942bc6ee28c494d872f69e5e0e61c31b5b949686cdee2ca739b9a8fc76a21882f1ed14fd3c10e1bfdf7b4d0a881f1b0d244770aab5b1ed7a901e0f1e5535281db14db5aee7585f61af9470446ce8a702a25ac343bf69355e3b6fbbeb84b1a7ee5c45ce48dd873c0c2b673e98de83027ae09f2caaa58385af98450dfa60322b78b3301717ea454421600d548a3e06ca5256871542493e180e6f2a46b9ea089ffbca830c41b28b888dd5940ca2f0c860cfacdc699d8ae6788ae9f25cd46dcfc3b54e78d10e242a57";
|
|
3215
|
-
//#endregion
|
|
3216
3277
|
//#region src/async-mutex.ts
|
|
3217
3278
|
/** Serialize async work (one flight at a time). */
|
|
3218
3279
|
var AsyncMutex = class {
|
|
@@ -4382,40 +4443,50 @@ var SqisignWrapper = class {
|
|
|
4382
4443
|
this.variant = variant;
|
|
4383
4444
|
}
|
|
4384
4445
|
keypair() {
|
|
4446
|
+
assertBrowserSkCeremonyAllowed();
|
|
4385
4447
|
const pairPromise = sqisignRngMutex[this.variant].run(async () => {
|
|
4386
4448
|
const api = getApi(this.variant);
|
|
4387
4449
|
const module = await api.getModule();
|
|
4388
4450
|
const seed = crypto.getRandomValues(new Uint8Array(api.seedBytes(module)));
|
|
4389
|
-
|
|
4390
|
-
|
|
4391
|
-
|
|
4392
|
-
|
|
4393
|
-
|
|
4394
|
-
|
|
4395
|
-
|
|
4396
|
-
|
|
4397
|
-
|
|
4398
|
-
|
|
4399
|
-
|
|
4451
|
+
try {
|
|
4452
|
+
return withStack(module, (alloc) => {
|
|
4453
|
+
const pkPtr = alloc(api.publicKeyBytes(module));
|
|
4454
|
+
const skPtr = alloc(api.privateKeyBytes(module));
|
|
4455
|
+
const seedPtr = writeBytes(module, alloc, seed);
|
|
4456
|
+
const rc = api.keypair(module, pkPtr, skPtr, seedPtr);
|
|
4457
|
+
if (rc !== 0) throw new Error(`SQISign ${this.variant} keypair failed with code ${rc}`);
|
|
4458
|
+
return {
|
|
4459
|
+
public_key: readBytes(module, pkPtr, api.publicKeyBytes(module)),
|
|
4460
|
+
private_key: readBytes(module, skPtr, api.privateKeyBytes(module))
|
|
4461
|
+
};
|
|
4462
|
+
});
|
|
4463
|
+
} finally {
|
|
4464
|
+
zeroizeBytes(seed);
|
|
4465
|
+
}
|
|
4400
4466
|
});
|
|
4401
4467
|
return { get: (key) => pairPromise.then((pair) => key === "public_key" ? pair.public_key : pair.private_key) };
|
|
4402
4468
|
}
|
|
4403
4469
|
sign(message, private_key) {
|
|
4470
|
+
assertBrowserSkCeremonyAllowed();
|
|
4404
4471
|
return sqisignRngMutex[this.variant].run(async () => {
|
|
4405
4472
|
const module = await ensureInit(this.variant);
|
|
4406
4473
|
const api = getApi(this.variant);
|
|
4407
4474
|
const msg = asBytes(message);
|
|
4408
4475
|
const keyBytes = asBytes(private_key);
|
|
4409
4476
|
const seed = crypto.getRandomValues(new Uint8Array(api.seedBytes(module)));
|
|
4410
|
-
|
|
4411
|
-
|
|
4412
|
-
|
|
4413
|
-
|
|
4414
|
-
|
|
4415
|
-
|
|
4416
|
-
|
|
4417
|
-
|
|
4418
|
-
|
|
4477
|
+
try {
|
|
4478
|
+
return withStack(module, (alloc) => {
|
|
4479
|
+
const sigPtr = alloc(api.signatureBytes(module));
|
|
4480
|
+
const msgPtr = writeBytes(module, alloc, msg);
|
|
4481
|
+
const skPtr = writeBytes(module, alloc, keyBytes);
|
|
4482
|
+
const seedPtr = writeBytes(module, alloc, seed);
|
|
4483
|
+
const rc = api.sign(module, sigPtr, msgPtr, msg.length, skPtr, seedPtr);
|
|
4484
|
+
if (rc !== 0) throw new Error(`SQISign ${this.variant} sign failed with code ${rc}`);
|
|
4485
|
+
return readBytes(module, sigPtr, api.signatureBytes(module));
|
|
4486
|
+
});
|
|
4487
|
+
} finally {
|
|
4488
|
+
zeroizeBytes(seed);
|
|
4489
|
+
}
|
|
4419
4490
|
});
|
|
4420
4491
|
}
|
|
4421
4492
|
verify(signature, message, public_key) {
|
|
@@ -4450,6 +4521,381 @@ async function loadSqisignLvl5() {
|
|
|
4450
4521
|
return new SqisignWrapper("lvl5");
|
|
4451
4522
|
}
|
|
4452
4523
|
//#endregion
|
|
4524
|
+
//#region src/opfs-sk/algorithms.ts
|
|
4525
|
+
/**
|
|
4526
|
+
* Browser signature variants that can store an encrypted private key in OPFS.
|
|
4527
|
+
* `*-webgpu` ids use the same WASM as the matching SQIsign level — no keys go
|
|
4528
|
+
* to the GPU.
|
|
4529
|
+
*/
|
|
4530
|
+
const OPFS_SK_ALGORITHMS = [
|
|
4531
|
+
"sqisign-lvl1",
|
|
4532
|
+
"sqisign-lvl3",
|
|
4533
|
+
"sqisign-lvl5",
|
|
4534
|
+
"sqisign-lvl1-webgpu",
|
|
4535
|
+
"sqisign-lvl3-webgpu",
|
|
4536
|
+
"sqisign-lvl5-webgpu",
|
|
4537
|
+
"ml-dsa-3",
|
|
4538
|
+
"ml-dsa-5",
|
|
4539
|
+
"fn-dsa-512",
|
|
4540
|
+
"fn-dsa-1024",
|
|
4541
|
+
"slh-dsa-128",
|
|
4542
|
+
"slh-dsa-192",
|
|
4543
|
+
"slh-dsa-256"
|
|
4544
|
+
];
|
|
4545
|
+
//#endregion
|
|
4546
|
+
//#region src/opfs-sk/isolate.ts
|
|
4547
|
+
function isBrowserOrWorker() {
|
|
4548
|
+
const g = globalThis;
|
|
4549
|
+
return typeof g.window !== "undefined" || typeof g.WorkerGlobalScope !== "undefined";
|
|
4550
|
+
}
|
|
4551
|
+
/**
|
|
4552
|
+
* Browser-only gate for the OPFS encrypted-sk wallet (`self.crossOriginIsolated`).
|
|
4553
|
+
* Node / server loaders (`loadSqisignLvl*`, `loadMlDsa*`, …) stay unconstrained.
|
|
4554
|
+
*/
|
|
4555
|
+
function assertOpfsSkCrossOriginIsolated() {
|
|
4556
|
+
const g = globalThis;
|
|
4557
|
+
if (!isBrowserOrWorker()) throw new Error("OPFS encrypted-sk wallet is browser-only. Node and server REST usage remain unconstrained.");
|
|
4558
|
+
if (g.crossOriginIsolated !== true) throw new Error("OPFS encrypted-sk wallet requires crossOriginIsolated === true. Serve Cross-Origin-Opener-Policy: same-origin and Cross-Origin-Embedder-Policy: require-corp.");
|
|
4559
|
+
}
|
|
4560
|
+
//#endregion
|
|
4561
|
+
//#region src/opfs-sk/bytes.ts
|
|
4562
|
+
/** Reject JS strings — they cannot be zeroized. */
|
|
4563
|
+
function requireOpfsSkBytes(value, label, options) {
|
|
4564
|
+
if (typeof value === "string") throw new TypeError(`${label} must not be a JavaScript string; pass a Uint8Array`);
|
|
4565
|
+
if (!(value instanceof Uint8Array)) throw new TypeError(`${label} must be a Uint8Array`);
|
|
4566
|
+
if (!options?.allowEmpty && value.byteLength === 0) throw new TypeError(`${label} must be non-empty`);
|
|
4567
|
+
return value;
|
|
4568
|
+
}
|
|
4569
|
+
function copyStandaloneBytes(bytes) {
|
|
4570
|
+
const out = new Uint8Array(bytes.byteLength);
|
|
4571
|
+
out.set(bytes);
|
|
4572
|
+
return out;
|
|
4573
|
+
}
|
|
4574
|
+
/** Copy into a standalone `ArrayBuffer` for WebCrypto / OPFS / transfer. */
|
|
4575
|
+
function asArrayBuffer(bytes) {
|
|
4576
|
+
return copyStandaloneBytes(bytes).buffer;
|
|
4577
|
+
}
|
|
4578
|
+
//#endregion
|
|
4579
|
+
//#region src/opfs-sk/prf.ts
|
|
4580
|
+
function base64UrlToBytes(value) {
|
|
4581
|
+
const padded = value.replace(/-/g, "+").replace(/_/g, "/");
|
|
4582
|
+
const pad = padded.length % 4 === 0 ? "" : "=".repeat(4 - padded.length % 4);
|
|
4583
|
+
const binary = atob(padded + pad);
|
|
4584
|
+
const out = new Uint8Array(binary.length);
|
|
4585
|
+
for (let i = 0; i < binary.length; i++) out[i] = binary.charCodeAt(i);
|
|
4586
|
+
if (out.byteLength === 0) throw new TypeError("prf.results.first base64url decoded empty");
|
|
4587
|
+
return out;
|
|
4588
|
+
}
|
|
4589
|
+
/**
|
|
4590
|
+
* Read `prf.results.first` from `credential.getClientExtensionResults()`.
|
|
4591
|
+
* PRF must have been requested at the **first** registration; existing
|
|
4592
|
+
* credentials cannot gain the extension later.
|
|
4593
|
+
*/
|
|
4594
|
+
function opfsSkPrfOutputFromExtensionResults(extensionResults) {
|
|
4595
|
+
if (extensionResults === null || typeof extensionResults !== "object") throw new Error("WebAuthn PRF extension results missing — request extensions: { prf: {} } at first registration");
|
|
4596
|
+
const first = extensionResults.prf?.results?.first;
|
|
4597
|
+
if (first === void 0 || first === null) throw new Error("WebAuthn PRF eval.results.first is missing — request extensions.prf at first registration; existing credentials cannot gain PRF later");
|
|
4598
|
+
if (typeof first === "string") return base64UrlToBytes(first);
|
|
4599
|
+
if (first instanceof ArrayBuffer) return new Uint8Array(first);
|
|
4600
|
+
if (ArrayBuffer.isView(first)) {
|
|
4601
|
+
const view = first;
|
|
4602
|
+
const copy = new Uint8Array(view.byteLength);
|
|
4603
|
+
copy.set(new Uint8Array(view.buffer, view.byteOffset, view.byteLength));
|
|
4604
|
+
return copy;
|
|
4605
|
+
}
|
|
4606
|
+
return requireOpfsSkBytes(first, "prf.results.first");
|
|
4607
|
+
}
|
|
4608
|
+
/**
|
|
4609
|
+
* Build wallet PRF material after a WebAuthn ceremony that requested
|
|
4610
|
+
* `userVerification: "required"`. create() uses `prf: {}`; get() uses `prf.eval`.
|
|
4611
|
+
*/
|
|
4612
|
+
function opfsSkPrfMaterialFromCeremony(input) {
|
|
4613
|
+
if (input.userVerified !== true) throw new Error("OPFS encrypted-sk wallet requires userVerification: required (uv=1)");
|
|
4614
|
+
return {
|
|
4615
|
+
prfOutput: opfsSkPrfOutputFromExtensionResults(input.extensionResults),
|
|
4616
|
+
salt: requireOpfsSkBytes(input.salt, "salt"),
|
|
4617
|
+
userVerified: true
|
|
4618
|
+
};
|
|
4619
|
+
}
|
|
4620
|
+
//#endregion
|
|
4621
|
+
//#region src/opfs-sk/lifecycle.ts
|
|
4622
|
+
function assertOpfsSkUserVerified(prf) {
|
|
4623
|
+
if (prf.userVerified !== true) throw new Error("OPFS encrypted-sk wallet requires userVerification: required (uv=1)");
|
|
4624
|
+
requireOpfsSkBytes(prf.prfOutput, "prfOutput");
|
|
4625
|
+
requireOpfsSkBytes(prf.salt, "salt");
|
|
4626
|
+
return prf;
|
|
4627
|
+
}
|
|
4628
|
+
//#endregion
|
|
4629
|
+
//#region src/opfs-sk/wallet.ts
|
|
4630
|
+
const DEFAULT_OPFS_SK_WORKER_URL = "/pqc/opfs-sk-worker.js";
|
|
4631
|
+
let customWorkerUrl$1 = null;
|
|
4632
|
+
let worker$1 = null;
|
|
4633
|
+
let nextId$1 = 1;
|
|
4634
|
+
let initPromise$1 = null;
|
|
4635
|
+
const pending$1 = /* @__PURE__ */ new Map();
|
|
4636
|
+
/** Host apps (e.g. Next.js) must serve dist/opfs-sk-worker.js. */
|
|
4637
|
+
function setOpfsSkWorkerUrl(url) {
|
|
4638
|
+
customWorkerUrl$1 = url;
|
|
4639
|
+
if (worker$1) {
|
|
4640
|
+
worker$1.terminate();
|
|
4641
|
+
worker$1 = null;
|
|
4642
|
+
}
|
|
4643
|
+
initPromise$1 = null;
|
|
4644
|
+
}
|
|
4645
|
+
function resolveWorkerUrl$1() {
|
|
4646
|
+
if (customWorkerUrl$1) return customWorkerUrl$1;
|
|
4647
|
+
try {
|
|
4648
|
+
const sibling = new URL("./opfs-sk-worker.js", import.meta.url);
|
|
4649
|
+
if (sibling.pathname.endsWith("/opfs-sk-worker.js") && !sibling.pathname.includes("/_next/") && !sibling.pathname.includes("/chunks/")) return sibling.href;
|
|
4650
|
+
} catch {}
|
|
4651
|
+
return DEFAULT_OPFS_SK_WORKER_URL;
|
|
4652
|
+
}
|
|
4653
|
+
function workerErrorMessage$1(event) {
|
|
4654
|
+
return `${[event.message, event.error?.message].filter(Boolean)[0] ?? "OPFS sk worker failed"}${event.filename && event.filename !== "" ? ` (${event.filename}${event.lineno ? `:${event.lineno}` : ""})` : ""}`;
|
|
4655
|
+
}
|
|
4656
|
+
async function createWalletWorker() {
|
|
4657
|
+
const url = resolveWorkerUrl$1();
|
|
4658
|
+
const instance = new Worker(url, {
|
|
4659
|
+
type: "module",
|
|
4660
|
+
name: OPFS_SK_WORKER_NAME
|
|
4661
|
+
});
|
|
4662
|
+
await new Promise((resolve, reject) => {
|
|
4663
|
+
const timer = setTimeout(resolve, 150);
|
|
4664
|
+
instance.addEventListener("error", (event) => {
|
|
4665
|
+
clearTimeout(timer);
|
|
4666
|
+
reject(/* @__PURE__ */ new Error(`${workerErrorMessage$1(event)} — worker url: ${url}. Copy dist/opfs-sk-worker.js to your app public/pqc/ folder.`));
|
|
4667
|
+
}, { once: true });
|
|
4668
|
+
});
|
|
4669
|
+
instance.onerror = (event) => {
|
|
4670
|
+
const message = workerErrorMessage$1(event);
|
|
4671
|
+
for (const [, handler] of pending$1) handler.reject(new Error(message));
|
|
4672
|
+
pending$1.clear();
|
|
4673
|
+
};
|
|
4674
|
+
instance.onmessage = (event) => {
|
|
4675
|
+
const handler = pending$1.get(event.data.id);
|
|
4676
|
+
if (!handler) return;
|
|
4677
|
+
pending$1.delete(event.data.id);
|
|
4678
|
+
handler.resolve(event.data);
|
|
4679
|
+
};
|
|
4680
|
+
return instance;
|
|
4681
|
+
}
|
|
4682
|
+
async function ensureWorker() {
|
|
4683
|
+
if (initPromise$1) return initPromise$1;
|
|
4684
|
+
initPromise$1 = (async () => {
|
|
4685
|
+
assertOpfsSkCrossOriginIsolated();
|
|
4686
|
+
if (!worker$1) worker$1 = await createWalletWorker();
|
|
4687
|
+
return worker$1;
|
|
4688
|
+
})();
|
|
4689
|
+
try {
|
|
4690
|
+
return await initPromise$1;
|
|
4691
|
+
} catch (error) {
|
|
4692
|
+
initPromise$1 = null;
|
|
4693
|
+
throw error;
|
|
4694
|
+
}
|
|
4695
|
+
}
|
|
4696
|
+
function transferableBuffer(bytes) {
|
|
4697
|
+
const copy = copyStandaloneBytes(bytes);
|
|
4698
|
+
return {
|
|
4699
|
+
bytes: copy,
|
|
4700
|
+
transfer: [copy.buffer]
|
|
4701
|
+
};
|
|
4702
|
+
}
|
|
4703
|
+
function postToWorker$1(build) {
|
|
4704
|
+
return ensureWorker().then((activeWorker) => {
|
|
4705
|
+
const id = nextId$1++;
|
|
4706
|
+
const { request, transfer } = build(id);
|
|
4707
|
+
return new Promise((resolve, reject) => {
|
|
4708
|
+
pending$1.set(id, {
|
|
4709
|
+
resolve,
|
|
4710
|
+
reject
|
|
4711
|
+
});
|
|
4712
|
+
activeWorker.postMessage(request, transfer);
|
|
4713
|
+
});
|
|
4714
|
+
});
|
|
4715
|
+
}
|
|
4716
|
+
var OpfsSkWallet = class {
|
|
4717
|
+
async keygen(algorithm, prf, options) {
|
|
4718
|
+
assertOpfsSkUserVerified(prf);
|
|
4719
|
+
const prfXfer = transferableBuffer(prf.prfOutput);
|
|
4720
|
+
const saltXfer = transferableBuffer(prf.salt);
|
|
4721
|
+
const result = await postToWorker$1((id) => ({
|
|
4722
|
+
request: {
|
|
4723
|
+
id,
|
|
4724
|
+
op: "keygen",
|
|
4725
|
+
algorithm,
|
|
4726
|
+
slot: options?.slot ?? "sd-bundle",
|
|
4727
|
+
prfOutput: prfXfer.bytes,
|
|
4728
|
+
salt: saltXfer.bytes
|
|
4729
|
+
},
|
|
4730
|
+
transfer: [...prfXfer.transfer, ...saltXfer.transfer]
|
|
4731
|
+
}));
|
|
4732
|
+
if (!result.ok || !result.publicKey) throw new Error(result.ok ? "OPFS sk keygen: missing public key" : result.error);
|
|
4733
|
+
return { public_key: result.publicKey };
|
|
4734
|
+
}
|
|
4735
|
+
async sign(algorithm, message, prf, options) {
|
|
4736
|
+
assertOpfsSkUserVerified(prf);
|
|
4737
|
+
const prfXfer = transferableBuffer(prf.prfOutput);
|
|
4738
|
+
const saltXfer = transferableBuffer(prf.salt);
|
|
4739
|
+
const msgXfer = transferableBuffer(message);
|
|
4740
|
+
const result = await postToWorker$1((id) => ({
|
|
4741
|
+
request: {
|
|
4742
|
+
id,
|
|
4743
|
+
op: "sign",
|
|
4744
|
+
algorithm,
|
|
4745
|
+
slot: options?.slot ?? "sd-bundle",
|
|
4746
|
+
message: msgXfer.bytes,
|
|
4747
|
+
prfOutput: prfXfer.bytes,
|
|
4748
|
+
salt: saltXfer.bytes
|
|
4749
|
+
},
|
|
4750
|
+
transfer: [
|
|
4751
|
+
...prfXfer.transfer,
|
|
4752
|
+
...saltXfer.transfer,
|
|
4753
|
+
...msgXfer.transfer
|
|
4754
|
+
]
|
|
4755
|
+
}));
|
|
4756
|
+
if (!result.ok || !result.signature) throw new Error(result.ok ? "OPFS sk sign: missing signature" : result.error);
|
|
4757
|
+
return result.signature;
|
|
4758
|
+
}
|
|
4759
|
+
async verify(algorithm, signature, message, public_key) {
|
|
4760
|
+
const result = await postToWorker$1((id) => ({
|
|
4761
|
+
request: {
|
|
4762
|
+
id,
|
|
4763
|
+
op: "verify",
|
|
4764
|
+
algorithm,
|
|
4765
|
+
signature,
|
|
4766
|
+
message,
|
|
4767
|
+
publicKey: public_key
|
|
4768
|
+
},
|
|
4769
|
+
transfer: []
|
|
4770
|
+
}));
|
|
4771
|
+
if (!result.ok) throw new Error(result.error);
|
|
4772
|
+
return !!result.valid;
|
|
4773
|
+
}
|
|
4774
|
+
async hasKey(algorithm, slot = OPFS_SK_SLOT_SD_BUNDLE) {
|
|
4775
|
+
const result = await postToWorker$1((id) => ({
|
|
4776
|
+
request: {
|
|
4777
|
+
id,
|
|
4778
|
+
op: "has",
|
|
4779
|
+
algorithm,
|
|
4780
|
+
slot
|
|
4781
|
+
},
|
|
4782
|
+
transfer: []
|
|
4783
|
+
}));
|
|
4784
|
+
if (!result.ok) throw new Error(result.error);
|
|
4785
|
+
return !!result.exists;
|
|
4786
|
+
}
|
|
4787
|
+
async publicKey(algorithm, slot = OPFS_SK_SLOT_SD_BUNDLE) {
|
|
4788
|
+
const result = await postToWorker$1((id) => ({
|
|
4789
|
+
request: {
|
|
4790
|
+
id,
|
|
4791
|
+
op: "publicKey",
|
|
4792
|
+
algorithm,
|
|
4793
|
+
slot
|
|
4794
|
+
},
|
|
4795
|
+
transfer: []
|
|
4796
|
+
}));
|
|
4797
|
+
if (!result.ok || !result.publicKey) throw new Error(result.ok ? "OPFS sk: missing public key" : result.error);
|
|
4798
|
+
return result.publicKey;
|
|
4799
|
+
}
|
|
4800
|
+
};
|
|
4801
|
+
/**
|
|
4802
|
+
* Browser-only encrypted-at-rest wallet. Requires `crossOriginIsolated`.
|
|
4803
|
+
* Decrypt + sign stay in the worker; the UI thread receives only signatures
|
|
4804
|
+
* and public keys. Node loaders are unchanged.
|
|
4805
|
+
*/
|
|
4806
|
+
async function loadOpfsSkWallet() {
|
|
4807
|
+
assertOpfsSkCrossOriginIsolated();
|
|
4808
|
+
await ensureWorker();
|
|
4809
|
+
return new OpfsSkWallet();
|
|
4810
|
+
}
|
|
4811
|
+
//#endregion
|
|
4812
|
+
//#region src/opfs-sk/webauthn.ts
|
|
4813
|
+
const UV_FLAG = 4;
|
|
4814
|
+
function requireCredentials() {
|
|
4815
|
+
if (typeof navigator === "undefined" || !navigator.credentials) throw new Error("WebAuthn is not available in this runtime");
|
|
4816
|
+
return navigator.credentials;
|
|
4817
|
+
}
|
|
4818
|
+
function withPrfEnable(extensions) {
|
|
4819
|
+
return {
|
|
4820
|
+
...extensions,
|
|
4821
|
+
prf: {}
|
|
4822
|
+
};
|
|
4823
|
+
}
|
|
4824
|
+
function withPrfEval(extensions, salt) {
|
|
4825
|
+
return {
|
|
4826
|
+
...extensions,
|
|
4827
|
+
prf: { eval: { first: asArrayBuffer(salt) } }
|
|
4828
|
+
};
|
|
4829
|
+
}
|
|
4830
|
+
function userVerifiedFromAuthenticatorData(data) {
|
|
4831
|
+
const flags = new Uint8Array(data)[32];
|
|
4832
|
+
return flags !== void 0 && (flags & UV_FLAG) !== 0;
|
|
4833
|
+
}
|
|
4834
|
+
function assertionUserVerified(credential) {
|
|
4835
|
+
const response = credential.response;
|
|
4836
|
+
if (response.authenticatorData) return userVerifiedFromAuthenticatorData(response.authenticatorData);
|
|
4837
|
+
if (typeof response.getAuthenticatorData === "function") return userVerifiedFromAuthenticatorData(response.getAuthenticatorData());
|
|
4838
|
+
return false;
|
|
4839
|
+
}
|
|
4840
|
+
/**
|
|
4841
|
+
* Trigger WebAuthn create/get with `userVerification: "required"`.
|
|
4842
|
+
* create() sends `prf: {}` (enable only — salt/eval in options breaks Safari).
|
|
4843
|
+
* get() sends `prf.eval.first` using the RP salt.
|
|
4844
|
+
*/
|
|
4845
|
+
async function opfsSkTriggerWebAuthn(input) {
|
|
4846
|
+
const salt = requireOpfsSkBytes(input.salt, "salt");
|
|
4847
|
+
const credentials = requireCredentials();
|
|
4848
|
+
let credential = null;
|
|
4849
|
+
if (input.mode === "create") {
|
|
4850
|
+
const publicKey = input.publicKey;
|
|
4851
|
+
credential = await credentials.create({ publicKey: {
|
|
4852
|
+
...publicKey,
|
|
4853
|
+
authenticatorSelection: {
|
|
4854
|
+
...publicKey.authenticatorSelection,
|
|
4855
|
+
userVerification: "required"
|
|
4856
|
+
},
|
|
4857
|
+
extensions: withPrfEnable(publicKey.extensions)
|
|
4858
|
+
} });
|
|
4859
|
+
} else {
|
|
4860
|
+
const publicKey = input.publicKey;
|
|
4861
|
+
credential = await credentials.get({ publicKey: {
|
|
4862
|
+
...publicKey,
|
|
4863
|
+
userVerification: "required",
|
|
4864
|
+
extensions: withPrfEval(publicKey.extensions, salt)
|
|
4865
|
+
} });
|
|
4866
|
+
}
|
|
4867
|
+
if (!credential) throw new Error("WebAuthn returned no credential");
|
|
4868
|
+
const withExt = credential;
|
|
4869
|
+
const userVerified = assertionUserVerified(credential);
|
|
4870
|
+
return {
|
|
4871
|
+
prf: opfsSkPrfMaterialFromCeremony({
|
|
4872
|
+
extensionResults: withExt.getClientExtensionResults(),
|
|
4873
|
+
salt,
|
|
4874
|
+
userVerified
|
|
4875
|
+
}),
|
|
4876
|
+
credential
|
|
4877
|
+
};
|
|
4878
|
+
}
|
|
4879
|
+
//#endregion
|
|
4880
|
+
//#region src/slhdsa-kat.ts
|
|
4881
|
+
/**
|
|
4882
|
+
* NIST FIPS 205 SLH-DSA known-answer vectors. Source: NIST ACVP-Server
|
|
4883
|
+
* SLH-DSA-sigGen-FIPS205, pure/external, empty context, deterministic.
|
|
4884
|
+
* Public key = last 2n bytes of the ACVP secret key. Verify-only.
|
|
4885
|
+
*/
|
|
4886
|
+
/** SLH-DSA-SHA2-128s (loadSlhDsa128), ACVP tgId 19, tcId 162. */
|
|
4887
|
+
const SLHDSA128S_KAT_PK_HEX = "0fd12c3f990748cf9b1426413b64128edf9242e50b9e29378bd24cad4d547540";
|
|
4888
|
+
const SLHDSA128S_KAT_MSG_HEX = "c0666252089b9e469f0ee398b8c1bd89aeb63ebcb794bc68de8738a93804df48e8cf6cf936abe1dddb02178f0064f8e06ea827a79e6ee02c5f98fdea797948b79ee4fdb1a12c31d55edd2b98c11c01dc71b12381bc7d2ce6800d2667813fba079ad9ab01406a91922ae324cb54603a86007f2a3481e3904ae53d1c33bf5bb982a880f8fba2015b9ce6a5644cc712239c41e5c33ac2638893d44e039c0677388f2fecdd78fd7b6bc4b9ec9709766598e8d923abf7ebe86f85f9f6760ec514897eaedbb160fbfdbfecddae2331e981894b5dc9b08ff5e66ae14cd876bd674973dc1e808affb0f5b18ab3a1de55cabb5e6fb3de5739f1a7ff39da6256ac88728dbb04eded47f13c2ab402a237f5204543a285fe2ff50477c90cc87c3cdaaab32cea96fe9a0e5ee36ee2d35cb0bbb4c7b5163d0060b45d23ba9ffb4c2a5f1ffe10b25decbcd65c80a3e6b38d18be16c558f3db5bd9ba6689d652d4f68f02c92170ec1ac7800dba917216bbc73e34768f958a4ef4818fea2b7addf97768ce965eadf2c18f4dac50a7e75debc3e6e067d0c93dc526607614327c6874d1b4a2ee5ddaa1a8a60440cc5bb0af6b95c16794eeafad19562c71005599c6d01a08015652f2ac2b7ace177ee393f19760ccadf84c827cd20bf4e10a051b76bd82235f4d470f3742bab4166a81b90d3837761ccc5749f37a554966893567df90399837f0cc290d7c98044140fcd11b717e1671e4acb056ba142c76558ccf47fcf4133c9d2a8c4fa85bc87cad0308a6cb9ef3597c63d3a47535627d1bd1694514b14548a29dba64d893d5b851258c1c914748bfd2e4f9413cb6d9578f64e27e1419a1392099ed145dc53d75a5105a4f8df1e2fd507d5fb6eb65e28fb2182a15097ac8ab74190d7345983c329ae4a71e468b6fb97aecf8ddc516532e0d32ac9af7d75a4c2fa0dbfdab5cea485b24cc3f93f0c25eb321ed64c7f84b4f16b8d02fe1985666243b0f08ea22db6850bfd510666ae6de618e324e3e7f883ea8c62086c53b08303532a97ace24ede6702be34f36f416363f956ae9c88c98ceb6dd2cd7094b94340f0c057ca12673cc77fbdbd64d3e1cd59e29d2596f173d3aae4aa142f064e14b02318e52c9b45f11eed90105c7471857201d3ceb9796659d5fce30013762a67901a21e66963cf2da1469f0d4b59c09df4bd8a596dee3ee2097248fbc8f747adeaeb7a2d1266430c5b41ace85b7fcc2ee8bbf75b2415530a37444cbc601a7f5e2eea8d1788a959fc18ae6ec0e87626562eb906485566886802f2c66c525bbaca02955e71d5fad7fef45cb1bc8d560d0da0af181ae471f38d5c531260985e48ca6afc16f573d70536c3eaca58e3e4cb15636ebaab2615b6299ad248eb31abe9bea5a5a1587b707c6b4a4e209aab9e5fa54e441c720cee700c549265e0325f84f48565e7439a19697fe0c789a6121abc00b28b4ab6a06f248ce93b61d4e05d32d3e442b557af1220890abce1316b6937b677564d753369373acd8655ca92643cd208f50f49c1236700007e1fe7a9e2134ef604492d3f3bc8f39c768b061220f71aa49b138ea83dcab0837cb0fc5cd3b1589c67fb998ed16d2c73b7879bd3ea7cb16a7cbb6b3aafb6f1adc80eac584cab14126ef09ee261975ff65e2e5f2f68788219193907e7c3b78cf6de0b1631637a9216a6f45c7c95daa374a33ef22cbdcfa8ee400fd2dec1cb06cb6d24bd151bf335404b0cff1156c228ec17c9a2da82ea2b9b203234a8caed239605b34ebeb6cb4e46097516d95ac91074b8adbbe5511c7eabe373d05a494ec561e659ea7746d199d3af03f6f1960f0ef08c8de7804f09efe02a8590509efd59f076bce869c99cf2903e0aff410ca93173c47f57934f3c1eceb3a4144961c7de9e54f3aad782d36fd42126cc5dd8a3943edf02187d9baef411846b3d397123b6fa68c7f4a0e80085dcece332335d9339f0ed856d28b23766499482d808a05cc7535a29f102a481c43c2adaa4f1e898a46c73ed864887112459ca9922ac3ca0a791e52acc020fadee73dde439e69130d2b73f14b957eeac8e263c00b082f5921054b14622cb5fe3812d4574e50537506a8b1c184e5d0568d807e62be580db23e8c2e96146fbbbfedf8d71beb0c6b4644221818ba6de6509c60841eeba2f60f2dbf63ba9798981ec16c2f6a366cb6129f6a05b5683b72a146c52fac8e7d2c1d630e87a21e0bb149d780542d0f2c16cb0c139b18c0591eb56181c548e2709f159a3f974d37c3253b82c50f86f0d4230b0e111c2d92c65cfa5cbf654346330fe7074401323824dc29402ddf1d547a74c7c50b7cf157a6599b72cf7214ec666962e36300659be8178a0274d4ec62cecaced451aaaf95f24b08aa9d1b50aedf9d141a42ec1e4848186fbb11e3a2ae03398d1f21f38a7a83a4cf8249aeb458d39ce61782f09b5ceaefc7dc24333ac1ce51585173234ac5b5970ade48083810f594ee4ca570005c8a01436cb83f118d82188b81bfa9ecc2e88b88834c265d2d5b801c36c1bcda59d317fb60e533503d1a5604a636939111caaf097fcad4748661289f097d2ce487bfc21550bbb771f10b5257c0acbf56fa8a9963a544991ce868b71857245c907217b1668d8e1bab2e554d19e6bddc3d7980c3660d9ffc39254fa36c67e5c73e2539149cea39d7bef0a702a27dbf6b8cd41ffd1e6381c987b49ca0644c0c5230f8cad85249b05d779f27e8d626b0d5c5b4f078ba16bf09fd8b5d4d47b176e5d87e285352841f7c4cd913de6c7f55e401e451da32e5d1594b1d5d72c5fd378b7e93672b0bb2b9178f235d8b6f0b265afd234a7e3cf4793faa33060c9cae9faa6583ea92d952084c638ecfac257b8c5129f92165a79c0e6826407e13fe1da55ecf8206fc5d4f541f89f21b4b5d9f8029470529410d6f2d6c7f47e22d72923e7eda2c4ca5a4d456533b2ed4d5088eb0086ef1a53d9c7f8b1b28aad1b4a38f4d5ec724da0da8ef1aed42c6c1988a561750fc85bcbff006a3b43af494bec29919fcc75f2b20dfad8e2bb096433f34c510bd69934dbd8b14bdf344babb371aca838605f55e9b1380e44a4348d4adfae86ef52baf8845201ff225fa3fa0c3f7d17385443e27a3bb3b6cf2d86edc7d3ab833e57eb2088e50c7c42d9919d78072bcb81fc60f662ecdeda8343dd90de54d8b3fd1c01280aff13a94aa6cf5906370aacbe6532909798af4f8fe62fac8e4723122297d472b3da30b49cf88f122c5eb0a2e06bd7f1670b4bd19ec5023bb3a091d9b8fbb7c6d9eb188666999bd36a3e148221d34d2010dc1dda5ebe6ddc60975e38dbf94040e0e2763d9bf8dd74e5aa8ffca172c301e97dd3094c98a95018a48f341e718dfa3ab604f4d5369df3e55a72f80e8680ffcb6cba59f38b06e5d75b6429ecc2df58929e7322629e6e93c7c694438e70ab8cde7bf6edda1088bdd8678343ca65ba799df178ba035f6bc25a847a7c38ef5d6a9f2e9fa73c6d5a0b488681de60b9283242dd22dbdb3aab6e13334b242bc1346a35f40ce297fd46b0dd43e4becd8f0595b8a64d7d49935e9c1137a4831e275f2d355f6d665ed0d8804a6c6f39d6cca5c7c6695b8afe69b9a36a5bc3708d912d4c8dcb7b6356cc0f14213be6f336b8f7d4b822144b63ecf8a0c2b4326de509cc216fa5f2ce915df9daa4cf67e71a7c579cc9a88a49c28ce2708a0cb14096b3d39923017f8e55b18d327bd6c8566d72bd83f4d921c8a2ff32df2448801e8075b17d15d569d7f05c65eb712d48f55c16c90a2b41b65820f96e8cd96fdabbacfe6fb4dc246d268cd8c5bb2152c2117c0c4f0f042d1ce02a8d91830be6a0c607873e433eb5019b15cd273831e0d5c28c6a638a25d242db41ae79ddcf82f3b411079bf7154e7bef9674e147085e9ea45b5105ff9ac1cd938e5391baa4981007143f96c0952113926a0e4be375d13ed3692e65df9a17e3a7c8212828d0e5fdd26867183731f7d2b12090177e6985c4b67c62a0926a787e3c66c8b867e23422718ca5793a87ab4609c0d04808445a7080891a6d03677a87d1a1afe277f1938168a86bc8da164dc0e976080cf24a1fdc5940b9fb73accadd458f9f884894cc11cdc2821820a3b14a748e09de44c0076129f87734136143fab08c6c8b50c25ef3545cdcf9bb39c4c084cd5cc7978b69b21ae04aa788106eaacc4d51e5643607d155a159ae82225174900f54720c10480271d0c16893b494bdfb5f2c0cbe64cfd94f58d7df8ddb92dc48ee5c1cce69f9e85a005a341f572a3d70e78a150e9a52fc2c22dbf5f89212cc14d0bfcde215a585742aa71150fbfc2b4ed071a0a7b7bd08ac3e3263ef6e130121ab300b72790df29831dcbba30f2a5e86cb540ba3346744ec2236e0083db740e65a108b4a82e6a2dc14e51f0ca93ad32e3a91a6aef95b42267a9e592bea177d40d964dde25899286203050e769dcf8a8b52ca1fab081a4b2802d3e3bb58a5e1235baccc23b635f85a4caec9448344fa5e59a1d1cb3ac8fd9588941840f36510cc5991cb882dd43d24955a73f5bfd3bc1b14d72069723ab52734ea07f35a8db4b09489284f501f357a1b4405fff0228f908772cea825a54571d12ba7535e4878ab4a64284f64439de38f460ec7bc9642dc4d563bd3290f14bcc89c92fdf2b4b01a1bc286330edce6c345f7b73a621e1e74199a080e62846dd097271c5b16d3db367070e5db0a5c765564ae5796dfbbe3e4e7a9c1cdeb309af19d808f75224b71ad8e96e65602f61deb67f34efd85fb6126ac4e96888169cd66c6e8c11837de58a3abdd9240d290337e325337b8a761da6ea8c7537aff1d8b20d7c8e63674403e9fabe65f506a09fdffc985960c8aa52fbd1f4568766e0499fb3dfc5ad0900d03c85fc25dc71ef9a4113dc17f8918c91d2299763378189e5209bd7e5a1e2b3bb1490eaec5a7c7c93352cd7104c00e5779980a760c41461277256a2590525c718242818dd082512798a5c7899a8fb3cc2f4dd0a68fbd7e42d6ef3126df606f0aec5800c89c2d954a4e9a238a942cf1b85c3985ff5d38c9930b2dbb75dcafb1bc206ba68c481005a54d2def5940796082551dc6912c8f6692d448d891d2e2782de363f404af46c612daa28ec3cbadebd3cf9e5844cda520146055d30e32d057dbe1bb073c4d2010bd6294365ca3c6e8a7570b723abe59e8eaa04134c00428b7010f228ab45542df31d916aeb69fd0659525d736e9e166fe7c7f5c8f2c61f9d4115ad62d096c0e7e9de55391bcd658472f6d96b9d83a01e72c3bf6c2d3e0c4856ad3850ee6ffd33bdfaf70fbc8833a7332306fe0f764a79659bd2cdc97ee2e1ee12c24e7498a779f5e8e1e7fd06ba459089ea0f1ffa5b19fbace996e9f21b9fe1f41577cdc4301d3226f96a8f46264f31bbc0e51dc4d603899012a4b6da9fee52712d2356ec00516e07d4f6fee5aa0e519f7088e16e100f186b63ce159e25071cf74f395577efa243a1532dd3ee6fed5f2843dbe1bce5a2aa829b458f44f2c235a8e46dd30937957b5244c711bb92b3b1f21308615baf016423428c0d6af4886865e966a120e07230a53690bd4ac5ed0ea8af83cd5b271e0e868eb37b673ab1e30112d7a8a15b6176e063897abd87f3d6bef3481cd78a7a3c9207fd825753942eb04e453e9cac02f0cc5b57d664b01683110bcffb69623146507455a34c2dd2383aed2bd30b04e28deeb17e09d1cbb0e7ab49af2a8bce1bdb2250437f3af1a24a6528a11498c1cdc0355ac9843d539793f38f94ee783760db01c394d8c518e7b836bc5d685fa3763f372761eca91d9eb729089721a9d806c29100b80e0004e8974673a2dc0ac09c8ab13dc67ffaf2dcbad195ddaeaf2e2bd8996829fb2e277dfea65cde86d7704c06b64650d4b1a02abafce6367e028ff325f9794d57c653d10112771f25add8a00713df3da3532552e6bff04eff299075c5818c5f777860e6f4eaa3fa0386eaab4ae55f0e785575b158f1c5b7ac47bba50d7ba50f5823866722589219047e44ac779c96bbce9df16b91e482fedf823e8703a87847326247e0a12dab6ac00795dbefa53aebcebf4e85c3d771a0042795cec253209a5a3351b188647a1d23b44303858725745001da2443d27b8414d0451b4bcf1e030a1b6315198beda9e391583e5c86704a42e09de1572bb5bd486b3c750e5eae7bf39f89f6d26854ede3324ff990c4ef51455479f94a12a39411357d6e78d0db328ae8034bd7b69fbcd9e7f3fabfc7f3c6dab545ea903964f6ea60ac71242ed5d62c0fc0838ac9068b3f0a33ae088df5bea6a29d4ea708414b6b8d15de41dec70d96fc88b48599687704ecf3d285cf84ff3eee4feb3b6bd2b5c4451df3400b7832ddb87e8c8d34acf68dd9b97abe0691888155e9ba10a4c6148816e93190f650be66b1d81658055528a86090027f5bcbad77ade991c9dee3b6cfd792e35c55561edb39d589b308366ae7b298f45a95eb1afa4587e7142bf73c3b8c1f8f6f3cda4154ea976b76c6f2fe94fdbcc11b1f42ee6601203796ab0872a54c50a607cb68a373b4139c83511c1a7d1d921d9d9c898b32265ad8e04ef568871abc93e1701c271a5a5da4aa7415c0da01868c13908d62e0311624f283fed158bd119811f71c03aaa6ad2bfe69bc484b4c5bde204e2699b3ce8afd73c7cec8855c0d67bc600d35e0a6db3a2940306a2e89ebc04b832e6624cef91f2cfca985e0d76b2fd4ebd1370da7624eb44b67acedb7fa1c4caf9ff18ce1528e971adc42f58f8591ed1e2228a53870eb74bb48775d9139093f9e156568594ef614776f7d92d70afcc2c43d27c039bb6215084adbd8660607986f1aff8c47552b46e362619a85f4bf9620dd6398d278599da1adbe8595d976d80a038797a11d9f27d6fa39935904c2c6cf71b1dcdf119cf6b1a0a9e77d01411cf5ba9e47bb8f08d2ba42aa6e6f0b3e4b943c87d7f66b93a94a4226a9ef596a8069a99e974f56025648a74872bbe639d74a9941e882abc59452ee9ebee6507a02b56555a9e388e4d5240982bcffe597e9000cf9695c1fe5bf528120342c2760ca64485752d039e443029d08686a18157223cae5461ade4b0db826e2c7cce7732c71ecd41557bbb3e5531447a82c9de53549ec1c9f53d2b7385eaf0e841f38584a463506504d5f5f3f6a3918d116a9bcc6aa02002432b961783c2174b7fb1d1f6ce65e52e964903749114e58b54af45ad26609a23ea43ea8981e6ae084a8708ec2ee62c5717c23d04c40a462db5180e21da61d2789e00eceabcfcf0d34dc78ed7329aa362d1100f08e93834c73ea78672c9fbdfd96e3b86d258fd7716db163cf8d174c53b9ac82daa3b40b414e335e83413cbe97ac0505c07d64e3afeba4a499d4d180d16db9a3eb3769039ca435d2083fc216114a38a10de9b90d5d98b944a650af76203b9d45584e09d04e13ee798ac17b682f4bf5484bf2bb6fb212f2f507b8168b1dbf9383a7f26207938393c9596c1f4f8dc0fcbddbcd36b4bf4537ba559d53e2dd48e6a91108292c09d01582a67bb5eacc47925b9af4d30469a58cd11e6bd7a9063a440e57eb961f1b97b1aed19f594b1756252c46591c22573d95a82845c3bb7fe72200c6cc41f174d9b5b7162a41ff4db416e2265790283a0bdb98dd0bf9d14ec8d9139fa6002d394b84d782572d32d673b32116128359fac1a6c6fa7a3df8b0370e445d187200d62df4a9b08be9e1d2d6131b04a9085d0c362b11a7d65a2df534626b380008e98eb7cb1e70908f26d24e9d55a8332d13a24745660101b8a14b653a3fb1bb2f6f2bbb4f31bdaaa5519c2d136077a6932f741427687034a4dee988c915e22c53e5ae15fc3b63a227c9afb59aa6dfa12a147b1c6c05a1de8527f7b2d3e473550737d3f202a2bb0e4ce119c846f55b9c90bc6d3d6be96326d8b0b7b74aaf834192f6abf642705e9752e606d02c7a8f3cdf41625626064cb22d166261390df552b14543d5323bdef2139443b79c913d3b11f1c53f023487d5ccdd312062722b959ea26169b6a02da481648baddc18905f37c5d365a293f512affa7660df5f579f411fcf2cf07401e55668d3f74736cf423d1080ba126db46ecf";
|
|
4889
|
+
const SLHDSA128S_KAT_SIG_HEX = "1bac90ab7e6d50f9567f015164ef5b141262de517969edc6938943bad9123ba5a31236e9c99e6470cc1bfc44edced879efe625c50f8d2cd117192b84a7fe9a3a5753806774ed59a7c91a63a96888ef5191fac1e293017dcb40be1f48c538efad2c058342505a906e7577227f2b003b597d7deee3bcdea9292550cdcdaddee7c5f38322295fcb0e98daa4bdf4f250b87714108432b2df23f5ef7affbbbd71677f39f8923531bb60332e78da03dcafa85395b82fa4699dc4b1952ec8bf58e6ecf6a40591ab1ca423bdc9c6c63128abc968b61c88590f5fa3bda9654baca75ee1192d9e77649f4ab344d9e1643983a41b751e093a402b23c434b99b1692d8525aa06250f199ce369f3235d5e2521176bda3a3e514af3b69899c7dce41fb6ffb4eccb4335fbc71e1316a1cb9c112ef62a7d261de37ba47115c1b5a9576c33697ee24aa218e113376275de3d87e9107f8e4f10ac21334a03203bf1729944c4f3f22492a3fdbd9620259fc44008af6507ae7516421e228031637c91a1969922a4fea0aa005e08eb26740a3f39778b207a4d0a83abf211d5a311fc3f96529a587a9ee9d2cbd484d210ae9ce401873a4e8ca4f91c006416964138a2fb08a53ad58e1b7a27ee2e0a40f2e5f92f365838e67d2823d3d60957909d78552000e4ac78288e665a3cc97b4c9e7ddf14067e63916d305d8a0ade48e1069fd6523d5d4bdceaf97525dd0169baec2c53bd58c56ccfc7116eb79bd6c420962b2667bdbd4b27857dfb6513145e0336b5a4d4976fac5568a64c12bd2844f7250abef88196b1ff02646b43478a613a58377e835dc19660d7cac97b5b581e1d99414cb2211d2ad205eb40d77ab4ebdb8a8e36af955fc62d6ba5ba3438ac55ed7910abdf45170ada52143a56e2d4199904187c7b51a073a6ac896c0e030a1f0701eb85322ab7152b2b08e9cc39a9c4bf104e86a71e82b487e2ed3bc235c3ea274f4fe4db4e8cc9dbcbd5b8077ea4859d7f81e1b4c4c2539eb5870098197c71de4fa9a92ff54733f4c6bd3835a2922a9858bcbf792d6ed77204b72986983f0f88324ee99d8a3f110bd94d7bfad2f89d8fb192d746df1e4fa1384ed8cb1b2411dfd3fe886fabf3cefde776f0251ac889ac6596f377277c1e74c6939a7a675dab42cb9aef370ce078d19061778d1098d783f6619c4e199128504ba2f02bb142cce9b0797205fed1516882e2f35fc6d4b2875cd5f652b5338620d1356b2588aa9a3a71e4c888174e402b626ea9649734f157a17beee0651694febff3203c37703931304d1f95b4a993adfb332ae34834bf942c03593b54d9bb3bff31c852b5e8f72538e29ee4507ae0f5260494dc53a814b655002a08a5ec8513922dc22de3d85b7e381b79560d806861ddd03924a5c7972add7b12dece20533a77f90c5d2d8fce4ccf833f57509d29850a93db1416a145eaa6c910de596282a7cbeaa911de582078b6bdfda0678c4ad31ed76faf04d770d5a60f730c6b5b27dac7e9939270c239ede4ffc5f21ecad060274af574facf24a951b1e24ab0d60b90ffdb90f95390161287611436e3f73be9f11069c01e67cf8e48b1cd4556aac7ba1cd7e7c038a1dcc7e1c0fb0ac9505998aad9ab74359da64a3a8bcbd229f61aef207a546f1190d798b2af941abd7be06f60f406291f14ad2eb0bddf0c5225ff9dc75d5b2e762a4a7ca07227c0641ab6d2b58759c93838d3ad7e2502db56ce75471caefa43efe435a75056fab3a4107c58c2530d7f78a58eab6af1aeb4622f42dab230c09f31a9ebffd910a75aeae9ca9a6559dc7925666d2c63ef2f20ecacd3ac4745f1c4aa0064e6ee3ac40c8c1b6b98a9980ad9f41abae9f9d7d2d52ba0b39041aa909ae045878738abde787a1630aeaf22d2a73eeda1dd3733356d09d256759b298db98a300e21e8fd13dcb1b81d725e38fc874ebb53d58d7943ac0f20907b4a1603f7ffce22339cecef60accfa91394bcc495a9a2de88f999cbcdf14ee756781c5bf68fca81c28ce968e07ba84c8a615ad310215b4adaefc0706b16a88ec127b9f70f739770d0d53fdeb9d376bfa7cf0f6299800ada7a9c697c4716872c5fca02734e0fa7d8872389a314e1efbf7c449bf37a90ac2a16a6feba60fa21327a1b95c9ea134e38625b9f9a9b7bb60751f79df2c5b4deba4ce74586a4d66782f75dde07c22adc8fb01c3a83b7cfcd53c988ff90c59b3505fa7733dbeebcd72edaf815431d21499d650d9080424cab6c01cfefa1d1754352cec5875f65d80c5eb8f5d47343502824c6cb84f0c50afeea2daf72e16b79146bbcbb3b1511ee327ddedc4ae0e88fa0a184ae23add39cc5014aaef247fb2dc846c088ea44e5c066140ad9bfa32da47e4dc294afe11e9c949dfe29c3672bb8a8c6e37c494747ae3b8d551c602a7c971835fcceb582bf6dee85a998bb1ac08a040d8bf90f7dc4922269dbf44184185111b922f751013ad4a902ee2f853cdf4fe50cae3a742a35e5cd3753aa709d7c7bdd3538f0075d3d18b90919f5e40bdb8020b22a9e32d2e8fb254692db0d1b4d4ba9781c2e50dd9edd75059b203157a938fe233fb967dd6d568efce66ef2dc4b2b3ff0cff6ed5101b146fc828e56980cc2e0eb510f13cfe62dd896aa66c3d7ea34fcc88ded688fd4918e8ea9f4d5eebe22f837164834b5e979fd4d0b2d97aa6101aebe4521b9e3a9200b8231476a37c45d3d4b20edef0cb9e049b671adaa9dba965aa210dc6cdb95ba12cf335ce9619bc90c0e5a9c147dfa8f2bec0dd07a3f0d9d1004ababad4accd9bab1c11c3e474457f258dbd544d9d835ac4ba9fb2a1539c6ea6469f2a8d3821672554188d3652205ebd1eb55e8704380fa78b732aa01b3ab096dcc063df739e67b309f616d570a08b6756f6df7cb09ef95a720c6cdf65e210845d065858b358451554aedcb6d74f5fc441643027dbf90449087a0f61e9aefc09c95bbfe3d16e1a4c8f2d5de2bdd1242854229d0978eaee295504ae72dc310b8e64d8ac0ce91ef46e4050b12f71f5953eaf80a320dea58b99fea38567daefeeef66ac16ba1b3e8f39afea623cb63cc99e9d7adbf575daa61b355bc85104276436c9a7c6b306d1937d34084f0645a2d62c08339773e7cf8da3a8c6f81f93ee0a1dc8b28898ce2a76c10879e03f6ed4712ec812d0605b365397524e957630c0760605ef11eebfb1178c9b295989c379817a92bb869bcf5c61cc3763cf6ce1c3e9322d85e50c8dd117bc1929f3b97893c83b004c5a739b38f478df458b8eb7cad667b76c15013bdc85c19c9ace0d6475e2e03e0a76b4a4dcffe6adfb4ef39c1e13ede2f53eeb0ee6eb58b420ab811ab154a63541e8ebaa57157d97aa2b61d29206c73fb7ab3abac729686494a34898c7f522985b3d25bc56fc1b46b5e0554558eab5e014fbce93c62aee3a73128c3ba387ef33c10eee20fdfe3062c47b3add94c3659c2b7595e4dce9199496dc478098b1d589f9d4ee0305302e212df042b1be5d35659ce575cd894241befde9e2567a6909ccc3d576164704b752d9e71fd283348f272b1fc170c6e588d50be984311b7625ad451c7057663d03c773312081f732fa2a96ea3c6d92cbdb5f6095ed322fbf4b809df811e4be50beccd3f7d675018ab932c23d661f3be515f08679840ff988b98c090cbed33a75ee079d0b06c8b2cefcf4f59b1f028adfcb21a50fad667900538452fab52c63d6c2b633859b2b9426eac4e2563db23c7b92aeeadfc83aa04f9cc812bd5211771c879bb7d44acf00157d6359a7554ca29eaf255678dfe2649f4e3a4a07dac415cb67c1763354d14a75910e688b0c0e75e39696333cc9597764fc190d5e7924a8891cb6ae7b0fed7ff1468eccd3f5a7e4a955c12df22438bf8f1c52cd2411c8ed5e2ebd1887a3b33cc565354cc1a3a30706867393c219bdba6c60bce984a3cd084e51c50a05e006fa26d4e5789dabc9b820e59d9a05cb0c3ae294009059ca1bd10732c4a6ef4a094d6ad3b8ede1c4049fad9dba92075bc2f5491040c7eb8974ab7b5c412abf442b033d4330baf8e523ef07541c62fea80a4bedb99092851b16c36bd7b5fc7d95b39d4d9c720f8d99f025865f49fb2f364eff6d8bb03ece10253e1bab2fd89e0b285d69229fa118561380f7e4fd6322acd10795d46b983d07c61289f98e654f8b962b3f389338835fa240ce686cd7a061dfd914512632c448bb3b8a430ed5137326134305f3292ee7e3eec82e324816863d2f384f0777c3eac0e65e7f5d7f4f6d4605deaded5b069f59ef790996f1d30a9ed2ea121de1ee3cb82a438e5bc81174d8c0adc968f3ef1cf047f36fcb4a488eff4fdfa6e8b7611e57272445b4350470711bd8fe884c664672e295f094477bab5f4e97e14ce5e1b5ccba84bd85cf14b306712eae2eba9372ee44fb524105be864a2105c1ec5df84067ca2517cd6011c65a533bf56cc7db6d3b0f211c8049cd34f692cd4fe189b8daa2b946c00874f6dbe664794d8cc1139f66bab4ebe1572aa6fa2ea699d76765a19778130a2b1b3f6d023fdacdd7fc2026cf14d24db7b3ea061154b5a51a0e7adb1210ccef08a57e67c7964d084efc747764b7c39c8ae52ea437c4399f6abf27e40dc4a908d3c07b4012bec9aaed0700d7d11cafacadd37650a75a513fa52cbfff632aa707948ae7596836ad1e0ee39c069d0df4b25496619a075e12f15a49a65909d9ed702bab5811b4214956e2cfdc5ac634bf06369017095ed29a0918df87ee25ca68aa181a47fa020544ea62f153b4fdd5513f8955fb8df3ab84c0302cf9e48d87e2b7d916223c4469e5b44b6572d2d6565a349427b7d60610bf50313da25da6ae1613a08515768ac2933fab753a1563cd2a5224b7e8988e94e8269380c0256efa7d40921b8a7eaeacd06db1a94d41dffa4ef8fe62481fd2d37827b577e4c9cac4ce740b97971767fba90f2705f491e697e3a315fa92389c6b639da671974f9b2093fd6ba8cd6be452343268b4cf0643afaad3fa20af818b524378512704f2c8bfdabeb444df9e2d3b7f0ba8a7a335b60f91daea15fc50984281172089cc10a25b590034a81d3962154e240e9cde26c89e77e36715d9efaea5e15a3d65ee7505a278d131f753c312d3f7f61faab70c3bed14396c47608aa7781975658294b779ef3ece395ced7cbf3b6d267d9a6640048a6441fafa8e38bcb1401e015ce114a66130f2bc42f0be2ab37fde126d2a59bc39f69490b23275739485b4e408cb64e43543e1030863317a60e6e60d9e144a4754d1fe6da38a0bff9ff8bfa099a25f21a0d4d2e5f97b4778a507e4f2b87cf6d4db2c0dc7e0d306704aad29aaf7a794e0057b9dbad7f13ec8b082c52f97d31c72d5d48d30ccbe0803a633abcf5ca9aebc6123a62c8e18eee0814b2747f969dfbe1d38f504e5b31754a6882f7049268351d93d9cf6ec2e791883a65f1dfb73344fd83fa15dfab488818b2cfbdf321986e512422315c2f1966a08b6d885511e19628c26bcfc9d08bec86c7666edc638d0df720e1b47c3a1e1adabefb13e8cc6cb2fa8101c770e212a5a99d3babcfc24970f7639718132d58cfa859640ba14c13dfbf759fe2c0ee26aad56a1ee4298820d215f6cd969f891d049ada72aed65ea8863bc6cb859c91f5eccb87a21d680137bb7447063908e6a4f8c979c1f7d467b5997503a8e61282f08eb99b8f6ce1f5101e6d8fcb2d790cc9c443b031b7e71cd20b91b849fc3d425d5c4d924611999966fe0f96a90011d53bd0be140d78d6406e01c53b7c86bc796ed0e35eab658178b811fc4d35ebd2b4b8090627092be464247d88bbc202645190aa5ba7feb893ba426d0750f5206204000253c21ab4746e8487c4c8fb8e22a493a54e2645346c07a3325799b2b17535765effc6fa8cb3f7f04ee9658884201933b3bef8f718a07925867ad5fa32a5942df40e122625623e6084acdfdb5def0e8cb4d53786321b6a70c486f3bc6beaf0097209d0a7ee682365ba6078ec295ed3027d19e0db6ab59196eca6e22b845fac233d136e31ff258de58eadfef5fd45783a2ace044c29cb8be57159584f9d7b9571a7e4d3e7d258768bdf310823934ec51932fc4c7ec66aa661138240abf534e63673a2324b439aaabf1b83815d70d1f1dd51cd502a8746f10447c122d82027c6c0283e02e1fd83a9aadce0da8d87fc513db2ef82a721af1991216f3179591d09b41d7803e071f22d28b378e10a69eb72a57d7db60149bedf130b869357ad24fcdc21997dea759c5846e58e28116467c4fee76ca7e57662a378f5a615766c7a6d38c89af8645747555b54d2a790922c2fd8f9f1f3070da84772a5a3dbaf5f54bd4408c8da0e465c44fbec4bd788111529f290928dee69d6bb727613e5c5ef222c41bad1841d8ccf19914c270d37e529ef0bca0cd921312d5ee8371b65b3c83dd6ae0a4f75c4285e81a8c6bc83d935f58aa6581ba061625a81aece4775d5cd5bcd2f0b29bfe351dca928fd90f37e731d5ffa744c028987c97d2d040f0d6f20c6825d16ee79980a8797e3ca924a6f53b48dffce55b8c809d2727638a86149207fe9432eb26053820f8d65c0ececfc9460bb967d27753cf2ad373336c38f4f27527c4d8348523ba56e54961b393277afe7c86acb80ef89b3c62c05c9b930f06c76fcd1fe1ee6f7a6cf97b7a2ec0c1806fd3b616d19ab4c748fc142bcdf6d338cb22c5a5443dee31789f7e5655a02750318a851ef8b3080358e36f72f5371b2e57f90bde3a68bb4c4aa5c9e9737d121f854ebc4466bc683ffaec2df62ace60f188de5a4037e64aec5d59b31e9e75eb0ffeeb9bae281fb790f4ba3cd75815f8f292b37aaf73ab10148408b72c28f0e9cbf910c20ab86764429777196bc0f80147945382028a0d358aa6db3cda35c539994ea3e2ba167131e0802e84146bb75efb55f7f6d6de2be958a4f045bff626281ee0cf015ad7ea26f3bb6b6a0ea53d70b69721ac6bcdd897270938c27e8d37befde444f9ae7fbb8921fadfbdf7f946420fe3223d1d55364d7fbf913c3eb46a5b0c8898150f8aceb0896c804d94ff8194fa3f5d5d625688ccaeb8ddb9c4cdb33ae4530e3ab22adada5cc9d6bfc8371350107cc142f801391e6f375f80f45e6adb59e4288a210e402aa0901ffa8de03b8a9673e36ff0d92940487c4ad3feb579b6136c8ba829111410299818cddbc81ace1cadca73c83eb2167081e28e0fef489b42338b69e1005779579340fec8ab20e75ea7bc707b9693f4b25efea6f1812e13bbdf1dbe095c08ed818f87ae99416213957e81fd3f0f2803cb317ab9d63d2c256e8a16cdd3fab509faaeb9ba2ff38af68dc468ac85bfb97531dd0c644838c267054d5cec54ffb650dd9ad87cde7b822de425c5a6a578c8e85d7d0e3e8c1ca0e5410baf766aa2d8bfadb6219b228298342b32bb5c230189603caa5397510fc91932b7208c3137038307d3b6bab7370731a286c05419cf2b1fda06a1ca54a4bf1612ffe10814ed2d17052466ef9c3e594b5a5121f0bbad98335430a25019c1a8fcb2b1626eec0fc191719902a93e5f5b49e5932d8af3918f65ed043a93ec737b47dc4c654e2c256eb9ea1f054ec38428afc553ac4915262dc16409b5242efd18b57452933466ccd738d030664b6a3e5f30eebadb29bef2166817650d811f7bd57a5485acd8785723c4f47ab6f1ac6a5493c5c3074bef7033e2d9f58f57b082a711cce4f06d4f504619fb9ad1824eb5b0fce0ed84db1632519f6cc0ac12569f13180b1db3762841803e05718dd21d4c84786812d7f157e48b96e5e7946759e4a400a86662f7ca22d19e705c7a70eb79d863ae3e63708fc79d664193035ddce2593f5b2398075d7c82ddbc9ed596bbbdc28ce2a25048a162d46c99c4de1087d7063bf436414da8f3f52873f66b853658f95a9305ce622ffea72e4122b26c49d7540ccb99254ebb9e43036b1bfd661b78c2e0e220e8e746896271b5501901ea34658fc19570f3b3a70c2d6b57d9403b652e8baf79c42aad077b3cbdd9ef4d65cde865744c9dfc618565de6538ccb3968e0fc77bc0147632cbeaafca903361d0ffc4d76ae4c184e0c4f86a9187d4c3ddb164dc4196d09e68b16c841b5768411174d54cd9466313ba617b2880ae735053586fe0d9576275de8732a7bd938b40654c700503b7ee5722cce0bb1644357123d5877b01df4ee19ecd66797bd41c6232416914cd4a35ef69330c5279ba214a78a7db3a800c1cd6d6dfb31f8e811989288606ec467ab9c9879093ef1b67807ff5ce5b502c2eb8c99e8d99ca63b3921e53c04ef6db94f0a2df0bde1332d1592098fff590d6add19a2eac6a74563bf51e2f6c6e6a97670fc1e58b3c4ad3b387b51eae84f1e63a6100eff29fd394f7fb897595012f384eba7e43382c3859873a77f22d62893385c724ad29126a66f235fb2864b0011095d322b849e2e919486d1e3ab2c9daac3d2a0bb609f8aaeb0c20fb169ea89cdd979f44cff1a51280982adc594b74cdd211e044721de4bd23a3fdf28f5117d9ffbcb4f7d0cd379d19ea6647d18491cb04fbf8e16bde9d11e7e66cfe50e4dc2bec9172401fc76c358b4752815906310d464192bbb6684826d921a25f890cbb857be2e32b313e96e2bc6cc330efe6203f2476b6038a6e48091e4dbc4dc5d1d7b7cb9bd4d41235c9ffedc5f2aa57c004bb5756fa35946916c388e26f3df804580bd8307771b8045ebbc04c6e6adeefe118a9743ed8581e5aa72682d7010c3f4c414f27360d7a6e3fc50670d811e65cf4ed4472665cded8e0aef0d0b5f315e529e85fee87072fbca4b8f27b025a5189f80eec7033533d0fa11594cabe096fa337525aaeda733053d0e9459e4dea33d4b2ac91237495a2ee7696225ee93e6358a6fd2fdae1f56696287732ce7aa7f41c11d6b513798d4dd0bbe4b055c09b8371612afc3a497522776f7909b71c6aef75373d969d71c0185a8146a096d04357ad3245fa962ed918c164995dbfc385fd764bd95f211b071d184e2544f889e2154476051dfce9279919756c098a2d2c07f70dc66fd6a6ffb3c134b2fd8874844a5fc5e0d15f4d6c7197d4677edc883426748d452a8dbada7962cefdcb8df1100162261bae5818b91bf82569f31207684840a573568d1e889b84248a2cb8ef9fb82f621aef2fa6f4731158169572396536e267b6dbffb525b8ee9cb501efca26655750549e44b92a8a2c21a48695a307e793fd57ae844b0c4f5db1b77e8d7819f07a94235118b8b645ebc9f914603ab92561468d0b493af3fd9963fb1e2ed253408e6e43ae796b8f7b8c6592b5af82b4aa772b3220e49d66926a9371e20dfe0aae5a50b43fb6a4c418c693e03e19624cfb3b6427021d545195610352b4b15248cea6bd320c4a5a8a031956b051f29f6e6dcec1ef9fb92f68eba0b5340b082fa51bc73122dec7b5a987dfa61a73464c5839ddab7c59a222e313123a9e10163acda40285af47955e3664567896d8860d4159803c97c206dfdc468ba85bfd85db132c424771706e0e26801054c477fee733ff59501abc33f0d58ff67bf5d9b010307c468c1f3ed5641bead0829f0473a786f80c112ddf0017e7e859bb7c7afee95fc815ab880f94ad43e2518d18047eb83d1d77b9d42beed20d3e357c79867c56d584770fa0f7974ff83ea7d26ccb6319a320bc3e763b332f62680e4fdad9b22c17af154fe1183a732e5d4dc084443b1097703dc7640db74c595f3b6d0f1986502f49b3ce72694e95b4c48f7b8c3dc1c4544401d22e5b6733dca273d7743ca177161a1abe2f0880b9a1407e71eb67296b7892ceb435d2be6f989dcecb4874fd73a492757404dcb02bb4704e908b0d5a4d7f494e2711e2c59a454eac15183082ee6090c90568e966d7bb1d4a55127f996ff64a0f3fa918d3e5a2c0f4b3f05a7c41039e5c850a3ea9ae0e795d507fa82cdb4169c02deff2e6990539704cc85afa2bc4b7ab3861049eff0f2d2a8a1d5584391e91b9f99b0f7a5046fb8a6e6c00973ac9c3ba053c35c0de582045ea951164951df02e8b5155fdca9af868a1f76e9be7830f56f1df755375aa9e05d0b4182576bad750b22dddbf9d9f3948eeb3ed52b16ed1213db2daf16ac6e0684efa85b41534db0357a2aa51a858bdec4c78f315bcdf96eb8056d797da4ac1fb50fc05698cb64798231b0acd7536eb8a3939867a5f11f4e6ef82c75892a7ce74d29d5199f25454629965f4a1215e428bd02ff466d7edc79eb2b4ab2a978a9f09a94bb306cebf9783dedfb497a3f0e1f24086847c60b25687abc853a2806fa70aa04dc6839285cc360248a2a990c5c1ae7e3d6cb10bc08cc959e552fa671c033a7081d7baa23e193b917ebc6f837c493e2785ae4e4bf549b879d4f40cc1ceab28aa2b14a8459decb2d00bd554b5ce6e9caa9212124fd9b1e16e057d4e17dd77056c188e0df53ea2f679994325706cf440e49d80f5150d8191c53c2638c2b35892b8f66f5dffa1506df4665513d2a8b000a931610bf695cebaebfd80cf2d6cd225fdf6515e5f5d8bb3f3da49c88797812d1479255dea2dc1a663586df4a50b7600357a671650624f264bd6ee7a31ef1fe4c8b7a902813413f6c9146b211b8e32e2ecc50ee3825aa03515b3bb171338a5b0dd618bd4b014abd5b52a08843f84a6b04e551b40edefd7de45c071988be1f50b71adf056a461fae7b5ccf6c857cc85b627e327e0464536e3b4707d95fda5217e14cb8b022a5e400133147608421c1b1aaa62424ce7b1f4a613d371910b92e36ef5fb7a051532b6a48f51952ec39eb9173ddc90f29776ba1b3ee2a7ea961bd2b6c9a1329db9e5ef0315d8d8e5629469fa7f2c7192816d2eb0eb7bec2e325e64d2dd0782c0bbd6cc42dc728106814e50b7ed5b8865d1a1655f7afd8ce0bc7e8ee3163527be4180842164673503e7558231bb1782f35a60975892e627fcb3c777cd8a2a5099bd21f9a2dc335517621316a9cacf5f74739dadbd90fe3763215ac754915cebfb2bdb11511be0cc362cf439005a00d50886f04fd5488b61013c59cf8d2b8fb07c17e79ec93bf09886a9474d5f5111fdbff6c137356bd670d75d72d53a";
|
|
4890
|
+
/** SLH-DSA-SHA2-192s (loadSlhDsa192), ACVP tgId 21, tcId 176. */
|
|
4891
|
+
const SLHDSA192S_KAT_PK_HEX = "72156900e450cec7b128a9f953c8948d620f58d51f8c631af405c811f4a03bf0fff8495e4eed37d12bd5200cd597d08f";
|
|
4892
|
+
const SLHDSA192S_KAT_MSG_HEX = "bbe7062233100bae1a0ec1f920b03ff49f73d018878ad19bd8b1be89d42b90fe8e758d896c6350036d6b02429f9fb5ebc67982da442204497172858314781a1d516098d69c056d224e153a8cd3420e5e35d202ee48e15e274c2a8eda859e18a8f8d685adfeeabec868cbbca3495073004c0b212d2112f4d70e96c15bcdd6ed0ab884dd47425b6956ff23013cb86cbd0d855cb073a9d12dd51dc8086741beec69087510075ef95cfd7ecafe4ee7119f17fe0319b940f67fc88b3b409f58e821fe72e94e5884bb109f16f069299ab8105e68615063bc5e5257cd94c36e9873eee7f39807f87007784e66d518924d4d5d4eaad91346d015967ae1bf5ffc0a76752f83b776f707ba377ba8207852d934162d90cde50ea2719f6a8f0fb3a882206edf28f2c7647bee1b8fe7b6b86f7f25899467e21d78559e214a1bf1e5234a1f31608ff87862c87d10ae463bacc4bcbb5c7432fdc7b481fed7a1558fe18b9c62ca937a742bdc9abc912e969e772d3f76dafd7d818514b3acd5bad4131f5aaca74dbd69eb3b97b9d9f6b8117b6056b9acb474ea8e32e91f337fb60be4b69074a3aaf7f530daf4ebc48cb06ba5483362e19f8ba394fd569e42ee43df275b4589615e5aaec23758375808e7e5d02c0e775fdd67293ff2d2fd58b92d89124cf4ac718197b3bf934049c9cb9567fbaf586f77562c1b08b70af8111a4103802102ee6fe394289b85cd8cf970e14aebe4189abdaeaa153a649006aa33398d1f39b9aa15814c1349151d226b677f98bdb42c4ba7613c3acb186fbbf7de3eb9a739f378099eff1730c0fbfae8762eaa2088e4e8ece1c712b2c24815987cd3450f06999a119f21a29d182c6f74effc142e0738cb244dc041d304182a409d2f5c2f70e9e58b5db158530935ac229b17caec89b3c7d903b5f8eb24f7c3f874abd3c54f0a8cb9e99ee2cf11ceda45ab65cbc7109fec70f5ab39fca2ce293f806a22e37b588866dfdb8b7523bd853cb29bba4e374362978e4e1ed7716c957513058c960b8ce166b4030b72367abe1383aa6838443d440d002d6f5dbe3d69eb4ec2f0e2d108e61ad3fe8c7c5162c5feabdc14db57e33803e75d9ff1a6b464407f5dd5fc786af09785c01b7c412c6ba01f1511237de94924be684dc1a06bdaee7acda9bd03e414bd0092c4a107f76c351f3f5d81a3df0d281ad8e18c28f02a49612273ad618be07d97b5028b1163fca0f575b2cab53c11ee7b0a48e361ab73031dd505049762aad20a13bdb5cd883363bc43389cf3481f66270a100c5dea90546bd01444c7b9e32d12a612d4a238f88b17a6cdf200ded3321accbd7a90bc781de860eec6144a098935387bc77a3933e484a0c9d60878b55996288fd14218668d6d8d0ed61d7d2ce17cd66ab5386a5ba99d0093f64ae6abf6360b43402b865fa0edb432d6e3d1e4189713bcb36feb65da69bb57a2b85341a064f2a70295c3f43889d9a09e45c465f5a34c4a8b860fe9dd0ed90320bfe97a8e52779a48c68764e19f42c358c974b46cdb168c33e19417fe3a6d8af9a5947b4c326a12f931400c2f7f2c1f9e0e234b98d3a8b53b36acf86571cc89d2b7e30dbfe1d17c150c87159051c3dfdaf989cbc44041dcb2535d1eae801f8147d15ef35e061928d9e88cdab05b0898555a7884f3145b30ab4214d909ab64a2e6377199ea183a537e7ddf1f71ec1ec72c66c9132205b9b96b480b995a98a5b908fec7cf2335fe1f6e9b8aaccdc679b6db6f71ae656ca0ad0695cfe937a8ee0829ace6eaa3fa369d152f80c2b3bf4e3a31434249a1ce66efe86bc95ad3134eee5d3d6b1b01aafa1db8127dcb5b8918d0efa2fc85974c4695c8e8959e17efb092fadc4bcb8f3ddd2ec9d996e7632ed77e09e14983a648caa909fb59ded8c3f64ef9e0fa330721b13926a2ce61f64f9021c76e610e3ea972f40f52ed407603d1973a8c36f44f9eec6aef872d183dd9fcf63ccfe2aa5a31da30d549d1f38ca0c053bb0b3bf246cdf1a918bb3f18da483ee14679e137578da2757e7dc2404704262fa007617bba42701e073937fda759ad978a19f8b2d0615b1d86f635b6ebf8e24fb8e77287e0c9fa3f2bb199b2aa296cb333ad392a54de16128f4144b5829ccfa0ebe226130de145c3434d91e674ea5fcbabb753bb98ce31dffa7f68258d3e8cbd980d9d09f5176b8669d2f886be1091f767d1f40e5968ad88eb1b2b7868af963cd34ff705e2c69da0c6ac2346571dfb25f7d0d5237b5f0c8f127fd092b731338d184fa4b93689c83cf46f6e65f8c008bcaee2a99b3cae8c77082d8eab03920f34121b065fd9a908a16c11d107d715bda12ad324c76545a81faf7d623e2a344ec676467bb5613390d3aa0fe0e5cd3bf56b6cb8e05158867a8dd16892697cb2b04df69f43cd802a5a0b257d4de0d37a8741e7dff1da824565ba13fce0bb3eb551f7efb45f547ddd4b5e936296be408e89b223d11fcdaaa00156f3c0aacb89ed6dbc3c8e6e5c2dab1307ad9b7b839b597abec869a9ab728d855e118cff90e5f8fa0fe53218bb4c521ccd7c925b30ff12e3f35190c483fd52ef5449bbaf49788f9908cc7a957e4dcc4e8ceca6fe61e1cf1ac0d678207f00c68a7ab165879bde09747bf43dff19d2b96c720fc54987cda0b9d0568d52ed0b8d45cb946738b93e5d51362ecc019b9f714d28652c0d46911ee2e91ec5f9303fa248f5d89f8a1fe1d19e1c0bdaa5af89d89650bd918f53831e6a1f87198bdc7a5d11d47c8b7436c10bbaf5809065fb3e6902aaa2738e5076c4814dd54c2b9bc71ead71d6e4198c8339c34be20618056c3f6bb2b552fb27cfe7b89517f77084579cfb9896d13baa1bb8fd9e9a5d372e59994545d18238c2b64343118e344480d75da91a35729eb1853d35ed15b26a12f946ca5c7848e200b6300a3483c1e750a51250046f317524f5bd8db383eef3c177c6d37585ea932862184baa96946e13f1b8dc0973e2d8ccbc50470b70451902dba0c8f1d5d809821bc3e748fe31743cc8fef99cf1cf6140b7a84e8e6daeec4a6149dc0ad03612ea54cdd8d52290750adfb4b95c8f7a4cb8ab9928e7c25d4ff3990ad9733c53f1825a89173d870cd9df9010ecbca285543abd195ec2b86d736c0a5fe2fc70061bcb715ce1e4b50ad1095be05436ca5a537b074a79571f62de3c6dcd47581635c0e447b617f6005b8437707d2497a9e03952b8f83231ea62828852e23f3a4242877f77fe1703ac0b73397b64b9a2ea311fad07899b9db538e35ebac3017494009c2a1f0ec8c98e41db5396e769cec03c4c5456d43ade6ca68e40c7a544885f0a20e4337ade36857582426807444378ab03fe4c607eb5e4d0a5fe454e3e1083435bdb2ae17ac43b98b5d48a1faf11a5d38e06b5c7cbbae54bc5ad3e1acf3a4a0c611719ea1706b1b8c6171b6301aa7ee3181488881ce55b74c542e82c7c01b0d0388bc92df5bee8168fd2ac272faa8eadd9bb1c7f0a82982a450fa8001d418b733f4a0d8f58579f3493930bb50fa0846d42056d0875ef1a461b218594f27caa9a87bcc7b317d0b347c3916e25c8b34ccaa39b7cc7dc133007fd255f0b9f62c602b8d3695c6b2708bfcd491ba5f6186b7b2d24f7b97f636ef11933db208f8090df37653d342e7aef9a54fb2b4a04493ad846ef8c2f42fd67f60797d65ac25dbaf8931fef31f0b26ab95439b6e6597688f08d9e7d4a7924ff26962ee6993343d40be284c08d3ac876c43a05544123fe24ee310a9d97689d7d54ad29f96776a4bfa87adae47e64bafa2b35e6e7f678ac508f965c3ef3eb4fe5c702254735f4acaa22fccced748dba4b6ffe89e64e648079f45eed1420c7bc74684e7238af2af9b51c344c77f2a0af7daa7d05b060b7343a3bd4712ea9c8de6e73bf8e230b65c875aee99e829ebc4e668d97dcff353034f6727e9e789fa89ebab7eb3340073c14867c3be094aea7b8da4c11d648829559a7ff956020ec45b08f7e4d2a56969a7764df5f958fd7338cd29e8abd4f381d07e142c9db7fa0f4e512cab8c83b7a56640a610e658a779b71da140114d2577a484688a4adfaa5d87345e90c2b490ea1d4b35c15ca80639085efc481571439cf1ef502d7dd4e09c0202b8fc91afd8a355c6c154ea1766f4a1d65f2b6bbc604030e0409b67e6a0ee901fd8c3acb81f678a57f475c1748d428ab8142eb370bbeac655b4b117530b5a3c82c97759f1bcb5f512ac17973695e59157fe6340ed71699732b5597e147a367f9bac676a2e9a791b550c24ea432d8bbf32c581997af5d8ea33a5f46ad81af147966ab4b2552866e987ee36b66b9d3d2720219915b1ccda505ebc82857401099bb290878044abd0cbdb4366554627a6c62b787bd1a6b3d81deb096e35f4423cee338cee025368af9c033fc999eab569bce286c7b0ff4d189092dae8e447e40ba4ed411aafe4894cf3296b1ebf546af8d3fda61a0fe71a3f5e3cc29ba06bc90721ff1e04d3895762fc86becb2e9b45632e8b44bd4f060ac2e214a4074785d3b1e499ba04b7997428aaf5100ab9fc43f2341a11741dbd90dbf3d59e47a202581c9168c7728d898d400f626aefd20ea8806c56199fa2652aac0c378e44d9738b15d4f209528ca0484db9b3e93869ad13821a77cb3d283d1eaabb4422c5d73703e8aac48ce580b2f8278331ccb11fd5f02f0d557bdd6c35ea61e79a1584d7db8f8674f91e59cc20d796553773029ef634d0c8faa156bd78e1c92e591658595d5ef6346bb744a6b929aeac29565dff08bafdf26ed236c1b3e22c4dc512e5df83cfbb85620b49f4373f9b31631a9f953f8e313ee5ec1908e4683fa5ab7be6546b11b6c8fb8d8d39f9d3de77eb2b39f397c7c9ab7740e13a88a712ff3533c805b7865c9d0e376d0939a88fc716a1bff75774e973819ddac7bec4f05896c6e289aaf5199b128168813b5b494218a00f890fa9b617bd72fad1117f2e76b8a85482fa9877262abfa10d9ca6e67c6eec36ed3bb900fb49dd12121b444ac39ef53821d7b83e4f8d3b320094fff4df9506155c32bd6be0ca2c3b38e7f4516cc0460d81868b82844879aaa799db1785060a166ca11b099c86cead5a3c86c927d2dbebbc74fae9ab72c6673c59f2af778677bfa12c2448abf2828c7027054abfb5f49a4952adfcc5bb4290e9b70c2f033ed46f87467f2c6d253e6a71c094fe13b02e4878f5ee5be5ff062048916dda6cf44d052518faedfe7d9027ae83ebdbdb8b32579169135043f97872347d9a0d4cdcee5d9c70794607cfa19c5622456e713a9de29ebab74b41e985ae6f02bd9009f649f3e25d06797dd10258b46549c997d784e21da3f396c0d0aaa2e9f7170a1856019ffbed35f61cab869251882bfc8c7f95761cc5f61b8645d128432325046353d0d061c6493d5d91a803bf89dca208fdc61efb8a6df9266366351a9387c4bf461c3e3a24ea528e91007acf2c7efc7afbbbdae7d44a7f821af54c28c7ce5e0c77203e7657adb4c8bde34609e0042bbf9f0ce8f1943bdf748285e7e9b31061d70a6ac3582e8b77d4ad6f23b3cf0217f2deff39399568774a885d01cf826227e197150c07f70abec8368e5a0b7657d194556a4beaf208ec1662ca62ed53be52f77aaa1ba0966d5d2ada3b32817eda04eb4a657de569a28ba2b5a26554359903790fc8d58b431bf9d35fa58d8daba1b8c82e9876672762c050355ebc8030acc067b8ee2327a23373b0cca55829f2c0f16232960105f0cc5732e087beb6dcb678a7cf704e9d03eb6e3f9e67237ea5a0d7f4058946b9549fd8077b371300630227e023fddacab4f6fb795f5595d8c3d279f38821c8f496ac959a4af3940f54bd95344fe7511fa46015ce8ddd55fa3a130b1f4677cdf84667c7750d7f2acac57946a55fdfebcef1b06b561a0f6c6e21a31965ce6988ab62e5043bb642c01fb62fddea3b779d5388c988cf1330dd4a937dc7dd9ee0faa363822ced2374987a7f8e86e749ffdbe980b856b90cec3d8fc227a04ecd4fae4d1717ea17612e0bdf8295bb50b0af6243cc952d4d2e01cb4da98e0b2f541b103aef4796bc33a87eadf574cac839d70ddd56f469dd7a9d84add42dbfefcbf1544d6de537ce8cc9382662a7daa2bf9f6b696dd720a8687e10170613757bcee155c0277a6795407bb477acc25b9ab49ab159a98ec121c17bb7c58a784a3130e4e8be328f3d60f904e83ef8f2142043aa9f4044b660a7af985f64eb50aa28aabd79b0e29f3543eb06100a3670ba20d0a32624a0e4febaa5cb5d77c32877090f1eafb312f4c379cf303543610672fd00228d5269b9474a608cb5a609048410497100a96dba435e058fede82f6f375b61568c5738c08a0fc80d6d5652c8f9bd2864a2a851e4438c79c612e3c91f57dde3087f02b1ac74ec29529db146bd142863a6f7873d2a63e0593df3bdaca36255ceb41376f16d541febdfd2b5c4acca7d73cf872b651682067f606015cc60cbfc18525e112a97f7fad26c9dcf30d340c953b02e78af8ab81cc54e0ee968268c79af039905661e2d924826b61d3357548e49d83c48ea6affb167c43f583a30218889c11685519a91800908e3af3c1fe0f4a6491989bf064ac588faaff7ae36ab2bc5e23d145bfac76351fb5f352088ac07cbed9ed56bf77ac6e5728028fdf38b583e0427d827acd2351e858129cd203819139deb299ee93ffdca54b13e3fe5e8d3152c5558a1bfa5b7072dbe9bf5451b96a0b00ee6c69084936cd997cd53e952dd11766ee8c6d8d91284b1ca137c9cd76222151792b30a5984152c317ad22a78d1313b38cca74dbbc852b1f1202499cf9e4479f7ccca94084a33163682912bd475d1fead3c3b1bdc19e1e226cb548caa4baec296b6a04adfde7763d883679daa798d45acced57e60db209817aa728fbe1b999e104b9561bb8ecd72aa9bf70cb1f98c994b12a833d9cf0e3c186bd99d51120fdf9029973712c8585502af3d7f1748f3f147c391cdeb39b7a772a83a13e3c021e81b0e55b5fad46cecd0937d917680e4427fbd6d830a1adde5df820b7fb538e87040b3fffb8b73beb5569be8c92f97397e27ef4ccc40629c0af9e129a989b388b95c9d28b00f1c21bc89bde59625c7c7093b85333df2351d6963ff07bd2038634c320e80e69065036b2d3f016dcbfff9f19e59e1ecffcac7ed83b91502774efb8b1bb1961fc965531d7232f8ba12911279017f0c2bc38efdd82e5a5be37285ae25f913feee78fb70aa75a57bfd92e637dfac97881564e4af1aa00f1b3a0fc8c2ee308ba05a60bf00899471006299add749946bbc3563dea1997e6fad8985151b761815ab7a3fdc3b58dcfbf4168e1d7a5d98a05f2b4edaf3ebf5d026ac17ed8598978e8013fb7ff9e3870b1067caa779950bc5671aadb3049829a6ea29bfc263ed63bece07b28612ffcafcee53732d82e009d66e8bcae9576586329a1e6fb4e0656e83954d97837b7a41220405289adac3b549de9037c270f90c658b3df06421cef206fe5de13829d876964e3bd253cb01609a729173d26c5cd17685c15bf2009f6de658e3ac4b5e27eb4272a41f426f8226d72000f39fa55aea9a994f60152af93a6d8e41d5e1e890ab6621193d56e77ac5e5d686eb4afcec283ed584dc099e0c6baffb06cd3567fd5e0b5be08bdd89c02f7548fe11869935645b874ddf469bf746ace6b71716f01ee3f80d84806147bf8cb4db77f0e4b94267121dcd445be56b9fdc41c38d0674fafd49d2dad900578218cba9c4a22bd3986063cd9c01fd58c6c2d694d7e3607b26798da3d47d19b634be2fcaad12a84224a43523f82cfe78a11e5ff48f4505a1e368bc7ce44077dd946bfa8a8a9e7726b765d9dd9543e3e2f671f44c4abe223f48aa6914496fa7fe81ca67ec1fe4eaa56aaaa2a1744e4c4c8cf5dc9c4f09980c580a7f7533e1c15a074e2be18060e8d30e3355e2ba7a39b81facf60ac9af3cbdabf84cf8b7e8d8c09d5d1bae066be97300a63b7bb743f494f3376e1ca26eb722fc224d69e3e97949bf1d36af0f3cef7db9a87970d228eff96230e2213287ddc40c2aeaf5e9932b8a171d94974d56d5d55890a48032c35dd718270d0f73905753b47405e512480e6e28ac442ffff8206f3055b189eb8248120ffd3df80144366b3d949f6dc6063b1a1a80027ad55dc4561f0e43a9fb94e843d1dbfb4d6228ee3";
|
|
4893
|
+
const SLHDSA192S_KAT_SIG_HEX = "d77bdf452426e085edf5dfdc2f207b9c5e931b1d3ea3daab79aade8d109c13720a3dbad9cc7e54c65a6315c6d3831ef6de22d4e97004d92576fdff3d5e0a867374286418bbbac60b3f7b7aa3652fe8ae15ea7a1ceb77a0016eb19f90af10c78e972a654f980338aec5896ea544a205a114bffb62160e3568687b26224f3fcfef0b68b01f9ab410e677f109b2ab49e1965a4b4b5cd44c572a1ef7016ad27e2be7e3a5caf6d9f85fff69f479767d415b1fa90b825c19c8ecbac78665b15c30c2da632b7aa7d44d35ec78b0f2e053220af1a187bf0f2f2842db2f084bbb834e9ee457ea83b89ee103ecc2090f1b5d0987683364a4f46886d48eff392286f0dfc0c101471aa37ec9c8b816a2c21c07677d3ccf62384499866b485fa07b0a18758daa51c309490eb33174b47990d0b13cb76cf447b27b3091a411f622b5b36ee8d7d17f03715e8e7e06b12468d1d61370c644ba761e4dff978862169561dd54362c853bdf2b4f9a27cba5e76e32d260d7f1b08e97c4df79dc4d791c3dc3f74069604ba61f37d27f3018aea623ef10b88c1a1a9bc7f8503d8bc082358c48d530cb5a8aa93d313b1ff63b243c8079822d822d7392f28f17d507697f1a3f12b61e60bc8fc40eaca3a4d8de072a82a6531dfa182da34e8f7fe15587ed54a81fd776caba151a7b3ef22649f9f91cfd5b373a18d3be2bf05c178b13ef3335f579f46bc180734df2872185003ae2ad587a0910d8a346cf60ff742b62797355cf3d4091ac714ce9d276d03fbac7af95f36c9075f3d973401105f9e28b313b5844b199f178e95852ae5b41d25abb462dc58ed6323ef754dc2df2e077f81fa47cfc40880b2bd79026cb8073d10b9aae955ab1f177f6e30f37a5bce0c4b0c0938d35652eaf15dda0f1e12c7bc46b1577803cef0b039b09c852c2075fd7bb888a85a6d6a10890fc93682691085c0124269cad1a3fbff01693fcd58232ef72e86eb783d2d4c333f3e5b57ee6b8eb741725b04f99281e79382ecdea1aac43dd64108afc2b17d5f2ae1bad7fb3b356c00821dd43ff7a5b332e78a6f60502706465ef8c5590275d6218218dafbdd67f444bfdd0dd80413c4c202615e02ebca776f8863b76b13783b7cf737cff4af0bd48e11405c4b75e868f37d82e52bb4b1ff36977c1aaca788aed2860d6ec21d20d2f5319f7667acd514ea2228191f9750e25438bd55ae596f17c15db7a32951b2c750e5e77cb5838985478fa3d347782efc1f919b8dd8b5d5188e491ed3f769ee30e9b5b311f24fd4a0c523d74ca63cebd3eaeae0bf004cc15697d69bed2da03affda7e22e343657f9588192c3f02aec25f7a22da576c3b80a1cf5eb04f4e8953032559eeb77f944d94d11a8fd8517f62c7c5ec9b1dc0336b27ee52c07d8828d7f34f143da8503d26828b6422f6e1c51eee343019db1872c2d90af05a3d504b2738c3e42b72800c9b603475e272189662f3d67480d0d811b5af274c197070a88cc5fda07f152647be4e25e35acc36712312dae707bb2721def9387e8277ddbc0a58be6f2d4bf4991e966a0da6b2283a13f664d5b0e89db274d377f44c26bd8c4c00f28b6144b8eab018acb3d55b5ccec55773ee1ae105246f10ecccf33c8bc7e70e5af805e018a144c2c9ec99a227f1a8e498e86b177dd55b32b6bdf787b8a8ee56ce9ecb2aeba11b475127ccc737edc11a173af991342e05b4885860eb9a5dd6708db2315906d7a0c59936a64a7754ebd33330401287aa5d3fdf142e89abbffe9e65193c39e55fda801608a2bc066dda925a52c8aab78a58ddfb682f234aeac0e0529cc6db77ad3a22515401e0b2c69ba2f2bfca5835b7e80a69210c75663b482a3912dd5ea83873949246fccab113e3a4d89c2a9e4369134bc5dcc170851ffd88323b3c8c3a5b2ae51ae9aa992055151329f916f1395c8fc2554d9a1843d8173aea4ef6d609adbb0f097187750cdc22dfd7a378510f33fb67389ce52c3c864eb9cc3836609864bde394e16462d60999544645711e9ac7f55b648c48af6876b98f28836707cb6a8a06dca524d85f987691d0639308c180dc4a19d37a7ffeb0ecb3e80025f76f0d12c150bd0c6ffe530d1a8b8b8fbe18dd9f3bfb0fd168f9a3649c3390dae231a5f4009a290db7ee3485f2b2fed38a25f0a31c755ed1706cae31c6d810b59705d40b3db214700fef11ebc4025064718dbaf98ffe363f112e516945bd10003efbd6c9aa46188f5d8306bc236ba1bfa476927e69d60575b4f5bee9597cd5f2959d7e89a510bfe2b0a836cedfe1d34e09137d3b0274646f39faa83dbd8b49824db87d38536c7d431a60aec5e93183614b657fb0d74c2ce28b752339b284dfab08d01dcfb17df2ae99b1747e072de212fb715d817d9dd46cdf66c0c246b760809792014cbb6edd48c25785ec0f5f732b7d60f710153c19104f755ca49e2020a3969aec3e6c3dabbee7f2d6506e6549377996d06a710db29b9ae63e545d480507567185b450a445abae192e18812ed75ef9f7de3575fea23bce9129ac63500eedac678de72479893507454f8f3e04c52aae6e16f43d4e654ee5efe81897d282791acd9d584a969cd4915d4bd87d6f540d639cad4f7c478e018bcac149e37c81d1695270ee0f199cc83cb458e96863d1e77e123a5b891ce90063913066675f8b27d25cc47844d3b8054a86851e6f656b5adef84cc929e14cbd09d8c7d3a699fe3b7f59d1c54152fe54eb541f0fe9249ef07f4b7fc399aa495c1e87429c509987ab1641ae444580cf82d8f7ddbb0fd55d026c17e22ed3a20e6d406ec81eb1478a15c2d30728828219a5bc949d7da96f23d091103342b003ea4a1ab9f6a9d49940a85f3bbbb7db326a37bf729dbab56ce40c40fb71571f6a4e9998466dac9c204bacbbad51c9103481507cb482dd6bd5bd5460c22db3a81b1889bfcac863b7bb54a451a70f7810637b57837c81cee67970d299cbcfa313aa6602cd81cd31d3f5d1d74d79e3c1652745148ca0f84944c1433d68485c16fc2c180f51da90ce05fa0d694f1829c65dc5800fa773f4d219ce6b923d33ff5364edd0ec889002f90964dff6b5afb1ad70c07a88e83dded9dc3540bc14e47c2fc01e149d0a581aef31f191c77517f748d322cf4b28ffb46d69edc0e5a0f54b55fa79d585d2f72d5e14d7788ad0635166a384be16bb189192c9a3bffe5928eecc8c1320b1a8dd46374a09db5f4c3d77499b63ceead4134b6a850f7695cfd07c2bbc6137e505e066ebbf7d2f8947340eba1447b000bdd25c9c7a7450b79abb7c562dcc0310ec5b1de062640c6870ce984174bdb8a2cfe997425eff2eb2144317c67bd269918f2747d05b86912525d07c17628f583d4ac774cf87520486057f08b8a0665fe439607f52163dd22ac92896419fc4c60a43244477e2ff94b2c4197fa4a750d4875caa395432373988efef39f7bd97846dd80fa0a15d9c9083afa6736bc2b59890282c85a2bbaaf721acf3a8ce7c0dccb156ef9486ae9b125d32f3bfa70b0e6922ac9fe8953d9a693246bee30893fc6abf3da8c21ce7cca12a135f64886ed63d9d199886ec2adeac7308205a15ef001ad62fb8de37bba0dc30ca25009a141316732e13bc6d46421a50e1f7c0605502be46ba52c4d0da8aa31434fe815458619fffa06ba33a56c905cabfda760e8d865606e3bda6fe4fdec7c6b9a585105c9b3a32436a36b08426bca31c36eade1affd54bb1dbd539597c8f976274c35fdb3ec5611441ca4081a771e70da5340a16a111ac8d2814efa1e18753297673ffbaed2decbc42f6c14bbf7b72d5ccfc307b0310f870c20160c16dfa5a81295ccc2603769f14c6ac2a61f0ff85105f4bbaa539d200c67e6223b5ac0f6c5fca0b534c9ba9eb834978467c03bb1a7125d225de381f5aa23990c17f29476f7dae4428c507d6954ffb2f936271d9532c2a81fa68417763a70f068f472dfb1830f8e86aefb93fb1bc0a8910dc0e123775b8fd85f6aca2c9a3f43a527fabf1f2011632e89d54b90e688e93a3be7cc0fec1e0decf95278976b2832d0a08bed6cd2bf7aae65696566f446882abb090628db5a09cbd7e54061e0acdfab3bbe2e5b7ffd7e30c7baab69d03aacaa7f0c41ececa64dd041b51e1dc55ee958e3e7cf87c19168ac783ee8455592d1c2afb642572b7fb5d48d634f52c26ef616deb27c2a9745014c303723bb248737798bf3716618ca0aa02d5d7a042d72ff755aebbfd750dd4d3003a3f9f9faa019672ead2e7471145041c876466167fb2488de7ffbee4da26105bf35cc5bd2314624cf853507999f2061faf5cf867c3405cb4d44753eaace77fc4bd2833d5083798143980879e9ae7068c245cc4783912a7bcf17099df6eda842f91c6f6fa78fb62b48f9f5472dffca4da8aa01de0282779082606a7eb40c3d4b4f1007cf68a7d63e739f4c50e61fd7a5c92b15c81f7da7528238c9c5bfe6954c4b2304c30ba12d89114bda412edb26b82e4a755abf358fbed9fbb0e920f33d1a48f8442ead476bd10398f4cd664911ce779e7a4f43627451459de445c0752652954fcd7d599eeda7bf5d3e789532116efa2747c05127194378c8b21d8597755c0e4b0b6c958bce3e9ca5ed0c34e5e1f9a2b6d255353355b129487d2dc03dadd58f315f0074036359db872284e5c0ed6490ea5bd738297fffdc4822d0662436a91ed30f1e15eb8728861b158e62c2e2230a80df833152fc13d233755a17afb8ae8df26ade1df722312e4683ea7afe12458e85bd270ecf2e3842bdd05481cf7f9144cd097ff32e349acb0627f18fc9aa23e189fa26450197dee142ca7a09fb3f292ac26e59fd605058bb7caa4aaeff5dcc979af4f639467a3a4adab48b8d9c5686a5b260b66c53f8b770eb0e49fed77f177b0267d15bc0603e1f36ef6a84a459a4ed10876343b5604c281cfc42cd234403cb0aed97951e37f41a2f4bf91d823f0cf0df06fb5e3dcfc4d6ac7b4ddd73aafe66ae13abe36f7cc72bc74a0189231c513955d15791ef3c83d5ec86084c663967e1dba70cf3913b7e9cc8f837e08f983a12e5ccdccbc0957e10d64cc711fe34270fdadfe9c1931895ae69ca7b94ced9291b0c809626bfabf4f9f26c9743d4d436ca3e4e0d26d7b42098d4ebc34cac1d1c3e3f27f6155165fb8f3a2f27ea8ddbac5e778a15f3efcd64a493603526096add92c3d5ac45306cf7e721afbac3aa20cd4652c3050c2c7b3106cb82b5af283931dd3d863d396508328842df894701d55312976c79176c44fa94da99367542e4bf77a6e62f25aca77a718d8f7a79ffa55e0926a9f88ceef87921387412e6bc75da67d6d4ef87df70001113d740ce739508da5504f11807ea2bbf9c39628950ecf8939498a1b506456b609146c42dc77dfa9fa629f2d2c3dd58b24cb36f81b578b57803f0f0222bc8f3dff9930a6cca8ddcae66301ea155cadccc56c274c4e04721401fbe521d55293e8dd23558f004974d0a6b67a4658c84a60255b01b91aef597d1153377e22d9e3e392022de20317adeff0cdf4df77f04a5c356753054167394e9ce6c925d0215a6d91c3a699abd99e7b0663cdd8b9a4c71484d51f2c55ee74e1516c7659c2d214795a071ff5d55e5faddb36cd2163423b170f890c0c56a7cfb7f45347a7a3899efc84ccaa61291e1228e3e544dbbd76b858e13d61d81a22a51f75b409ead0f0d4d5adc343f5e0fe04cb191dee6d5de9e587b4486a5d0c93a4b38ce8bcd8915d0089a371ef0696fe60b8663aac93746da297c7d03c8733f75d33c9daa287da8a63de030b86e2d0c13486569d9c3ed8b0aab389acd1d12dbf9487cb66d02338361cb7b1648b39e345faabecdae9bff533bf4250faf2e9c26705f2523a3c72e2a52819ede12e0c84586544c3bfc205c12dd3c97e3ed9f2e100e1700d66e69486d5554567e75777dc095ecef8cd49f60364bb734702da12d45766d2511ea7e7c6fbc8298df14c927172fe0b2f9d81d1bb0a278c4e14256cc8762804f47a0cad1cd4dc294b1c50b174a01aef5fa0726f5ebcc28194dbf3470d4747ca11cb67eff5cfffd3e4742f28fc3a5e98a123adf01a67cf276c5e2bc60b5887f950cc8319364f2791505522570dc93c63ac546f519f160bf238b78cb05a0103bc8975b2cbc611b5c5ba3c3a2c0a87a3fa56faf85f3f1ee84d352dd74d67bea30b0fb0f16d87958ec069cf534c072b9b9350281ebc71959be1a25d4faa24911681c707944ed94e14bdfcbf244a33a8b56b72047f87a4b40b3e3f3ec88d7244e4c685c53f55b4bb2d54f16fb68403e99edf203f9a6ff8ad57f98e21ebeb78cfcc1c42bb62029008f6c6e666f65313719e16cfbcdda27acc623be231b0650c312b92e62ba270a46dd0668c4e8a8239e9107f9f00252ba770250da0c8cd3aa61714423d130713f635c0a02c51e170fd15fe286e6d9f2aa7c241e31421569fc6b6f4440d9e7463adafbb5d061c3d17547af6818a6a1d777d30726f08a10046d71c421b1364a545969e35b65a9e81c11f99191c098a6aa8de940156db09a8ff31d595eb7ad2765a82dd8a6a94bd1b887d6d7699fb6deb19d13b8a612411f8a78cb667bcf53cc4fa3b304584715a9fd6cc794d0997367ed800b85e7be80730ebf1a6d83acb75dc83ed7c1445ac5b9402b71df27819cb641159b8e6c1e559b9bfe7679d7ee9906fc07f7586801a1ec7bcfa07555136dfd6920e818974e9ce31ffcb2aaa72bff4ae819c56f700e3dd0595f4e7c134394a100ed755c088df33aac476b64b6fd066e2f53791b9c1366c4bc79e86ef0c68eb761ffb81849398841aa56a01e8e31684d466a4add4703342a50859dacf4943e5e266600c9e84f430c92b902566c5bbe342d36d83313417509499519818c59b23805337bdda880806888f587956d75cb2b785e4a40101a81f8d3a2d523bab0caaac841ba7ca5ecdd24e81e7ff9d9f48c2c004f92ac532d4da7f2dbb895bf7d4a06dd6ef72e00971b435023938fcf3083d1f2dba5f93b2710fc13a4dbc29df8a66555916ef36828d29c80b3c8fc2ee194d5e05b79d79a257e620744db8daeea0c6e35764c21991b54ba9937bee1776aaf34ceeaa535ec7c1d7b78112ab318e57260a49114f57c011793d5b344825c1cc8370f220d4620968f9dec6ebd8d7eec801a8c6b13e599f0da26fa247e044af419e67b1fa543af9968221045eafdb7677a232f4632320e159daefba6f880409472c36d1231705f652144991f9eee53861905716865350ad359a371baf2ad9418b439c059e250ceaf68fc9417ccb2b4ecbbf68e8ada5ae38226e390efd4396b161cca8ba1188f9762a4b41d9937edaee79672d387cc520ab47c11225ecc5e6ab631602fce0fcdc31d6afd97e0701e60e2a46c02c9e2b4c1eaae651e9575c65d9a5ac8de73c096428d05a59424d5cbd02cc288044fa1df7d1439a62fdf050d493b5861547ec42075aaf26a318ba9c399c663997e66ad26a0e329770c81c152b7ec110937e9a44a8905eb861329ef26934892198228bbf813739b294dd273207e666c897be5eb803605d6c7c3f2bae316879af868ce108a33b924f81013018dd7c85a887bef52f2969951bb552d2b693bcd797de81978cafef95dc5d173af0f4274a820646c400a5dca379980b99256d6b4c0b573a9cff926e3ee40ead702c5effba0a2f545595db4ac0738380e26b40724e8b1ccea8c996e94513cdacd03eedea8fe6a9646bee8ee32954cc8abf21c82ae9923886291852ed0a89ec2e1c5df91d5a1ed2ca64b5d565b7416737233f42ebb3e7afc643e1c0a14dca31716f0612c32b4fc97ea99dda22173cd05cc85ce173809a9e21996eaac8c6e3861ec6558e5f6e759b115440b85e777d27f0b79576a41e82e2ff3d38619fb45ef9f8127c327c418443cecd0c25bcc4f9994798f7523a227a0c05025a262ee7247c4a647054d35baae0b1a04d1e555cbcf3aa4dec66122d38f12e673b812e1fb8ab2e73dab864e15e1696161cafb761d6340c594548f326573cbd81503ce09528a4bfbdbfa4f56d52b393e0ce95d216d025a643ade12f933ce91f8c38dfa7fc9b9075373ac4c33ad626e3c95d4605d38ff438fdf4ce2b8c5759d6fc7109f47fa6060a48698230fbd2c71fa0e15a29d7dbacb267321c602693667b6c6150ebdb0acc0cead1ce719cc679a5f7f49ffcd8957df34fee233a72a18af18f0bbb8b889b95cb9c4a7cd9455c5eb29c3c55c911c12ec7bddd5b1eff291f247a5c8991b8004e8c327e1898fe4ea2b51f82a50a4fa5e3d16015df5f03618d213d25e030baa21a59fc43f429f3c471b7e9b0be59ed4f82feddc888a7ca7dab25600005c6269c3cd29a598189695fbe13c46420061f8786a3a24b5680c7475a745d5a1e701c7f2c9534cce54d779548e655135bc34ca846293ccbabd0145d871c5c37d41b2f537df57e3022fc686dd771861347984c637b5f0b66223f45baeda318a79560d0068939effab6e0a40375e9be7393c04c33b33037971363207fa2011f387649183e6f2d87eb053811edeb38bb479c18622d7579cea9f7eeef130afb8407451af20d3deb31dc82624e447311583172840373159ba4f22bfb32209b73453062e26dc9076cf5af71e6349048b1819d32310c2fd81757506d8e9b6692fd810bfcae9b1da4faa609b8d92525232b57776e9a6bf10cf1faa3409495155fef22d200793527ec21176fec5bc6aa78d0f5bb00aeb737d9ed750e6199684df41435a2b7d1804161dfba32685cf2912ea97cad4160e8faea40b0d5ba6deba51bb8604701d084a73aab2bf23950a5d54ee40e3d15226b9e1686f97a1aac804bc9f9ffcc8539fca6a09c53606d9d92fe544761c8fc7d5d32687eada33771c2a9041830354e908677fd6e26b3a368609b55e819fa5a348a21f6c8077792e45d7f1f0d9eebfb83f8d7dcf905f4e651868c15772de4813a7f65d1b38f8ee20fbb85278b90ef05cd1750b1a6f002d1495a8739d116a4dd2784c4c43102d19e62b239c1486b7eb2e0ba93466c003a73b3fbfe345753f08149a6a309b335e71bfe57b27075957747a22beec6c77edc477b6ecb2ef5b545862f778f2ba0decefeefac9d31f6f79c2ae2b2a8a9a35c66a4cde333c9e138dd0e4d7c19d231e3f5a0a02077b293a88e77045d37c302750aeac842148071410a6dc6aa99d478598188125af0d09d7fa03f04b77ae4de363c4111c08e7d92a098b2ad6ca96fb82ba119d601389a55fc2bdb236fb913243ff9d88d8caaa71afc5fbd891b5b0254cae1cceef468dfd488633a9b154b06839c2699bd29d2ebe1bee20add8b82953f1683da70d77b7eaef73161e2ecfc1a71b7e7e3216b1e5c10a10860dc1a293173087824e8ddcd936812ac37912d80d9ef717e9c27b1b1a5af36829274bab16897e32656108e045c21e7395bf5de499d27344251ce5772169c49f137a07f5ee903c2d1c95f24e43b2852921cc7a0624ba0fca822e781587df576b35bfbcfeb81ed3ee050dec65744c44a1186f2ee31efce76425dfd57e6080f0aaa1d1e73f6720c63d79ce60dadce5facc2182b094466ee538fde238a05902272a67f46a9edd66cecc421c8dedaf709dd1f90139673190b8725523c26991f58fd2e5229112889b849dd91fce3f3ee75c0c1417c4623e4b9bb06b768c66da623e9a3d703222716aa098a803f6ff8b1cbc0bbf33f30510dae5f2c31323a67508e42bcb77568da78059825f2c516163a4619e9537514b7361e493dbfbae4fd2943bab535921508abc7625570c246c327cc93dc1cf6e4dcdc44d895f2bf6c7d07f379c69b78d1d0dfb4295d9866f0faf13f2421f6f0417f04e9c3677e67ac08a40bb56b1bd37c04342c20cce812243fb4abace5a6604e54301c762db15d0cf7b42ee9e61470eb92a8d773a3fc3a66f997e098601c48c2b40c38ff5b71a076f1825d9c8a4baf86882c3702a8ba16085f9eacbd836253cdcbdcff51fe569131fe642a810a027ef5b9f3bf27e5afdd9b321396ff28c6963abf3fcf39082326db008c20609771e13aa7909c1360248d0c4af1f6daee3f51ecfdd75bc66c6a755e2992f099c8086029f796b692e21636e72aa8f3a3901150fa0f5f3830b73c790b81d2a8c02f5452b8784ebedac78bb3f90445cd7b6db7536baf128548938d22a368be4bb5be6f60273ca3f98216714a587407f78c54586053f5b30e1aaf1c83e42675c0da5a8754c79c54279256a9b1527312f35cd63d25549ef43f4dddd0846d669caeffbeb0c57eb3de35abbd784a880222f0944be18972172bafa0d5431731d28688b5bea5bae320d7279e3b016d6a775b5e0c7e62093a72342b1713a7aeeacb78e180e762f5b4d3988445014318feb2f8cf192370ba26e32a6f658ac0f164eee485891222dfc56af6af93290c490a2d24f993b17b390012e52569728725fb117ecfcb53830308926fcc3cae5ae25b1b431811771840b87a46628e9191dc63830c5d89f5deabded0db0e4d1fea07ee786de31cc4da8ceddb5367c3f628b5b1654ca1485993156ac6e3ad9203d4537d4bc51b97ed3c2e87a26a881a95b5d23e23655b7d2229fcf002f12c439b521bc9c8f316ca77a5805bdcef2022a06a4143df818e59014cf7c091a88d5441b71d5310bc8182a27ecf04a0257c7b2217e2b43a7fbfb94dfcf54a2fba01f8ae5069a5bf54cf083df3ef24f243f7aaa5c8d66b0e60809732a54292673107ff33bd9188e09971ef4347acbdde939840ff080d449297e47c43bb404da2403e3751a842666c2f67a419a7f1faf4f48bf0be74fba8fad6641f1a0281eb15c31e8a0df130f48b1bf27685ae81a2ec8cc984a9817957b32e8061269ece78aa8c4f8112959a82c5dfb3da72cea6c3f82b3005644eb6842e8e0aa4afc2998f18223495752f04fc0173337b4bc5bab8ee46ee7d606cda026801ed952fda505dc748d93f2d28d9996603a9453a9fa18d14961892ee2b44b0bc1120ba156eba079e016393a102a9d7e6468126c41d7690c5adefaad3d52a36bd7b52e34f9135ea4a5ab744c044890dd0bd26ff4052ecac0443c54f96a808fde7bbeb3585b83d022144272d55918de687203d82ed6c9afc07047bedd2681a3d93ea9b7d177199432a8048367fe90ef41845d892ef09ae91d0e5ffae10ea3cf05e0292931c44347a4efce931aa1497fdd4780578db82fe4e1120eb57df77126c7426b74f41cd636d0d29c46536ea31610d002da0090b28777ac20fdf1f339f1cfd5df79bbce02064f87e7b3a6890b690393d6c7714bbb374dc698a3ffea29cdcceef5979f2d386101fd280b92c84bbf837710d84c6f0a0e9e50a8428ea4e59e6c90b4570cf0a1167888e002b6e4ce8d982fe2df168771eb8c7dd2385525147ec7e601d29d5adb351776476ededbab7502439dfa1aca2f6f34b89198756e1122a625f116924cc06a3e024d62cfebb85b0a672e4a79d92aabf5c803c593eee5747cec670a5411c40af8b9becf3f92fa8f51ce47e2071bf8696f6499a7a86fd6d2d35beb5e3cc3d209161bea004c950bda58325bc6c2e9aa18f71d63852c532dae96969720cd400150e7028636c640bab9153223b4a3853d1a54b40ed80474ab041ed647adabc1878d1e75e9ff3a7db8bb34cdcc40cf8be1f9d8fb3f5dd9cb2bc83a1560f87a1e855d4e7f814044f80c88c66886f0d4aaa8cb642cf309abeaac6e379261028e7f3470c5ed7f1ed023921a205a4f11ff2fa57b67930d2f59ea440f7080d840441c70456fa191bb8cbc91c809de44245dcb9371140966d1c8f4e819c03ec273ca2ab031f462aa93e4606a3f518df6490c8f1ce311906edd3e2822e844d948f10784f7f4865905b162476226fa6613d7050e7e3f5662d7626951048271d5ca9b55b9f71ed34f3d78546168c61276405ae6d2a3d15bb7751839cfe2fd050c85ee6becbb728ab2a33773672e5e77e2037a9945b04a54c20e0273bd5f5cf6cfb5b85a0b3db729357fb6ba5c237ff9adfd7c6e820881e30fb74ea16fbf03c2a0359978d1d2ec0deb8f9ddb9f1b000c58825a680bddab8311f3ff76365e6787313ef2d91b96f1fa082311493bddc5fda5dc4d11256bfe8779144ce0ab078ed358444fe15320a1ac190c036f4c743309b7903bf28c5739348e8ce138bf291b5700e92c3b258ed88da3f15ccb60b2dfbf278559dedf6f2dd1fd428b4fdce3dde298eb34d5942b4a782a22477426e7ca3a74bc35bbd70b4f0a11627df91942d9abfbf6f0dae1c7fb2da125df0633ae7177bce5fa80ead61045746f6d1367b42023b6f829c1b51ff067720eb60d34fa75df93857f89d7612f6ae06a962adbe163e28e3dbe45ac15dd90405eb4ce3cbf95c971e542349e08eb5ea6f9ca9138fc81f0777eebc24ccf5d25b9d6e5ea315b7fc0ccbc7bd91a34c7bbbe32677ba4f6645abd1efeed99f08d2eeb3500a92900c5ca18c6cb30cd5e142dba7c13025cb8a7d6064587e4bd5921211861a7c742db6465dff9aebf17fd1e346b003dd9b2a71c786e5a4bc7bf5456d529e5be04058a35f500e4b01be2ce847c1c33fd186f84f055f615369607332bcdc2f79226c89d4ea2f8241c4772fa53a0d65bf8ee110b664b67e033aaff42107f900cfa87f3fa6fdadc425975f8400833f5e77873e2ad9a2f100d6950c5e65d411213ce5e66cded2b06ed15eabeeb1c1106252342a13e65aa213f27d9144c5c341c23707017aa01a94d6b1a7531c5fe8ad99aec4d5a63b62f2856318d50fa33c8e1f4a3fd8d0e8f93487a897acf9cd726292e520f08752c4296804b857fbee7fadcc1b88e2d8305e9f423b5ec80c25da2411bc8a0f4086a44bcaf8836e21e05d0ac8b81701c68fe3cf0bd6da7bffacff4335eadc9a2a034da19c432435f5da825c7a13ed1ce295a658544263a88c3c761ab1ad29552275068ea8c7d0f5d7c18e8199f9d71d9594c0ba0cb68e6819c97891ca39097bb1b6f854d839b8dbb166ceb848617fb85700e8ebf61d29eb9c32b5c81e93605917e8bc93e80b47c460e6478a6afc18b53a060ce05bd9d393daa4d9eef86ed703e282a8c9860ee4429f3086658a65dee1310f0d5b6f0f5fe05f22f285c8b16cd2fa780100b01be93b522ac39163d2b80c8cbe8baee634312f7a7fca72f058205efa94ca1423029483a0b9db3f3b58efc101779aadf703fe45296f6676db8857ce356c43a22548dd819a3771e6d475a116e0e0d4beea64d23571e316883d7e30260cbf6289c6b58d909746cd4f3e624a483c217c6b4fac8ee1baa5c0bba239d5785ab16ed2a06d8808f48211ce36e4c5719e3f0a8e9db60da19cce86106055e94a9ae9d935d5c232c08ea6527c401924f822f33202b0e85e6342d0f9091cc3df1bf94b7f6234e6bfae91d4c1db6fe5235da25e7d98d68de875a4db9c980f550ec8c0cf7b38edb8eeecddfc200561f2f2599073e454798421e66b5024714ee7003475719cf95622528765b43c66c1c445b67b7891f86e527e8c4fcfe0680f89a45950d7e1ac689c012432ef20e05e27f56f9b4ce61677eacbef86fa6fbceaa252dc4016a4a2c58bfe1eb8dbdb382ff46cbfb57ce79268326852944179ee7299361318e1ba92a93e32a3ecb1ea6b4990a9c4badb2c5fd41a951e01251380de760e6bcb7ae5767fe71a0def87a445fcc4709a58760ad2099428f1c4fa434be3b1fe135e091a8d870b5847cccc7d6709756e1fbcaedeac3a44a2dc3adf59cfe8a338e3c90a2b293ed27a388d8a90501a7f149ae2d52018630930c10d9ab7c7dc45069aa88d669e75c208235d55c81dcc28858d1a9bddcfc31f7badb43c97cfb1aaf7c0263a52b0e4174077e4c9e6bc39d42728f5367954e1afcc5370961ba59dd073d4425daa63eabc36dea1db5ca9bc7afbb3ed5eebd076dd8fc895d2e0e3d5d448129e22b245dfcbe6fd3b64558a9b64e9f930df45159615881411e2ebfeff04858653baabe47b243d740568a9f030edffe97c6e6bcedfcd46dbf79d9a72deba23b32c1fdfb493359001e7b242137daf3f82e0d8b53809d12f92c3733926aba7d4cb7205fa7e6e8c7e749ab6454ee8b7261f61aea4deb27ef7b94015e5e83c03144895ecfcd03a5a3f4901b99bf7537ce734aae3c68f3535faf3d8b7ec28fec77cf8110af6687c28c6edd3dbc2d24114f247d2ecf10bd48fcf536dc0292104d1dbd6cba8657df1730b8337da283e0d309a895b0bda0881a926679a3641d9f401adf745eeeed93b229d59773980dd3e05aadb64efa080a334a9e640a42c3d73a1843fbdb8d8e22d2650f12f33e83bc821430e90a755d8fc042ce7d7dc1c85d4c23ac39634428ee153e061c0e117f5ca823e30e3b9e85fee79bcbc56cd799b3be48854f7668fd59a7a2e5ea0ae90542d535c7134861caed396da664bba211affd1cdccbde1f68c12848b7b86a0a0da4efc89d5d2a493ab2b57ab1bc43c9a851e21c5801aee0f2151f4d4ba6a487114d85ab89de560ebe3170e68eeb170dc821cabd6eff148c2b45bf449786337ef38093e7422a1afcc76d0e54953b6cce811d5a040bc5c943accd1853b28e4fdec5594b5d044c42c27ce40f770b212f1928f7b76c93fba3a5b119f0da522f9f786668ffdeeb95f617181377c5024e9ded6e08e0784069066887c9f87624f276a80cc85ad3407102e31cf71caa9706c041de5df1ccc3f6f8f50c9623b8f16ae70e6a2f8de0af5af7bbfee963dec02bbc5512acbaaed1ede532bec0305495ea262be56de516d2baa2079897a4af39759a498cad9d5651ea0d232c2b742a1f5459743e9a364ea265cae9da6649c77a0376d802af1b9f024210d6093af16fb683790722279d7766c94452769b3afb6fd82e3dcae2882a0c97578502839af23770dce244ee05658b0f8feb9c1aeb7fe72e4b177c56cf2b86fd4483a79014bd8e3e1f658134afe14b8865e47f70c657820a30726926972b375eef7629dd31580cb2b4bee7821cd8cbda8004e4ad96a4cdfbba06689400216c25fcde2a71db559a24285f94af87407762731df9106346bb3bcaf616e00146806cd8bf6233365a28ee824cc620681705d45171790c04f54a25bfa47739745cfd4c0b7b4c37ea88319e72f7311cc8494809ea7732c6eefdad20865261e0f7db68aed39eab2c55d75f2b3a27dbb8f6912ec624601ca759b0bb12609ede46fd8b32c38b715961edeaa9fac4d424b89091f9ab5c81269df27cb19349d5c73625b5662b12ef6d3598e61d039573c41d2079c0d082d50b2b83b4e478fa4b783374fdb54fee272911608020e535a2365f32b287b515f9739e9205c09eb292b258a7e10dc248784950ed961a506e005244ca3114210609a26cde7ccaea67615cdcf31f1696281a9a244cb6c3ac8894801f3b69626ffe8b8c7a6cd7e26d5a69c603f31b33fdd3e148400c2e18b6e75e36aa18eeb581fb4be5d1ce290d21ce1b2ad74f6624d3f3d07c48654458631ae44c6ad42a4522bd86a461334554c6397c67e95683f16c468b23c7fd12227195922683818659916eb2b4543d00ac51ee631c6ae1ab08ece4c2732de1f0cb09db2d0d02e62ff9d31df013f0187e2cf744f824c67f70ef2bf39c6d2ee25fcc5803a66767679dc098c32e3fba5e3364323f13734b22e12936e5304638ce250c25658cf210a0a629ef4e44e118392b1398ef5a02470d9f34e6e06ef8dfd82c7a7c154b005d84e2b709eb54fa3423bb99ec387d19d33ff991ddb0c34d39baf170400d02ab1f7b325c50571b5d4d33d78f872fca04d5207eee6eb10a96ec97441d72ea3ba1fa5bc8dd56687eba088f0f06245bf36628557419501d1e186bca4880d422dd213e22dc3fabe944a7696157c7971a5f9ea5049440e0ba6043ae21195067e24137ad1d94beca16da8982c3e91ff2bd69ad3a5897d6263ac34ba8678f06034d9123785681721e6b5ac8092cdb8cd960cddc241bcd11390a93408b193e5c1b8894dd56d460a729aecada7c17b2626b79c4a5ffd53dd0517ca0066bdd47ef72ff9db596b5a5b4e18fe62ce60ed3a7e9f38205aaa7ea3f1c9b8564ce6b9c5e13da45cdb6091943916489b3c23277d467e1a442b5ddcd79d7ad7744b1c61838971d47077a8ba6de7efa4d12972d7c9a0ba76bf9fa894d3b4fe495ec29d20506398e2f4cdad2fa3fc86105f9885bff040c9a2dc289073b1c083e11fb9a5346c7835701d70b7b221682920c3d224bc8443507ae0a1589a3c63f422648f1329313aa7270e43656212dffcb7d4141656c1f00c847d5dbf9b3208e30ce23a4f64e5da994f1b485cda49e068d6032f69ef72fdb0a50375d735d044ce2b0a587688d3cc3d3c4dbfba4affc81e33e752e4a4534f5b155cffea4fa44f387f3cb40e715832046ba7bd95e1608deb0b055e77a84608f923e9557d657e04346acf1f74a18df9fc847aadbc868dc33ca39c4fdf4b5864fbd0ccdd3021ea3c1b0fdc1928cb3d32da17a5a3f5ab49eef4121b5bc4c7e9643b2c07eb9f535983b3fc1b22728343385e8bc5c82d592d2dbf82f8d101b30a1dcaea9120992531d0ee6b3d6c28cd3bf3845c12d0c51e9ecf606856b94a5839ede3d1a5b370f7891d77394434366b2d5f07ea848dca4976d0a325e6d9edc4897f80f499962a4ecb2f31acf7ddff59e161395af841b5741c2184e974117958ae347d99df4af296078cd291d603a2cf4f8fe97c703411850b797cd5e4c586e6c12d0061b7df6bdb80e814d26477c807614be870d7efda8b6782dae2581b5f018c416925ce445a6092772453bbb5f2a55bf3a9c7b15bee5db248ecdbc5e4838f0184396a7f15ca7f28003eb473c5ca130602fd9e419566b51ea51eba0afa3604c9bf50f3d0a52527d8e1ac9af42d9a2f71bc5e1330e36d8b601363e2b3fde47d8930244b08cc03be5c8a167fd1fec3b08571d83efe9853313816e796d16b6edd9dce643e3597fe18b8ffac1d78f1651d0c528ea347976a336d7d73ff8fe7e02d3aca38eb140be7058656d893f17ab46728ef8801972510995886c74e34a811784385824c4a8c4e56c79a4286c9b7c248302de9baa5c76bc02adb5bebc2f6893459122133b61bbee205c2d00cd905cf5bdc34d382b568a54f61362f39b2ef2dd796cd99124c35582098dea1204379e92ae5bae9cfdabaf0ceaaba5aff4b7a5229d604fed3cb78ca4d8db20aac04e03094e669ab759b13a2ad1b7707ad2325a937056322f40479cb504196666ed4f885f5dc0d4e749ae1e28da65dc1246476a9e12060df6d517714889519ecd61079e73bd7a5e487b56772c7a0492a88e80a99d164ca1c287fb3983cce0cd753958a7498b5eb01ae7a437a6c80a8162b7b1e5563321a35647a131b9bfe92a113563bedbd20b290428f9979f0b867777718398af505a2a09a8536d7afe27017fe4f1e78da307e11c59ea54467733409e9455206bff0a159732cfc2d54c5bb2254f17243094e2487d94b2769503c748517ba9a566b1bfcad5c083c076b9f799f36afc10084746186b108890bbd1920e852931199033771d9f8a6bdfbb5f4d68125810dda1ffc856472395dd955d9da2031c79a4ad0cc4073e07f87053a8a8bf9e9210ecc8bf054d4ee3bed789eac930ff21e1e2b2e912b5967e0da9cab98d77a8c5bf8dd342641dec30fd6ec40e2723358cc057115bb3d61d90b1aa3d7c78bfa919f04ddf755eb8a1a7c96d83ba419fa0d0d801784b1a2512e6421848c84655cbfee0677e40720d653c72e1c2f50b92b92258814b6e32138053f3ce6daf6e374d88a8e8b35cc23242f6cf2a3aef8e2d4c1240ed514c809ca473371e5204eece62bb8d2961ef6f9700ca1342c1b8e4ef96cde615a6574ff0d70797c7170b3e7554df112f741cc81b917336ec0611d700242b563f04f20a052106d13ca78895d18295e696edb3b5c54850be5dedb1bd114078cc555cd6a6005c850749c19a9f931886a2a8980703ac70aff9f6d56387882813e0b2814b4fccf12d8b0786c5f2b41cac7d2a394757a311c63d54bd663898b0bcb07093da7b475ceb34c438f4f588040bdcb77ed12f70c851608d66eec929c1440e45248c117ea68c37fc569588e471d6edafea8099c2d0806cf321d92abb40a6bc45092faebb480354962456b3a09f001e6b00e7ebb39d2c8dd792e76237f4cade93de3e4cae5484664ee28b0d06ed347780dd119c07fbb02fede0b6e6ff3ed7115ab50773a10a534676a58d94f519da6a9ebc2977be03d5e901f356b7d776d78c61accb2f9ad1aa13d61624e3328b24fe98852107886e30f44e151ec907e61875b1401c5579362302a8ae4bf33902da7c58a7690fb502a1ce4fbbe1e9161f1e8e20cb4dfd57948929ea041dd5772ca02d3245a1f01d6471aa1d507eb2c6be3e5527186d646244f443345ea4f7c63b49dc2c49d9f54e39abab747de6fbf1c17050d5756e9d9d6844bfc4890d0631a83de89a732f8d4827abd25875ca794639011bd2043a2415b60e425d39fc37000a81c925c41dff1e338ac6a7c70adce65a87df739e4b0965d908d37ebd9fffd2c11893595175cc7e694e1c29d63373f657066feb2b64da6aee2701d3facbf93e493b5573e11ccf51f2973042c23d26af8fe1d30c2def431ad265c9f0617c17cb30d12e76d16881fe8617dfd5a3e6370fe376a0cf4052762427bf7c88e1469745c9e045fce93564f8df0b8d95b7399d2c1fc23ac70c70b526774eab75bb56bf57615070935a79287cbab1533b64012bdae164b0b68b1ed0a5ed7ff5ebc5f48558ed656be6569247172afbd37d47cf724fccd4d28b8917bf6f88303c85c96f6f9c1e35e28489f858a407961cec60cdfe0b16aad333edc3432e5c75dc18338b1f4e5c11b01119edf64a646d1ed4d509a05b0daa43779afbcb8df78c1a2bb3584acabe9c86066812d3452ced445f6aa3afb42d50fc6c839b4c476a276a02b0b4853760c137f347bf4afd1a35cc8677fc89cdb64ed0a6bfb037ada77d595a057b5414ec11f6c6f527836e60c0db580b73f46161f17ed8c58850c8dccadf60a1a3e161c1fb842d81439c4821f3cfd2fe60da35aa881a9e91101763252e9b6acf4d7231ea745d61fa592a057215c5b88a49353eef22f02fcfbb2b82a66f6d435ea24c80e8a5aefea138653ce7bf255ec0183b1e63655ca396e0fa99699c999a7592f7172fd5263706409407faf6f85a45f611336ab3b38ba70051dac651af28baa1fd6fbbeaffab539409677f4d759f326da21b81012ca82858d760cef5b533ace03e8eec69aaca0418b067b3a85596b580945326acaa17b85477250e6dc82361fed3d56770b7cf57c688f7824f2fe89098355af144e2c555bb70984788ea4c266df2c96595f0046ca3aa638e53934042c92a78a4cc83c324ee49d45751c992e454f954295030ae8f0ce597d6e5069c772623d7fc571347f8b418a6015c617e6e37912ff504ae383b27bb2a4fbc4724a73d3bb20269810e3eac735dce71f24194b539c2ecda20f311bdee7a35cda62a6f7a43574ddcca34cdf7259ff0c75dd1c9565138c20df743f783b778c8550df6df784f89641419944db38281efe63972090934a45cc42d83bcbbb02e44bb5b687801831a8d8150fbf71dbb5e529689d494c88a814304c6dc46b669c1ffd831236408a1a1b547b753ca11b19861c49f68b78e87541d8f42d58c8915ee290188272b3b6792959ccc160ff09b7c85ca62114bf4baf16f87f7d1418ab4335a5eb6f0fcd8e6a7e489d6fa9e11c02a9081f12da8726a6e19a904f5c21456197b471093e6cc9fc1c5babe709f81737d4a6cfed40479266f02f9b9ee5e2cea687d07917315438f1d36d7ed58238bb05d9c0514f04529a75faaa404422df03335edae61c9085c8b4074bcd265342e9e31b6b9e0e64c46a895906b19a8d61b5b0bc47d54f8667c9ccaffa95b4ea7549cc9b34ec4e2c18216bf072d3c49480e5d2484379819b78ce3a08672f2b06f2c51daf97aadb7cb67b618f0dd3b099950578bae95b5e2c93fffd5a9e37dc3d49ed5293d6d83ed19a23974c7fc6fef82ff8b01d4bfe237979092f126150edec1603b2c75fc7b497da84966799c3731741df9bb14643f5d9fc9b870bd299427df0e179ba7f224a75ab599f197d4de76ed234ef14639052221b23b2c0a18ac55b475d0f4bbd7e03f41053623518ccb6310d2662e6ee9eb17228dddcc393f4a98ba12da6187ee780a6fe68196a26e5d31992f4843e87d5b40aa78cfbd1d88cb7ced0067a861e4cd1e10760cb21edc9a4d37e2328e97c358555ea4d2808958be6fd6a3c372aff02c8da7cca78da6d18921b0104a4da662d42a991c16fca900d685aaaa47eca094a8993ee4e1d681d276db46be73f6b5cb803a95507ac85ec985402438e3021aadd4cfdf5c225e73564010487362b2b1b38d682863a2bc809daf556b869bfa2311f681feeb23d185b5dd0c9952ba74e1d22d69801a23fa7fb56fefae4cd6c4cdd717ede06a9bf3ab344f2a0a618d2b5d1f06d38ad10c0b56d7f507513402b88d5c631201c61b3c95e76b172f965e846ac88aa3065c8bc4bc5848804755b9433b579d73d0794e91bb818abfac01549eb8ae61749bf45f9719e40997dd56279b5857a0cc4acbc3a6766cf4925ed63511679e74528bb1170736b0a287110f0ca745827ad98e9d273862bfd42095cc89790b19b2b884d4d66589e0faa476bea4129fd80dcea3030b2a0bf21353fac811c975fa2dc8287ec0d142edfe6509a4e8ade62297fefa12d5c65106d17ba5dc24c55b33bc1c1944dc32e7980b469dced174e1d78566ee89cacf853eb39c745e8c390b94016f31e9fd0e2031794ad23a0117b37fc4db55ccfda6b08ab71ceb6c1f5fdd981a6057cf7d6a26fd1c9c81e0c64968ef9e73fa95ce585284b3ea1d833c410e2465daf4a94ecf792aa0066aea99f5f677128b84e205002367b7d9eb5bce59128f88d8b906a108e9a45d0ceb1698dec0347e870aa5680bb74bd936b7a3ba1f91206f4b7a8a905e41bf114760f7daee1a4c9a1fa139cf69a42dbddafd277fda400d52efd3d6c57399650882129cb3335d90099a5e8012d0ca7d52e629fff935fe7435abd77b07e05ec26feb82b8774136e176b707fc35bbdfd6454d0e9a155bf3a8153c308f423fd993a35c80467ae12176b6f6ee53d094104a86ef3f4d789e716a491ed044da2f9b2bad16a3985b46463438b1774ae383f59f6b344b2dd21124220acb57b64622fb0e868c52175ab9c8e4154550ad09fcd7f3cdb25ad0eee8c47b6b64350be1816e4189ca5f965e407e304315392f17ce602f367f068f378e9d370c9f530974c4c5c2a055f413ba7eb66dd0ee7f3bb4c3e75fe64c6773bd36ebfdb4eb42d93e29786ba42502ada481a395b019c61f39fb04238a5ae37ee2973a7c1df498ea82d7b62863ba0b3ffdfb4e191b1638c537c687f7538519a79132e01510f8cc71c4593718b0b318a2cdc8e747e3afd58e068a83db205e3e5c07da2ab8aa7fd0370be778502bb6f3ea9e1c804050a4e3d863e1c940363b5d1da537961d7ecb43f5cf5ab425a2a15490b44f665a6dafffe4751acc6c116a2cb61feefedb76a79b0c2f2ff9c8a6538fe2c0108925dd5421419c86edd935a1750b9f045f8ae43b94b02403dec2d67e8a968e89c3c9fa14d1fba3b078dc7fa24b5a2b1fa834060154961dc3faa87a1840150491f601d581c21bc00a31f587f16802fe27a932c5bc2f0be3b349aee3304b7803f3a7dc3681eaca7fe298a994fcafe04b94186972d58d9f014d2d42956380b2ccc6a413975ab40af4eb4fcb953d1021c4b04684a928d7e01564073bc8702fc7af5b16e1a845baa9198a15e705a94c25572147ebbf66488b5f8657ff39ffb3bbcd9f7aa61f069045d2351d4dbc9a7d830f0a02c832828eb1647bbe1a0ea6a6ce528a3d107893121dec362e7392251b52a55db39a9d2b0637c0d0d876a517e5b83c17723291b2d21d04b50e1d25fa9776a201addca1df7d4809a05b90bf984d53fe3d2729bb666a4fb2c32952c85040a0ba93db02d34bf1830b6f3bdf78f9b6202a13c1acdc615a9f1ad1862d294d981ee48fb3b807a5537ef94b1971fa67c0044b0fb84fd9d3df39dc007e03bc148eb18954f37e558736b51f2bfba495c1246efc12395da4a117a263d295f61f5ff7bf0ad99937a187d4b066ddb0f973a6fc3150e4ac33b82c0675ff607c7c73be0e128f83c7e4fc60e5ec9955f7ba3285aecc2f3e8f8a9d7d05e03714efa9b3d81b4eb2e56387e5af14764bf1cbc0cfb025ee35dbac160010a5d22713837edbb2a8b3fde4c633912b1da87a7a80a1141b3f2f04fc6a209f7f4044eb6dfac2e7378e30d07d38410e3beab74d990db243409cadee9007821c9438aeebad88d4a890924766f2457dd27a9082e28825faccf6434e1a3e354e379b51873d8f8a79458a76b9a5336d579fca57dcec4daed6c08bc4336557e3b2d431e51ff9477e1de373cb713d5f8746bcbe4615fbe19d7c72f29814ae44758a85e8a165a390c7a9328c8d189bcb78550baa3c65440f99ae4f07d1f78949713fdfc60c93293c72763d07b18ac55f4cee43e8c55d2e75439fd1c8e7fa59c4d7dc12beead25adb8099314f3dbed87ff97bb4ebd76d1617b48ce7a9e2a08f7e34d8dfd6a7d275e3a2b3d81f42550814b8eebf016a29fca289c61f25c0795a0e4d185eab47b9f2979a34d8404a0333481329e0d62c3907222204241d704f81a524034b98f4974dd541fde4d440ffa071d2fa241879eb60aabb61546512cd44efb8ae97381de7f0bbaa198e4b3c74a6e5147b7d97e95ab29d6d03856107a39536bb27631cb1c212e7816e7b4ee8c7043d8844bc227e44a52f02917f28f8837922dbce4afc5640868ed69f94e502fefb567af0be37cf941d997a2026051d5836e7dc8a07a4303311b0027ad4c0b1";
|
|
4894
|
+
/** SLH-DSA-SHA2-256s (loadSlhDsa256), ACVP tgId 23, tcId 199. */
|
|
4895
|
+
const SLHDSA256S_KAT_PK_HEX = "b2a7d53902aac9b2ce4216e8b238d801301e274eeece42b900b1451f9018365d0cf1e72f43161c09918bad4e64f99ce85c7ae665d4b992a84b6c4794b22f44f4";
|
|
4896
|
+
const SLHDSA256S_KAT_MSG_HEX = "e0ffee016f82c9464154c24b3e2d0f0d5eda0dda41b8f96b95fd9d604316f38860ef12c19d51bd240b088de782385c1ed6c69778f4db81f2c18b522da6d54fcf3b44849b4ce6d3f65202b6c2abbaf7e82a433692e62fcde58b5ea770471026c2cb39a2792187620d597ea7c2c10c5168fc9a3dcc971a09ddbea623aef32d74fac478cffc23f4836810cdacef0d8c8caf0c9a9ebc0aea3a9a36c56ea5f072da066db44e4ebb5d039b5648b7d2b440a32d4c1421ce33e2ae13c68b5a278fdab0c7a0612fb0b9d8c32d69d29eb9fd012591ecfe80a1397b679d6508267f8b6c6df501b4d3d9d1902bccb55a499b7f131bec0ae694fdd0b27c733b0141e5a47888b26e1ecd19ee2f7780fb5053b5efa29ea6eecbf7141fdb13cecec1094811271c0910383e1eba0ab801fab3d9e4814a35444a520dc18299ebac3d8723a6317234d434d50024e7e9f8fb8c79ad0b885155f2673aba45fc50de115d2508b205447ba8be6135d63c9d7e0598091160aa48d2453929ebad1af33669ab3dc165ee91059eda58535a968f1b53e7d53933ba8a4e1e8bf6430be2560112bccc6658f066dad13ccbebf9675e3c7d34ce031b06f3351295b1ccc9624169c552bbb9d30d5021ebf03f26ef9ce4d057bfa64d4c1c53ce759f73a91151cb1062bb87dd38b5fc24811a206ed468d5853fc31d9473a4254d2ff46ecf31d23c0b5f138ec5222394755419f1716982c2e46ea47c4d5d2a24f181aa01cd2b503d738c8af1974d442abb117abf9796a6f731c19a1f6e46c89551aadc0a4ddfa6f013b1881861b4847e8e13c216f37bcfcd8bf7e0731b63eefba4eba51bcbd33e7d286e3b666331ee1134b5835d416d81f6c5a7dd8b5cce5e4e17eb4950c5b834117104837472947568823d4279b206e7ee3b6bd3ffe4b082ace3aefbd99a714f762f3564295bbd6299a7c13cdf7a41fc13c4e3c1152f6347d52ddf32d52e1d2abf1cbcbbaf19acd2fd8003632c86af8b15832af6c4306b33eae47dd52dbbe29d0beec28e0657803dbba8f280634d2c53030deeb8cc281881abc2122f57677bf00167b058d9b298033bf61eddb217f6fc14d53da8abe404bb469c419e5abb33da86a5985949402840b5999cd0e45e1ded616ceb8b41019599c0fa9902f34e9dd8c7033cd004576900607ea9417ec5b6df9e34ecf893faddc2759cb1b34189be5fdb1a959a3ebc214e657f861fc30b3672adda8bb1ae79f35c9e7b8d26a6ce7fe69d6d4cb53764ba2ae69b7186577b3d02c35781c06f5ccd28cfcdfff8e708e9d606de9a01";
|
|
4897
|
+
const SLHDSA256S_KAT_SIG_HEX = "a72685bc923c477a21c5ef77cb26387fa0c18ec189984e9062c0c6cc48d3b2eb97708908dd8e3d3ca6ae000cff6b03a45f013dd1e386910218312b1e1870a944123510ab24f8349aab15bdf66d1dfe4b3e70a68de06c4694f487d3868c7519ae617ecd5c2d7c684227579ed8068c5c4986a099402d2d4afdebd0ff8333f13a4591e3889aea7e0bdfb0a1fea8200f46004ba8eb4e8f95b1a11acf44bf32f0e3679021b540cb56390a65668267a343da90ce2c565d6ab8a80722da2d52d1c7863835bef546c39ace546f315040883d393469539bf79f0f5e17a59ea5112ea4aaccc1b860a3d6502c9b9c7bcaf4c792b32ddbfea8f7bbdfe7a01a9a9d1db7846f2acb86c57b85ac730e9e25d52beef10d4df682d4de3a4be5a51926abf5a9dda76534eb0aa231e734ba26b050c66b2a6681da5babbe30f6df238c2cc1732222be6a1eb046f9e5507d75fb585de120a1ca994c2f0a0de4d983b07a2f909eaf7eb3b652446ee5e8980ce3a534a1d3c3aadb15538181fcab89ed817f8bd69b47d0327aa6cb89ceed1d4888a88c0891476d47fc82f0c457b25f0ea8bcf1ac8804878395e770bc3d75b7a3d29a154f4d0f1dc8572f52d1c948982d46dbae86c710ad4242d05e43193f854ce709a09f1b0d48b15b6bacf40bbcc30f34b496563b7b47159d11f414fdd096deb84c4259a4d8cb01ea416ba861b2381baceb50974017d1a6094d71141c265b5746844e1b9fb2b689886f5a869992fe06385edbce6c107eeb46bbc60641951aed9af0d535fa2b98fcdaeebfc2975e5c85e6704dff431bbd050fdce29a763f9e3dd572046bba126cb2c29778dd8f6b329cefe9395c0cac348f2d24842c0b4ee037d71124ac839b3e73c14f1a30cb8bda46e9c18cde4c3d73d8429cdf3cf26aed5ff4a300ac7a7f7461c2d2a2ca0751623b0e24bee34973ae1aa525331ccaa3da36d02f683aa528a2d5896469b4a43ccef05bcf0060bcb107fc3d553a2c5695611762b0d6772b5bd567b2e618a2a7e660d5d62cc11da663e7c7242b8f1aa4a14df2b4f4e92effd95d8a08486f29e0582fa89df2a17c2f03fcd64fcd0f1af2b73574f7ac16f1b9c58faf91b6f4dbe2073e10c11765ac99574f568f8264d8bc799e9fa858914b57c25da6a0d9012ce52ccac5b100eb975caf51eef27a4d08e077fe216f63668f5ae04ed061161edb862fe4b240a214bd268ce0f60698962b06b55c54c42fca1a6b05cf10166cacbe4fa52f2b3eeac03331d5614765a3fd48ca3e9933b6a6f4daeb9856c6008cae158216b72cd0e2abe32c8f5a0c67e8bff2345a397850b244f9b9060fc956bfd8242f5a7ec4e0df155b6962eab5d92dd12c31dc26d8586b8e2922db20215c51a83a2f31211e777f40ad636752a39d023981b9592d3dbcd998f597bc446092c4d951e80218e3b4f9e0594e92fc55c7a85deb5a60bd9949df42eea7cca7338c1c4815df39287df74b3908a83b9b65135c4567506832dd332561cd770e4420d18e1811d0048c67840e8e906d28a1767dcde08a64db398b549b134ffc6500bf603edd7bca40264eb1bfceeba25bf4e0978fd11c125e91a1445865c35483030536ab7e63552236e16dc6fb7fa2f08f3697d639cb7ce9040c4e906f24cf783ee9167399d3a2f3f2c68634597ce6f7fa469564513a233d2ac78d0b47ea7565b91e7e1f49bd055246b834ada289c2893145bcb0b72f613f441aad4e6a8ba0b63c143f25dccbaa2dd26e4662f280cef78bc38627ed92da6d474e09cb09160a9469f8d8dcae0f91de9e9e3353d2650df5d75c4ebdb58ed556c9b4f08e59f2abf82c16d96c6c8b27585016c13d1f8c5e60091decb8512f43c07ce4ae06262f814c633c7ad6697acc9ad2fa7373814345b8397226ffb471ad6c887e3a285fc486ce0387302f087a622f903847a1c532da95d98b4b6b5f79fcdd286ed0f745ea0d2f06b47f1741c0cbbe221cb539944f30e46840363bf20171fbcee1ea48430f1466df831482f29e2721e70dd5fbf9c022bb4f2423597e68290fbe25037aef5f77cb5b78c82c368f176bb32b0bf94e5f2dc84b98f08c3cba427a060ab95ef3911de19455c507d72aa6ec230e8623b79a4d5f4d26189b4a9d79972c1dc134f03afdc6cf52698f9e4416b39b47a39f7af30808935a69a72f5043831d9ca9b04b6e5c1bbe049d4ce2f7eb496ba5500f984b3038a559ddf07ddd84bd1504fc227bd75d980d4b115ac17d3f0cb9e6dafb418c357480fe7edd01095cea5b2628865ffd965bfe4ad70b5734d162576eb7021d4234b520645153cdea4a3827d28225a0a902c5d05267ae6cf281e5c01ad3a8564ec091788892a5c3d79dadbb086f150c11d9c679b3c521ac8de705124025b4704049a6fdf577ff677114b4f5591ba386efdbdd0759bc0b449c4fbd65606ca111acb82417234c2efb06411c4cf2d825411e21053fe368ddf0c12dc6565ddd5ca5e048e4f7b5bc0c052aca85ac517d293492b262f322e2186dc8726d601b2e718dc549606ce30b12980648a69207b981092adde6b49cfa8d21455d30bb7dbe948ab6b66ccbef737c72e33db91fd060f36ae0ba5828c5772a4e021dd2709929dfb5f2d64acfec54f11756593785ee5cc85a8aa914e2db0249aa05c7b17c386271243b700386c66487a6d25a914c9b62f56809d23f1d2ab9af1fe7ae9a4bb661fb817a17d6f9de5f012c2e793b5e2e3ca0cdcb392f8a9313a822bbe4bcc6123d6c88dcefbd304c60030ace7977f9b4eeade8febfbde001a21c67c1b18f5db7cfa6b6eda2dcd6c21636a6059b08ce63d819a198bb8da5e61fad26fc1ea0c914c92614266ee6e0c6fc0f353675fb36abf2241ad843dc17ad822dff3ce4ca6fdbe31078e2f5bd9ad7a4771c3ff6bded6a5f68a33acf97cea04ba5da4cca7e636a03057969b0ae38e280f23c944ea19742e17c696a4b8c816b813a2b31c68ae0e33eb1e3cb6cd472d420527df3302ac012334705106bf4e4d408ea69f6a7e4c521552fff75caf816bed8105277a0121138889da8a4cdeb120af1227dd1d96a6ff149d4aa9fc8f644505c3177cb985883a1d8695e35e701904d316210b95554894298c3448a57242aa8b130babd60c1fbbe26eef3c386f719a480ff167409b8f25538df63d7cbdc5dd5c6af0544aee3b77c0f0cd7dfa81c635ba77e4bdafa5a2d9e9f887dd22eaef09b86ace393e2e0066db85721c5497fe9fbe9276c2f5393342b0c74f1c2cde2eb7fefa186dce05f917b5e25f118616cbb165e17d407aa9187108179891cf0ba2b2059be7d16a926408abe0cca18e3efd2b44790aafb907d2ce7b55b2a66ca6564a1355501f745ba6bb0a6b609095e9838c969d69c8586b6c221988e50a750f182f4697af63118d8f377cb07754c6fdde13f10dcf92c0aad8db5ca62c0b316b2b4d97298f4b5578f319a09b14b1df3c81937afc8daaf4d85e605ccb8a8820ddc70fac0d3ad2b47492aa4f418983176604824a61c4e7ba0b0bfc358b3bc405e97bf324cc80d4c749953ec7163c2159b887b7423e95159d7da302f41e073dfe223a05fbbc93fbcb1565ec73b7b50d128c88167233345f55d1f07913b131fafd4bc4156ee72c85b8129f9331ad06e8e549c16739dceaef9d4e0f43cc30af57036ec1d0ba44b9759279d18fd3c14c1781036fded6dcb67a7616103aab3e4fa7ea50eba8393414648c0f0e15c74173fc12d93257e77aa333005b5171193fda471341ec6b51000b4ee867084853e64885a28467ba7121674ec5bdad7e274907755bf0e60813d53149362bb72b8ad2393e42e7ced237b7667c8f15d14843c2a38f74b90015ad7683e1e7dcbd8b031e4e886e4e35ae634b512cef56c0589ece8c4d72c52d8307800acbb13494417c0621836349f35194c79a38d888e1ec5c0115fb8abe48a5a745da2d17d5c67b52539e9f0e606d029a1530f5702e82226b76673c56e622b85a021e5dc81f40491b0dcb36738d9ac6981dbc5132b61937db45d91bb6ed201d1847c5206fcb332749d856e4daf7b1334c3821897eedd0317e14809953bbf7d6b55ee49fb2eee87bb6bcdd13329494b1e3caa62d5f1b888bf37993b3103623800ecd71b91400283e3dc6a1f4b045aea0f4ba3d88bfae61f5b416819465f541be7d30a69232d3e69d711daaabe77d2d2999611a5c304bf6a9e5ed95e2cce453c16be03aff624b0d2678be671059169c37fd20a9e4160db3dd4983c860ab9053d5815689df2f28d5af9140c9ff71dd80d5eac28f92b80215eb37d8a5cf48ea2dcc5dc269eab2adac267dedde9a324c94a7b37a0de0a3124ab9f6de40c52d653669800f6addac86041e95105b4da0c898c8ff43447f5d82d16c3059ad5eacc604c1b3bdcf19a12aa9a369de17a12a77bda200d1bd33d81620b6ffa626cf38223d7bc1ecd8db760c3c57098efceeeb72b4917a41a80f5901c2ec75f7feca8d135cb9d7cf1ae0673853a14065494d6060e34d0d6b937157b2ddb8aea9a3368e3ed3b4f1e7a55e1ad02c5872cbe29f60bea7f570599bc25798b2b02f97955d41d80cc217dcaca83bd0e342e1a3c78c91a0ff4baa7209ab8d85ed4058e9ef6931017c34b8bcef76e33b56a04743e9aca86b3f362be19b1720851a008ef716a13b6873c495ea0be36bfee15d97fce3816c34ed65977da33986c4a772d3e79abce25b6679509fca3e70e82304c065e21bf527256699aa1fdded0a8ad816a84b7b5e860f72141bef337415ff6b4efb20382e6f0c66f0526cc68a37859a73a545b333dafe53f1a029f4ae7a2faec510e302f926611d3415706e9694d71c8462577a33f8d98c43a2ba659124f8e7d04af5ef1b6341808592039223852610d1352a78f1da4ca2430c0449cc7faa81730e6345d834e2394017f3bbc6317469c5690f4a777b619b416a45e586fea7a4b5f16ad73b5c6b35f2e64e224b8cc4adc0aadd57d0d8a5b2ae589df6723180df269ff381b8956536dbd3415311207a760b6ecc891951119f08b6405d66f70da3a5e6f17f222398df7a758caac9c847a80a28190b684fbe73b462124acb1650c56a727cd38849ff6903110050f298b1d65a1de286546fcecdb9ebaa4550edcdb4cd5045a34d00fa015ebb49387c9dfadbd1ce67b60f853e9eaa86e5bdf47139a1d7e131e1d20e83b7858639ece0705616b054e67fbe3c82bb5e085c8755730d1b16ed32fb6ddc1cf5f737c55ff9080719b9b6efed9ae1a09337e1f28ef728376484cd3dde3cdf50bac154432f461d979abaf82bc331683b82e7bb9777cfca3d7673dd4aeb7cab163ec8fe9aec6b0ebbac1a0adb53a0e88f4d85af1bb0b26a095f96140c079d2c1a8846f59f1c42d945512cdc135244c5cff89492d5aff2a5b85794f02995c036cc77e1d172c56848897149bd8c168ac9caba973c8eafee3111317d8025e6ad6a8065d7270bdc982cc7a1efae22727a5d68d787328bfcd0880368ced30076f1c561b3d82fef77e23d2b4fa162c4fe49a42349ca8bc2f60e69bcf64a0c79336e04fd82ad3675867ac0eebb438a1f21d1a0c7f02074846e78dd7b9702e32f88791d4f721ae8e1744334a47a3655c6cbb1897eefae62965241dcc59853c13fccb619ad4151617f3b7fffb1e14ee71b0ecabb8d483f83bafc0e8f0aad2134f247aa9d13137c0efc077e8b43c97a63050118f5027fc05846db88b4f73434e6ba7b779a08dea0eccb0db60c6567c6a3d9a2ebe77a65dd61908aed3ea1a40297c75d6c5ec15574fd6526350be6270b674ec1487425560064af92084485644b472428e7a59e132f0d8d26f432adb654ba614d217aba763d3011a250627a3e5628f9656aceeaf2c87a415688cbfef863e8b5c2c4b32770261552bec0adc378f1e0da8024419d1b0c4d11db2fdefe1f56768142f64c5d362e7a3181d80214e594259083cb895509c50ac97c045f9248c4fbcaac3d593c471ae45689c9dc940893e1355c7fbd19bbc100885cbd2e7d641f4305b2485ff37f6903c72b5ec9b4c1caf32fa5f1a13b70f12130c3d7212a9461c8d891a59125cefc3fb15ebdb5fcfb5530b60bab2d1d81a597f676f189b3492698d9e02dd20f584363b57f113038f743f365d22bc429e1874df1eb9f941529ae041d0fe13492431ef8cf1f364f4cd178ce1584062db680588a536b57eaa64d80a7cbdce95f1d220da1fc1de98865db7125944472566995261ca6a3f4eaab5ba2800d78c9476e60576400baabcbfe79dacced5089a6d42831ed0cffab5054a04608e206271c10d004e04742e21e7d2a1c77e19177c1f016a02aca01331e9f2d833f89ba4ac578d9eccf8306cae881a4b451a3bb61c5a0579a612ad59021976cd41ef9ec8d70079e778afa27b1bad36cb1c10bb17a13d48594195ad11d582eba28be14be8ae7439a042a24ee6c466d09959bb02ff8fc72a5886a33495db60f98e6317e9ca8b879f3fa704ee29c81ea9d6accaf05fe30b2d0dafadeb778188c4f540fc7f1b467486896d691da6d4de6a5847dfd1eae60ca49853f9b6db845237e9c687390287fa3eb9b54da941acc2ccb06eaecdb4cc6149c357df480a1ce2d51f335e0bfb74eff839df2135aa6b567835e14584f5110f566309b8292f0d04d437d3f0617cb42408d916121930e0c8baaaf1c20c229d1b1a6dfb8fd75cc34ea7f64a615d20251ddd83a4a0b7de196579ed566fe66fd5c7c9d910fb517a9af378b5fa0715a27622ba00a0b48cd96aa427af397ebf5c75ce61d218e0f42cddf73d0fc7f4675c114979f6324cd708ca22a9c832c5630dd6e4de1d640527d23587b81820807f06abeabd43db2f2ef866882ee4af6d68f5f30c6bc28060465753804b538e2729fbe55b7b1f9191c9ed298a4b2f9072199f4d5499ddae0995b5e955862fe871fc48f392d49b77e98be8670158bfbab1e7797a3ec0f704665c62d55d1cb6b58f801c7eeb86ad5eb463019037cc4b26788d4151f26c78dfdef88f1e226b10e03c14465a593019c5c158c4568b008456bc7097490218c56d85788eb8a88f51b5fd127b695bf5d8c137a6aa38eebfd312fdf3bbf368f06ca5c9ba8c338a7b0249e6bcd9ef0cf5f556a1fcda2d665138c733bc12b5d3bbb905f49426705feeb363dce8b0c3b47aa9ce582d5aa5c7c10c0d6eb9061ac5600f456b0c821d0484249c3b7b61999d49689905f931022f0b00ffa2a3cef340703f275a07665c007be5c42e3d499246628d570af4e584d65ef14c56ef13af466a2e6b21cbe1ed8bc998d799f0cb527bb71ff3ae1849b684f228425b1fbd979acdc5966b7693f3f52a455bd221b40ba4d63eed7c64ee75c5e3e046103736e72c81f7e6f2a7f447e6bbe56fcb09fd8d5ba283023753f231156def66557a094210351927f2960cc6b84841b3f5e9920ae4ade48a41a97c112e72778f191011b116f6059c14091ae6980993a86e36fb6a1c1f362970ff6c676f63d70cbcda97b08309307f5182d62f96ea84175ff613735d8282320c62bd1e94679b3aa90c4a8847ef7e7d620bf42dd5cf983d5b5d09916434f9ccdc5392be5fb7a28a5e15849d16a4201eb7e56235e650a5af31fe609529ca0543925fb66f483d8499622733a3d4a8c078cf7ddcf4828b10addadd68f824e6835f8ba0ca44926e6ce1ae7c28265a9d75764bcdea135e994c11a6b52e0314cc4e5ef288d2ffa09f3a82b36667889fba1dea4db55762bd8185eba1ca98b0d2c8be9fd6a84285ce72205080845f4026b237d373ffb9816b5bff529cfbcd688b35ad14d0e21e38bcaa93918295eef89a899a87a9b9fad7aa2e39c57788820f0c0d6f3740b8e6f4ac3302b4c1805f28e2efe952ae3d8afb33bfce086ab9a0349a360404656461e1b65bce1e7d92dfa250a68734bdd98e3754723461adf7b8e13e6d33d8c9e87dbc0eaea4eb856b59856da1ad6afa2318b882920a8216f512ccce6bae8faadd1824c55d986d2e1174246bf975bdbd5b412fd2b9c1b9fbcc5816f6468dd8896d956b7610d6f027ee0a013f7f1fa5a73f1db06ca7b61571101dd587f46c700d93a97728cf113d51f1063f7c44e4ac78b589e970289c4a370f21406425b179df6a2a895b7dcd324332dc033b9b7f830e4f0e558a86b024a50af6f9109af9da05f322347953b31a07ec7203cfac061b4d85c5f834bf94a02ddba067503de0e68a3816e037c99a88e6fe76d9e7892235e28309dcb47e563d46ae87f6b131b1b2505596d298126ad698083561e7e2788f6d3bd2cc9687db33a1533657b03dad27621aaac5d1cf1ab33424bf24c06f3207a257506f38fd820c0a16dc69eb9b2a1c9e1d314c6183b3911149aa6bbf759c5d1106fd7341c1ec9cce34a3e13252b7219c6619f1e2d3cfda65d7278d630ef0718ee9142451923df39b8f571b0973ce2fb557d84b7becf57dee178464e735753ac764c90d1d1e21253de51dbf0a0a9833dbdff12ef840f5a7e1cddde60da2475f13f60cfe53b518ee190402cbb05dbd8f7afef69a57ef888dfffcf6d329760289a74184ddb238f6746a63ddd9a435f820b3e28a1c7585a6e71a5b3b4f4ef9db05a9c41961aada3db89add9473449cb2dc1f901fff51478782b5bac9d2c461f3634aaddb55cd3b542bf9bc5df65d5f951514fc385edce1635e2de3062dc02d30a0fa55969a1c001449e9c23c4c556312d92b1a72563e4d01615614053a495a8673caa2f9ecc318d570a205aba8e6da877c9ef234137a7d416ad4513bf6a82dba58854f513a31c9b0afda8745bc0965273c693da3398c7df2abe42cd0efb4d09c94de3244fb4c6a754739be5f9439fa7e20ecaac8939e83570277a036afdee437004d3d9865b28fba486bfcc5dcec881dc05bcc2af548ec896f9ff730febe71c366e6393602db4479f87af45efb7fcb1b022efc6b380e0d102f3f1c8c21e74299d5d7db64ff5bef68f80c82d14337444c24bb27efb19a06757c7075002160ab535f4951a63a272d4e316fc2817e8f1fcfd1b27e0fbc73f4beadb23f15b6ade27027e18eb9ce0d1acd5d347f152a3c22f565ad718c89af4d4ff3f7f1e83ba1ad73d741c61fa7cc4bd84c4a25d6f444d457a92849175f86225687475e0e0f4230d9ece6902802c64690e5540aa4ed0e85f9dbf9aa7bce254f5f3aef3ddea2af5f657001d4c42b88c6a8b211720bb15e06144498c2fb684afad63918d6196ef3a70ec89ce9951fc53c284d0358052e09963e955f68656ce10958fd5bd90337c8fe76177b5fdf995cab2b1a0d04a36450be332e95bebf1c674a40cf2d3b8356f0ebcdae1ec2e6980b426327510299b50c702c7b13da9362d8d9be250a741350cd2e671ddaca60e0ee62982bd97d8f2588eeb22b55ffc4e07e02f5f0065a0bb29bfc638397f90b86791fc352bc8881a6d7d73b188e2c48e233c83a9d9980a967e76d53cdd8bb0058f9a3816cb440fd28bf031d0868db6a68d9f610aa27d3d11cc7a5c01d89c11f29ca7c4dc32cbeac34c19b0b7dfd15007f41958aaa74f9a2dec78cbe38d5890daa8158aa01b1cb444b2e214098da29bcf7197f75b48984a4c73b8e850a1e2c96db70b1473110b38fe6ff952a12f3e1c3e0b566bc93468578a65fe253986d1712c045543dc93a517ee75505e254b4abf0324eb56ffc43865a3acc0010c4caee7b29c113243575421116e1932e96bf2d66274b88d3ea018657c3e88752ffa34ec26679c87070437455354c9634273aba1bdd024c79e1059278831d78f7add01e4e7212357b51ee3489647c1d380f11a870480c99408be6560da78699b7ecf540e4896ba84c2a89bfe0bcb93ab822aa0b2ee5a2d6cc281a9aff3fc0302e2c4926e24aec92a8b5520554cb2aa21b093303c112d36d559a3da6152a004c542f04769766869d00b9f9c22974b6c59219c77996f232bc94b5fe0bca213234d502e0881d61e1fe00a5b153af9b82c151cf47b5713da724694d04961330426e8d0328383837e19a6d9a96f8e7734290aa5591faa81c20b941aeacb2b202e5d2d5cdf2f76dc142be7f3c03f7d581c9af920f582084946d1f32812d0677509e4d7286084518d4ece233a2093a8b3317edab1bcdcae02fbe4cd3df5c03a4bf92eb0b068939e3cb13c68722796d660f4140ae057ba8694337872e0319a6f9fbdd25ef677e932565278cbf5a63b6df16756466e3c974a23798fe94f042301a4077b376de09ceecc320057d14469331a2b9ba035633f95db3ca2f353f8698398c5bbeb742bd36aec2d5964b36005efa4c1237b625c9f7dde9a76340fc0bbeb640ff51c4e54394b5825ae226f8d03a0b549b1f74f4aec0120f1e702aba44112775471afbb430159b9d45d9522f6616bbd8990c741039e3540abb9708eba955f4256c0d069bf0a36c0e9d1736f76b52120dafa029f567774ed65e9dd0b976f1e5f7016a5d7768861cc8c7e0d0e612bb3e9a0669e4bb8d8b5509d45b7b72686e85bbe7b901a58d01fbfe6b1f515180e37582f4b2393973cf7e5c11ddbfa95de2010354999177d884ea5fa648ea6212718b7d4381254dbb22ccf10be53b7788d537652292fe274f25bba079e495f3ff56f82e72b7a4dd00c3d16da5771fda3f4773f57ebffc20e6332dc78a59a62900afbd80f8e147d8b690b79d5a151b420d9469da4d2fa5ee1ca6b24103883f3d645b1c0473744a8ee5beea390ff9b7bc1e22e704338a59df285ba3b14e4c3437baa8d405cebc8ed272ceacac1f47c640b6c3cd76cd4ece8e208d6cbad0f528a786ae41cdae2f8be9e8dab509a7759803b4be4a4ed21f380991770ba17dc34e9e28720f3390a3faacf8add22afca5e55b49e367a4bfe42593bc1cf3cf35d78e4d63aedcf51edfe40a660638a1f111d4e7065388f42447d154df70b485ea0008cb909643f60bbe22a242e9fefcb594c8cd13a40908b982cb4929be4a520fbbc96c47f9400ade33c07273bad47be034a17cdb6172f9dc3044014eccfc9c3c86e2b2d18766c785b5e113880e1299fddede1c4a9e93ec15cb314712bdbdb8f583888a9d3b49ee8f910365cba8db3de928971ffbaeac7a69077740c35c391388d76bebcee9ef567d09ccfdc3430897c3a254dbdf9be919c4a861798a644fb15215335d0ce2d21143f7e0eaa4a8042eb425b69592f460915bfc99a8e70eb7e7eac6679ec0fda038e86da6d2cdaef4f301e418735c2ca7b7635833bdcb922fe3e50828c189950ba6be952c605b31436cc24a40684bbe96ac403a334e215b0b7ed04880265d21eb208114857a2c4213d7291bdbd14f5a99574c1c1c2ba02cfd9ce28b4f6ddcd5c4ceeaab229e2dea4907813d0ace24137158af474aabacf5f9be8ae00899927754f97a4ab70f8db65d5deeba66e922fdf3098adf0fc7fd7accbe93a67f19b2233375ef16377a06136818e62e43c224073a8988bccad4c667d948d68f779ebe7cc572e841375c8eb8176b8d7087a018e8b8830f9f8bb545877854bf8df2229eadfa72e4605bc3beef4311bf25d6b6f7c025c5e2a6cfa67e10a72cfedf7c4730feedf6459929d04140a8cd0d680f2029f8c479d7fa1e3559963a7c18324bb8ad5c64ddc2d102d09e3447b2957eec724286df89a9a900c406839ccb649d5791086fd4d06464c3506fbbd308f17b14953d162dc834b82eee1be68b2f4163c3bec3ccd627fe87b666dc498b7191a2c4688aed1432b260e8b014e32b8777e93d74455006e4c5f7483c6bc2f23944c3bf4c79e8c55ccd3bf47c53130dec4f2b36a8e6f77adc578154f2ff453c487867d6e32f44dc24a662c40fdba9e45fbc734b981729d5b146cb6dd107b089de37aa7e5460c0b0835365eb8f7d4f9ad5485d08812c7123f159c0f70663053d46eee1d189533df1a96d63dea92e2a18619e3ae8db2db224f05a8757c75a30d1801d32b70ccc60f1e9106df1589071bbeb71149292b41de76ad91b763c640f5ccdd1a40e3ba8752369e2cc4ab92078540da470b0c8533ed48f4cc4f6a167956b4f2fd7a4fb4ff9b1949877e5d9134efba3330d58f8f049d97d8e54fb6518388595cb7b14c82bcc5866412fada573b38acba4a8cb7110ae7dada51d43c7f798a916b0f859f0ede0255dc03e2814ce5f6c45f80142d6b4ae1f8f060ce8faa55e488278e3834f15097d3d53ad07350c54fdb07b5b68d9a923db9b4e2f1397ba474d574040bcf0363f9b2fa72357ac4cd23dd4af6cc4e3da69080839d0ce8a47d724658bc53d668b09dac3c7d39d0e72eaacb11ba8d87d9909ea53933f546be163534a0bc6e9746947aab9d875b99fb5cb5d34c11920ee2780d7b8a53e6e117d5a25b9c38e3105033a030b954dde0262e8f9e5badbc61dbc569fb65641d3631b297dfea467bf614750a99dd5e27df5f473f8dd3123f6d1ea9de902691c17962d9aea6d7a9462e4b29c97a58c7dd9fb35ce2b6a320d45c46f039d519d64e59d0fe129b481757e1d940231269297303c860e52f4eeaf8240b52138bd8691f589953e5b019f4c0ab2e84a5f7702b8a5c7c48dda73b8061ad54367fe69495f51969d2dcc1ead1c077279a02a10a5d4ad064161c5d324e918fa6a795379166c6a5b9e842c01f770a1e4cc588cb659f44fec11cdd1c4b2afe42d64dab284cd47ee7729fbbd5e8bfaefeee5f7df3faef767dd583252805480165b9ca7af52e7136f974a998541ca50b3f91456b0cf87889c05c63b8e954e4525349e1f484563b3682441a5e22af8f29f756b9a8aebae9340de41880e9ecbde44e05b97c398f6a980a92c9dcaaa536fb8e453185585620a61f48b50396a70bfd0f7e7ee629f8319376d54ea0f6b5a35b68692d970365ed5216e287ff26589690c4171240c1c64190a886d7ecb04370852bd93dd1dcb4a144780cd63517cc608aaf4242145a08cd46bb57b438e622721d6d240e49a0bc82fbfbe51f2d0fe5d8ba7e9345acd79921248792bd2caca47e4bbe933872afa488fd956271783caeae0276e05d1c68ce2e65d7a145d4d6037e26ce9a444e86cf862580bf6672d98d1aa9bc908b1f366d63d8fb96f8d7a1d8f25f6286096248a2f8342602f1b3733d827751eafa4dbc952251e2fa9f15afed6a37e8d4a6a682a38b700eb74cfbf45596da4b7ef2c063e2fd2484941ed062031c1e14a6ee634d6337c6abfcdc28113b4764540dde252f9a020a481e3e8e8a2273e0a96ee18c4f40162f6b32080a43164ebfef445747332c462c44a5e6dba8fda0eafbd4798f95ddec8e5360275bad767bf10e81614f0b2213c1a2e6ae86412a6b113a8f19ab170c114c4c92433504e322c1a6df5f7b6d4d01c190399ce3497e7fbfc31dfcdd4b930eb2df3732d6bdaa4a260c678d288ade233354345160c714b522e4cdf4a25aeb4d7b596a5c58c597e88aaa68bc52509689574886194df00d456e1b8965e11e6b76f8fbaf876f878308195af6690b319af6910579e5b7fc9198c3ea096318f0d861e9fbe04ba762f19bdcf42231e8ca9b586c0a9069da73151277a07d138f83bbd7497ee6fb309a25020efc1133ab41f55debb87aa09478b569947b1d104c17d21788e6e1660a204c1ce80845116d685a35f78bc67903b859f74e7a7d7b6e10740e6169a7e3efad87bfc989e3b33c032ff64939efac2fef26618062a5b94ad3f8326f8a25339c334f220a52024c2846e5196670c47403d2ece6335f281bbc4353df1b096fd46c7e01289a3f72f9f700c13b6ac66891835113613234fecd63a00f3eaea0af939ad713bf59233444c2193a08a357843b38d920d89c66d17a16d6a4281617701c019e018924aa315d479d4cef73a785d0e70b26fb377eb1a9cb927d3fe1c01d1b7c237cc296b6925efb856618978bf428f4f320ee779318fe097c8d009cdd06c1677b35bc9ccad7e1d13fb806b2413928b08822580e10fa4f5845c1274318f6e936c9796825edc6c6029e3c6075268c3d0e61db75441a856523a124a80f8d33d3d46e0a4b05f26f8e7648467511701b26c4a72ba97cfe0f0eadc116e73c0312f7d32f35d62628bcec54bbf6356b8db34be488c2746eb91c581ff65e334d9dd650206b28d30316343158dfccc5424893d877921f534cec32ba73f3a7c01205ade260305baba4027d355aedf0b738501b2a3c03181c399a3b180e7df46da35153f46e9cef750d34b8af1715cff9e812705b25e9ba52e24f6c3234cf3a690cfddd2cc7fbbde13f57c67aae3186f9985c204598e3706a39730ee91ae556add15a6b696d0bbe3145d3c5bda6c599e58e5d299497a18d139a7bd85bef5ea98909d453f49565ec8bb1577fc13502f99ed8c5c9b005472e5ad2e299615a2e4fbcf95aab1e0355d4d6f8e89fde0a73aa50a47cfbdd0d8afe821e8806b97fae2f3fdaacd0c2c4173decf68413b4ed6fa7551b96548756984f7f8e358661ce5e161bdd775c118b68a1f06be32e74ca4cb7bdab9c5aa524680405f92282c529ce2931b96052910460f417a617a27b2032b851e6295656904e2e6d616d03b1732b8e9bb3602370634d0309ea1b17d06b884ad4ca429c51075eb1f01c7e3a300e3bdfeaac94950b42ede019df9d34e7255e3c35db12243aee51d5ceeda3a68a52f759b6d3c0da7e63474aa10941672412bdf51e07880ad8b84d835e5fb17ecf22652b39e2d7c0cadc2f56b7e4bb8059eff77d99fee3fb615b02f3887f1faa025fba6e4f1fade7095622634a0db4b22941ea10701da30c7c556d7b8d66cf91c831d7719c826f1da73df24eecbe173fda94e46ebc6c7f2d45b2d92b2f91f83039d7ed5aedf11d1930ff137f7b0f3d4efbfc97ca4cd43ea62091fa219028891a4bfe85bedcd9994a4f0fcdc386d01d74756e271d9f252c69583b5e961fe9123c51b2512145cee7f66a3241c1d1193fc512e3e25778d641771b07119d13a03f70a079f5295cff18ad180794b8d365dcd838cdafa8c8f6bbbf48adc770fc0d2f3fab7c8b607813abd4699f87ee66220d9f208cc343c76b7869012577af9efe7422362786e4a7be313d002c4695c43ff6fea75f78f1a568ad799521d1ea1757ab77d13ae0d5580fb9f88b61848efa14847ec872b7dc7b30ba78e2108f5d3469622a49b9728687a321e40e9a5316904350b054f55010ad917f752af5cc56d5c874229e32f85282af2306c678ff35042913b28234095d946e5c8896964705c60e3f750c981bee6827c11eb848d7d77e13becb8fc34739eda264dfc49a444f403c1109ac0717fb6712ce817ca2c81044bccd9eb9f8fb2aa87a8b03b72b99b6af7ded2b3cc7b67e6f6d532463bfc35f366b1ec45db5a1fd6cb238b62d6a8c920dc688c4c4f3dfef7784eb53934bf8fb603fd93d90e41cf681076fd45630d10af49889311526c82ff7779eca13e5329efdb9200647b0013551378c5b9f8bbe72ebd439d94a00994fd5c1ec9c00505f8b3c204e0fb8d78a37dcbc1e3b7d1107fb2edf86a53d7b6dff4a3efe81c30c14a839add14408d785550fc284d55637f719a9d1b1b385369e7bb0b38fd242c069830cc0c678e9549edc74621c2a0b7ba75315e073227cfaaee702258e70b739dbd1b64c153afcf411b6febd7b66903df1969daa9d2b448bacdfb7827bfa0f73b10ea57f08f1f3f899b3a1329fc67d78c367a4e59175b4b3c9b31b520756955a32ebdff06691c4265973bf116b9a90e8a3dbdc5fcd84957bed2b3b2bc977c2707798c804d087781db91fc3d23f42881eb3df31599447c96c73a9877907109bb88a6e80867baf5ae54eeecd7107f72c62bc410f41a09ee143d994eac12f3ef7bf6cf2ee952966a789e8744c0ae986fa1188370551dcf996d3c0a1756cb7e359730c850dff1be56153c22407b7cfd0da80b07fe146aef8763629507e725d617155d23bb90e077e16c9dbf74054393e907e574b4dc9012ec53e9e29922d4dc2ce65c5822ac0f40eaf587f411cc8058cfc9d76a580184fce1361fd2891d0b5bb880ab4535ee71d95feb993a6264b986aca2870191a31fd883448da780e476a1410a1b4a961f488890534a48dde7c2e4fe5c4bc66eeb27af399efd51bc40ec74cf920d41f548f6013663af4fb3d83f9f5c5ba6d12aa8945791be190a10aa92ec30036a54e1b64e69b70da4606b037730131f8a79651aae6615bd6952085b43b60482399945562908cd4cf2a629c9d073430a16ca12ec56690e12920efeb2e6327f02d4b9c173208d3c4a943dd15886aad15da8674fafc1614778766604b4fe58704888c98f27316a748d023dc7543e3a9ab3baa6ae3c71caf3eb7c80ed5f36860e2cf5d1929f1cc9ae68c8384641ed2055a933a76be5e55b58f97525ed079d6e0885589e49d802f953be33d5903878ffb1deecbece46855293a6ebe718e9074898e424b53f8bd8b97851b5f2cb246cf0983d5d5a80c9027b7643bdf45ce6b07ebd2888c8d3b28bbc1bc67d9cb9d473f470ea4b9692a3aa20eced297bf6dec6d771015f667774d32ed6fa2d21b6e1c7fe6d77b294189bc576f5ca409d2e6e733bcd18994bd1f6fd8782cd018ab32aa8dda3c901f995adf8b475caefbc8ddd258e5f74200f8f73fbcd6192b7f01f6fee01bf8578d12e61da35ea3ba5f065513bc1abcfd46b4435aaf169a69c68d97dae2b3a35a6af9d64ad875d05b5daab6d34cab97bd9a66e3f94f52dd54faaf83ff9182c39c7b0dd4752b8607fdbd7304f2553fabc555855897099e94d6e794dbbefc1215da267b5fd22f9eb289dc019868de9da72beaeb9436afec8732e6a48b301334236c3e70ebf15f7767460e13e68f473c7b69fc5f2a6b81e6f7552d917e54ab0e8b095a70ee3f59acbc326ead62bab78617685858b12ba6cf182420008da49eba1d27e34cd5518997db8a4b7c9ed9d1d4e7534b45e193f731448805e1b592cd1db7388c68533c94b5ce3a85b78ad8a0c8e523c6ac2c80a921707746eb2f06f5bd04f27f606ecfc065108ebc40a1fe0e3d18b9b6856e32d4f44260e32289fddc465ad3cf6c8fe7d1b18324cd4550b0e6c7aed07a59c302a10470fbca074c032bd929e62bcf0a76d19d74b7882995f1e713c0fbb478d7c2f8bb846e5a4e563191250c8294cb22532e50b14ba60f0605536c479863ae00f42235239f59d4615c3ee203795cc4b50c0a6d7a7065abd9cd516a9d73ac26dff3c30f7be9d11cb362a48b06b5ac8ef8891b990c8a0aaecc41bbdd7d2f276ebed2b60497f08983d9cb156fc5486abf703a91cc2e80e46fd5e247e91d821afe6ab8ace8bce83c0c9e5a4cd592bd5589a468fdef13bd3bc527da7902bdb6b49429c2782f127fecf75827e2424206deeb5fe45573a24dcc3cb10fce7fb1c3add3d17532f9c61219bd480c5b42e0d2caed05cdd4d6ce753aaeb884ff8e1dcbfdd89733b618efc69d1c9e2a407d274d4b9a1f3c87f7858c7ca9ff10d12c023ba28fe34410cc20408ac73c5e88e0d8b5838e6ee002ea64722eb33f9f53beee85ab7406ad0f9df3bc0792d868da8084ec58e3aa834a88078768798d6d0add002812036d77b0e73dd60862f3d8c286f403f54d6fa1c61e0bdbf52bc958ef2b6bbdb2a8caf46ef45fd399ca8c9068edda753fc559b322b74123762a3dc456c24b37cc77907a9883487f69b66043ddfd24a22e5c7a4baa29a7d7a7a5f9e864c7a0c09c2f1f9c864d4188bf60d860f1e52cc4c547ecb779ec5299c5f42b31968114a631c0bcca3ae6ab51fc75b21b77dfd628e6e3544258b0014781fc1b593451420ffe1ccae5ffbc80caa3cd40cac37c92056b078940865fca7bfd7dea82015549593503e1d3beb7467eeb04288cdc4adddfbcb4b3ccddc8fec000f097d1df6b7a308a15936a6275c561b9274abc661f2eda1ae07c36818c0266e8920f8bd3887fcdf263c2d7331245072d68c93abbddb2a10b40fa00f693812940fee15a99af88e7885718313b75e6f8b356499b50f95d04a45c5ecf1a4ba12363d06e8bb73fb3098779c6b742ad63f54857c77ad57316e8f4b8dd435e203a85230fa7173a25f556e7f0942b907c248f02f7d64c61a5572e2002a24699cdf3ffed46027f1c15528af390ad66f166802479062f60ac4bb321a6f5e90586add523745ddbb5a03c83400b642ff761fcdb59c725d39d141187aba27ee9d03598a2b3deee6e3762d0ec6af20d9bc47768359e796501cbd23fa0c0565df946a1425e20e65d4a2695cbc6769d889f8f507f3d1e4be3d64724ec8ef9fc1d755883b36f87c70d1403f7910de3ef9c13520cd81cac06599d6bec70aee878a92d9a9cea3445c606c5e6de9d5bef0611ca5528a25fe6d85fd3aa20fe38e1bf648a110a84d1d9b1c3ef8fcfe17198da4c3a8a667a0cc23a616d854cf061121d35ad1b4647295f5897e3f2bc0ab2545ca6dc676e3df7ea37583d0dd67092e596b88caa767f8f3ffd43767d3c786b7bcf2b3c1b1c1d47e5a4a9693264128199ded9ee3ff17a223064db455da0a19bbbeaece68d3b51e248920296eac7751074b5bd45637c637e690a506daf89739ef753c7c731f94c83537f808a153e31382d05d171d855b5785f7da2c190de56187cdf81dbd847f3a5f6ed58293df785fa8e91439f617921db6c4b828867aa2c8f578a4b6f6c787a1082db6cfa88f9b1a85cf10d06d7e4324d125077fd5e21ae52b1406e599aa4d512e2f537d1454d54cabe59e43b4c11ca2429cfd3677f2fadbd3250aae2b36efcca65b3e460c4e17ebe17249f455d239663470e6786380038ff36f077e3d2cc8b67f34f627d1e5401b2f47b7789632d64f63338975a9a3eec6e185334bd956c3127447f17ff19b381ad7d387626c27b599c7201e69e5310b731d35c4f01391db51977d1f636963ea3ee0b341afa838b55e053a355e20d672ba83dfbd0ab83d71cde66c6f3b576514b2da8b63dcd493719dfede06a56ef76935852ee7a53b632e59789fa6a62e82000c124182da5eab1f07921c1479ee212c1f32ab6966178c7a9191ca9ebc3f7e7f55fc201578a28cbf934aca8bc2c2604365bd68c88299fdec33ef0c463a02134c577e0d60dd3e92e1b6654a1188d6630bf134368f9ccf7f804812697e7bf1079908839f980a212676562d4b39243a1999e60663947dc948cb5002fe278dcb02cecaec128262ae22ef64af458540c3a79c8aba9d4be2d4a9fc5fc6d84a7766cb60240dbc0ce29a43a3ade04c2527579f32c2270008ef7328f7a798ec24d2da4e6d18ca9f987c08835429ae3e076a16243e729a778bc6e768150595fb649d25db63926fd4534e027599f0c42870c5c6bece7a7502c21896c36a8375c4e498f86f99f376b2b8cc0d802f9e7a7dd933701ce696c5bc3c81eb735bec18ecd2a1265d08d193246840364562de80888f207e1ba568cbe861a1370618941d3634200b2b4638073c5fd940c28d93fd1a13a5ef598ec522c785aa8ca3fc3d93d1360a0c15696582a5b1cac4cd2a3bf07f7ff922efe54900232d2204b79e912ca2bcadb504504124c39e021d2b8e652bb1809b8c71f1b32fcb3a3a0c1c9e1a8bfd287e7ab58a8c983c21632f74f64635a653e8020cc2669fbef817b876d60c375b3519ccd12b448a8866fef8da0ddf546422e5c15d0960f113a691c8302722db3bca5c2bf5e26fa0284df6077a82c80b4c9f30f874128e773ed252603b966f84f03b2fd8d376aa643b8cf7163dbed8f90837daf747414576de7b0ec2d11f4e0e1e208d850412d147d9f9a6360df2858b5a940d71343763fde22dad3c68fc93a31bde45e3ac4d02a0537fd391e8e68a47da1d322d477ba1081bb38bf03a39db020f6832488be0f43447b4b6ad3bc210c7ca3392698fee6353f1ceacbea1f984734c80f360d04f754df5740b77709f229cda3fcce8a315c5f74e9b7008fbda1386250a177485355d95c851f6a87eae1092faa6e1b1425691ae5a8908a2f1b7e7f08ec2721fc7c8fac509bf8e833a9da7a43bdf4dfa8b7ced55c6912679798387ade0278fb49c8e616e069cc11c73eaceab96c702fe9edbe9b749430cad54c8c245a216635f78b238e0f58711cb918854d7514b88cb911670db0dd4edaf1aa8c02037fa240ca9a065c9f6633101f39d703c6d3648a3f7b79a7031a791c2fd6e35cadc6d325761a9d599d604ae74e383fe0b79779788a50356319daf4699a80fd51765818071c51eb00e1df4bdda6c6487055b321d51af01cf71afea3618c2e98615a2930de07af08f28408d768062ed0f23c6e695ed3545a150904c4eaf159fd1d7659076be8f860232daa2f466decaef2edb2dcd4d86a1a59bcbdff32f70986c01afd76a5ba8168c105cda5cc7c0e727e9dc4a6d0ddd8291e873f4018ebff058ae78a1c4adffb3643eacf6e8e697bf4535cd8f04b7c857ab347473cf38ce48a2e41dca7e837aac1dac8c97070e748d8de49ab26064b0d7aa28fb14bde390c59c03c363a2faf16f798f152c7e0428a830a935552af603429140f1ee42d94618da10413cb8e4bb843249909e6886758e30f5e65676737f44c96950f94305922cdfa9ead958f1a25394f36c9f8df43d0c92d8018f87cd5499b4f0308db5253059d405c75d4f2081e64eb57032df45f8779cbdd3fc51f9deac8d24c7af488cf784a937664f2e2fc8e01f523e15cab46f9d8a796e49aa906eda43815fd7df1610019d1191f623ed15e9892d33cc5b266bb0cdfe9972b620dc615de292d4d5fff6ddeebd039b45c76c93618c7da33cd699bfe4464793c0df4b282aff3819a4625d3b44220d2d6767e1c10a8335e7a897beaaa6ada8fe8d13c2e723c05aaceadbf1408e811de60fb204a16e75d82ab96f5f92b64de07014a2a6a8d5ff20922c23ff39650d1ef4b3d94cb9aba0b615bde4e1a013b089b26126fc76c4078bb925d61120262feefaa3312d9721cfbaa9fe55c06fb3ca9972d6fed5343b48713adaa4c1886926607debdff37cb9e4e6f58ccad68ce02a8c64531f13f7d3d6ca5e5b3c06aaeb6f88f6f653d68ee2255d43698bb82744de03a915bd23b6c1f7473bdecd536193bd7d45279d73fc12eb4c372d5519e6356854f0e22fa201fb91bc439d79478844aff09e861ebe0df03bcc685f061b3dd995e841af39094aeba7f36fca5b6c2c3dc1365cb637a56e009317806bb3fc9f7811cbad61a41e8a4390c456f91a178488cb5a80a155a506e4a538e7f6367243db92e156c818bc3dbfebf90ae4571e7e840b8e5fd2edeb9c30b11a92ced549fe7c577c9af54cc4ac2908dadb3201d39b01314da3b44a27c3d8e58c7eaa0025433da4a64e065a0ab5952e2e8e034a6ea62aa302b5058a73f77e5d35902f1d44c630d6dcb3d8d719f0fa46d041291b5a7f3ab917c773ca36bbd832a7b4f7504ebe66efa960ccae221e95e5147e89e183e4c24e36aa20f7fb123b539bd861896cf63a96f6a624c8b79a18c77e1739111ca8e5820111921fb260e6a48388564f2afb69aeca0a2fd0a78eb7f49193fe7238f483dedf5a778bad30af52e04cdf8e9370e6f38f23426640418651b83b8ec0598d36dc27afe060edab5762186e5b08714983a55a6c308a5c5720b1a5bfa36e93ed1e336f5cc4b2a99394bf4479436ad83f775c281fbc1383f8e9a6e36d4e5cd6c8ea6ff92a26614374bc9e479cf8a12c5971ce751a6a289d24cbeb67ceb4754f4140acfb3dd73e8c22aa0352a9999a39ba1a9b110ba2e564e84d515bdf2d49cb0b5ff4dd02eeca8974633401d762dea53af7e485e20b90812d7f868d8bc7517f1814138d6857741484791f6c497e11865f6d134b01f574adb084c21c3e0476b3c47c9674173c241470986f3864f0f8b65b7e3d13d4caffc7d2b698c3d624507150c01ccac0171f4b6849165612abdeb24cf8943b7fd80333aee377d480fa8687dd3d911c2658ae859a246c807ef3c76b0f02dfeffe7e91200dcffda87726f2453e694347605b924f21d218fbef49cb1d5cd3f97cdceb594f180f395ec44fa96006f98bc7beba43cf498ad14f706202b5acc117d2de46ca52d03bfad74dfdd361dd4f934ed6350d4510447d2c6487635f1bbb86c38c270b408eabd5229cc6fd5a9c59222e793cab9f0f3bb3f2638388c678c99147e6638c60a63dd6dfaca6e32068b18818a79d8fad836dea4df61d22370a9d0dc6900cac2be30cd872eb18acaf9f52398f0c85ec95ee928f19d942b4e542463d0165752156e6f5b296ada791be3ca5c61c891c470bd0318f995491dfe39482745b164c11ab9e58c5dc7e1046f33b0f42886a579d4a215bcbe06025580afdd3a40e5c0dd656c29892f0f1b35e04547c31de30b1fae260a14ceace655d79bc6e9ddfd3b7873eecd9f4099318a9484d7fd0379370b17943dac3ca145229e300b6124270da5291b629f9563c2b1627eef6eae1627cda13f1a7e8f12faf08f2ab2b2c8f307027e9ce84fe66f5246263c743c7123bfe9bdea822558892e32c9e625e73448050acc3f8aae244e055c5733199d0b82bbbf93f2ab7436c60d591ce4ab0565d1385e006c49fac0927ae67815c49d1009c3ccc563b9e5d6b20354271f32a398d5fbd4c9b0b14137ea9815958231fa47eb0dc0f3a01cbe82b24421b19b2d1cab1024ae1f4a10ca3507a371cb81014680ff2d650d2e270008dc5dc8810025514120602a6174410d1f715c2498c3265ff62862527c45bfdbb4696bf51c1557c6ab0aefee4bdfe9a8f1469b6e2550d331b611d84170b0359b77c7e378f3e79b906831bec8df202c8be50ad0a9e777f3d9e3854c5e3a2b1e81d152c45c1296184021b877ef33d916b73249a205450d0adba715a8dc26eef992cb7b5156ffa641debf18fb1825f33b4e79daf3f8b70a1c6639f6bb8de22fc8dac39353aea8eed357470bee526c54c909c00ecb647c823c46d0309ce179fc90f8d71926ae8b40a6cf2362167c20da97625d930a240ea4f3c547d09f66d851ab1b36be8690e304a17be8062dc1268b2fbc1f4af83ea58bca83dd9937988b8659e495ebf4408ec8d2fa191680b126d1fed860b662af8c6e274e30b1a9268f90d5ff8ac5fe959bc8c8fca459445cbd24cb7668f890ec307fafa1609b5df89c09d9f9722954c7c6a31ad0751d0cec8702bb9f79c2245d796e2b0c712d16d1f830035fa3c30f5939f8d4cbecd45374ae55b383e6e1e070fc6e092e41585b970ff844846766fb07337ebcdb34294ce2202dc129d28ddd6cf73bcb1666f03779cf76ff310062f1490b7ce36ad2448d2e3ae172109ccdb2c1aed14f91f546cfb6b171b87b65cd7f6e66bf043f609f9f64592057611357b207ce952dbb7f7d5fe49b65af84717cba14e35830b35873f35a7f9a6744792b2fef4d18a24f426c4e6e91481a1cb0cfc79e660b2e0e3984e75ea64185d1b196b7958b830b9a585e55bb84cf624d73002c5144be283de6b8713cde91bc4db1b7c57604181e7a56fbcb91890f7e7cda492cd7f03f3836ea226e7115412e8439b9855c69da780df81a2d94ddf080ec027f9dac9063d46728bacccf1b858ebf7823136d302b9225a6673575ddc64f5525f6051bcfa03197e747cc618674b109e4e8f915d067428e35acbe7b007bbd363c859c0ac78aa4e1cf8ab81b4b77e1667f759f8824385314910cbaaf6648a7a0dfac37e0361eb9914122fb4dc3f467c82534dfebfbffa4dcacda5dc5eb04f4da8cd79b1bcf0ff2b0490062ebd38793ac9fe36e7a118705cf4723a09560c812f82b811f31596fb246c4b566934acdf065a74f9ea181a04bcff31f814acd3216cca2ce1c340d2ba826b4d0bdc72dc116a06a5c65aebcf3639a0d78e16a89848be61a6b862ef32144ad97cd8b75f62fd8d681e1be58b00e0b53339ff19d6f81929b693c1f46621e0ab0e970bdcfeb71a88b9d8c139ccc92233af21baa143ce0fce068231d608382d5bf13e4fdca6c2826d317880443a0ec48e0bc77d848deac6f5600b276a3668eba0d51ff3089ae48639e2a58c0ef0d0737cd3d8206c688318b9c362c82b3a0af74622462b396423d798b0d954acd83013dd75d495dd26bacfe392683cae144dfec0662c81ddf132513e0bdc771fb11eaa6cdc7688915575ee52123cc150954ae517e29f4d128d146b0a35bbad1b682f56384eae410f61f45ae57e5698e8c14e3939b8040e83a3113f97c73c1d99e21425ac2ac68a0aff530aae26f6765c82955620fae14f8f2cadddae106c8c1a6f2e541f446bd0748d1a3d396c3983ff2715d89729d9aa9b6ccaeae06150096930d4fa526296f9e3e219b0a8e6f4a0044ef44c0dd26eedcb73a495f713c42e4eed81361fc522b4342a1a1630b771bdac1b5da4dd2f676a452a78b5ddf50364933bcbc475b62052733c69cb3540d25c8eaf00d064430c8f05ed205f4615581dcaa9c3bf4a62ece54e826329b1eb2d47c38c8d637767f92c26ddc9156a74a64eb8a2f58c450d94af360e17bc2577777c88e0ade31c44c731962c29180399d7e760d7c9f474db4d25140fb41ed76b6ad6f7511c087b7d6feda75ad717b2b9ddb235ac5712baad058ad977a7f4d830db4b2c299a731af4a03738eab87c9dbdaa10b1d4d320267c0c09fb88fbf5825cf6e978221f52b920ff675453c79537c685c3aa827354f2f1934842d0b62eb7e1bb89efd8814a9d84e69080180bcab9136c212d69bf2a34a8dd0c7f9e1218041c6d9b2d320427ccef89fa1eb6adb0008461d251a20cdeb77ccfba6d4e9796c1694a8874064e9acb2abe5ffd57edaf6a0e0062effed1943ea9956b660674b58783b11bfc91231b6ad50d9a4737cedc8d0814d15b262e61a688eccf926d360981377fc20bc59782753296004ce5773ce2739ccd81db9c63e5fc8026da31cf7ceb46ec2ae80c0058bc6ec949a5b3be17aec751c4fc89548d1e2501df81c2a3c172d0a56229ff0cb4b6cc782fb303f3661ef9ec4e65f6bb0586ed5b0f6e81120b0507214fbd30f00f9ad0ea418bae8467eaf40fb1e3f214f0ddd958f18ee912d25234f0fc4d435737312d6cf3ebdaa4b6ee6a3f3eb7d2750e181999899ba1ccef9aa46a848f5aa36dfee2ec504b677f62d32c2db8e080bbe35ccb1dcba70a621fb884d7dd4526f3f30c328b74f2ff57e1324023ca7cf4635ac2f10a9e21e57807ff24ef4d7448b00e5e243ea69f1134c96dff3b58f357d7ded38b37f054dcf84b697ec4a722dcbe266c5245c5f907465f05f00e773e80c7f1dece5fd0fcf2402eacde756855a034395e832a29373b6d3368afb86380e47091575500d4bccbd9980001546554b73aa64d88e43f5b6c7b4e20478569e3fa402b9e70e88952d9497e94d1afa72257d59f6c78d93eb22e4f3f121fe5488a53a9417ffa30ec7f7c6f56fed2dcd9064c5c83d7ddf6cded0bef9e82936944d5b607ccff663d1cdcb68a1ef5e342cdea1ae120176131510ff9a94d7bd4fe92abd49cf6cdfff938a006a1e51e595b654ed85612a188e2199d8e6457a4c2821cd25805bd01eb1765a22992c967e536f60365577c0bb1067eb3fc80efab259e363028af029c540b330a0065f8f9c74bb4406976d5b6e330adb8319822bf2675a2592327733070b7ea0586aa0673517b371710b7f6ca075b003b3f8fb2bf5e3ad4004bdf220e54e9155b1535a5e756eb3953272593c3af27d61de4e600624ad734e7446768949125d70b3a51bae9a187904b20010cb7e22235fec836e7dea95745e8881c7c895b17194cc50ba1f42faf9f7db2645526962cab7fd015cc56aced71ad353ede391beba59f00e2094894e3eef3cf8d4cd21db04f7a063989690b2ce083640a8e16772341e969b33ac6d44e17d836d63d927cb15fb918d305b700579d562874e806986bdec896fa202aff773e370e735a6e1697924123085b2b22205d12cff2381dbc9667f119735af863f134bd9a541a3b931bcf9c2b7edfe0f668a747fc3a0626fafae7a76af825268721eaf1ed415e18db5f6f802c7117a66b757ca69d8d49858c0a3ecdc7e8d22a96b3eec2ddc627ecfaa8c329572620258a910856cd7c31e88dbee07a1550e8efece3bcdfed84e96e1eb8a346371169b8e63ffac29d9d13af82211b3855353ab1a092d2f11509b99292c2ed43921749ad5888563ac4701d1bc0c3204c1a05264a66e14dbf368e07054c637d25a330c3fc3e650dbb488f2aa2c942d5bbdc60f454d2fcad4f2596eba9a0205f93c52bc745a0c6cb610e59cfc7fbc323fa4fd3eef5b4494600c0e30b3c4ee3a6e9644e3a5d8c58e3954570b34c60642057336d622eb7309ee9daa0c391ea7767aa227e7417c9a4eab7e443e994014b0a7be3a6b42ab42c705026961c672c5195fa43ac8682cf65f725c17eb3dd5b4efe00710e99c034e93de311ff784355c955d859d675ad737f45f97a514acdd8687993cd9e7d3c27ad8889e49160755ef7287d3a30094ae32cdb5693f2ede57bce79834c11ae15780ad1d9472df0e85226c079607c5d8c1fa565ec63d7bb1bfe3b0f5cdc23401b509f34f9a836475a1367a6374dd2c10a0aece92c4eeb17511886fab90634e0810fde873887a9f206ac429f3294f65eb3cfb38915f472a13e67ea1c331fdef32eed17e79b79aa8649762b4a877685cf160a955d2dc878b187d660b0de1c4d14af9d47bd3bd9a2a0e090b2714a55866d6cb18519649e3d4e000434629570ef65cf9de35f6f86fcf0b430dba33d9ce934515919a6721c6675d6040307a59c414d8d1ca05e73f735cec19c4e999829a922b276a4d3fdc2ab8911e3216bd373e7cdcee555301cc79cfc90a8fecbd51ad96ae2fc909e7f51e539371a79f19eecaf47e86cd8a92cb36ea4a7b29353f68eb0db128eca840ff40d389f49dd45c8dca7e4ea04ca6088b25c22f5dd8d96e8af10f4c5736113cffada16c254631e9219a9443f36c5e498905ab7e04bb72d49457e813499cf7cbe13b01f6702a755b8f65afb3eea570827ef788b59bf9a69f2c881664851fa699361b29860704745626a09e7cf88daae1e1187e88c34223c0ad2486c76e1ca06d746266af389147b14992264b72df4e704090143f273955343d3407353a77a1ff2e6f93f124e88415411bd0cd3682de03714a622082444f0505af3e00a5269ffbbfac4edacd74f7b235b71f43c26dbc635de8667a2586e7e35336c19c4863224169dd496befabf72b072709c46a22536d8f74b0394271c227fea7710123e0efb3e8b85e974d4a21de63a415080379cc96d26aebb0c869950802e01dac2cf38e5bcad98e9dc0ecd473d68627ba6a14b4d8fff9ec7712d35301ed8631e7f433b2f8e30c213f85aab327038fb74a0b50b56ff2082c6b474589367c2b3d7a8510b867a8230ccb54a0fa802724c777e816ac74284ea8a867632da6ad2cb6dd9f7ea296a267d84547506eaa8ed59084e8879396c2dfa402d5669e70fbd743d06cb0f33cdd9a8df18aeaf2f6c0987278c228755600f9b9ae85104c76420d0ff18b3e4e77074c2007d0a3a1b35b5bf4759d0f35c25a68be405e562bd2ce0f6ba61f4e6bb1958f7972547d20a644907d7a0c1f47ea754afbcb71d4e6d702f8df8350d813201571910ea5020af8718ca833b77c61f569df76aeed5406bd708c2ca0572703728e6ac4b9744e92baa45eb48b407d2629b5e4bdb1a67470feac58b29b948f5e389ab60971918cd9fd4d6d7bc80bc5378f3670ac20aa6f74caef781c5699798be99b2c0ae08ccffc3f237ff41053d4930ae6a5e29fd9ba31475fbea697fb9cf4e7d4637468d3ddab1c84f9907c08e075ee094e4fe9af295be5c7744306ba6d10c491df5db3a8d6bbda979af795bf61b434978c51dfc85a99fd68b8ca040cc7cde0077ac60a362ebe393e36d799d164c25e192bf5ee67e58f1b1c4242b57818f43f89cf19f925afc439cd911bdf735ee31c600a3bb0ebae132c9fbf73b949e0588d786b35ead9bb4825014f361a3deca6d59683ae434a6a118b90adb62f4cc385f4e0aea338c49106e95210aef4ff05857e03ac5c47e159b50541a697d14386f29e301c06d8f17bc632d928ff09ef80a62a9c97050395be0d887f8929746261e74012abb48b3c5ed3df60d569e228bff62e4976d6486e1efc48e0d6a96a20a5eca61bbc9053acd14ae609e550aa065f799b57483090faaec33af7c3244b70bc614cd3186e745848c8dbf125fe5d2ff68db83513a8918be4d13800bcab5a2a83dbcdc0f775c13d05380000d7fd474537522cb89e4c620a0041268151ebe32e2bbe788534317f7a78c75800bec3e8579367cf2ef43b4638421270da4078e3828564a656e102297d8ac62b543dfd8be88b06e61ac927ef728f226f0839e660322ac7206d110c209faba863edbf5f7fef1ca3dd9a4d1b8348ddfb2e1e5055a64e41f51c63744227ddd8a25d1eeb58d3dfb2a6400bcad851027a494d6ce8c192b2356f207eb99e02a3abd185064c28146f31bd021049b32448741c8d92340601adbcbd2c9a7cdf3e2e1abbabff502c55a2774d85a95a05543dbcd22e36f3d90e34b9039e824a0f65e1f541648cf944c01c6c6a211055bd1aae1c3de0a5d3404d8d9efbe2133774562fc98dce89ff7b09603f064c35b9ea072dcfb8f4abcacbd8fd0a69bab7fbf1500f82f85f32e2872704e6247cf381dad917029c3345e55f70a2b248a9411d92cac8fa3b05ceca5db6bb96cbb84e3f49daa4714c49c11603a664b97551c19fc3b7026ae62297874705ab1f4bcb17e094836ac92b880fd7b3ca8de40b1eeb42570a11007690f7f3e47fbab72406d3dedf239a7d8d9054636559948e72fec334cdd86a4310278b86249e19053f9f847037caa71ba5bdf2a6ea75adc1a1c560bb8828abb2ce288ac87958ebf32ccacec8c576eae2c9efca23ce4fb74950cd6bbc4dafe0c429adcb6f845607849f0fb88a3f1f2004a92c502c86e8fb806a48739284514ddf1b8c8e8e26ae8c95b7b35f7d90e5df0b19c4d497045a600d0365484cc2d5992fc251d7c6201dc31c8dddf29ffed8b95db438236213438a71fe059680ffd4215cf5ad218df3f0671892a75c22b1377f9b725930f05febd7d27babf5c75880f6996933d915ab99e4e2bc50e3f5f2c4246019b217c3cdfb62ee97321cae04cb8375bbf3777086676ba4391d1679066efb1f57b81d9a95ce51cb50ad518b68128924f2869142d5917a7395b9082438130a92d8d82e445045a80ba4010bc30380457bb01b214fef6acc238cfc9e8a09691a6dfc6da90f88d4dde8861ba388e18e1aee8df59134c01603301b9d87c89e28e5ab7fb7d711ec3fb0e53c37b5ae52c26fced9feec594b4dcfae027d93dd09fa9bf5e2db1d000d9d5804af270feef74b0cb3cf4ade75ef39c1eea6efc0ae2efea8e37474c293674d0fee40353ba87a56bcd3f9bda76946104b92e9f043b7e0e8bc8dc28a3bddb5f4cdf887f9c3fdd58e455068e3d0ceaa4e0196705a212e25a9af06e93f6c5be5bf8ffc4beaf2e83f516ef829ccc97eeb8c53f8eebb1c63b76abc8f77154c68ca69e0fadeeb80da1cb7c745dda61adaf2240948f058c98f7325a3c5ca0c271333c08b02ef873e73ee92e65ab74343624cdaee389d45dac1dc9a2cbdeb9506395d3347dbd5a2e2e41a0dae525fce69dcc0381271e6c1abe2780406407abfede6bfc82f19d99b58c86ec4d777a2f135420c4bc4abb4a5886b2d0eb3d93f62ae62bab075c52bfc1aee548c538cb5df4f28689b723fb0f6dd203e52bf47be1948761ffaf64de31a7a459a8119bb043e90a47c25910ab4fff793375b638b7977f16d8154e1ef77f8176340a345a6d19785f2c25b0f094e07afb5cc17e1d85b75017767d9bcc56b857a89c411e17a2e1578da153490f22319b6bd4bd0dc137809fc36cb619f13383b5f0b75588ea9a539084ec02c905aeb7db695371e03f9a4211c4f50827f8f461702549dd89035ba4a2345cadfee9db2181f47d5ddb1740ddd5187d67a90f1e36d5d706e4ac4d830736434092df6a6a20aedfe96c7d7ab218c86bfd113579df3b3f40db098b05a66e77be10e36da3072e4faed137215e78af258a82dc308bd27129a23e49d9a20b96bcb1f9fa8634f795025237a0b3ba580bfc13d85e151ee88340a8b66ecebe7a65881d7c98be45a304740c5d61aa0e193a148b3d63a052dfbb7783c59b581a3feac790e16e2e2bb4e194892f423d0b4bfda77c996a94d1ada1ea58beabc2bf22638497748dc6e6702a48e2a3e0d634a9bef648aa20afc63b66f9dd2a2b33f0d50c8c25496dddb956419c6cffda0180f27b2fda787219905b998cde17145abb4ed42b9688e06bc386467308e29b87c7b863ac2b97f5a11e02cfb3bcc1b66297de5f2214b6a56d70efd58cd05d63cfc654e1b595de6319f1bc7e6cfaec44ca84f2c8ce1b4823b5b68c5e2fe53006e5cc9ea80b140e73941b272635eefd6c6e8fc565645360498d5d5387238d1882ed2ce35954ef0df97d2af7bd0cf592bf07f1386af72feec2c9d31392ca0fe462b3e9d36b545e74178087c5f782011eeb0edb89e288e7a8ec636c5d6383acbf79b2ff481bd6e2a7e8e1d937984b5d04bbb79fff4f64d847ba6a66238cda96a9ddc6dcc074e8dce1cf9d57a4de8cf43817052d7940d6fdf5a807cfbdd8b9ec3aaf38b3795d0a5a2b8109f1aea5fd7a4bf1b2feb223ca7d14ea5ef0d94dd2f589bfc80fec1818166838241754e88c4ff041a590209e0afe093c7939e0c76e285bd02a0432497aeea66472708d314930d08467cfb02a74d93a79c79db5dd5b837c6e85e55bc6814ea907729543b74c5dd1fa096aa6b72f8bf0b851088d0eb6c1c951b1dc95aea8f4fe9ed75cf15f57d14814652be1c5d9f4bb1ca2654407c1ef772de0040317612b6a60b3d11359d0fcee938778ca660b27cc3cabf1b7a90e5e93d3efd9c29752104bc230ea00504d7915e2ce647e0671a9ad37d5d86ca54dd41fff0a964b94514ae6b43f537a47bd2edb7b324d07b09a486891652b4c45a5abf9e96934a9cddcf3995d2b0b2240e89742d21942f5f997d7133c94db9cf75206f919a315d9d4a3f6ff27031ad3390ac79e0864442c74cf4d5fdc574bac7672d272e6f14bfb571f911798ab88e13720cd74a3c6fc59f55b6b3c7d37653c6035f0e41b9ac2149430b1f868a389675083d4ec40750721000caa664b1ef05719e3ec59beb61089ac4cea07a11e4fe701abefdfddd43c3e4c7355721c90fe7a28c3d0d1f409b6ee55a22b854ee73223c57eb3513c2bbb9dda5ab439a563a2b764b72b0d4956922e30bf22ca41e87baa46a5d7c507f552f0e5d35f87f28e374e5491b30e05db2b6c2e2cce38ea51aea7e6e49216babc8bd37bd76c648263d49273a7770599865dbce9e16ccdaa8835cf4e7ecb1bc3992df51aefccdfe62c3d138dd5789a84643d5d25cbd20b0767749c9834a738c16bfc67bbc76f159085f8f241ab8218752a17a414be9bf468f9691cb0c7cde08e83e307cfe2fb25f14cc6541ba413b82fd2f90950d0e7a370d51c74c3540b05b516268d8345fb15d0808f3c2d60a768cc1beedeaed959ab5fa1ab5083ab9ae64bd060975299c853a2b8d2f6ba8c2032bfdbf164e40e984ebad1597cc371c676ba6b309ce2788f06304dcb46009c4280943c45b81b86ee0e7ef501a554192512a0e065d3a9bc797d8e4d663cc23e81ce318cee299de027869372380877b4660a846379eed2efd3c49c80fc4c44c9397c6e0b8ec35faffa7def624112b2af884cfb884fbdd99364d72110605d015b37745face096f87f6d071782e1fcc97cf9b3af84385145c1734ee52a2144ba843b7ac5df059e794c1363edef59f6d8418978fd164a5b1a3a2f8b3256556453ef2e60f8dcefa233a792e5a98abfb8daca722763997f33078330746ee1461b78bd44a5bd474e025e03b7015bcd4213a891f3e2fe9d277ee29271f0655688bbb38d4aea064eb254455f88e4930db4d5e9e6c7bff2996676f9421edc462f28cf58554d2019f33bb6fd66871727c81caf8d4bd0edac00917a8dc41102b05a314bb346fc53d62f06147bb4134b1248de5ec4649bcabae06a89720ed8f99d58243b6d55cd517acfc8f67704ffb88a35dbbeb1ef5d4e156a53ac3dc87b179a0dd1d12e8cff2343ac3e1e320179b0d10c3a1c3ff36bd38fc2114b95be42c44ccf9015fc3c8325b8db31c3e08ee541880f6cac7590a5f8128d550d90c2c3f6ad2cc048978b0dc0627eb37b47bcab25b6c615f71cf287e91f01ae4ace2989224f220d01e22ca3b1fd8e152d17e5e97b815a3ae12aad8074301e68b19bb3e6b31aebaa3a7805d0d496cb4296068a6caabf0ed776d54bb22a0ac08b73500b1b249d5a4a0b03f4f34b55c6e54e98b99d33199c0963586c196e64c8dae9ae42539899c4a882c5f0ca4cd4e5b6db8b3b216f1fac2e50fd830a4d65337a347194b0e2a7a3a7df6fc47f0c4663abb3ddb7750ef6f488067d37a65f01ba69569e771edb1a097d1fd31da4c5bccb98c80dc47a974f3bdc9eb0be01bbdf274641d4d60d762cde6b98c78d0197fa575816f804d63d2f16891eac68617a406ce404d15f9fe37e70caa669cafde8a85fad408dbe0bbcb63a69581e2753206a0a95490d895f1a3378d43c51b4933c91efba261c650f9e9ad68e2676493b3f162db760f1b52879b389f206255c00fe9ea2359b35d0fe4377f0ac53243628265855873de713a74b5d979ee3dbc1932833e10c686b41570e448a6defc298864cd4f53278f96dcbc57ce1e0e365c42a327c716ec9fa7f99eab7c5b33a27520f78f10a23d9df11f072d7be0c4571ff4086a6de4fd2e3e129f33e877dfe049aabc2d57410ac4cbf13aa38addd4867cbdba28167a0ccb8b7258303f67b4e9fc5b855ea6160ca9601a5fab6f54ba985d2ad0cc1e166f0c4aedc54f8644bff4d05b65f7c843145850ca2239d3c839c3625e6b39ee8a2cd8fb935d745586c88450d73cb91598108bc259a8af0e2dbdf78369c3bb86560ceb2546f15c5b1dced5bd037171fd512035aa1ea90ef54f9b2f1514d2d0e41568680802aac08f01654dc099a62e9d203b28268aae82ff1c9b0224578ee220caf37bc930f0817f0c9424462ba3ee73d878be0f4ec61490268cdc40d1cb173598c16fd953ec19a75878a0e74e79c858a06ded879b5760eb986fd39ea7510c31e7f6638d5e58d8c4fecbf65a0e3d215f2fd14cc872dfd4bdc6c28a96a68904dbabc8fedb2635c1fec668161bd1c5f000a028b7aaf5ef802320c6f1305e0ecc51d508f8e2a85819ac198986bc1d886c248fd3881546a8fbfa02a9d64eb26336977737ab05d0bb8bf4f4ba9541b493edc5a5131e57c4e2c109b93b38c6ea9de0e706d4feb126edcaedb8ccc3f0ef92aea85c031150d15982e1dbaa319ff2bb58e52c6cbe307e03ecc0601d726796bab689b5414a9c86b7132944ce7ecf6d19d700930a88f8da824d010ca91616b3d4a24597ff7f65ae38a3ee9018b4230cf9602bb0d42a3b78d73b6cadd3ddad78aa735e7aaa7feee08eaa513110d9f4b415b8777bb6a3c432e7cd5cfe1b267f5aec555e25db0e8418eec308731ae8421fb4d3aa3ff926a74daf0171694d3c0f80e32fe9e17dc2d4e824cd1e032e8b912b38bc5157e2257313b2be3e08e0ec25d683529ca2ec558746a07a4990ae745cb828aa787ca75d044cadaed2ade4fa936c124515c491e5ee30dc59ab7c8bb58f42c2bf0e90c817fa53aaaa4c2d70ae66681bf151a6778868cc25da51f0bb04c8c3beddcc1fe4f51b67fe603cdaeed78dc779a42c5c67b7d7cb21941b373561655fe226119bddc8f37e6a611bd6ef79abaed01cdcbc8b7b0db2e752f8ee8f9de2f2ade97d7ab2ec31df4464752a624e4bc66d170b1e9015e389f458754733886eb587a6bdc32cc4e797daaf64c36239ad18bb7b771b1baa55f1ea5ac4c9836293772d691b9f3a91cff29e98ba79ac9f14bd5e09169a2f13fab7a6f1417307cdf8eb276e61798c2bc068807318faaef3470f6b1e30aad8726c8bb8ecd14d922aaff885d1f1b09623865604f4deebf84ae44b0690930e401de291312a59b14cb627c5dad5764253315fac5cefa789f7e58af809fc5d34bfac5ab430e2d27b07f449edb740f2aafea71b7ff62431517c8b48d5b4df83f1012012a89664472797a2efd2267988dbb91b31f7c1bd2ed68933b041043d29582320c951d23e5b09f6ac2d6229eab85bd48f12f2fbc833e99286db807e981c8944e460c1c82658bfd7d61496f64a5a84d573777b2ccd98b6e62118cedff9667c4618930d0d756b82ed0eec9917620fc8af91e9b77ec68981123c65a01300c2b414b1e354e196f253c2c8da89f4bf794f6d90fae5e6d222b26f8cb84190869541dd8b57c3b0b4755749caf452fa7f0e938ef3b89878c5993f5f6609844c662d6da6aa916d94f3a61e445dfc2df6d7e958f430642770551215bdce4788e88e376e63bf5899ab333a615e42c80feab13b6a6cd560f500e15dda7861e349fde1fbaa65474e9573338293062f83f34d09c54bfe92c696dca74f2832f87cff72060053cb8212767915e969fc3aa647357021119961dc72583640ec49990453d89df538f6cd8bd6a0a438cf0a921331b1476dc927664c91e0b6f4496418bb56b4e079bab992bb4e6a3745e69cf81ce46e8767ef6283a8252a6625d18c6176a92e261513b2d7e2c92e702a5bf34886c98b6195fd670da045e409f19714a7d0c2d6926da58368f717e85ac8424be9757bc3f83232462cafc6ffb95182f5e9cda7d7a80d895a5de7b087d293b25ec73a669d81f082cf5da2f4a32f00200ac2b0af5ea27c265f58cd60550c914487e58eaee348eddf17bffeb7e98d7129f489b8667b7c18a0c1350b63edd66951bf3be6da68100df79261250daebbd16e929de1d1c312aecf2f1237c68dc9cc9b81a1147e4a2a37347ecde60eb19e950aa9c2b1180e4de9d1c4d40d0cf543c0125a924b50496d0732a214b03bd392d1927b7ba5500153c7443fa5d12d2e584f60befa06a7df5b7ba7ba9e3e3cf922a44f6e17ace701897ce8a384ecb2831a26a5fa1ec4e1cdd08ed97c10ac5b110293c79d9a6d94d9483884eeab08d425225f3ad0b1eeddbbd2a8afb9924b2be2ca6fc9c0cac8178908a27eb936a2fcfe51858a5646bd92db4929fe70aa3cda7824f8197645bb04525c0af958cc31f3a0383a663d17024658561ac1771f9a7f0678024f64094b6e0b7ccd980fb3ed3bd92c0889ea71cbd398b40c342fb635aae128c153b357e1797774c246442b1655904f9c15fc7d0a9a3d6d54c1b394c60240e5ab7a34f5458f5f637a652d5f98a8fd0fc6f5a76ee484eede5299582f9e494cc44e07fab974b6f346d95038f6a24effc2b7fc40895e07dca345fb3b176cb96f6a41b4784ee66ad0efab9bc923ba9ba3cb4baf9b21f76d52482f5286b36b90ab64136e99210768f50a8c76d39ee589023124298ec77ec64f56b35f04e4c9ceac9324249014e6ce6afd0ebae66f6f76431ad440b718227812142449c89c1785fe974192cc4b2a7f96058b8c8d6075fb1b38bb2bc7b3661b3a037c0c503bb3c3d75191beaf3365af9cca59f512f618afda11017227ad8170e32d328fac60d7aaebb71d8dea96bb5ca7924bec38c39fc59c44b4563304e3d878c8ab7ab3a22c3aff4d86368a27fb3a529bebbd520bf54180b35c55970abc88685c47eb093af85a569b3aa6d6c3b4d077c5bde459a64408dc5f0d6c30980aebefbf3d32541d6afa392992530c8bb440a9d3530bb79cf5b54c0eb6be3a232ce24c13cc10b3398ea217f5b8bc86535351a434a50e3c7b837516583021054381d706103e4f2ece9699b5130a807c002e5c420de9841b10267ee280326ed3d8373c99e3de8d7e525a0ed42f68bef4fc0a2a6229f6e0c4ad580dfcbf9170da3ef512cb549474abc3718807331a342a0e819731302ec719aca8bbac0999cda352121679e3ee622db28b65f5fba96b74c0576b8153373d129ca3e63bb0aae7bff2129e9704fe9ccb70802ca4eb9fff5914c298978a855234eb73a9912ef417d1a4aea392b868beb250949bcb640f3468d0ec078277dab2d162a43acafc17b53b19925c309a10589fb78d7112514fe75ced48cac379278ea858b7624a5cf6a14ff8d10e0438e5861c3588a1eb38d714301383e5b3c79174106a845d332dedd24d37e573c23e8ccd57289323619a93fc063e8b096bf007ec8799a9b18d235dedc6aa1e1e27fd8d27d270a784d825f7f8d80a085ef3768a1579a37165bd65de4f567de9ba550ef08c3190a2b5595ac8d3701fe9ddc4cee1fcd9fe346925c955ad2968aec9d88ed3b4b6a4d2adb2e7769afb8634dd655cf15b1e29697f930a442c75c84ae99e45f55c79d1d45e2108a42ea8ca57a15d55ed2f6dd0f931b9e79ae354f16431ccc6970ae7587464fd7525fbc1628d087109aa341d50d5a146532e56971e067a73ddf6f47ca3866d3a724b82bf8442db7020a6b9c7a79668400d8c783ed5acfb92cff2270f51eca821fb895a4fffda48b91ea1845360143a2dcac8f9d06be003e6229226937121678a019d0b11d9d96481e5d09fabe134c2ee60024fa9e12ce5112a29ba162874630e31beb68d97ac591bb8416ec4ab40442644885da49f98b5c4803a15df0b5b63d43cc29a1a1dc3ab7a940716ea376f8237db8eb6028c954b767f363f9495e8f280e703ea627316b63285bcbff8aab980ab614b4bf6fce950f844e9ccfb212b691266632b14e6ac88ae0251a1ee2b581047e631afa39cb32764c8ee329c9ba1f375a03ff5d1bffb08f7482b7e83d92d3567221b3b37eca3d956f5d8d7cb4ecff7e2d2ada24157d27c0ca0cc7a6dfeb4d70f94245a63e8db528a78c6b1f5add3daf3f2d014b811010032a109ad133d425fac69d01b4608386812ec679d5309db10bd76a7d381f750691f92f2720345d73db6a33a5c9c0f0c6a0416fbe31f70bf37f4361ff5383351a09992424d8d44649caec0802c3850485493c37b3cbdcb33badffa997e27607dbce8a55d8ad9742305764215ffc25074a3ddb092aac3f1df7e85d809f29358ed457889534b7847bf76914297ec9807920146ae32e7458035c56c2d7ef5a481094ba781835563b37165f6d10d121b76411f734557584103a1451e1d1ffd0bc07f4ce3492eec66f579d23d9f1e3440288abf5f5465d1ec18cbfbe9a70ba2ea6f52e9b386b10b3eb7b70a800499a2f7c3bdf842bb44673f8401a6b21d5af641cb4e609dd3c0cb4f69a26600c8811aa3fc9a5ff28e38d2048131412a888b7ab08ae50b7f816cfeca576105bd7848f2649370cc6d9b44ba2a8149527ff8e23197c47c8bfedb2213204235409fdec0c5b8884f6aa8abb0a90b0849fceba0ea18e6917823185467c332b0180c638403ee538bc3c68cc168fb6808fa4cbdec82f3e3e2700ff432ad1d68ead6c7393133c0d800d0694364fffeec99e874fe5f1896a07be8f2e65178212bb3b30be04cd82480f0e67e40cd96384c828b19a336d3f879aed66ffd86e6876da0c405591c2b127ccf75543896d85684e09fa01fe1c104e1a036b8567849bf23174c0a9d39087a7bf39a26dd65e4f5ed41833df47a9b3f0ac3b7d78a1e807da25da29cbcc1269d12a26913d03e73b2d4815fc4eab633fbdc3da0268f0d72dad0bb1f42761412b430355ca23dcc1a349a741dac870d52b7d2423e66a43394d9ce071eef492ee87e3948f27b40f3ac1ffd94bb9bf8987386800a33ccb32794b005225a93e7166350603b5d78df797d517b149b1b520787984a4ca6404965c4bb20ef1d2d4bcff92aee1210998e3fa4cb9ada98d193bcea4ad05f01784910cec305fc7e0fe9afe2f42e501e40e12d1e08e748a4564e7d33eb0cdaf52ad0c9a401af7242a10660685bb7ba9a2f4fe9b9ab95ae7672a4d7e87902e035b96fc9ee997402ffbbea7fdb896332a4ff67ef9dc2d111fb5c275f0a58fe7aca85a3a23632a3ee3edec96fcc4668b1d795c6ccf7b58442eac07300e29900b8db6e4ff277eb17ab59c099dfef3a9d9fcc2e2bbf707ab3d13643dfb7f7977cb06f1309b5c245e76e0db75c5cd2818a58c1e497dd00e76f0409d2cff25f035a03db6a4c113d382438c9a09646c2469a27ab0ad6ffa625748685cdf57d38ac7ee2b0bf55e39c3d9deb3c65765dc084c81bdb6510cac1be81c2b1b63f78e7c3bb4af01e45485d3060765457fb44a5640175cec8f95796d7bea81c66257429f7b8484eb9b945a538423517756bb948f1690aba6a1a6ec33ec96fdd5d1f4674c8fdbe46723ec30342685444dd62c527f00bf4bae0f9f5c9809ac2c4f7a9355f38647967835f04dcbb942a3f8054b6cf0793347f8d6510e369be237a89c899564fbbb1008a4ee51c8888e4bc5ec615f09f3709fe8915d311e4fcff087020f4c647639a29955ba349cdf309fa85fbd8ef3acf931a330d57fd51dd3164ed444062bafb350ff1a2cbdb68f0d065c787ff0662ca4133c228e98171a1188356b6291e29309f3f5a137b51b095f9955fe32f9e27131efdf995be6bc8b2ce199afa13d9879a9317faf9f16e307bcdbc549a7a1404d8a1f0ebf2fa8e3a4ce6473258a37898673c5033dfc04c0366ffede7b4335b4d776f5dc2a35e17e614cadec376461f11df2312b07fc5fbbfd524a6e7ea8a1469bbab45697db1f15eff40b0bc9a0c919853340966389c49a713285650066654f3207902afd9dadf06c4b5714c553840cd3ed4335fe17f4c2027965339a76635efa0c63035bf5edb6e760c20f14b66cdcaab4f8154cde371be4d60d45b28188b545600e7d53b2a8686d2130811b7f5259032354962af56d0a1f0c612e30d4f39781da020ab7a6102e8cf673089beb361be242f8fc92225f456b608a01ddcb32c3cbc6e806acdd37725ecc121eeab6d0164178d337afb530b68f3052dc17e669bb0d2352b84bae41ba085e60199d4863c6dc3c97fd7d574f69246dd16458fd0b836250e59a0e247ce80179ef6d2a59d2b0142d3bfd0d73597ecacf716e6e19c70ffefaea694290faf969af95e9e8c9d7224d19ea65092ede86315a4b1dfb3a17aa16a7073dbe68cae25bbfebf338e15452bb7331fbfa90a82170a9ea6ad8d8d0bd22470b52b304e5b51f5ca550fcc97a5f276880f20ac253799acdd40d685415c1d5d3bccfa9ba2fdad2a1199eb662536d210d4bf9c9c82f299a2cd0a1bbeed3c20ad2127f8791f09355876780eec985c2f9c9cd8f2d90291b88212d06b11e439a05fce2f8c65e8b1fe05eb845bc5163411a53a7829f87971ad454a295a2f407c730aabac55ad9417ea05b82e51d3642220e406f48125105ce37861b3239320d0c62e5ae18db9d4907dfdc4931f3066bf519b87617b27daca0217ae78f700181eb65acbb0682db8d5aa68fa6216d8ee51be3e42dc17f23ccd1292812727869d60f7a86b3f7a7a3d0d677bf9326ac1aab7cc043c0eaff1337f65f52bc60077c7cac0fa10c2560fcf781bc8e47686078d8f8c91d5739d969737ef302166cc540c9b580a977bcaceecda31a4525d9c3729130ad48485737ca29fc88353511faf09ab59a930656f87c02891c17aaa6929e1352202a5d6c3b70b3a10bea31a3c314ed3851595faf09a2f222d011e1e136d74a2142b05e096d70a3fb79ffdcc9838126e2a05a5255375899c0d40bd2191b7dce588e6cfe471d62c34a4973ffeb5359e55a540bb08c1e47959884cb2ae9f77ccde39a05a90d7756c2e5234dcda97663fd405abfeba2f61c6e7171757f10e362e60bc56207145568e6c917309382a75c50d6fea0b79f1cb25155cd3e354bb322105487edd1ded510d27c2846a9a68350f338a9cbd2da0dfb4b8b2404e5e7f653314cd9aefdfb7892340915607bb31709169e28e9e5df7a28778b8cc4214f5df24f6cfeb4f13ad63eef134888e9b608240db6ac6b3d1d5daea55bbf08cf2f090fd23d9874309949cc931e55550e864a7a0d63576925412864d870a397c4ef6d1ba6bbe4742b86f23899f5abd52bd34510ccd9bcfe47843cd7d3ff18691231502b5804d00c37f9769e4681875634aa20bef45e0c1ea4acf7688eba9eff330702b962ae08fd37cc6de5a5735b6fb00ad04fd35f499147f7a0af065b22a519b9cc6a7f3fafd7f16a3304cf20e9eae8bb3b120b8cbb7e167a911c37f944be1f732193a2095bf483b04b97931a974e3c8085d9014b143b1a02cc732db663bff7331e2f73f799ce0a9e64bde81c2ea13f910874d8a1742201811e6f9d26ca1f7b942128dae01ac26665e823a98bbf09e52a818d374223cb11ac6a0bf28f783489b68e133a974294e4b9ea1c01dd89ee1c14199e95f3b414afc41802c0615cce52f53559bfa81c16fd7c7d031c96ea4c26a57712e4ce6f4b37b143a88f55c21d6320456353e6fec85e5e9a8df2a9698888f72ee01bb72e57e21f52e48cb31f22376f08e5b64aab8e4e26c1382ea1cb41a1d88c56ad2b2a97e8e9c354721000c818412ccc4c44d8ba012ae4c957cc42250bdd5856cfc2e7577f8315c79936d535dce4db45f774437581ae9486def5d3d8527e93434567573ec04adeaf11d0f52ab7de962866b8a817fb01c4b5485b08217c39c955c1c121e5cce5e2fe6a4ea479ac6f06b4a85f413563d5226a7df4d8c8c00386d6018cd6d0c8cbf27dfaac42d26bfc82cbd50b37a91b32db689b7afa317d03c0b6039fd408d27172f78f3a9efa56b445ddb74e6c313366458957881b8462c611ab49f7230620bfb87efee37fb5fa14fcd27b20a34cd5efba6a719cf87cc649b6c4548278141c337f48cd2051d8f9daca634476b9119e1b8df0667e542af42e82d39cff46c47949db490aa05552543cb1d36c4fa74818b6724e0d5627ea899fa5aee0bc66eb4103c8179f0d4921962457d890f2c6b66a71120f0296f447458538245e6cac5388b761f46eb02b2ae1e09aa5b91001719a23eb3dc897fed70421258ab467db9ee0df593b967488c6542ab65e0ed207846bef7b9361d302ba4874741ecfad01a208a6b3911491e1cf3b62eba5603bc781b854be588989b2e63efdade4006c54ed7d0eaabbf17ffd24c37ea0bff043cdadc0c0172454e696d126420533a7d7210e5b19a9661f62494b8773f450b866bdccc63a36fb42c5a5ab04c236820b46de4f242b297b631b17d4c4fad7cde343385923724c6a1e13fd286b261e96dfa01e55ec724f1dce598112408b5e930cb7f461776aca6962866d2f54e40076619784f213c2d582b63a88408d05e19abc120d1714bac2dd75836c3b38aed9f88f922d9dc7654f878cc31c0f9f9a00c6b252356cf26977c0a127e3c50d6c101ed8c5a6fe1a122e189c911776ca1b50dc55883d4cd62a96a4958f90c9486e979a2ad0e5654c95ea18ab08d1f295d7e006a7babac58a186fc5f24d868e81a63cd46996fe5794857aa4e39e504c855e03d054c406ce1df752042a04c00297edc5c8c34a59ecc8d1968ec07e2754f1b0020e92970c57bae78c5b20c3f0e18aed20194e34069b147ff33358563d70ae9581e45b71c84242f1c77690e0fc8c09c7a3f3d62e84db6500332b4e64f3126fed6a070fa2d084394b7447b5f1f206be6a29e3fe4cc501d11d0746f5d0977fb32a48490aa612abad360f40faced42a420b8addfbd4b4d9f6144e6093a9100fbf24ca85b923f9ae7febd60f5bb1ab5a7bd63c396a4d464d420e14a8091772fbf1220081bd358a0c80ab99a07344a82bd2c273eac9d7123bea7725b3e1686ee58bee7e82b8ed3850345911fae7b88c48ba0b3c2d01d0f3036f79c176668ae17418c287afdfda207f161a57c17fd05c0f40d8425629782c1730bfd543aebb82541d429eda3b06b7705740a656790b99b8ae8f9feb8d40dcb782f250b0eb35ab22fe5424a31cbac901070a8f71a7e2942bc6ee28c494d872f69e5e0e61c31b5b949686cdee2ca739b9a8fc76a21882f1ed14fd3c10e1bfdf7b4d0a881f1b0d244770aab5b1ed7a901e0f1e5535281db14db5aee7585f61af9470446ce8a702a25ac343bf69355e3b6fbbeb84b1a7ee5c45ce48dd873c0c2b673e98de83027ae09f2caaa58385af98450dfa60322b78b3301717ea454421600d548a3e06ca5256871542493e180e6f2a46b9ea089ffbca830c41b28b888dd5940ca2f0c860cfacdc699d8ae6788ae9f25cd46dcfc3b54e78d10e242a57";
|
|
4898
|
+
//#endregion
|
|
4453
4899
|
//#region src/sqisign-kat-lvl1.ts
|
|
4454
4900
|
/**
|
|
4455
4901
|
* NIST-style KAT verify vectors (count = 0) from upstream the-sqisign `.rsp` files.
|
|
@@ -4564,46 +5010,70 @@ async function warmupWebGpu() {
|
|
|
4564
5010
|
entryPoint: "main"
|
|
4565
5011
|
}
|
|
4566
5012
|
});
|
|
4567
|
-
const
|
|
4568
|
-
|
|
4569
|
-
|
|
4570
|
-
|
|
4571
|
-
|
|
4572
|
-
|
|
4573
|
-
|
|
4574
|
-
|
|
4575
|
-
|
|
4576
|
-
|
|
4577
|
-
|
|
4578
|
-
|
|
4579
|
-
|
|
4580
|
-
|
|
4581
|
-
|
|
4582
|
-
|
|
4583
|
-
|
|
4584
|
-
|
|
4585
|
-
|
|
4586
|
-
|
|
4587
|
-
|
|
4588
|
-
|
|
4589
|
-
|
|
4590
|
-
|
|
4591
|
-
|
|
4592
|
-
|
|
4593
|
-
|
|
4594
|
-
|
|
4595
|
-
|
|
4596
|
-
|
|
4597
|
-
|
|
4598
|
-
|
|
4599
|
-
|
|
4600
|
-
|
|
4601
|
-
|
|
4602
|
-
|
|
4603
|
-
|
|
4604
|
-
|
|
4605
|
-
|
|
4606
|
-
|
|
5013
|
+
const bufferBytes = 256;
|
|
5014
|
+
let a;
|
|
5015
|
+
let b;
|
|
5016
|
+
let out;
|
|
5017
|
+
try {
|
|
5018
|
+
a = device.createBuffer({
|
|
5019
|
+
size: bufferBytes,
|
|
5020
|
+
usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST
|
|
5021
|
+
});
|
|
5022
|
+
b = device.createBuffer({
|
|
5023
|
+
size: bufferBytes,
|
|
5024
|
+
usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST
|
|
5025
|
+
});
|
|
5026
|
+
out = device.createBuffer({
|
|
5027
|
+
size: bufferBytes,
|
|
5028
|
+
usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC
|
|
5029
|
+
});
|
|
5030
|
+
device.queue.writeBuffer(a, 0, (/* @__PURE__ */ new Uint32Array(64)).fill(1));
|
|
5031
|
+
device.queue.writeBuffer(b, 0, (/* @__PURE__ */ new Uint32Array(64)).fill(2));
|
|
5032
|
+
const bindGroup = device.createBindGroup({
|
|
5033
|
+
layout: pipeline.getBindGroupLayout(0),
|
|
5034
|
+
entries: [
|
|
5035
|
+
{
|
|
5036
|
+
binding: 0,
|
|
5037
|
+
resource: { buffer: a }
|
|
5038
|
+
},
|
|
5039
|
+
{
|
|
5040
|
+
binding: 1,
|
|
5041
|
+
resource: { buffer: b }
|
|
5042
|
+
},
|
|
5043
|
+
{
|
|
5044
|
+
binding: 2,
|
|
5045
|
+
resource: { buffer: out }
|
|
5046
|
+
}
|
|
5047
|
+
]
|
|
5048
|
+
});
|
|
5049
|
+
const encoder = device.createCommandEncoder({ label: "sqisign-warmup" });
|
|
5050
|
+
const pass = encoder.beginComputePass({ label: "sqisign-warmup-pass" });
|
|
5051
|
+
pass.setPipeline(pipeline);
|
|
5052
|
+
pass.setBindGroup(0, bindGroup);
|
|
5053
|
+
pass.dispatchWorkgroups(1);
|
|
5054
|
+
pass.end();
|
|
5055
|
+
device.queue.submit([encoder.finish()]);
|
|
5056
|
+
await device.queue.onSubmittedWorkDone();
|
|
5057
|
+
return true;
|
|
5058
|
+
} finally {
|
|
5059
|
+
const zeros = new Uint8Array(bufferBytes);
|
|
5060
|
+
for (const buffer of [
|
|
5061
|
+
a,
|
|
5062
|
+
b,
|
|
5063
|
+
out
|
|
5064
|
+
]) {
|
|
5065
|
+
if (!buffer) continue;
|
|
5066
|
+
try {
|
|
5067
|
+
device.queue.writeBuffer(buffer, 0, zeros);
|
|
5068
|
+
} catch {}
|
|
5069
|
+
}
|
|
5070
|
+
try {
|
|
5071
|
+
await device.queue.onSubmittedWorkDone();
|
|
5072
|
+
} catch {}
|
|
5073
|
+
a?.destroy();
|
|
5074
|
+
b?.destroy();
|
|
5075
|
+
out?.destroy();
|
|
5076
|
+
}
|
|
4607
5077
|
}
|
|
4608
5078
|
//#endregion
|
|
4609
5079
|
//#region src/sqisign-webgpu.ts
|
|
@@ -4744,6 +5214,7 @@ var SqisignWebGpuWrapper = class {
|
|
|
4744
5214
|
this.variant = variant;
|
|
4745
5215
|
}
|
|
4746
5216
|
keypair() {
|
|
5217
|
+
assertBrowserSkCeremonyAllowed();
|
|
4747
5218
|
const pairPromise = postToWorker({
|
|
4748
5219
|
id: nextId++,
|
|
4749
5220
|
op: "keygen",
|
|
@@ -4758,6 +5229,7 @@ var SqisignWebGpuWrapper = class {
|
|
|
4758
5229
|
return { get: (key) => pairPromise.then((pair) => key === "public_key" ? pair.public_key : pair.private_key) };
|
|
4759
5230
|
}
|
|
4760
5231
|
sign(message, private_key) {
|
|
5232
|
+
assertBrowserSkCeremonyAllowed();
|
|
4761
5233
|
return Promise.resolve(private_key).then(async (sk) => {
|
|
4762
5234
|
const msg = asBytes(message);
|
|
4763
5235
|
const key = asBytes(sk);
|
|
@@ -4803,6 +5275,7 @@ var SqisignWebGpuWrapper = class {
|
|
|
4803
5275
|
};
|
|
4804
5276
|
async function benchSqisignWebGpu(variant, message = "rustykey-signature-check") {
|
|
4805
5277
|
const scheme = await loadSqisignWebGpu(variant);
|
|
5278
|
+
assertBrowserSkCeremonyAllowed();
|
|
4806
5279
|
const msgBytes = new TextEncoder().encode(message);
|
|
4807
5280
|
const keygenStart = performance.now();
|
|
4808
5281
|
const kp = scheme.keypair();
|
|
@@ -4954,6 +5427,6 @@ async function loadMlKem1024() {
|
|
|
4954
5427
|
return new MlKemWrapper(mlkem1024_default, { name: "ML-KEM-1024" });
|
|
4955
5428
|
}
|
|
4956
5429
|
//#endregion
|
|
4957
|
-
export { MLDSA65_KAT_MSG_HEX, MLDSA65_KAT_PK_HEX, MLDSA65_KAT_SIG_HEX, MLDSA87_KAT_MSG_HEX, MLDSA87_KAT_PK_HEX, MLDSA87_KAT_SIG_HEX, SLHDSA128S_KAT_MSG_HEX, SLHDSA128S_KAT_PK_HEX, SLHDSA128S_KAT_SIG_HEX, SLHDSA192S_KAT_MSG_HEX, SLHDSA192S_KAT_PK_HEX, SLHDSA192S_KAT_SIG_HEX, SLHDSA256S_KAT_MSG_HEX, SLHDSA256S_KAT_PK_HEX, SLHDSA256S_KAT_SIG_HEX, SQISIGN_LVL1_KAT0_MSG_HEX, SQISIGN_LVL1_KAT0_PK_HEX, SQISIGN_LVL1_KAT0_SIG_HEX, SQISIGN_LVL1_KAT0_SM_HEX, SQISIGN_LVL3_KAT0_MSG_HEX, SQISIGN_LVL3_KAT0_PK_HEX, SQISIGN_LVL3_KAT0_SIG_HEX, SQISIGN_LVL3_KAT0_SM_HEX, SQISIGN_LVL5_KAT0_MSG_HEX, SQISIGN_LVL5_KAT0_PK_HEX, SQISIGN_LVL5_KAT0_SIG_HEX, SQISIGN_LVL5_KAT0_SM_HEX, SQISIGN_WEBGPU_VARIANT_LABELS, benchSqisignWebGpu, getSqisignWebGpuSupport, isSqisignWebGpuAvailable, loadFnDsa1024, loadFnDsa512, loadMlDsa3, loadMlDsa5, loadMlKem1024, loadMlKem512, loadMlKem768, loadSlhDsa128, loadSlhDsa192, loadSlhDsa256, loadSqisignLvl1, loadSqisignLvl1WebGpu, loadSqisignLvl3, loadSqisignLvl3WebGpu, loadSqisignLvl5, loadSqisignLvl5WebGpu, setSqisignAccelWorkerUrl };
|
|
5430
|
+
export { MLDSA65_KAT_MSG_HEX, MLDSA65_KAT_PK_HEX, MLDSA65_KAT_SIG_HEX, MLDSA87_KAT_MSG_HEX, MLDSA87_KAT_PK_HEX, MLDSA87_KAT_SIG_HEX, OPFS_SK_ALGORITHMS, OPFS_SK_SLOT_SD_BUNDLE, OPFS_SK_WORKER_NAME, SLHDSA128S_KAT_MSG_HEX, SLHDSA128S_KAT_PK_HEX, SLHDSA128S_KAT_SIG_HEX, SLHDSA192S_KAT_MSG_HEX, SLHDSA192S_KAT_PK_HEX, SLHDSA192S_KAT_SIG_HEX, SLHDSA256S_KAT_MSG_HEX, SLHDSA256S_KAT_PK_HEX, SLHDSA256S_KAT_SIG_HEX, SQISIGN_LVL1_KAT0_MSG_HEX, SQISIGN_LVL1_KAT0_PK_HEX, SQISIGN_LVL1_KAT0_SIG_HEX, SQISIGN_LVL1_KAT0_SM_HEX, SQISIGN_LVL3_KAT0_MSG_HEX, SQISIGN_LVL3_KAT0_PK_HEX, SQISIGN_LVL3_KAT0_SIG_HEX, SQISIGN_LVL3_KAT0_SM_HEX, SQISIGN_LVL5_KAT0_MSG_HEX, SQISIGN_LVL5_KAT0_PK_HEX, SQISIGN_LVL5_KAT0_SIG_HEX, SQISIGN_LVL5_KAT0_SM_HEX, SQISIGN_WEBGPU_VARIANT_LABELS, assertBrowserSkCeremonyAllowed, assertOpfsSkCrossOriginIsolated, benchSqisignWebGpu, getSqisignWebGpuSupport, isSqisignWebGpuAvailable, loadFnDsa1024, loadFnDsa512, loadMlDsa3, loadMlDsa5, loadMlKem1024, loadMlKem512, loadMlKem768, loadOpfsSkWallet, loadSlhDsa128, loadSlhDsa192, loadSlhDsa256, loadSqisignLvl1, loadSqisignLvl1WebGpu, loadSqisignLvl3, loadSqisignLvl3WebGpu, loadSqisignLvl5, loadSqisignLvl5WebGpu, opfsSkPrfMaterialFromCeremony, opfsSkPrfOutputFromExtensionResults, opfsSkTriggerWebAuthn, setOpfsSkWorkerUrl, setSqisignAccelWorkerUrl };
|
|
4958
5431
|
|
|
4959
5432
|
//# sourceMappingURL=index.js.map
|