From 657f18ddf9607978b678476454ad20a4aa78813f Mon Sep 17 00:00:00 2001 From: gagdiez Date: Tue, 31 Oct 2023 17:06:15 +0100 Subject: [PATCH] Implementing NFT Primitives on Docs (#1528) * basis for primitives * the structure of nft primitive page * basic navigation structure example * editing nft primitives * added the list of additional nft sources * basic FT structure * a new structure of nft primitive section * Added how to buy NFT section in NFT primitives * Changed the way how to use near-api-js (NFT primitives) * Added code example of near-wallet.js file (NFT primitives) * how to interact with nft from smart contract section * editing structure of the nft primitive section * general review * editing NFT primitive section * small fixes * minor editorial changes (nft primitives) * ft primitives structure * minor fixes --------- Co-authored-by: garikbesson --- docs/7.primitives/ft/additional-resources.md | 10 + docs/7.primitives/ft/bos.md | 11 + docs/7.primitives/ft/dex.md | 373 ++++++++ docs/7.primitives/ft/interacting/bos.md | 75 ++ docs/7.primitives/ft/interacting/near-cli.md | 14 + .../ft/interacting/smart-contract.md | 7 + docs/7.primitives/ft/interacting/web-app.md | 800 ++++++++++++++++++ docs/7.primitives/ft/introduction.md | 39 + docs/7.primitives/nft/additional-resources.md | 16 + docs/7.primitives/nft/interacting/bos.md | 550 ++++++++++++ docs/7.primitives/nft/interacting/near-cli.md | 306 +++++++ .../nft/interacting/smart-contract.md | 272 ++++++ docs/7.primitives/nft/interacting/web-app.md | 800 ++++++++++++++++++ docs/7.primitives/nft/introduction.md | 42 + docs/7.primitives/welcome.md | 23 + docs/index.md | 2 +- website/sidebars.json | 57 ++ .../docs/assets/welcome-pages/examples.png | Bin 94168 -> 90125 bytes 18 files changed, 3396 insertions(+), 1 deletion(-) create mode 100644 docs/7.primitives/ft/additional-resources.md create mode 100644 docs/7.primitives/ft/bos.md create mode 100644 docs/7.primitives/ft/dex.md create mode 100644 docs/7.primitives/ft/interacting/bos.md create mode 100644 docs/7.primitives/ft/interacting/near-cli.md create mode 100644 docs/7.primitives/ft/interacting/smart-contract.md create mode 100644 docs/7.primitives/ft/interacting/web-app.md create mode 100644 docs/7.primitives/ft/introduction.md create mode 100644 docs/7.primitives/nft/additional-resources.md create mode 100644 docs/7.primitives/nft/interacting/bos.md create mode 100644 docs/7.primitives/nft/interacting/near-cli.md create mode 100644 docs/7.primitives/nft/interacting/smart-contract.md create mode 100644 docs/7.primitives/nft/interacting/web-app.md create mode 100644 docs/7.primitives/nft/introduction.md create mode 100644 docs/7.primitives/welcome.md diff --git a/docs/7.primitives/ft/additional-resources.md b/docs/7.primitives/ft/additional-resources.md new file mode 100644 index 00000000000..1f7113e20b4 --- /dev/null +++ b/docs/7.primitives/ft/additional-resources.md @@ -0,0 +1,10 @@ +--- +id: additional-resources +title: Additional Resources +hide_table_of_contents: false +--- + +import {FeatureList, Column, Feature} from "@site/components/featurelist" +import ContactUs from '@site/components/ContactUs.mdx'; + +1. \ No newline at end of file diff --git a/docs/7.primitives/ft/bos.md b/docs/7.primitives/ft/bos.md new file mode 100644 index 00000000000..99caa369975 --- /dev/null +++ b/docs/7.primitives/ft/bos.md @@ -0,0 +1,11 @@ +--- +id: bos +title: BOS +hide_table_of_contents: false +--- + +There are some components related with FT functionality on BOS that might be useful. + +1. [FungibleTokenBalance](https://near.org/near/widget/ComponentDetailsPage?src=ahnff.near/widget/FungibleTokenBalance) - shows balances of a current user. +2. [Claim Fungible Tokens from Lockup](https://near.org/near/widget/ComponentDetailsPage?src=whtt.near/widget/Draft-0) - the example how to claim locked tokens from the `lockup.burrow.near` contract. +3. [BSC Dex Collection](https://near.org/near/widget/ComponentDetailsPage?src=bluebiu.near/widget/Bsc.Swap.Dex) - the example of how to build simple swap page for a DEX. diff --git a/docs/7.primitives/ft/dex.md b/docs/7.primitives/ft/dex.md new file mode 100644 index 00000000000..a643e2390e8 --- /dev/null +++ b/docs/7.primitives/ft/dex.md @@ -0,0 +1,373 @@ +--- +id: dex +title: DEX +hide_table_of_contents: false +--- + +## List of token prices from Ref Finance + +```bash +curl -k -L -s --compressed \ + https://indexer.ref.finance/list-token-price +``` + +
+Example response: +

+ +```json +{ + "wrap.near": { + "price": "1.011", + "decimal": 24, + "symbol": "near" + }, + "a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48.factory.bridge.near": { + "price": "1.0", + "decimal": 6, + "symbol": "nUSDC" + }, + "dac17f958d2ee523a2206206994597c13d831ec7.factory.bridge.near": { + "price": "1.001", + "decimal": 6, + "symbol": "nUSDT" + }, + "6b175474e89094c44da98b954eedeac495271d0f.factory.bridge.near": { + "price": "0.999695", + "decimal": 18, + "symbol": "nDAI" + }, + "c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2.factory.bridge.near": { + "price": "1572.51", + "decimal": 18, + "symbol": "nWETH" + }, + "111111111117dc0aa78b770fa6a738034120c302.factory.bridge.near": { + "price": "0.250491", + "decimal": 18, + "symbol": "n1INCH" + }, + "c944e90c64b2c07662a292be6244bdf05cda44a7.factory.bridge.near": { + "price": "0.080141", + "decimal": 18, + "symbol": "nGRT" + }, + "token.skyward.near": { + "price": "0.12269762", + "decimal": 18, + "symbol": "SKYWARD" + }, + "token.v2.ref-finance.near": { + "price": "0.04921385", + "decimal": 18, + "symbol": "REF" + }, + "berryclub.ek.near": { + "price": "0.00026663", + "decimal": 18, + "symbol": "BANANA" + }, + "6f259637dcd74c767781e37bc6133cd6a68aa161.factory.bridge.near": { + "price": "2.35", + "decimal": 18, + "symbol": "nHT" + }, + "de30da39c46104798bb5aa3fe8b9e0e1f348163f.factory.bridge.near": { + "price": "0.841444", + "decimal": 18, + "symbol": "nGTC" + }, + "1f9840a85d5af5bf1d1762f925bdaddc4201f984.factory.bridge.near": { + "price": "3.93", + "decimal": 18, + "symbol": "nUNI" + }, + "2260fac5e5542a773aa44fbcfedf7c193bc2c599.factory.bridge.near": { + "price": "28349", + "decimal": 8, + "symbol": "nWBTC" + }, + "514910771af9ca656af840dff83e8264ecf986ca.factory.bridge.near": { + "price": "7.37", + "decimal": 18, + "symbol": "nLINK" + }, + "token.paras.near": { + "price": "0.00601845", + "decimal": 18, + "symbol": "PARAS" + }, + "meta-pool.near": { + "price": "1.24785231", + "decimal": 24, + "symbol": "STNEAR" + }, + "marmaj.tkn.near": { + "price": "1.14664312", + "decimal": 18, + "symbol": "marmaj" + }, + "52a047ee205701895ee06a375492490ec9c597ce.factory.bridge.near": { + "price": "0.00898478", + "decimal": 18, + "symbol": "PULSE" + }, + "aurora": { + "price": "1573.81", + "decimal": 18, + "symbol": "ETH" + }, + "aaaaaa20d9e0e2461697782ef11675f668207961.factory.bridge.near": { + "price": "0.04886864", + "decimal": 18, + "symbol": "AURORA" + }, + "dbio.near": { + "price": "0.00044179", + "decimal": 18, + "symbol": "DBIO" + }, + "f5cfbc74057c610c8ef151a439252680ac68c6dc.factory.bridge.near": { + "price": "0.09152023", + "decimal": 18, + "symbol": "OCT" + }, + "d9c2d319cd7e6177336b0a9c93c21cb48d84fb54.factory.bridge.near": { + "price": "7.43262412", + "decimal": 18, + "symbol": "HAPI" + }, + "meta-token.near": { + "price": "0.00216632", + "decimal": 24, + "symbol": "META" + }, + "v3.oin_finance.near": { + "price": "0.02673488", + "decimal": 8, + "symbol": "nUSDO" + }, + "3ea8ea4237344c9931214796d9417af1a1180770.factory.bridge.near": { + "price": "0.01986850", + "decimal": 18, + "symbol": "FLX" + }, + "pixeltoken.near": { + "price": "0.00061222", + "decimal": 6, + "symbol": "PXT" + }, + "myriadcore.near": { + "price": "0.00008448", + "decimal": 18, + "symbol": "MYRIA" + }, + "celo.token.a11bd.near": { + "price": "0.413032", + "decimal": 24, + "symbol": "CELO" + }, + "cusd.token.a11bd.near": { + "price": "0.996913", + "decimal": 24, + "symbol": "cUSD" + }, + "abr.a11bd.near": { + "price": "0.082354", + "decimal": 24, + "symbol": "ABR" + }, + "sol.token.a11bd.near": { + "price": "23.72", + "decimal": 24, + "symbol": "SOL" + }, + "utopia.secretskelliessociety.near": { + "price": "0.00009794", + "decimal": 8, + "symbol": "UTO" + }, + "4691937a7508860f876c9c0a2a617e7d9e945d4b.factory.bridge.near": { + "price": "0.171255", + "decimal": 18, + "symbol": "WOO" + }, + "linear-protocol.near": { + "price": "1.17190405", + "decimal": 24, + "symbol": "LINEAR" + }, + "0316eb71485b0ab14103307bf65a021042c6d380.factory.bridge.near": { + "price": "29758", + "decimal": 18, + "symbol": "HBTC" + }, + "token.cheddar.near": { + "price": "0.00080216", + "decimal": 24, + "symbol": "Cheddar" + }, + "token.pembrock.near": { + "price": "0.00599021", + "decimal": 18, + "symbol": "PEM" + }, + "token.burrow.near": { + "price": "0.00017675", + "decimal": 18, + "symbol": "BRRR" + }, + "atocha-token.near": { + "price": "0.00015148", + "decimal": 18, + "symbol": "ATO" + }, + "nearx.stader-labs.near": { + "price": "1.03190420", + "decimal": 24, + "symbol": "NearX" + }, + "30d20208d987713f46dfd34ef128bb16c404d10f.factory.bridge.near": { + "price": "0.573246", + "decimal": 18, + "symbol": "SD" + }, + "xtoken.ref-finance.near": { + "price": "0.06854020", + "decimal": 18, + "symbol": "xREF" + }, + "token.sweat": { + "price": "0.00913548", + "decimal": 18, + "symbol": "SWEAT" + }, + "v2-nearx.stader-labs.near": { + "price": "1.16228622", + "decimal": 24, + "symbol": "NearX" + }, + "token.stlb.near": { + "price": "0.00186631", + "decimal": 5, + "symbol": "SEAT" + }, + "ftv2.nekotoken.near": { + "price": "0.00001100", + "decimal": 24, + "symbol": "NEKO" + }, + "e99de844ef3ef72806cf006224ef3b813e82662f.factory.bridge.near": { + "price": "0.00923146", + "decimal": 18, + "symbol": "UMINT" + }, + "phoenix-bonds.near": { + "price": "1.77543121", + "decimal": 24, + "symbol": "pNEAR" + }, + "a4ef4b0b23c1fc81d3f9ecf93510e64f58a4a016.factory.bridge.near": { + "price": "0.08832548", + "decimal": 18, + "symbol": "1MIL" + }, + "farm.berryclub.ek.near": { + "price": "0.00028640", + "decimal": 18, + "symbol": "CUCUMBER" + }, + "v1.dacha-finance.near": { + "price": "0.00000162", + "decimal": 18, + "symbol": "POTATO" + }, + "9aeb50f542050172359a0e1a25a9933bc8c01259.factory.bridge.near": { + "price": "0.00212776", + "decimal": 8, + "symbol": "OIN" + }, + "ust.token.a11bd.near": { + "price": "0.09496213", + "decimal": 24, + "symbol": "UST" + }, + "luna.token.a11bd.near": { + "price": "0.406404", + "decimal": 24, + "symbol": "LUNA" + }, + "deip-token.near": { + "price": "0.00000388", + "decimal": 18, + "symbol": "DEIP" + }, + "059a1f1dea1020297588c316ffc30a58a1a0d4a2.factory.bridge.near": { + "price": "0.00012627", + "decimal": 18, + "symbol": "BSTN" + }, + "fusotao-token.near": { + "price": "0.00464067", + "decimal": 18, + "symbol": "TAO" + }, + "discovol-token.near": { + "price": "0.00014885", + "decimal": 14, + "symbol": "DISC" + }, + "apys.token.a11bd.near": { + "price": "0.00660365", + "decimal": 24, + "symbol": "APYS" + }, + "usdt.tether-token.near": { + "price": "1.001", + "decimal": 6, + "symbol": "USDt" + }, + "usn": { + "price": "0.97411628", + "decimal": 18, + "symbol": "USN" + }, + "17208628f84f5d6ad33f0da3bbbeb27ffcb398eac501a31bd6ad2011e36133a1": { + "price": "1.0", + "decimal": 6, + "symbol": "USDC" + } +} +``` + +

+
+ +## Ref SDK + +[Ref Finance](https://www.ref.finance/) provides a SDK with the main functions: swapping tokens, getting tokens metadata, fetching pools details, getting swap estimates. + +:::info +[Detailed Ref SDK documentation](https://guide.ref.finance/developers-1/ref-sdk) +::: + +--- + +## Ref Swap Widget +[Ref Finance](https://www.ref.finance/) provides the Ref Swap Widget in order to allow any service to access Ref's liquidity. For example, you can allow user swap other tokens (including stablecoins) for your project's token just using the Ref Swap Widget. + +:::info +[Detailed Ref Swap Widget documentation](https://github.com/ref-finance/ref-sdk#ref-swap-widget) +::: + +--- + +## Bridge Tokens + +If a project already has a token on Ethereum, there is an opportunity to bridge such token to NEAR using [Rainbow Bridge](https://rainbowbridge.app/). + +:::note +Before the bridging a token it needs to deploy that token on NEAR. You can do it by [Rainbow Bridge a tool](https://rainbowbridge.app/deploy). +::: + +--- \ No newline at end of file diff --git a/docs/7.primitives/ft/interacting/bos.md b/docs/7.primitives/ft/interacting/bos.md new file mode 100644 index 00000000000..0b02be8eafc --- /dev/null +++ b/docs/7.primitives/ft/interacting/bos.md @@ -0,0 +1,75 @@ +--- +id: bos +title: NEAR Component +hide_table_of_contents: false +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +This section shows how to interact with FTs directly from a [NEAR Component](../../../bos/components.md) + +--- + +## Check token balance + + + + + +```js +``` + + + + + +```js +const tokenContract = "token.v2.ref-finance.near"; +const tokenPrice = fetch( + "https://indexer.ref.finance/get-token-price?token_id=token.v2.ref-finance.near" +).body; + +console.log("refPrice: ", JSON.parse(tokenPrice)); +``` + +
+Example response +

+ +```json +{ + "token_contract_id": "token.v2.ref-finance.near", + "price": "0.05732698" +} +``` + +

+
+ +
+ + + +```js + +``` + + + +
+ +## Send tokens +## Get prices (?) + +Ref Finance API + +List of prices +https://indexer.ref.finance/list-token-price + +Get token price +https://indexer.ref.finance/get-token-price?token_id=token.v2.ref-finance.near + +## Swap tokens (?) +## Attaching FTs to a Call (? already exist [here](https://docs.near.org/develop/relevant-contracts/ft)) +## Minting FTs (? already exist [here](https://docs.near.org/tutorials/fts/simple-fts)) \ No newline at end of file diff --git a/docs/7.primitives/ft/interacting/near-cli.md b/docs/7.primitives/ft/interacting/near-cli.md new file mode 100644 index 00000000000..1dfe53051cb --- /dev/null +++ b/docs/7.primitives/ft/interacting/near-cli.md @@ -0,0 +1,14 @@ +--- +id: near-cli +title: NEAR CLI +hide_table_of_contents: false +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +This section shows how to interact with FTs from your shell using [`near-cli`](../../../4.tools/cli.md). + +--- + +## \ No newline at end of file diff --git a/docs/7.primitives/ft/interacting/smart-contract.md b/docs/7.primitives/ft/interacting/smart-contract.md new file mode 100644 index 00000000000..15814a26897 --- /dev/null +++ b/docs/7.primitives/ft/interacting/smart-contract.md @@ -0,0 +1,7 @@ +--- +id: smart-contract +title: Smart Contract +hide_table_of_contents: false +--- + +This section will explain how a smart contract can ... \ No newline at end of file diff --git a/docs/7.primitives/ft/interacting/web-app.md b/docs/7.primitives/ft/interacting/web-app.md new file mode 100644 index 00000000000..4fa76e5f80e --- /dev/null +++ b/docs/7.primitives/ft/interacting/web-app.md @@ -0,0 +1,800 @@ +--- +id: web-app +title: Web Application +hide_table_of_contents: false +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +This section describes how to interact with NFT contracts from a web app. + +:::info +All the examples are using a `Wallet` object, which comes from our [basic template](https://github.com/near-examples/hello-near-js/blob/master/frontend/near-wallet.js) +::: + +:::tip +In order to interact with NFT from your Web App you can request data from various APIs from your app (for example, [Marketplaces API](/primitives/nft/querying/marketplaces)). +::: + +--- + +## Mint a NFT + + + + +```js +import { Wallet } from './near-wallet'; + +const CONTRACT_ADDRESS = "nft.primitives.near"; +const wallet = new Wallet({ createAccessKeyFor: CONTRACT_ADDRESS }); + +await wallet.callMethod({ + method: 'nft_mint', + args: { + token_id: "1", + receiver_id: "bob.near", + token_metadata: { + title: "NFT Primitive Token", + description: "Awesome NFT Primitive Token", + media: "string", // URL to associated media, preferably to decentralized, content-addressed storage + } + }, + contractId: CONTRACT_ADDRESS +}); +``` + + + + + +```js +import { Wallet } from './near-wallet'; + +const CONTRACT_ADDRESS = "x.paras.near"; +const wallet = new Wallet({ createAccessKeyFor: CONTRACT_ADDRESS }); + +await wallet.callMethod({ + method: 'nft_mint', + args: { + token_series_id: "490641", + receiver_id: "bob.near", + }, + contractId: CONTRACT_ADDRESS +}); +``` + +:::note +In order to use `nft_mint` method of the `x.paras.near` contract you have to be a creator of a particular token series. +::: + + + + + +By using [`near-api-js`](https://docs.near.org/tools/near-api-js/quick-reference) + +```js +import { Wallet } from './near-wallet'; + +const CONTRACT_ADDRESS = "thomasettorreiv.mintbase1.near"; +const wallet = new Wallet({ createAccessKeyFor: CONTRACT_ADDRESS }); + +await wallet.callMethod({ + method: 'nft_batch_mint', + args: { + num_to_mint: 1, + owner_id: "bob.near", + metadata: {}, + }, + contractId: CONTRACT_ADDRESS, + deposit: 1 +}); +``` + +:::note +In order to use `nft_batch_mint` method of Mintbase store contract your account have to be a in the contract minters list. +::: + +By using [`Mintbase JS`](https://docs.mintbase.xyz/dev/mintbase-sdk-ref/sdk/mint) + +```js +import { useState } from 'react'; +import { useWallet } from '@mintbase-js/react'; +import { execute, mint, MintArgs } from '@mintbase-js/sdk'; + + +export const MintComponent = ({ media, reference, contractAddress, owner }: MintArgs): JSX.Element => { + + const { selector } = useWallet(); + + const handleMint = async (): Promise => { + + const wallet = await selector.wallet(); + + await execute( + mint({ contractAddress: contractAddress, metadata: { media, reference }, ownerId: owner }) + ); + + } + + return ( +
+ +
+ ); +}; +``` + +
+
+ +--- + +## Buy a NFT + + + + +```js +import { Wallet } from './near-wallet'; + +const CONTRACT_ADDRESS = "x.paras.near"; +const wallet = new Wallet({ createAccessKeyFor: CONTRACT_ADDRESS }); + +await wallet.callMethod({ + method: 'nft_buy', + args: { + token_series_id: "299102", + receiver_id: "bob.near", + }, + contractId: CONTRACT_ADDRESS, + deposit: 205740000000000000000000 // attached deposit in yoctoNEAR, covers NFT price + storage cost +}); +``` + +
+Example response +

+ +```json +"299102:1" +``` + +

+
+ +
+ + + +By using [`near-api-js`](https://docs.near.org/tools/near-api-js/quick-reference) + +```js +import { Wallet } from './near-wallet'; + +const CONTRACT_ADDRESS = "simple.market.mintbase1.near"; +const wallet = new Wallet({ createAccessKeyFor: CONTRACT_ADDRESS }); + +await wallet.callMethod({ + method: 'buy', + args: { + nft_contract_id: "rubennnnnnnn.mintbase1.near", + token_id: "38" + }, + contractId: CONTRACT_ADDRESS, + deposit: 1000000000000000000000 // attached deposit in yoctoNEAR, covers NFT price + storage cost (optional) +}); +``` + +
+Example response +

+ +```json +{ + "payout": { + "rub3n.near": "889200000000000000000", + "rubenm4rcus.near": "85800000000000000000" + } +} +``` + +

+
+ +By using [`Mintbase JS`](https://docs.mintbase.xyz/dev/mintbase-sdk-ref/sdk/buy) + +```js +import { useState } from 'react'; +import { useWallet } from '@mintbase-js/react'; +import { execute, burn, BuyArgs } from '@mintbase-js/sdk'; + + +export const BuyComponent = ({ contractAddress, price, tokenId, affiliateAccount, marketId }:BuyArgs): JSX.Element => { + + const { selector } = useWallet(); + + const handleBuy = async (): Promise => { + + const wallet = await selector.wallet(); + + const buyArgs = {contractAddress: contractAddress, tokenId: tokenId, affiliateAccount: affiliateAccount , marketId:marketId, price:price } + + await execute( + {wallet}, + buy(buyArgs) + ); + + } + + return ( +
+ +
+ ); +}; +``` + +
+
+ +--- + +## Query NFT data + + + + +```js +import { Wallet } from './near-wallet'; + +const CONTRACT_ADDRESS = "nft.primitives.near"; +const wallet = new Wallet({ createAccessKeyFor: CONTRACT_ADDRESS }); + +const response = await wallet.viewMethod({ + method: 'nft_token', + args: { + token_id: "1" + } +}); +``` + +
+Example response +

+ +```json +{ + "token_id": "1", + "owner_id": "bob.near", + "metadata": { + "title": "string", // ex. "Arch Nemesis: Mail Carrier" or "Parcel #5055" + "description": "string", // free-form description + "media": "string", // URL to associated media, preferably to decentralized, content-addressed storage + "media_hash": "string", // Base64-encoded sha256 hash of content referenced by the `media` field. Required if `media` is included. + "copies": 1, // number of copies of this set of metadata in existence when token was minted. + "issued_at": 1642053411068358156, // When token was issued or minted, Unix epoch in milliseconds + "expires_at": 1642053411168358156, // When token expires, Unix epoch in milliseconds + "starts_at": 1642053411068358156, // When token starts being valid, Unix epoch in milliseconds + "updated_at": 1642053411068358156, // When token was last updated, Unix epoch in milliseconds + "extra": "string", // anything extra the NFT wants to store on-chain. Can be stringified JSON. + "reference": "string", // URL to an off-chain JSON file with more info. + "reference_hash": "string" // Base64-encoded sha256 hash of JSON from reference field. Required if `reference` is included. + } +} +``` + +

+
+ +
+ + + +By using [`near-api-js`](https://docs.near.org/tools/near-api-js/quick-reference) + +```js +import { Wallet } from './near-wallet'; + +const CONTRACT_ADDRESS = "x.paras.near"; +const wallet = new Wallet({ createAccessKeyFor: CONTRACT_ADDRESS }); + +const response = await wallet.viewMethod({ + method: 'nft_token', + args: { + token_id: "84686:1154" + } +}); +``` + +
+Example response +

+ +```json +{ + "token_id": "84686:1154", + "owner_id": "bob.near", + "metadata": { + "title": "Tokenfox Silver Coin #1154", + "description": null, + "media": "bafkreihpapfu7rzsmejjgl2twllge6pbrfmqaahj2wkz6nq55c6trhhtrq", + "media_hash": null, + "copies": 4063, + "issued_at": "1642053411068358156", + "expires_at": null, + "starts_at": null, + "updated_at": null, + "extra": null, + "reference": "bafkreib6uj5kxbadfvf6qes5flema7jx6u5dj5zyqcneaoyqqzlm6kpu5a", + "reference_hash": null + }, + "approved_account_ids": {} +} +``` + +

+
+ +By calling a Paras API method + +```js +const tokenData = fetch("https://api-v2-mainnet.paras.id/token?token_id=84686:1154"); +``` + +
+Example response +

+ +```json +{ + "status": 1, + "data": { + "results": [ + { + "_id": "61dfbf27284abc1cc0b87c9d", + "contract_id": "x.paras.near", + "token_id": "84686:1154", + "owner_id": "bob.near", + "token_series_id": "84686", + "edition_id": "1154", + "metadata": { + "title": "Tokenfox Silver Coin #1154", + "description": "Holding this silver coin in your wallet will bring you health and happiness \uD83D\uDE0A", + "media": "bafkreihpapfu7rzsmejjgl2twllge6pbrfmqaahj2wkz6nq55c6trhhtrq", + "media_hash": null, + "copies": 4063, + "issued_at": null, + "expires_at": null, + "starts_at": null, + "updated_at": null, + "extra": null, + "reference": "bafkreib6uj5kxbadfvf6qes5flema7jx6u5dj5zyqcneaoyqqzlm6kpu5a", + "reference_hash": null, + "collection": "Tokenfox Collection Cards", + "collection_id": "tokenfox-collection-cards-by-tokenfoxnear", + "creator_id": "tokenfox.near", + "blurhash": "U7F~gc00_3D%00~q4n%M_39F-;RjM{xuWBRj", + "score": 0, + "mime_type": "image/png" + }, + "royalty": { + "tokenfox.near": 1000 + }, + "price": null, + "approval_id": null, + "ft_token_id": null, + "has_price": null, + "is_creator": true, + "total_likes": 8, + "likes": null, + "categories": [], + "view": 4 + } + ], + "count": 1, + "skip": 0, + "limit": 10 + } +} +``` + +

+
+ +:::info +See the [Paras API documentation](https://parashq.github.io/) for the full list of methods. +::: + +:::note +When you call Paras smart contract method it returns data that are stored in the Paras NFT smart contract. It means a response contains only data about NFTs which were minted via Paras NFT contract. + +When you call Paras API methods it returns data from other NFT contracts as well, due to the work of the indexer. It means you might want to pass more parameters like `contract_id` or `owner_id` to make the response more accurate. +::: + +
+ + + +By using [`near-api-js`](https://docs.near.org/tools/near-api-js/quick-reference) + +```js +import { Wallet } from './near-wallet'; + +const CONTRACT_ADDRESS = "anthropocene.mintbase1.near"; +const wallet = new Wallet({ createAccessKeyFor: CONTRACT_ADDRESS }); + +const response = await wallet.viewMethod({ + method: 'nft_token', + args: { + token_id: "17960" + } +}); +``` + +
+Example response +

+ +```json +{ + "token_id": "17960", + "owner_id": "876f40299dd919f39252863e2136c4e1922cd5f78759215474cbc8f1fc361e14", + "approved_account_ids": {}, + "metadata": { + "title": null, + "description": null, + "media": null, + "media_hash": null, + "copies": 1, + "issued_at": null, + "expires_at": null, + "starts_at": null, + "updated_at": null, + "extra": null, + "reference": "F-30s_uQ3ZdAHZClY4DYatDPapaIRNLju41RxfMXC24", + "reference_hash": null + }, + "royalty": { + "split_between": { + "seventhage.near": { + "numerator": 10000 + } + }, + "percentage": { + "numerator": 100 + } + }, + "split_owners": null, + "minter": "anthropocene.seventhage.near", + "loan": null, + "composeable_stats": { "local_depth": 0, "cross_contract_children": 0 }, + "origin_key": null +} +``` + +

+
+ +:::note +When someone creates a NFT on Mintbase they need to deploy their own NFT contract using Mintbase factory. Those smart contract are subaccounts of mintbase1.near, e.g. `anthropocene.mintbase1.near`. +::: + +By calling a Mintbase GraphQL API method + +```js +const tokenData = fetch("https://graph.mintbase.xyz", { + method: "POST", + headers: { + "mb-api-key": "anon", + "Content-Type": "application/json", + "x-hasura-role": "anonymous", + }, + body: JSON.stringify({ + query: ` + query getToken{ + tokens: nft_tokens( + where: { + token_id: { _eq: "84686:1154" } + } + ) { + tokenId: token_id + ownerId: owner + contractId: nft_contract_id + reference + issuedAt: issued_at + copies + metadataId: metadata_id + } + } + `, + }), +}); +``` + +
+Example response +

+ +```json +{ + "ok": true, + "status": 200, + "contentType": "application/json", + "body": { + "data": { + "tokens": [ + { + "tokenId": "84686:1154", + "ownerId": "bob.near", + "contractId": "x.paras.near", + "reference": "bafkreib6uj5kxbadfvf6qes5flema7jx6u5dj5zyqcneaoyqqzlm6kpu5a", + "issuedAt": "2022-01-13T05:56:51.068358", + "copies": 4063, + "metadataId": "x.paras.near:5210047642790498956c9669d6a37b98" + } + ] + } + } +} +``` + +

+
+ +:::note +In the future, users may be required to register using an api key. For now, simply passing the valueanon for `mb-api-key` will work. +::: + +By using [`Mintbase JS`](https://docs.mintbase.xyz/dev/mintbase-sdk-ref/data/api/tokenbyid) + +```js +import { tokenById } from '@mintbase-js/data' + +const { data, error } = await tokenById( '1','rub3n.testnet'); + +if (error) {console.log('error', error)} + + +console.log(data.tokenData[0]) // => token metadata +``` + +
+
+ +--- + +## Transfer a NFT + + + + +```js +import { Wallet } from './near-wallet'; + +const CONTRACT_ADDRESS = "nft.primitives.near"; +const wallet = new Wallet({ createAccessKeyFor: CONTRACT_ADDRESS }); + +await wallet.callMethod({ + method: 'nft_transfer', + args: { + token_id: "1", + receiver_id: "bob.near" + }, + contractId: CONTRACT_ADDRESS +}); +``` + + + + + +```js +import { Wallet } from './near-wallet'; + +const CONTRACT_ADDRESS = "x.paras.near"; +const wallet = new Wallet({ createAccessKeyFor: CONTRACT_ADDRESS }); + +await wallet.callMethod({ + method: 'nft_transfer', + args: { + token_id: "490641", + receiver_id: "bob.near" + }, + contractId: CONTRACT_ADDRESS +}); +``` + + + + + +By using [`near-api-js`](https://docs.near.org/tools/near-api-js/quick-reference) + +```js +import { Wallet } from './near-wallet'; + +const CONTRACT_ADDRESS = "thomasettorreiv.mintbase1.near"; +const wallet = new Wallet({ createAccessKeyFor: CONTRACT_ADDRESS }); + +await wallet.callMethod({ + method: 'nft_transfer', + args: { + token_id: "490641", + receiver_id: "bob.near" + }, + contractId: CONTRACT_ADDRESS +}); +``` + +By using [`Mintbase JS`](https://docs.mintbase.xyz/dev/mintbase-sdk-ref/sdk/transfer) + +```js +import { useState } from 'react'; +import { useWallet } from '@mintbase-js/react'; +import { execute, transfer, TransferArgs } from '@mintbase-js/sdk'; + +const TransferComponent = ({ tokenId, contractAddress }: TransferArgs): JSX.Element => { + const { selector, activeAccountId } = useWallet(); + + const handleTransfer = async (): Promise => { + const wallet = await selector.wallet(); + + const transferArgs: TransferArgs = { + contractAddress: contractAddress, + transfers: [{ + receiverId: 'mb_carol.testnet', + tokenId: token.tokenId, + }], + } + + await execute( + { wallet }, + transfer(transferArgs), + ); + }; + + return ( +
+ +
+ ); +} +``` + +
+
+ +--- + +## List a NFT for sale + +Basic NFT contracts following [the NEP-171 and NEP-177 standards](https://nomicon.io/Standards/Tokens/NonFungibleToken) do not implement marketplace functionality. + +For this purpose, there are ecosystem apps such as [Paras](https://paras.id/) or [Mintbase](https://www.mintbase.xyz/), that use dedicated marketplace contracts. + +In order to put a NFT for a sale on a marketplace you need to do two actions: + +1. Cover data storage costs in the marketplace contract. +2. Approve the marketplace to sell the NFT in your NFT contract. + + + + + +```js +import { Wallet } from './near-wallet'; + +const CONTRACT_ADDRESS = "marketplace.paras.near"; +const wallet = new Wallet({ createAccessKeyFor: CONTRACT_ADDRESS }); + +await wallet.callMethod({ + method: 'storage_deposit', + args: { + receiver_id: "bob.near" + }, + contractId: CONTRACT_ADDRESS, + gas: 300000000000000, // attached GAS (optional) + deposit: 9390000000000000000 // attached deposit in yoctoNEAR (optional) +}); + +await wallet.callMethod({ + method: 'nft_approve', + args: { + token_id: "1e95238d266e5497d735eb30", + account_id: "marketplace.paras.near", + msg: { + price: "200000000000000000000000", + market_type: "sale", + ft_token_id: "near" + } + }, + contractId: "nft.primitives.near" +}); +``` + +Method `nft_approve` of a NFT contract also calls the `nft_on_approve` method in `marketplace.paras.near` as a callback. + + + + + +```js +import { Wallet } from './near-wallet'; + +const CONTRACT_ADDRESS = "simple.market.mintbase1.near"; +const wallet = new Wallet({ createAccessKeyFor: CONTRACT_ADDRESS }); + +await wallet.callMethod({ + method: 'deposit_storage', + args: { + autotransfer: true + }, + contractId: CONTRACT_ADDRESS, + gas: 300000000000000, // attached GAS (optional) + deposit: 9390000000000000000 // attached deposit in yoctoNEAR (optional) +}); + +await wallet.callMethod({ + method: 'nft_approve', + args: { + args: { + token_id: "3c46b76cbd48e65f2fc88473", + account_id: "simple.market.mintbase1.near", + msg: { + price: "200000000000000000000000" + } + }, + }, + contractId: "nft.primitives.near" +}); +``` + +Method `nft_approve` of a NFT contract also calls the `nft_on_approve` method in `simple.market.mintbase1.near` as a callback. + +By using [`Mintbase JS`](https://docs.mintbase.xyz/dev/mintbase-sdk-ref/sdk/list) + +```js +import { useState } from 'react'; +import { useWallet } from '@mintbase-js/react'; +import { execute, list, ListArgs } from '@mintbase-js/sdk'; + + +export const ListComponent = ({ contractAddress, marketAddress , tokenId, price }:ListArgs):JSX.Element => { + + const { selector } = useWallet(); + + const handleList = async (): Promise => { + const wallet = await selector.wallet(); + + await execute( + {wallet}, + list({ + contractAddress: nftContractId, + marketAddress: marketId, + tokenId: tokenId, + price: price + }) + ) + } + + return ( +
+ +
+ ); +}; +``` + +
+
\ No newline at end of file diff --git a/docs/7.primitives/ft/introduction.md b/docs/7.primitives/ft/introduction.md new file mode 100644 index 00000000000..a9ad07efb76 --- /dev/null +++ b/docs/7.primitives/ft/introduction.md @@ -0,0 +1,39 @@ +--- +id: introduction +title: Introduction +hide_table_of_contents: false +--- + + +import {FeatureList, Column, Feature} from "@site/components/featurelist" +import ContactUs from '@site/components/ContactUs.mdx'; + + +- [What is an FT?](#what-is-an-ft) +- [How to create FT token](#how-to-create-ft-token) + +--- + +## What is an FT? + +Fungible token is representation of an asset on a blockchain that is interchangeable. + +Besides the native NEAR token, user can issue their own fungible tokens or use those that are already present in the ecosystem and created by other users or projects. + +In contrast with the NEAR native token, fungible token (FT) are **not stored** in the user's wallet. In fact, each FT lives in **their own contract** which is in charge of doing **bookkeeping**. This is, the contract keeps track of how many tokens each user has, and handles transfers internally. + +In order for a contract to be considered a FT-contract it has to follow the [**NEP-141 and NEP-148 standards**](https://nomicon.io/Standards/FungibleToken/). The **NEP-141** & **NEP-148** standards explain the **minimum interface** required to be implemented, as well as the expected functionality. + +:::tip Reference Implementation +We provide a [FT reference implementation](https://github.com/near-examples/FT) ready to be deployed and use. +::: + +--- + +## How to create FT token + +Usually tokens are created by deploying own FT contract on blockchain. But there are other ways. + +1. [Token Farm](https://tkn.farm/) is a tool that can be use to create a new fungible token. It is deployed as subaccount of the factory contract, for example, `new_token.tkn.near`. To create a new FT you need to fill in few fields - token name, symbol, supply, decimals, owner account id and choose an icon. + +2. [Token Laboratory](https://app.jumpdefi.xyz/token-launcher) by Jump Defi. Provides the same functionality to create tokens as Token Farm. \ No newline at end of file diff --git a/docs/7.primitives/nft/additional-resources.md b/docs/7.primitives/nft/additional-resources.md new file mode 100644 index 00000000000..591368d1502 --- /dev/null +++ b/docs/7.primitives/nft/additional-resources.md @@ -0,0 +1,16 @@ +--- +id: additional-resources +title: Additional Resources +hide_table_of_contents: false +--- + +import {FeatureList, Column, Feature} from "@site/components/featurelist" +import ContactUs from '@site/components/ContactUs.mdx'; + +1. [NFT Tutorial](/tutorials/nfts/js/introduction) (NEAR examples, JavaScript SDK) - a set of tutorials that cover how to create a NFT contract using JavaScript. +2. [NFT Tutorial](/tutorials/nfts/introduction) (NEAR examples, Rust SDK) - a set of tutorials that cover how to create a NFT contract using Rust. +3. [NFT Tutorial by Keypom](https://github.com/keypom/nft-tutorial-series) (a fork of the NEAR example tutorial). +4. [Paras API documentation](https://parashq.github.io/). +5. [Mintbase API documentation](https://docs.mintbase.xyz/dev/mintbase-graph). +6. [Mintbase JS SDK](https://docs.mintbase.xyz/dev/mintbase-sdk-ref) - a set of methods to get data from blockchain, interact with Mintbase contracts, etc. +7. [Examples](/develop/relevant-contracts/nft) on how to mint NFT, query metadata, attach NFTs to a contract call using `near-cli`. \ No newline at end of file diff --git a/docs/7.primitives/nft/interacting/bos.md b/docs/7.primitives/nft/interacting/bos.md new file mode 100644 index 00000000000..0f66b1ac33c --- /dev/null +++ b/docs/7.primitives/nft/interacting/bos.md @@ -0,0 +1,550 @@ +--- +id: bos +title: NEAR Component +hide_table_of_contents: false +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +This section shows how to interact with an NFT smart contract directly from a [NEAR Component](../../../bos/components.md) + +--- + +## Mint a NFT + +This snippet will enable your users to mint NFTs in one of the NFT solutions. + + + + +```js +const tokenData = Near.call("nft.primitives.near", "nft_mint", { + token_id: "1", + receiver_id: "bob.near", + token_metadata: { + title: "NFT Primitive Token", + description: "Awesome NFT Primitive Token", + media: "string", // URL to associated media, preferably to decentralized, content-addressed storage + } +}); +``` + + + + + +```js +const tokenData = Near.call("x.paras.near", "nft_mint", { + token_series_id: "490641", + receiver_id: "bob.near", +}); +``` + +:::note +In order to use `nft_mint` method of the `x.paras.near` contract you have to be a creator of a particular token series. +::: + + + + + +```js +const tokenData = Near.call( + "thomasettorreiv.mintbase1.near", + "nft_batch_mint", + { + num_to_mint: 1, + owner_id: "bob.near", + metadata: {}, + }, + undefined, + 1 +); +``` + +:::note +In order to use `nft_batch_mint` method of Mintbase store contract your account have to be a in the contract minters list. +::: + + + + +--- + +## Buy a NFT + +This snippet will enable your users to buy NFTs in one of the NFT solutions. + + + + +```js +const tokenData = Near.call( + "x.paras.near", + "nft_buy", + { + token_series_id: "299102", + receiver_id: "bob.near", + }, + undefined, + 205740000000000000000000 // NFT price + storage cost +); +``` + +
+Example response +

+ +```json +"299102:1" +``` + +

+
+ +
+ + + +```js +const tokenData = Near.call( + "simple.market.mintbase1.near", + "buy", + { + nft_contract_id: "rubennnnnnnn.mintbase1.near", + token_id: "38", + referrer_id: null, + }, + undefined, + 1000000000000000000000 // NFT price + storage cost (optional, depends on a contract) +); +``` + +
+Example response +

+ +```json +{ + "payout": { + "rub3n.near": "889200000000000000000", + "rubenm4rcus.near": "85800000000000000000" + } +} +``` + +

+
+ +
+
+ +--- + +## Query NFT data + +This snippet will enable your users to query NFT data in one of the NFT solutions. + + + + +```js +const tokenData = Near.view("nft.primitives.near", "nft_token", { + token_id: "1", +}); +``` + +
+Example response +

+ +```json +{ + "token_id": "1", + "owner_id": "bob.near", + "metadata": { + "title": "string", // ex. "Arch Nemesis: Mail Carrier" or "Parcel #5055" + "description": "string", // free-form description + "media": "string", // URL to associated media, preferably to decentralized, content-addressed storage + "media_hash": "string", // Base64-encoded sha256 hash of content referenced by the `media` field. Required if `media` is included. + "copies": 1, // number of copies of this set of metadata in existence when token was minted. + "issued_at": 1642053411068358156, // When token was issued or minted, Unix epoch in milliseconds + "expires_at": 1642053411168358156, // When token expires, Unix epoch in milliseconds + "starts_at": 1642053411068358156, // When token starts being valid, Unix epoch in milliseconds + "updated_at": 1642053411068358156, // When token was last updated, Unix epoch in milliseconds + "extra": "string", // anything extra the NFT wants to store on-chain. Can be stringified JSON. + "reference": "string", // URL to an off-chain JSON file with more info. + "reference_hash": "string" // Base64-encoded sha256 hash of JSON from reference field. Required if `reference` is included. + } +} +``` + +

+
+ +
+ + + +By calling a Paras smart contract method + +```js +const tokenData = Near.view("x.paras.near", "nft_token", { + token_id: "84686:1154", +}); +``` + +
+Example response +

+ +```json +{ + "token_id": "84686:1154", + "owner_id": "bob.near", + "metadata": { + "title": "Tokenfox Silver Coin #1154", + "description": null, + "media": "bafkreihpapfu7rzsmejjgl2twllge6pbrfmqaahj2wkz6nq55c6trhhtrq", + "media_hash": null, + "copies": 4063, + "issued_at": "1642053411068358156", + "expires_at": null, + "starts_at": null, + "updated_at": null, + "extra": null, + "reference": "bafkreib6uj5kxbadfvf6qes5flema7jx6u5dj5zyqcneaoyqqzlm6kpu5a", + "reference_hash": null + }, + "approved_account_ids": {} +} +``` + +

+
+ +By calling a Paras API method + +```js +const tokenData = fetch("https://api-v2-mainnet.paras.id/token?token_id=84686:1154"); +``` + +
+Example response +

+ +```json +{ + "status": 1, + "data": { + "results": [ + { + "_id": "61dfbf27284abc1cc0b87c9d", + "contract_id": "x.paras.near", + "token_id": "84686:1154", + "owner_id": "bob.near", + "token_series_id": "84686", + "edition_id": "1154", + "metadata": { + "title": "Tokenfox Silver Coin #1154", + "description": "Holding this silver coin in your wallet will bring you health and happiness \uD83D\uDE0A", + "media": "bafkreihpapfu7rzsmejjgl2twllge6pbrfmqaahj2wkz6nq55c6trhhtrq", + "media_hash": null, + "copies": 4063, + "issued_at": null, + "expires_at": null, + "starts_at": null, + "updated_at": null, + "extra": null, + "reference": "bafkreib6uj5kxbadfvf6qes5flema7jx6u5dj5zyqcneaoyqqzlm6kpu5a", + "reference_hash": null, + "collection": "Tokenfox Collection Cards", + "collection_id": "tokenfox-collection-cards-by-tokenfoxnear", + "creator_id": "tokenfox.near", + "blurhash": "U7F~gc00_3D%00~q4n%M_39F-;RjM{xuWBRj", + "score": 0, + "mime_type": "image/png" + }, + "royalty": { + "tokenfox.near": 1000 + }, + "price": null, + "approval_id": null, + "ft_token_id": null, + "has_price": null, + "is_creator": true, + "total_likes": 8, + "likes": null, + "categories": [], + "view": 4 + } + ], + "count": 1, + "skip": 0, + "limit": 10 + } +} +``` + +

+
+ +:::info +See the [Paras API documentation](https://parashq.github.io/) for the full list of methods. +::: + +:::note +When you call Paras smart contract method it returns data that are stored in the Paras NFT smart contract. It means a response contains only data about NFTs which were minted via Paras NFT contract. + +When you call Paras API methods it returns data from other NFT contracts as well, due to the work of the indexer. It means you might want to pass more parameters like `contract_id` or `owner_id` to make the response more accurate. +::: + +
+ + + +By calling a Mintbase smart contract method + +```js +const tokenData = Near.view("anthropocene.mintbase1.near", "nft_token", { + token_id: "17960", +}); +``` + +
+Example response +

+ +```json +{ + "token_id": "17960", + "owner_id": "876f40299dd919f39252863e2136c4e1922cd5f78759215474cbc8f1fc361e14", + "approved_account_ids": {}, + "metadata": { + "title": null, + "description": null, + "media": null, + "media_hash": null, + "copies": 1, + "issued_at": null, + "expires_at": null, + "starts_at": null, + "updated_at": null, + "extra": null, + "reference": "F-30s_uQ3ZdAHZClY4DYatDPapaIRNLju41RxfMXC24", + "reference_hash": null + }, + "royalty": { + "split_between": { + "seventhage.near": { + "numerator": 10000 + } + }, + "percentage": { + "numerator": 100 + } + }, + "split_owners": null, + "minter": "anthropocene.seventhage.near", + "loan": null, + "composeable_stats": { "local_depth": 0, "cross_contract_children": 0 }, + "origin_key": null +} +``` + +

+
+ +:::note +When someone creates a NFT on Mintbase they need to deploy their own NFT contract using Mintbase factory. Those smart contract are subaccounts of mintbase1.near, e.g. `anthropocene.mintbase1.near`. +::: + +By calling a Mintbase GraphQL API method + +```js +const tokenData = fetch("https://graph.mintbase.xyz", { + method: "POST", + headers: { + "mb-api-key": "anon", + "Content-Type": "application/json", + "x-hasura-role": "anonymous", + }, + body: JSON.stringify({ + query: ` + query getToken{ + tokens: nft_tokens( + where: { + token_id: { _eq: "84686:1154" } + } + ) { + tokenId: token_id + ownerId: owner + contractId: nft_contract_id + reference + issuedAt: issued_at + copies + metadataId: metadata_id + } + } + `, + }), +}); +``` + +
+Example response +

+ +```json +{ + "ok": true, + "status": 200, + "contentType": "application/json", + "body": { + "data": { + "tokens": [ + { + "tokenId": "84686:1154", + "ownerId": "bob.near", + "contractId": "x.paras.near", + "reference": "bafkreib6uj5kxbadfvf6qes5flema7jx6u5dj5zyqcneaoyqqzlm6kpu5a", + "issuedAt": "2022-01-13T05:56:51.068358", + "copies": 4063, + "metadataId": "x.paras.near:5210047642790498956c9669d6a37b98" + } + ] + } + } +} +``` + +

+
+ +:::note +In the future, users may be required to register using an api key. For now, simply passing the valueanon for `mb-api-key` will work. +::: + +
+
+ +--- + +## Transfer a NFT + +This snippet will enable your users to transfer NFTs in one of the NFT solutions. + + + + +```js +const tokenData = Near.call("nft.primitives.near", "nft_transfer", { + token_id: "1", + receiver_id: "bob.near" +}); +``` + + + + + +```js +const tokenData = Near.call("x.paras.near", "nft_transfer", { + token_id: "490641", + receiver_id: "bob.near" +}); +``` + + + + + +```js +const tokenData = Near.call("thomasettorreiv.mintbase1.near", "nft_transfer", { + token_id: "490641", + receiver_id: "bob.near" +}); +``` + + + + +--- + +## List a NFT for sale + +Basic NFT contracts following [the NEP-171 and NEP-177 standards](https://nomicon.io/Standards/Tokens/NonFungibleToken) do not implement marketplace functionality. + +For this purpose, there are ecosystem apps such as [Paras](https://paras.id/) or [Mintbase](https://www.mintbase.xyz/), that use dedicated marketplace contracts. + +In order to put a NFT for a sale on a marketplace you need to do two actions: + +1. Cover data storage costs in the marketplace contract. +2. Approve the marketplace to sell the NFT in your NFT contract. + + + + + + +```js +Near.call( + "marketplace.paras.near", + "storage_deposit", + { + receiver_id: "bob.near" + }, + undefined, + 9390000000000000000 +); + +Near.call( + "nft.primitives.near", + "nft_approve", + { + token_id: "1e95238d266e5497d735eb30", + account_id: "marketplace.paras.near", + msg: { + price: "200000000000000000000000", + market_type: "sale", + ft_token_id: "near" + } + } +); +``` + +The method `nft_approve` will call `nft_on_approve` in `marketplace.paras.near`. + + + + + +```js +Near.call( + "simple.market.mintbase1.near", + "deposit_storage", + { + autotransfer: true + }, + undefined, + 9390000000000000000 +); + +Near.call( + "nft.primitives.near", + "nft_approve", + { + token_id: "3c46b76cbd48e65f2fc88473", + account_id: "simple.market.mintbase1.near", + msg: { + price: "200000000000000000000000" + } + } +); +``` + +The method `nft_approve` will call `nft_on_approve` in `simple.market.mintbase1.near`. + + + \ No newline at end of file diff --git a/docs/7.primitives/nft/interacting/near-cli.md b/docs/7.primitives/nft/interacting/near-cli.md new file mode 100644 index 00000000000..498c6a476fb --- /dev/null +++ b/docs/7.primitives/nft/interacting/near-cli.md @@ -0,0 +1,306 @@ +--- +id: near-cli +title: NEAR CLI +hide_table_of_contents: false +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +This section shows how to interact with an NFT contract from your shell using [`near-cli`](../../../4.tools/cli.md). + +--- + +## Mint a NFT + + + + +```bash +near call nft.primitives.near nft_mint, '{"token_id": "1", "receiver_id": "bob.near", "token_metadata": {"title": "NFT Primitive Token", "description": "Awesome NFT Primitive Token", "media": "string"}}' --accountId bob.near +``` + + + + + +```bash +near call x.paras.near nft_mint '{"token_series_id": "490641", "receiver_id": "bob.near"}' --accountId bob.near +``` + +:::note +In order to use `nft_mint` method of the `x.paras.near` contract you have to be a creator of a particular token series. +::: + + + + + +```bash +near call thomasettorreiv.mintbase1.near nft_batch_mint '{"num_to_mint": 1, "owner_id": "bob.near", "metadata": {}}' --accountId bob.near --deposit 0.000000000000000000000001 +``` + +:::note +In order to use `nft_batch_mint` method of Mintbase store contract your account have to be a in the contract minters list. +::: + + + + +--- + +## Buy a NFT + + + + +```bash +near call x.paras.near buy '{"token_series_id": "299102", "receiver_id": "bob.near"}' --accountId bob.near --deposit 0.20574 +``` + +
+Example response +

+ +```json +"299102:1" +``` + +

+
+ +
+ + + +```bash +near call simple.market.mintbase1.near buy '{"nft_contract_id": "rubennnnnnnn.mintbase1.near", "token_id": "38"}' --accountId bob.near --deposit 0.001 +``` + +
+Example response +

+ +```json +{ + "payout": { + "rub3n.near": "889200000000000000000", + "rubenm4rcus.near": "85800000000000000000" + } +} +``` + +

+
+ +
+
+ +--- + +## Query NFT data + + + + +```bash +near view nft.primitives.near nft_token '{"token_id": "1"}' +``` + +
+Example response +

+ +```json +{ + "token_id": "1", + "owner_id": "bob.near", + "metadata": { + "title": "string", // ex. "Arch Nemesis: Mail Carrier" or "Parcel #5055" + "description": "string", // free-form description + "media": "string", // URL to associated media, preferably to decentralized, content-addressed storage + "media_hash": "string", // Base64-encoded sha256 hash of content referenced by the `media` field. Required if `media` is included. + "copies": 1, // number of copies of this set of metadata in existence when token was minted. + "issued_at": 1642053411068358156, // When token was issued or minted, Unix epoch in milliseconds + "expires_at": 1642053411168358156, // When token expires, Unix epoch in milliseconds + "starts_at": 1642053411068358156, // When token starts being valid, Unix epoch in milliseconds + "updated_at": 1642053411068358156, // When token was last updated, Unix epoch in milliseconds + "extra": "string", // anything extra the NFT wants to store on-chain. Can be stringified JSON. + "reference": "string", // URL to an off-chain JSON file with more info. + "reference_hash": "string" // Base64-encoded sha256 hash of JSON from reference field. Required if `reference` is included. + } +} +``` + +

+
+ +
+ + + +```bash +near view x.paras.near nft_token '{"token_id": "84686:1154"}' +``` + +
+Example response +

+ +```json +{ + "token_id": "84686:1154", + "owner_id": "bob.near", + "metadata": { + "title": "Tokenfox Silver Coin #1154", + "description": null, + "media": "bafkreihpapfu7rzsmejjgl2twllge6pbrfmqaahj2wkz6nq55c6trhhtrq", + "media_hash": null, + "copies": 4063, + "issued_at": "1642053411068358156", + "expires_at": null, + "starts_at": null, + "updated_at": null, + "extra": null, + "reference": "bafkreib6uj5kxbadfvf6qes5flema7jx6u5dj5zyqcneaoyqqzlm6kpu5a", + "reference_hash": null + }, + "approved_account_ids": {} +} +``` + +

+
+ +
+ + + +```bash +near view anthropocene.mintbase1.near nft_token '{"token_id": "17960"}' +``` + +
+Example response +

+ +```json +{ + "token_id": "17960", + "owner_id": "876f40299dd919f39252863e2136c4e1922cd5f78759215474cbc8f1fc361e14", + "approved_account_ids": {}, + "metadata": { + "title": null, + "description": null, + "media": null, + "media_hash": null, + "copies": 1, + "issued_at": null, + "expires_at": null, + "starts_at": null, + "updated_at": null, + "extra": null, + "reference": "F-30s_uQ3ZdAHZClY4DYatDPapaIRNLju41RxfMXC24", + "reference_hash": null + }, + "royalty": { + "split_between": { + "seventhage.near": { + "numerator": 10000 + } + }, + "percentage": { + "numerator": 100 + } + }, + "split_owners": null, + "minter": "anthropocene.seventhage.near", + "loan": null, + "composeable_stats": { "local_depth": 0, "cross_contract_children": 0 }, + "origin_key": null +} +``` + +

+
+ +:::note +When someone creates a NFT on Mintbase they need to deploy their own NFT contract using Mintbase factory. Those smart contract are subaccounts of mintbase1.near, e.g. `anthropocene.mintbase1.near`. +::: + +
+
+ +--- + +## Transfer a NFT + + + + +```bash +near call nft.primitives.near nft_transfer '{"token_id": "1", "receiver_id": "bob.near"}' --accountId bob.near --deposit 0.000000000000000000000001 +``` + + + + + +```bash +near call x.paras.near nft_transfer '{"token_id": "490641", "receiver_id": "bob.near"}' --accountId bob.near --deposit 0.000000000000000000000001 +``` + + + + + +```bash +near call thomasettorreiv.mintbase1.near nft_transfer '{"token_id": "490641" "receiver_id": "bob.near"}' --accountId bob.near --deposit 0.000000000000000000000001 +``` + + + + +--- + +## List a NFT for sale + +Basic NFT contracts following [the NEP-171 and NEP-177 standards](https://nomicon.io/Standards/Tokens/NonFungibleToken) do not implement marketplace functionality. + +For this purpose, there are ecosystem apps such as [Paras](https://paras.id/) or [Mintbase](https://www.mintbase.xyz/), that use dedicated marketplace contracts. + +In order to put a NFT for a sale on a marketplace you need to do two actions: + +1. Cover data storage costs in the marketplace contract. +2. Approve the marketplace to sell the NFT in your NFT contract. + + + + + +```bash +near call marketplace.paras.near storage_deposit '{"receiver_id": "bob.near"}' --accountId bob.near --deposit 0.00939 + +near call nft.primitives.near nft_approve '{"token_id": "1e95238d266e5497d735eb30", "account_id": "marketplace.paras.near", "msg": {"price": "200000000000000000000000", "market_type": "sale", "ft_token_id": "near"}}' --accountId bob.near +``` + +Method `nft_approve` of a NFT contract also calls the `nft_on_approve` method in `marketplace.paras.near` as a callback. + + + + + +```bash +near call simple.market.mintbase1.near deposit_storage '{"autotransfer": "true"}' --accountId bob.near --deposit 0.00939 + +near call nft.primitives.near nft_approve '{"token_id": "3c46b76cbd48e65f2fc88473", "account_id": "simple.market.mintbase1.near", "msg": {"price": "200000000000000000000000"}}' --accountId bob.near +``` + +Method `nft_approve` of a NFT contract also calls the `nft_on_approve` method in `simple.market.mintbase1.near` as a callback. + + + + +:::info +More examples of how to mint NFT, query metadata, attach NFTs to a contract call using `near-cli` you can [read here](/develop/relevant-contracts/nft). +::: \ No newline at end of file diff --git a/docs/7.primitives/nft/interacting/smart-contract.md b/docs/7.primitives/nft/interacting/smart-contract.md new file mode 100644 index 00000000000..3b147a41ba3 --- /dev/null +++ b/docs/7.primitives/nft/interacting/smart-contract.md @@ -0,0 +1,272 @@ +--- +id: smart-contract +title: Smart Contract +hide_table_of_contents: false +--- + +This section will explain how a smart contract can mint, buy, transfer and query NFTs. + +:::tip +If you are looking to create your own NFT contract please check the [Example implementation](https://github.com/near-examples/NFT) and the [NFT Zero to Hero Tutorial](https://docs.near.org/tutorials/nfts/introduction) +::: + +--- + +### Base Contract + +The examples assume that the contract is defined as follows: + +```rust +use near_contract_standards::non_fungible_token::{Token, TokenId}; +use near_sdk::ext_contract; +use near_sdk::borsh::{self, BorshDeserialize, BorshSerialize}; +use near_sdk::{env, log, near_bindgen, AccountId, Promise, PromiseError}; + +const NFT_CONTRACT: &str = "x.paras.near"; + +// Define the contract structure +#[near_bindgen] +#[derive(BorshDeserialize, BorshSerialize)] +pub struct Contract { + nft_contract: AccountId +} + +impl Default for Contract { + // The default trait with which to initialize the contract + fn default() -> Self { + Self { + nft_contract: NFT_CONTRACT.parse().unwrap(), + } + } +} + +// Implement the contract structure +#[near_bindgen] +impl Contract {} +``` + +--- + +## Mint a NFT + +
+ +Minting in Paras + + +In case with Paras NFT contract before minting NFT token you may need to create token series from your contract account. You can do it via [Paras UI](https://paras.id/en) or use `near-cli`: + +```bash +# Example of the command creating token series on Paras +near call x.paras.near nft_create_series '{"token_metadata": {"title": "NFT #1", "media": "bafybeibnpe5x6euhjtn5qrayfgeemxyru7ho3yhdyaifv7gsvdn46j6vzi", "reference": "bafybeif6cjn5bmdp7w5x2jms2xlz64qmp7crd5z77rl3iy3m54mlustdiu", "copies": 10}, "royalty": {"": 1000}, "price": null}' --accountId --depositYocto 6090000000000000000000 +``` + +
+ + + +```rust +// Validator interface, for cross-contract calls +#[ext_contract(ext_nft_contract)] +trait ExternalNftContract { + fn nft_mint(&self, token_series_id: String, receiver_id: AccountId) -> Promise; +} + +// Implement the contract structure +#[near_bindgen] +impl Contract { + #[payable] + pub fn nft_mint(&mut self, token_series_id: String, receiver_id: AccountId) -> Promise { + let promise = ext_nft_contract::ext(self.nft_contract.clone()) + .with_static_gas(Gas(30*TGAS)) + .with_attached_deposit(env::attached_deposit()) + .nft_mint(token_series_id, receiver_id); + + return promise.then( // Create a promise to callback query_greeting_callback + Self::ext(env::current_account_id()) + .with_static_gas(Gas(30*TGAS)) + .nft_mint_callback() + ) + } + + #[private] // Public - but only callable by env::current_account_id() + pub fn nft_mint_callback(&self, #[callback_result] call_result: Result) -> Option { + // Check if the promise succeeded + if call_result.is_err() { + log!("There was an error contacting NFT contract"); + return None; + } + + // Return the token data + let token_id: TokenId = call_result.unwrap(); + return Some(token_id); + } +} +``` + +:::info +Values of gas and deposit might vary depending on which NFT contract you are calling. +::: + +--- + +## Buy a NFT + +This is an example on how you can make your smart contract buy a NFT on some marketplace (Paras this case). + +:::info +Please note that in this example the contract will be the owner of the NFT, however, some marketplaces allow you to buy NFT for somebody else. +::: + +```rust +const NFT_MARKETPLACE_CONTRACT: &str = "paras-marketplace-v2.testnet"; + +// Define the contract structure +#[near_bindgen] +#[derive(BorshDeserialize, BorshSerialize)] +pub struct Contract { + nft_marketplace_contract: AccountId +} + +impl Default for Contract { + // The default trait with which to initialize the contract + fn default() -> Self { + Self { + nft_marketplace_contract: NFT_MARKETPLACE_CONTRACT.parse().unwrap() + } + } +} + +// Validator interface, for cross-contract calls +#[ext_contract(ext_nft_contract)] +trait ExternalNftContract { + fn buy(&self, nft_contract_id: AccountId, token_id: TokenId, ft_token_id: Option, price: Option) -> Promise; +} + +// Implement the contract structure +#[near_bindgen] +impl Contract { + #[payable] + pub fn buy(&mut self, nft_contract_id: AccountId, token_id: TokenId, ft_token_id: Option, price: Option) -> Promise { + let promise = ext_nft_contract::ext(self.nft_marketplace_contract.clone()) + .with_static_gas(Gas(30*TGAS)) + .with_attached_deposit(env::attached_deposit()) + .buy(nft_contract_id, token_id, ft_token_id, price); + + return promise.then( // Create a promise to callback query_greeting_callback + Self::ext(env::current_account_id()) + .with_static_gas(Gas(30*TGAS)) + .buy_callback() + ) + } + + #[private] // Public - but only callable by env::current_account_id() + pub fn buy_callback(&self, #[callback_result] call_result: Result<(), PromiseError>) { + // Check if the promise succeeded + if call_result.is_err() { + log!("There was an error contacting NFT contract"); + } + } +} +``` + +--- + +## Query NFT data + +```rust +// Validator interface, for cross-contract calls +#[ext_contract(ext_nft_contract)] +trait ExternalNftContract { + fn nft_token(&self, token_id: TokenId) -> Promise; +} + +// Implement the contract structure +#[near_bindgen] +impl Contract { + pub fn nft_token(&self, token_id: TokenId) -> Promise { + let promise = ext_nft_contract::ext(self.nft_contract.clone()) + .nft_token(token_id); + + return promise.then( // Create a promise to callback query_greeting_callback + Self::ext(env::current_account_id()) + .nft_token_callback() + ) + } + + #[private] // Public - but only callable by env::current_account_id() + pub fn nft_token_callback(&self, #[callback_result] call_result: Result) -> Option { + // Check if the promise succeeded + if call_result.is_err() { + log!("There was an error contacting NFT contract"); + return None; + } + + // Return the token data + let token_data: Token = call_result.unwrap(); + return Some(token_data); + } +} +``` + +--- + +## Transfer a NFT + +This is how a contract can transfer an NFT. + +:::info +Please notice that a contract can only transfer an NFT that they own, or an NFT that they were approved to transfer. +::: + +```rust +const YOCTO_NEAR: u128 = 1; + +#[ext_contract(ext_nft_contract)] +trait ExternalNftContract { + fn nft_transfer(&self, receiver_id: AccountId, token_id: TokenId) -> Promise; +} + +impl Contract { + #[payable] + pub fn nft_transfer(&mut self, receiver_id: AccountId, token_id: TokenId) -> Promise { + let promise = ext_nft_contract::ext(self.nft_contract.clone()) + .with_attached_deposit(YOCTO_NEAR) + .nft_transfer(receiver_id, token_id); + + return promise.then( // Create a promise to callback query_greeting_callback + Self::ext(env::current_account_id()) + .nft_transfer_callback() + ) + } + + #[private] // Public - but only callable by env::current_account_id() + pub fn nft_transfer_callback(&self, #[callback_result] call_result: Result<(), PromiseError>) { + // Check if the promise succeeded + if call_result.is_err() { + log!("There was an error contacting NFT contract"); + } + } +} +``` + +--- + +## List a NFT for sale + +Due to the specifics of putting a token up for sale on a NFT marketplace (more precisely, the need for the owner of the token to sign an approval transaction), you need to do this on the client side. + +Check out how to do it from a [NEAR component](/primitives/nft/interacting/bos#list-a-nft-up-for-a-sale) or from a [web app](/primitives/nft/interacting/web-app#list-a-nft-up-for-a-sale). + +--- + +## Additional resources + + +:::info + Read more about cross contract calls [here](https://docs.near.org/tutorials/examples/xcc). +::: + +:::tip +Example of [how to attach NFTs to a contract call](/develop/relevant-contracts/nft#attaching-nfts-to-a-call). +::: \ No newline at end of file diff --git a/docs/7.primitives/nft/interacting/web-app.md b/docs/7.primitives/nft/interacting/web-app.md new file mode 100644 index 00000000000..4fa76e5f80e --- /dev/null +++ b/docs/7.primitives/nft/interacting/web-app.md @@ -0,0 +1,800 @@ +--- +id: web-app +title: Web Application +hide_table_of_contents: false +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +This section describes how to interact with NFT contracts from a web app. + +:::info +All the examples are using a `Wallet` object, which comes from our [basic template](https://github.com/near-examples/hello-near-js/blob/master/frontend/near-wallet.js) +::: + +:::tip +In order to interact with NFT from your Web App you can request data from various APIs from your app (for example, [Marketplaces API](/primitives/nft/querying/marketplaces)). +::: + +--- + +## Mint a NFT + + + + +```js +import { Wallet } from './near-wallet'; + +const CONTRACT_ADDRESS = "nft.primitives.near"; +const wallet = new Wallet({ createAccessKeyFor: CONTRACT_ADDRESS }); + +await wallet.callMethod({ + method: 'nft_mint', + args: { + token_id: "1", + receiver_id: "bob.near", + token_metadata: { + title: "NFT Primitive Token", + description: "Awesome NFT Primitive Token", + media: "string", // URL to associated media, preferably to decentralized, content-addressed storage + } + }, + contractId: CONTRACT_ADDRESS +}); +``` + + + + + +```js +import { Wallet } from './near-wallet'; + +const CONTRACT_ADDRESS = "x.paras.near"; +const wallet = new Wallet({ createAccessKeyFor: CONTRACT_ADDRESS }); + +await wallet.callMethod({ + method: 'nft_mint', + args: { + token_series_id: "490641", + receiver_id: "bob.near", + }, + contractId: CONTRACT_ADDRESS +}); +``` + +:::note +In order to use `nft_mint` method of the `x.paras.near` contract you have to be a creator of a particular token series. +::: + + + + + +By using [`near-api-js`](https://docs.near.org/tools/near-api-js/quick-reference) + +```js +import { Wallet } from './near-wallet'; + +const CONTRACT_ADDRESS = "thomasettorreiv.mintbase1.near"; +const wallet = new Wallet({ createAccessKeyFor: CONTRACT_ADDRESS }); + +await wallet.callMethod({ + method: 'nft_batch_mint', + args: { + num_to_mint: 1, + owner_id: "bob.near", + metadata: {}, + }, + contractId: CONTRACT_ADDRESS, + deposit: 1 +}); +``` + +:::note +In order to use `nft_batch_mint` method of Mintbase store contract your account have to be a in the contract minters list. +::: + +By using [`Mintbase JS`](https://docs.mintbase.xyz/dev/mintbase-sdk-ref/sdk/mint) + +```js +import { useState } from 'react'; +import { useWallet } from '@mintbase-js/react'; +import { execute, mint, MintArgs } from '@mintbase-js/sdk'; + + +export const MintComponent = ({ media, reference, contractAddress, owner }: MintArgs): JSX.Element => { + + const { selector } = useWallet(); + + const handleMint = async (): Promise => { + + const wallet = await selector.wallet(); + + await execute( + mint({ contractAddress: contractAddress, metadata: { media, reference }, ownerId: owner }) + ); + + } + + return ( +
+ +
+ ); +}; +``` + +
+
+ +--- + +## Buy a NFT + + + + +```js +import { Wallet } from './near-wallet'; + +const CONTRACT_ADDRESS = "x.paras.near"; +const wallet = new Wallet({ createAccessKeyFor: CONTRACT_ADDRESS }); + +await wallet.callMethod({ + method: 'nft_buy', + args: { + token_series_id: "299102", + receiver_id: "bob.near", + }, + contractId: CONTRACT_ADDRESS, + deposit: 205740000000000000000000 // attached deposit in yoctoNEAR, covers NFT price + storage cost +}); +``` + +
+Example response +

+ +```json +"299102:1" +``` + +

+
+ +
+ + + +By using [`near-api-js`](https://docs.near.org/tools/near-api-js/quick-reference) + +```js +import { Wallet } from './near-wallet'; + +const CONTRACT_ADDRESS = "simple.market.mintbase1.near"; +const wallet = new Wallet({ createAccessKeyFor: CONTRACT_ADDRESS }); + +await wallet.callMethod({ + method: 'buy', + args: { + nft_contract_id: "rubennnnnnnn.mintbase1.near", + token_id: "38" + }, + contractId: CONTRACT_ADDRESS, + deposit: 1000000000000000000000 // attached deposit in yoctoNEAR, covers NFT price + storage cost (optional) +}); +``` + +
+Example response +

+ +```json +{ + "payout": { + "rub3n.near": "889200000000000000000", + "rubenm4rcus.near": "85800000000000000000" + } +} +``` + +

+
+ +By using [`Mintbase JS`](https://docs.mintbase.xyz/dev/mintbase-sdk-ref/sdk/buy) + +```js +import { useState } from 'react'; +import { useWallet } from '@mintbase-js/react'; +import { execute, burn, BuyArgs } from '@mintbase-js/sdk'; + + +export const BuyComponent = ({ contractAddress, price, tokenId, affiliateAccount, marketId }:BuyArgs): JSX.Element => { + + const { selector } = useWallet(); + + const handleBuy = async (): Promise => { + + const wallet = await selector.wallet(); + + const buyArgs = {contractAddress: contractAddress, tokenId: tokenId, affiliateAccount: affiliateAccount , marketId:marketId, price:price } + + await execute( + {wallet}, + buy(buyArgs) + ); + + } + + return ( +
+ +
+ ); +}; +``` + +
+
+ +--- + +## Query NFT data + + + + +```js +import { Wallet } from './near-wallet'; + +const CONTRACT_ADDRESS = "nft.primitives.near"; +const wallet = new Wallet({ createAccessKeyFor: CONTRACT_ADDRESS }); + +const response = await wallet.viewMethod({ + method: 'nft_token', + args: { + token_id: "1" + } +}); +``` + +
+Example response +

+ +```json +{ + "token_id": "1", + "owner_id": "bob.near", + "metadata": { + "title": "string", // ex. "Arch Nemesis: Mail Carrier" or "Parcel #5055" + "description": "string", // free-form description + "media": "string", // URL to associated media, preferably to decentralized, content-addressed storage + "media_hash": "string", // Base64-encoded sha256 hash of content referenced by the `media` field. Required if `media` is included. + "copies": 1, // number of copies of this set of metadata in existence when token was minted. + "issued_at": 1642053411068358156, // When token was issued or minted, Unix epoch in milliseconds + "expires_at": 1642053411168358156, // When token expires, Unix epoch in milliseconds + "starts_at": 1642053411068358156, // When token starts being valid, Unix epoch in milliseconds + "updated_at": 1642053411068358156, // When token was last updated, Unix epoch in milliseconds + "extra": "string", // anything extra the NFT wants to store on-chain. Can be stringified JSON. + "reference": "string", // URL to an off-chain JSON file with more info. + "reference_hash": "string" // Base64-encoded sha256 hash of JSON from reference field. Required if `reference` is included. + } +} +``` + +

+
+ +
+ + + +By using [`near-api-js`](https://docs.near.org/tools/near-api-js/quick-reference) + +```js +import { Wallet } from './near-wallet'; + +const CONTRACT_ADDRESS = "x.paras.near"; +const wallet = new Wallet({ createAccessKeyFor: CONTRACT_ADDRESS }); + +const response = await wallet.viewMethod({ + method: 'nft_token', + args: { + token_id: "84686:1154" + } +}); +``` + +
+Example response +

+ +```json +{ + "token_id": "84686:1154", + "owner_id": "bob.near", + "metadata": { + "title": "Tokenfox Silver Coin #1154", + "description": null, + "media": "bafkreihpapfu7rzsmejjgl2twllge6pbrfmqaahj2wkz6nq55c6trhhtrq", + "media_hash": null, + "copies": 4063, + "issued_at": "1642053411068358156", + "expires_at": null, + "starts_at": null, + "updated_at": null, + "extra": null, + "reference": "bafkreib6uj5kxbadfvf6qes5flema7jx6u5dj5zyqcneaoyqqzlm6kpu5a", + "reference_hash": null + }, + "approved_account_ids": {} +} +``` + +

+
+ +By calling a Paras API method + +```js +const tokenData = fetch("https://api-v2-mainnet.paras.id/token?token_id=84686:1154"); +``` + +
+Example response +

+ +```json +{ + "status": 1, + "data": { + "results": [ + { + "_id": "61dfbf27284abc1cc0b87c9d", + "contract_id": "x.paras.near", + "token_id": "84686:1154", + "owner_id": "bob.near", + "token_series_id": "84686", + "edition_id": "1154", + "metadata": { + "title": "Tokenfox Silver Coin #1154", + "description": "Holding this silver coin in your wallet will bring you health and happiness \uD83D\uDE0A", + "media": "bafkreihpapfu7rzsmejjgl2twllge6pbrfmqaahj2wkz6nq55c6trhhtrq", + "media_hash": null, + "copies": 4063, + "issued_at": null, + "expires_at": null, + "starts_at": null, + "updated_at": null, + "extra": null, + "reference": "bafkreib6uj5kxbadfvf6qes5flema7jx6u5dj5zyqcneaoyqqzlm6kpu5a", + "reference_hash": null, + "collection": "Tokenfox Collection Cards", + "collection_id": "tokenfox-collection-cards-by-tokenfoxnear", + "creator_id": "tokenfox.near", + "blurhash": "U7F~gc00_3D%00~q4n%M_39F-;RjM{xuWBRj", + "score": 0, + "mime_type": "image/png" + }, + "royalty": { + "tokenfox.near": 1000 + }, + "price": null, + "approval_id": null, + "ft_token_id": null, + "has_price": null, + "is_creator": true, + "total_likes": 8, + "likes": null, + "categories": [], + "view": 4 + } + ], + "count": 1, + "skip": 0, + "limit": 10 + } +} +``` + +

+
+ +:::info +See the [Paras API documentation](https://parashq.github.io/) for the full list of methods. +::: + +:::note +When you call Paras smart contract method it returns data that are stored in the Paras NFT smart contract. It means a response contains only data about NFTs which were minted via Paras NFT contract. + +When you call Paras API methods it returns data from other NFT contracts as well, due to the work of the indexer. It means you might want to pass more parameters like `contract_id` or `owner_id` to make the response more accurate. +::: + +
+ + + +By using [`near-api-js`](https://docs.near.org/tools/near-api-js/quick-reference) + +```js +import { Wallet } from './near-wallet'; + +const CONTRACT_ADDRESS = "anthropocene.mintbase1.near"; +const wallet = new Wallet({ createAccessKeyFor: CONTRACT_ADDRESS }); + +const response = await wallet.viewMethod({ + method: 'nft_token', + args: { + token_id: "17960" + } +}); +``` + +
+Example response +

+ +```json +{ + "token_id": "17960", + "owner_id": "876f40299dd919f39252863e2136c4e1922cd5f78759215474cbc8f1fc361e14", + "approved_account_ids": {}, + "metadata": { + "title": null, + "description": null, + "media": null, + "media_hash": null, + "copies": 1, + "issued_at": null, + "expires_at": null, + "starts_at": null, + "updated_at": null, + "extra": null, + "reference": "F-30s_uQ3ZdAHZClY4DYatDPapaIRNLju41RxfMXC24", + "reference_hash": null + }, + "royalty": { + "split_between": { + "seventhage.near": { + "numerator": 10000 + } + }, + "percentage": { + "numerator": 100 + } + }, + "split_owners": null, + "minter": "anthropocene.seventhage.near", + "loan": null, + "composeable_stats": { "local_depth": 0, "cross_contract_children": 0 }, + "origin_key": null +} +``` + +

+
+ +:::note +When someone creates a NFT on Mintbase they need to deploy their own NFT contract using Mintbase factory. Those smart contract are subaccounts of mintbase1.near, e.g. `anthropocene.mintbase1.near`. +::: + +By calling a Mintbase GraphQL API method + +```js +const tokenData = fetch("https://graph.mintbase.xyz", { + method: "POST", + headers: { + "mb-api-key": "anon", + "Content-Type": "application/json", + "x-hasura-role": "anonymous", + }, + body: JSON.stringify({ + query: ` + query getToken{ + tokens: nft_tokens( + where: { + token_id: { _eq: "84686:1154" } + } + ) { + tokenId: token_id + ownerId: owner + contractId: nft_contract_id + reference + issuedAt: issued_at + copies + metadataId: metadata_id + } + } + `, + }), +}); +``` + +
+Example response +

+ +```json +{ + "ok": true, + "status": 200, + "contentType": "application/json", + "body": { + "data": { + "tokens": [ + { + "tokenId": "84686:1154", + "ownerId": "bob.near", + "contractId": "x.paras.near", + "reference": "bafkreib6uj5kxbadfvf6qes5flema7jx6u5dj5zyqcneaoyqqzlm6kpu5a", + "issuedAt": "2022-01-13T05:56:51.068358", + "copies": 4063, + "metadataId": "x.paras.near:5210047642790498956c9669d6a37b98" + } + ] + } + } +} +``` + +

+
+ +:::note +In the future, users may be required to register using an api key. For now, simply passing the valueanon for `mb-api-key` will work. +::: + +By using [`Mintbase JS`](https://docs.mintbase.xyz/dev/mintbase-sdk-ref/data/api/tokenbyid) + +```js +import { tokenById } from '@mintbase-js/data' + +const { data, error } = await tokenById( '1','rub3n.testnet'); + +if (error) {console.log('error', error)} + + +console.log(data.tokenData[0]) // => token metadata +``` + +
+
+ +--- + +## Transfer a NFT + + + + +```js +import { Wallet } from './near-wallet'; + +const CONTRACT_ADDRESS = "nft.primitives.near"; +const wallet = new Wallet({ createAccessKeyFor: CONTRACT_ADDRESS }); + +await wallet.callMethod({ + method: 'nft_transfer', + args: { + token_id: "1", + receiver_id: "bob.near" + }, + contractId: CONTRACT_ADDRESS +}); +``` + + + + + +```js +import { Wallet } from './near-wallet'; + +const CONTRACT_ADDRESS = "x.paras.near"; +const wallet = new Wallet({ createAccessKeyFor: CONTRACT_ADDRESS }); + +await wallet.callMethod({ + method: 'nft_transfer', + args: { + token_id: "490641", + receiver_id: "bob.near" + }, + contractId: CONTRACT_ADDRESS +}); +``` + + + + + +By using [`near-api-js`](https://docs.near.org/tools/near-api-js/quick-reference) + +```js +import { Wallet } from './near-wallet'; + +const CONTRACT_ADDRESS = "thomasettorreiv.mintbase1.near"; +const wallet = new Wallet({ createAccessKeyFor: CONTRACT_ADDRESS }); + +await wallet.callMethod({ + method: 'nft_transfer', + args: { + token_id: "490641", + receiver_id: "bob.near" + }, + contractId: CONTRACT_ADDRESS +}); +``` + +By using [`Mintbase JS`](https://docs.mintbase.xyz/dev/mintbase-sdk-ref/sdk/transfer) + +```js +import { useState } from 'react'; +import { useWallet } from '@mintbase-js/react'; +import { execute, transfer, TransferArgs } from '@mintbase-js/sdk'; + +const TransferComponent = ({ tokenId, contractAddress }: TransferArgs): JSX.Element => { + const { selector, activeAccountId } = useWallet(); + + const handleTransfer = async (): Promise => { + const wallet = await selector.wallet(); + + const transferArgs: TransferArgs = { + contractAddress: contractAddress, + transfers: [{ + receiverId: 'mb_carol.testnet', + tokenId: token.tokenId, + }], + } + + await execute( + { wallet }, + transfer(transferArgs), + ); + }; + + return ( +
+ +
+ ); +} +``` + +
+
+ +--- + +## List a NFT for sale + +Basic NFT contracts following [the NEP-171 and NEP-177 standards](https://nomicon.io/Standards/Tokens/NonFungibleToken) do not implement marketplace functionality. + +For this purpose, there are ecosystem apps such as [Paras](https://paras.id/) or [Mintbase](https://www.mintbase.xyz/), that use dedicated marketplace contracts. + +In order to put a NFT for a sale on a marketplace you need to do two actions: + +1. Cover data storage costs in the marketplace contract. +2. Approve the marketplace to sell the NFT in your NFT contract. + + + + + +```js +import { Wallet } from './near-wallet'; + +const CONTRACT_ADDRESS = "marketplace.paras.near"; +const wallet = new Wallet({ createAccessKeyFor: CONTRACT_ADDRESS }); + +await wallet.callMethod({ + method: 'storage_deposit', + args: { + receiver_id: "bob.near" + }, + contractId: CONTRACT_ADDRESS, + gas: 300000000000000, // attached GAS (optional) + deposit: 9390000000000000000 // attached deposit in yoctoNEAR (optional) +}); + +await wallet.callMethod({ + method: 'nft_approve', + args: { + token_id: "1e95238d266e5497d735eb30", + account_id: "marketplace.paras.near", + msg: { + price: "200000000000000000000000", + market_type: "sale", + ft_token_id: "near" + } + }, + contractId: "nft.primitives.near" +}); +``` + +Method `nft_approve` of a NFT contract also calls the `nft_on_approve` method in `marketplace.paras.near` as a callback. + + + + + +```js +import { Wallet } from './near-wallet'; + +const CONTRACT_ADDRESS = "simple.market.mintbase1.near"; +const wallet = new Wallet({ createAccessKeyFor: CONTRACT_ADDRESS }); + +await wallet.callMethod({ + method: 'deposit_storage', + args: { + autotransfer: true + }, + contractId: CONTRACT_ADDRESS, + gas: 300000000000000, // attached GAS (optional) + deposit: 9390000000000000000 // attached deposit in yoctoNEAR (optional) +}); + +await wallet.callMethod({ + method: 'nft_approve', + args: { + args: { + token_id: "3c46b76cbd48e65f2fc88473", + account_id: "simple.market.mintbase1.near", + msg: { + price: "200000000000000000000000" + } + }, + }, + contractId: "nft.primitives.near" +}); +``` + +Method `nft_approve` of a NFT contract also calls the `nft_on_approve` method in `simple.market.mintbase1.near` as a callback. + +By using [`Mintbase JS`](https://docs.mintbase.xyz/dev/mintbase-sdk-ref/sdk/list) + +```js +import { useState } from 'react'; +import { useWallet } from '@mintbase-js/react'; +import { execute, list, ListArgs } from '@mintbase-js/sdk'; + + +export const ListComponent = ({ contractAddress, marketAddress , tokenId, price }:ListArgs):JSX.Element => { + + const { selector } = useWallet(); + + const handleList = async (): Promise => { + const wallet = await selector.wallet(); + + await execute( + {wallet}, + list({ + contractAddress: nftContractId, + marketAddress: marketId, + tokenId: tokenId, + price: price + }) + ) + } + + return ( +
+ +
+ ); +}; +``` + +
+
\ No newline at end of file diff --git a/docs/7.primitives/nft/introduction.md b/docs/7.primitives/nft/introduction.md new file mode 100644 index 00000000000..44b2b20fc22 --- /dev/null +++ b/docs/7.primitives/nft/introduction.md @@ -0,0 +1,42 @@ +--- +id: introduction +title: Introduction +hide_table_of_contents: false +--- + + +import {FeatureList, Column, Feature} from "@site/components/featurelist" +import ContactUs from '@site/components/ContactUs.mdx'; + + +- [What is an NFT?](#what-is-an-nft) +- [How to create NFT collection](#how-to-create-nft-collection) + +--- + +## What is an NFT? + +In contrast with fungible tokens, non-fungible tokens (NFT) are unitary and therefore unique. This makes NFTs ideal to represent ownership of assets such as a piece of digital content, or a ticket for an event. + +As with fungible tokens, NFTs are **not stored** in the user's wallet, instead, each NFT lives in a **NFT contract**. The NFT contract works as a bookkeeper, this is: it is in charge of handling the creation, storage and transfers of NFTs. + +In order for a contract to be considered a NFT-contract it has to follow the [**NEP-171 and NEP-177 standards**](https://nomicon.io/Standards/Tokens/NonFungibleToken). The **NEP-171** & **NEP-177** standards explain the **minimum interface** required to be implemented, as well as the expected functionality. + +:::tip Reference Implementation +We provide a [reference implementation](https://github.com/near-examples/NFT) ready to be deployed and use. +::: + +:::info NFT & Marketplaces +Be mindful of not confusing an NFT with an NFT-marketplace. NFT simply store information (metadata), while NFT-marketplaces are contracts where NFT can be listed and exchanged for a price. +::: + +--- + +## How to create NFT collection + +The easiest way to create NFT collection is using NFT marketplaces. Let's look at some options. + +1. [Paras](https://paras.id/) - a classic NFT marketplace. Just login with your NEAR account, create collection and share the link with your community or integrate NFT functionality into your app. +2. [Mintbase](https://www.mintbase.xyz/) - a marketplace allows you not only create your own NFT collection, but buy NFT with credit cards and stablecoins as well. +3. [Enleap](https://enleap.app/) - a NFT no code launchpad. Provides NFT minting, staking, whitelist managing, tracking functionality. + \ No newline at end of file diff --git a/docs/7.primitives/welcome.md b/docs/7.primitives/welcome.md new file mode 100644 index 00000000000..fb54b9ab059 --- /dev/null +++ b/docs/7.primitives/welcome.md @@ -0,0 +1,23 @@ +--- +id: welcome +title: NEAR Primitives +sidebar_label: Home +hide_table_of_contents: true +--- +import {FeatureList, Column, Feature} from "@site/components/featurelist" +import ContactUs from '@site/components/ContactUs.mdx'; + +Welcome! Here you will find blockchain primitives such as Fungible Tokens (FT), Non Fungible Tokens (NFT), Decentralized autonomous organizations (DAO), and more. + +These primitives are the building blocks of the NEAR ecosystem. They are designed to be composable and easy to use. + + + + + + + + +--- + + \ No newline at end of file diff --git a/docs/index.md b/docs/index.md index f4abcd2608c..d05e27b1c2b 100644 --- a/docs/index.md +++ b/docs/index.md @@ -50,7 +50,7 @@ Welcome, this is the starting point for all NEAR documentation. Learn to build a
- +
Solutions diff --git a/website/sidebars.json b/website/sidebars.json index 4c62273f75b..0cfddad73a2 100644 --- a/website/sidebars.json +++ b/website/sidebars.json @@ -359,6 +359,63 @@ "href": "https://aurora.dev" } ], + "primitives": [ + "primitives/welcome", + { + "type": "html", + "value": "
" + }, + { + "type": "html", + "value": " Non Fungible Tokens (NFT) " + }, + "primitives/nft/introduction", + { + "Using NFTs": [ + "primitives/nft/interacting/bos", + "primitives/nft/interacting/web-app", + "primitives/nft/interacting/smart-contract", + "primitives/nft/interacting/near-cli" + ] + }, + "primitives/nft/additional-resources", + { + "type": "html", + "value": "
" + }, + { + "type": "html", + "value": " Fungible Tokens (FT) " + }, + { + "type": "html", + "value": "Coming Soon" + }, + { + "type": "html", + "value": "
" + }, + { + "type": "html", + "value": " DAOs " + }, + { + "type": "html", + "value": "Coming Soon" + }, + { + "type": "html", + "value": "
" + }, + { + "type": "html", + "value": " DEX " + }, + { + "type": "html", + "value": "Coming Soon" + } + ], "tools": [ "tools/welcome", { diff --git a/website/static/docs/assets/welcome-pages/examples.png b/website/static/docs/assets/welcome-pages/examples.png index d06c9e3cf1191db1b76f5c8662e4b65b304e1bfe..95f7cdfd37846a77dc0d6fe95230059f2eb66243 100644 GIT binary patch delta 66420 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 delta 70495 zcmXt9Wl$V#w_IEU3&DcB1}C^n@Zjzi+=I*DF2UV{LvVK|K!ODi?(PoD-S?}yQ?q}j zwsz~WK7G1-VtWx5*AZ&V4S{>~v?Bg%zqiT?{*&zB=6ZM;aTNH7Y?@?tazTs@Hbgt6 z`q&Z9>+F61)_ec7)#U(nQ}Mz^lQR-^0Od)-6q`?ZOY0TNPp=K${;yDgwv$I4#J)Y};?!pStHDThBIbvw_x-!77VGqUWWre6(~i|iSm#Ih%9CHHh+ zi8#yAEn(_-Y~sNu>(AC!->P!qBoQXXgRTbLS1;72PMX9Jx{9wye`FViwymCQYJRe) z-OFYNKO%N;Bv8XfYNrGLv}v|d`LSC5Mr#`~8(TL;^z$xM4=Oqtv>~%g)U7Y2G87-! z2u6;F--}@!uQSsZTM4;=t4lG&6Hb|6THh_nOdd3vHOfWW@V8x)u$JIbxT!kI%>tmr)%IyVgd%O^`xE=dmF@@n_ zgG#%vh0t$qi>j;Vl7ag_n95p4@ft0>0&u)P!UwO(BD*J5lLB!;N#&K(zA23CM%r@L zgMXQporIN2r6h#P4jevP0|GztR+#C!+`+#iX*s6Q=-EP3I$fWzc}wYx;ng$nqDmDAYH2n!*se zO3R`di@5AkMwqoD+mZB-(jg^Dc}1IHS#*Ak+ijR-EFcL;I(j1G@TD5)_lQX3&zGdp zFE{RN;aU+Z@e(E<&dz>GVN?8Z2uV7I&;V2woSFZLdRi^VkIitC%DhhR6(`nJX$P**(rW?c5hA zMyMkak_oW`Wq5;Z|04Ig^Pg*Xb}EpHfoHh6VU67)LykLx4y7g@T!#G@lF32;#6+Ty z_&0}P;?B!OhP0pj*taV-#BIbt zD77f%ubxI91guYM{evG!O5j5ane1J^kI)3EX32*+@5zL!R!VqZzq{>*(?9P2pi)ELjUje{o#oY`rJv+VQtez zP2ng9bT7e!CUl&`U(-RdhC2#x)DdR@Fp(M%F$4qpdrQ|(k4z~=EiUu1lu%Igl>w`8 zw%w*%YnpJWr#*$G8ZBmO60v8jq4y((+IuOLi+y{?t)$my7!ao54ci{8cGaAs!Sh}2Dt{dAAtutb#-;~$`uSgNy-c_Wwb)%h_>8W)$hH)N3f`q zS^{zgZ2^g;PvIzdfFHpsj!;52j^Tl4jYa+Iqd$MQc^)YYR7j>wF(y1b>0f8+%3RAWLX%y8kc#^-%W z`ZET!g{Pt^#Uy#b{W3kQI&Pdd0L|lVfpdH<8*@{PA{4qHO{R7%`oy2zFqGk)5OT}eI zll0@!*xN4ay$uU#q_X*kYB~|5V${8#odS&HbO&mQ3w*93X!D7NZgWUx??gqB=dOYz z)$KwU&_LK4R_bx3nM46!M&mQk2DhG_6~4qWy;g|_{H|euB}M~<%Yu;+FIUol*xAxA zuppb`qgv?~RPY0Ne8 z3?*+epcn*(;Tc|k6_2Fg+}kEsv_+Q{m@=I=`;; z2iLd7P>K?ww2IhiZN6qwZs7nt+^qV?l2MZF?;a1n!Y`A+8;{}xUC2h3lF&O3;-uyj zp4AvPB5s#>x5gF$XbIu{0aG|?jdmnWA4(ACIEDnu#}NnUL51{FL5p7!0BT}blyL0$ z>ApS_LbGQ0+CL^_YjUl((>urVD@^Yr=W>@W-$U3x8*Vn)rbZU7GrYMr*ZDX^{4pJj zk%z}imWF+)uEMHo)E!i8!rn_MmS+2Th5fM-yRPC(zhV=mP1H$8n^P!YLvo>1tex!S zX#I(inx_RwjlkZBPKJfsJIj>*Xvk&e_q|L5VXn#2iG`pv0zo?JaJ{i{i;GAe~wjwHtZ-Ki~*2)4wBM+&zMQuwW^c}qBy^Q+mh zD*l$eS>na6oE3GM1o%g)EmLS0>A5{wj4P_TFjtrdtySfTY%S^mT9n|zl`$0RF6SiV z$iF&!wA!i+reB?}>R19IYFFG2)wwo|0}QZR zPuW*fF#=2S=Dtz(Iio%+$j$~hPnkC+iB4(bzQ+$25~+=o@brPR)_;~(&kYRry)Hk` zuW7-rW@awgCOca`d|@FWR;5;3c|?gqmjk4fD@BFm_6kug5#*@Mz#NUziO@r3X#DEV z&Nuz<4z-pMy^MB%_PzI$f0Y*>+%l#IN3MQHUrqb6IhNpuj1;^PJ0byZS5`J6sDvdN@BwgO zg_f7z=5CA_=QRx+zL;h;BM@lsV~<1b;&pu1NYLjFd!EnU}u^$95Zm112imC}%efoTCIpIf4d;-3BzC1R1EoD&z z!}}f|p7*ANU{R(8l#1>~9IsFaTDL!_e?p(-LKL7(GSsBe@(eSO>^ z(j73MLMC*aE3MAch`7sV2S@etGL+%=OfbRGuoG|07q^#WaYL`*`8%5EOCWsY87zp8 zg)T3NK>z18swd$WziX>xP}tTlq(^y#G|&VimQ(k7?xRpKR^FSuk-z!jwGnyLqP9xB z*BYgPclCJiNF`ydU;g_6+HrC0cjylvL~)@-R_oiQULKvu)c8@=rvMgG(A@s)&Vvw?^x!pWzUE z-tOrK-W>OGV2Fu{6Qv_8xziB2-u&0}(#Sy{97Kx1uxdBVP(p7ltuOXl{DB9xQ{Twy zOM50Bbhwg^L?Ci>WAPjtc$n{b9{4mvdqzMlUFYU3~B%Gp1fH=y9xjA6&lk62y3>o))?O@I6 z->s<%eWO$vq&gZC3FmLY&tkGP9udVyrHX0W2b(eZH8v_(;_B~Y zdSKJ>LaDz0eASZYlh3+`0)&Kk2J|Zk^o4%CKOjogpLv8jvH>k1c%TVJK>mXVb!Lp4 z5NrHVkigoi9e=8fVUvw(J?%w%?_1R`KjO*_bxZfAf7+Hnl5D+#+e_+WQhnbfd$ud{ zuJ+rHc3g(S`3RF#KUT|uERA;A=SF%ENSx9IVqL|8iL zaSJveJ^!b_h31RdPnf#A?yn@h@aJiN;n>Mw_iBz1^D`eSyWyr2%9$S91?zCEuuwiQ zfx3tSpaTOU3L{E;?q7c>ym?h=d%d4`{1<|my#ZigFqqM#mv)gz!R*@4N+9F3@L(&7 z$ot7+!h>m)*}L>G`FMGEL{7FOvbZ4 z(b?(O?`|c}b!dk4QQCTj@u3JWDF6w4`sSsnpA?BZy1Vl~7!c#Qm53iW)B?9Gqk~tI z4O7{|Rx@|rujIr?BUP&!&Xi6!3U>EueOT5 zdJKS-H+l82>~_p>F`P}~fg*}YD_mg> z$#)5IIfeX4t!fo+N)S%PhK()SF!0&0-P&Wc8pJ8DARcFc7T}q~7Aq2p`pb&-N5NNe z;`F}{3;}1A_5`HFQ?cvvaJ?_6XAjpIp8X;SQ_uBCX+biNuiERLfkO*zl%T$3dA zeG^t}aCppn;vP?Lq##1gIcGe2WD6cKq+f1fTEscz#ZITCVfuB>T|>tZAMn78__cfT zNHI+SqRxz7&5i$j-x<+{Q+8-$CYkorXf8hEvaAnLy$4PsdP^I`t9^N~EY0TgM_6s@JpKTsSH;>l=X4zu|wzm&9ek8c(dFh(B79jhREBsCe z!>q4A)YIxW6+JWaZ<#EMVhc|Q{#%5f&wc*o3qnj>Y++Ru`nYD*pwRs)W*W7{4+Es| za;4NY|B}CYslia90l+r$F@JT=LOwexqLd(DL+X$(A&V+BHuXjKTg^!)AZr;NIR@vS z(WD~J+6ZuhJA_(v{cxXIVagq(h*C6O-fthA9}XWxG@;oDC#s_d@QT!@ntY&w3Cf^> zjWU3zG}+-*{3UVgk3IZ_06~UZo{OOj6#O2CqzH9b{Lb4@6W}32bM!$zwd{cnZMXfln&~7qG>}@m&8;Op^y?wCzfhpudK+pL3)s0D6=pNCXMv#GnZkJ;r za3SBFxe!?TMw@5OSk6f`g?3p*Df;>|Rox7()^F;Oj*SKJ%Z^*PWb3L!m7h7uyl_2> ztvwzdp6TqKG!Xb($9AUAWK5!gD{sVB8ni*%hGxo@lOF-Ui^|XMjTGK!>LUid+0sHoc{BnW1-9#%@FFwf!(N(r7Jk1RH<72zJv8lG?eASfh& zZ?Rzchw}@}8~kU#0py3*?-n1D8Ici!k;4bFu@#t|fu}rqo`4^jB>^ea@(fcvV(bTL z6es~We);wF)Xxjr%$vSnRmQ{2qu3PBva!UKTbw>rd}Wqg9a2kQU4=4J(K!0hJjg9Zzs$R#jMCu9&6!6j%7|jRcZ1#0h!F}ZI{JQMI+^OcQ+xLQT z3KkuNOf=&Cm*KD95m}aOIEXQdo^1p^`wqyu1Bu#X;&z(?TGWm(#yMH!TX&?%f%)0b zNCB5EG|=|(4>Sg#QXF=Y{$6YJuu>8ecty2OwYO|#C-IYivHfzdyg$wZ`+g`ZC97) zhl~5wOANLo>BKNYFjb2lBW$lOh~O1Ki0Ovg*x@w&E2#ZQwe#fQ>;%1Jh@!~FNAqDt zv8vzz{;zKt64X!RqtNvzH}lT<+HBcC1P4+N{OgKmKGE6Jg^Q{&wX`P4w@JqKPE;?) z68~`vw-j+nk_7NQ_EsYs3>*iCtt4U7@C)eDvA*cVh^%|SOks^6kf&780%~fEyG0m> zFa7_CJKeMs9L``a#r$F{nJO zy|3P`11-kH#9L5)!Y&cW!Ku?Cp`R_?6fE(?_KPV*n>ez!<82T!4jz7LrKvhw2wWq5 zpu zE9eKu0v(}yAwQkl^2d)73gY~Bh(v5{19T2t({7XLXrSjl@m{2SqfwsG`(#y0uy~on zTwZm6r7p;iM%U1gj()!Zy7bVsm%u8Hfrn3ikNoDfQNnBQ{0FEGme@s0gCu*ajs3U9$`G$A#64gF-I_67rKs z(?az27xeJQH_fd_YIWbom0tdE&>xTcA*D7;;juT(0>WXxC%Qw*FCkjB{~NsgND&~3 zTtHhL`1E1pt$q=)n(G}~va7-y$$vbJCqy(=A3RVX+k?eWXufg-=)>r{|5hf!rc~?g zB;DWm4hWPCEMwKY1yL8|w-eHcv+f~y!(8}9Ga$&Y*EGWeOpG9Pr{{s@0X@;iBYA#` zLS#n`8aaKcbX;EhC0YbgR1l68P3))3H%+L*D&I?Gu)PpcN1X6CDb?z&!N8+AJax2Q zC|6V|=IfJ9XF%f(O&ezdA3mt!ddJwzx$ICEP2@EM(m+@BA9)nI7)J17Bcie-1NNmzAgh^=EgDO({h9tl#hbG5W4<@O*bVaHv-L&6-K`=iux8dY-zFVjAmq zFo{6pc?ejr&W-8FazdseSE2SeIH%RSNg~btnZ#pjxR~c_@oQZjd$x!NX&TF?!pa7; zE+L_dN8ffqhZZ8k8hqRoAjK+uDInt=C%Yp=a3Vv1hsiG+y;IA*(#?p;Lae*nyt2 zwfpFzj^?xc`w3tg$}n^qKvRrdsK<6xc4#Q@eu_jUDq6xy|5X8uB#O1@ipy5^-<}gk zKK0&n&CT4tSC=Ea&Rg)GrKOp#8KQ!e>EZJx!*g>Z4c2H`4a;)Wi!IzT z9p{fx77O_pL9PzKsNjGrK*=1hbXbbrVI<*o6 z{v`WrC5j7xZoYYJzj(d!r6&YU33G5nq3yFC%ozG^O1%JEWN$ErH4BC6?ybI$*nje7 z6ab$3JJJ zqoZoStZSI<&XKG)Pge`oAQe3FM0iT%3r&rFjpPvOzV8f4FXl&Fdm8lQQQRM!sZm0} zo{VFgj0}LRH8HgAV4KPD*RV;sSIEx5lB+EWtp-BA#JCyEoJteHK8OL5C>K9A`RPrJ zzl|mnyQAfY&Ns6xB|4%YfAO<{YTVaDy}ZjiKF_cW`|) zMmPcfuSk{s>gef8felCsXC=azRlwt~3V8gd30D^z3Tvf}tPoq~N{&8l&3GyJ8$^ zAf9;W`MfKg2foEzxK3@1=upim!(2;<{NLVb9ib~%-?j+5x31GN$*tcz1Lj=u` zC-9)zU1h791&>OCh z=;ueBw98s1)ggD-(bA57LK@;h?R(rD;6miX3`PD3)1=*nXOv>|WMX8{$g0cE`#O(h0++^r?<;JheqfcnXIOpAuC0%|$u0xXOzHAK`bX<-; zxwW0i4IiEz_1pINDYgXVvEWGc^-cElCe&bTM^@`O-*?^r=!*UIed5J3TP@bQZCKAB z7*yc&_(WcJ+42Eqw(-^g8ICOkhoQ+^`aghL87TDR?z%5l!80dk-zlHjcc@rFSI|fo0 zFT7mZNDCOg{bo8iJ5fk)`O%2;smbjE4@WeSnm#Hh^3wU{{@#SXkC(-uGXQwoe?wC8 z-OkeX8m~S)^4IqT1_l;;_9d!TI%$|rmo|6mimV(mJBwwSmo6dC>6{)cc&s|v$3M+u z;_u0N1sr>-qn-PT^7BEQgoMh5h9yJo&|WG%JzZ2wi|6V2X^YWQyZ{V&csjPS>x^*p ze_rA9s4=eNd>d+j9VJ5+)NoTCtK7hZ7iHKzGeyu zO1?{+C0`cIt-E?B-`~yo*5!_THukn{;LvK~kZ;OzIQj7(`}{_A`7)xFJS-n=IbR`c zTvoX8n+I4Q41`1a_`G-PU1u}L_|c#lJsOW$T#PtL3W{^CX)FboHRtf){|^)NOJ(!> z#~iyVF$|56or*2YRX&`#iYVyqye5srZ9(g1v@+YM5Q{7}6bvGZnKU=rrJ}cosV|fi z@-O?nvIYDI>EcOt=MVGJd(Vx$J{aTxIiBXTdsXSlK>a;cRrmGJDqT`-EY#52?VJ|Z z)!1ZZ9E2XPM~j!OJP4MCmlMluQ z`wg^{j~(=rBVxh8|S`FT+>aOM!h-|2Q-aIgF*&OIxn`OOCpXLLqkKg z8{C=CI?jbxSZ|7pi?y9+f#2HgS6}Uxo~XYN^Th}Wh=_`e+&^r!HF!RXK=8ZYipT~| z>+Vh)2TGsswz@$Cj3-jHa0h9D`c>e^HaJBq=iu7BhF@53zuffs&z0Actx zBK3*(CVQO!%ptgZti9D+|I><1j)S@x?6Kb0@^*#v!F~jT3}^)C3W_C#Ik~yR(hNPZ zCf{BsOMlTY(KIHcWa&Yrv2jvL8aLi+-|Z3A15kTb_?ag_W-tIb~zOMQJ}O4=|_Bj)rWU0L5R8W?4+ z*3{L#CVeN6Yu*80{Q6YrSDCE|on3y|Lh`wi@IZB$W(z~DGni_m!9$>gLb67M6QkR7 z_SOKyS{@|QjYlGaW1MV;<^Oz2lVa*7>^rZKEge{bcr~b@S=0SgQG5X`7j#tVgQ zQB&R%VM$?CYOcraLhaC;bNdm?=lcx!oAFru%VFCdU`S2Glh$JMvElXkW9Zv4K5O5+ zqra^x(_W~Qly-v&mFBt|&zj%060h4!I>V%vkuOHeNU(H^aE6P3JD=AH{aO1PB-;Uv zSCA{jkL>J^&huemSM@u<_tj1CHRpV%ohj*alg$RoTM)VN>eH=u$611G+p0`rh`?F< z`{=$WgK>IUtqj=VB~k$%)xhw zJE!Hlg%5YqqgADnki3rS$!Z~1rYOM>vd z&Gsu!JEK@?MxBPNxn6fVg10xbN!Sn_eFvUq!8%+K$kH`EGZQC?h}#Q+@Y1u2oLe5R zH~dOVmjyNig+jZ<3oZBYxJNdt&DUDzL$3dxj^O2QN9WM8$-DCbD0Ilm>s{t2n?3`2 zd+e4;IVx)-%a&mfH9={hVnP2*&Pai5OM9?bR(#y37YQn@d6#yiEJ(#NZ zACTYgF+ZqMEYaCQtMG;>*|Kh?6R)9O+(bp8zT7^oIa~j7&_5BkrAV!rn=prL$6k3k>cKu{=G{*3zRYH!c!S&$Yy- z1hfN&O4kux`{Zu9A%C3-e*S?k_a+g2bS> z2fg88VPYP_*rw95yuKq@eC^eC5)sXLy*W>*%TN^%hY3^#x+#z?G#_sJJ0YzqWjv^N zgExf7+A#mMzapNjIVa-`S(sBjjfBkbo_KI4b=?sEmotwZ&f5ZL4HkJkRDuSx{>jGD zVC|-)c<$9ehH(N|i81JKm057mx0;N4%ymO)LpF$@854&wCvyn&cyA)IspB93p1T$? z@v+6#0JCgj?FN4XC@osUlj%74XnDC4Ss^`Qxt;%?^FmI^4b-qT>Ul`C2FFVJ z?7j?R=xS{x0IofN==P_lm}Vm=K$1Zoq@6l$pWDI*OzeD)t7Dq&Lsj@})PpKUJg7$MJbkZXMhmPv{cIQQ)2g2pehh$}|>VPu5%$>Api&@M-JUMrQOa{pk& z#4V~5yiZgIIF>v#y1&95S2jO92|gkCFbjhah@zDopUCu{fi)4f>^?5d7qx+2Ldzn$loqq;lR@LaiX*=q=GKav%R43m;f)_h& zRs;PskAhfI|Lq$Lh#~}a3WMnNWl6(da+bMwpZB z4vHX~bh2vFlAM+((?a$1hH6|1xK}{dn?zd=baC`+QBaanTsX2>9!ux9mW4~;VJW+R zUIlS}GB!oxaOP`P%LSZv-s_?|(fEiYp1A_#b{b{7<~!5{hiY(%I!pVzX7L}$$ip$o zK5J>EmH(~*UXS^FWLayf2JihJsMM523rD|;!yvm5gdF{@%gW4j+JvUA9w2Apy%$t-)v63UG<7Rn8eFn8F` zIPOO7Pp01n(>hJ_bXkqBhx6(l!-pY~xmZyv=OibnEOu`O0`15h!T&j z!mxJ0gHEGYv76iRBHYDu3kznqM{{7D52n1xiBZ@AGqSH)JOB(HtAS0$T~Zerjge6{ zWYul`wd`m4C*nfS``LOF6x6Q$C*Vz9z);-|V@eDQkRlUQp+@);ssdReDB@aN_Y!R5Pxo)#h@1FdPdCXyTy`_|> zElo@QLSp{C0M~7+9)`&^ZNvCyJ$X)O6JlpO@oUDV7=1)gyP!9$NISSq4 z9KB;922HKZ218|>PeoBF>W5a2(rEj+hR>r^OXmu?rWPtg5Jhu?-3_*!$orRlJ*?@I zGf@60*pGxfs*C>F{d`54H>3|@*vP|E&{U2^0b$U# zRG5%MM8yWHL~mu4MHNWUJ@u{Bp<5?; zHGs#K>D2=ezP#^K=%UEA8H&oaoe4JcFm{BI!Dlfw0D=hHrBenuc+rF+M!*rCa8TD1h#-6Z9 zN^ToXIhJf(na`)r#1H5XFP`@M*1leQjA6d-^HF0JNQ+>Id!W&f6W-9~++U|3NHn2U z>zBpJ(-sH6_h)b_Rlg!R!SL>#*vny&>%)n;4}X~J?` zirR8@%i7qwf1GNB3%!4b%c48ksmqFeOUBF>mp^ajOZ66L9(tm=c@T5nyE$k?)tbB5 z(fCxE(IPVVMw&1VamKonQ~pHKM?Wc~YngIG+fALr|~lP8^`}w|o16waL)Df6*i=qj_;w8cXn@!H@(U(W3KNmMUy}M|NkwJW7cc_2pmEzP$>fQF+khf+g7%=oW-oW537~XDR$H_o>e6O;Lv&bISIV9un@ks zcC$8cdwZ)N==he4$u5{o3dmNHAeJmQ1MWId4EHF`Q;pIx@iijPtx$pW9q>^JmjKPazM^I`3AN4;Pj~17+_82b=w5*OAJ8O~tt9pGBhNG4VU{iD_C-JOO;KWV zoWa!5he}@SfJ*{kH>M6NY1K4H{Uo+qr~btkquF5Zxs8(UXFap?X7fI%vC(f&Wnc)_ z1K$2K_A$>AyzX@?nro9vjb^_(8D;qXsaiAEK94gYhn`qR$Mf77-_B$}(ds&T*)N^T zsLfQ4iJrdqxVwN==%%|QJe{NRLW~h#~fg$7cfj}mzrw;)mIp{sfDEedB0)Z6O5=dp0)$G4{9n_ z2GPuGa1%;ds`nSnxZ z5ww0T8wK*M^Ka0Du42%bFSUSO9hPPc5ZIq6EDT^o?O$sVe!t4kXBxQE5cOkY1! zMp<*Ra@~!Wfvl{p`;O)+XP3XIIHSy0tp}X0tj!dYyladeg(1=2o5^;e|vsdFoK{#W#w-p%PY$l!^bt-<>v~9Z5$t#mnZJ~tCkvE zrrw9!i7^Zv3~`d@*gv%xqfX)6r2p!a*3->pKfjc1B4OsyRfa#W*V|yJ$Cvrm_=s&K zPX(WYQyNC3RF7#rDgZ29#0rSC2=T*7THTjo?gGRGvs5duB$kEPug#P5{`g9UKXiD>73D;M# z$XL$I4@LX5YkFVwmE>UD`YA~;W^{Z;L=c7#QipywOabW72b}e(tUO9ke0b%q zLWuc>N$s(k^c$$2p81shE#r^y^MY5!j3w9f`x~T08!h_n3~Myo7L1|qJhJu znL?)*_k2A%Jd|~$3K4Z~bK3X2FKX^K^cZDyGU7P#+_w)A_g+AUs-*J{|B_vD)Itjj zDFvVZH8{BjF#x3ep2&IrFR~ckxC3SBpa8_I`=Eip=7p7T;+BNM_D}>| zr7PIY|GKd7Auq2Y3T(9kP9UppD=;Kb{Y!weU1!}_%NG-5A$w(x{E*y_^V{*Ud~;xN zJ3i+f#*l*4R+m-tkWFYxADY&nmmTqy>&dphX_<651{79pPJ|76=_@7&GEdb8aSX-H z14RmF^E2-mO#FGd-1XB~=i}-U(lLY9c*N`lQ+a?7Su!V+W7x=HSm*-IpsP@2Z85g= ze<6bWx&J;X6)RBo+}Y-I7hDcz#8{{*|5Nyc$m>6@k@8r#W$aNY4AOr)uBc$lI@K2W zQoe%52((d+1#rDqR+aDGt!sLrC21Rw{z4eqg@MN^q&J;4i_f~^;V~HgWws}C>0Zky zK+^o$Fg~Hva1rb17wu!WqUX3Nr>2(bgJWjgON`r5*hz^bBun;){hiAw;rXNu?TQV> zb=dVc-~C}Hsi4V>hI&L{JHKaSj56D0hhl4u0I;hCm^}~IT@Gg+UPc>YqFVkPIL5=u zm4U3%7-+|G5ZzN{5X7XvT9V^of)m)ok)Ag4WOjvEU$-aIifwO~KSN1+B`ShNBTilX z$+=d_0M*Y2>ck%oQ~_29HvjzXi`SD`=dp5Nl(>EdWa4qw6(~qwJ&R$-k@ke}UTM|Z;nhw|NcX1|AqVW=9Io9u;-`>o9-uya# zlhtcq={Nv=%hOm6Gkn1FvDj!}KkFY0z*f$|{k0j9X*|tmnSx4L=S!=LeUnX=wF$Q& ze~q7`6as2RrI;i|{cZX?CbkNNyvq)Gd1Y-qG%@U=LX|T-P!hge^>Cg72|O|q#XGLR zMP!g&3*GQ}UjUf|+#^=2#ydMl0ic9m{Pqjyaz8&)TJS;Aq7$A9mVU(O?blfl;2s^g zi06-GA6Q{BHH7zLDz470_7e0hGfL0{M&|bkN6*MN=7h1`=#~|UcET~)jTr_>Yel3xmclk3eRpQoZ*4XfYeY^DeKV$|9#+zLHK!CY z_kx!?^zBcw{*(y9mNJ@5um1$CLzZ*58YuX+i!US3OFaeW3R7GEE#~zj&^QOtmZ(S( zVd@yEcdbIO`U@-Cq6pF;fieC1GDTAKl$B#sZDY~cqyA>#!JSSDsNg4h@^2BsmfwfNk9bNr2q-OdfdilxwpYyq2$qm#M7>@Xzauo2NeQwWF zY}Dh4lKN3k_)xec%dQi+Knn^uf7@Vfo2S*v%!KZobMsEj&*n>Zr_{0;U8NQ}!w(Oh zV{copcMS!jZK?Sv5M95xmcp_3GW1pBM`J3e)7xSyek4C&YlMRx#Mp$)U0*KaY!8#g zzf zW~gNhH9T*wvOQqbk+;fZXW^cAc)C6Buo$r&-qTO8%~F7RtK|P&9V^a z2CjXKq?=h=D3`RhX2|tA(|NfE-T=j(wpX8flmAlbem>qFo)JjrhRC5D9W!owHy=75 zDvgTuAthOk{g}CasXh~zZ%QPnL7RM)Y$|-=oOuwELOa9DT)7@!apb*mk}`}oHu7XK z+At56JM~)NomYq`j|>Hjm>p@fy~qf2|7b*AXGuMmJ6cR&p?NbOUOY+F8p``FCckZz$KO;p)qt#h&f9|{-CThPKK~gieB7A10jWjdESD9fudt)G@XSm($1H%Y8yI?9KA30Ci>Lnt$c+kbp_1q289mN-mCie5pnRpfpnx$2w+=wf-mya=$cex{4>&8b?!p-;`;F zFMf+luFKyzj67{b&$h43TzWW@ZWa2+wI6Er{vS};K4js}U z-QC^w(j7{7gGhImq%??1mvnc-;hz7!>#oJu^MQ9}o|$>}Z|{lGzy}p&U?t02hNsIb zl|26tbHl&LfuJzdd#%dL%PZIn4BWN^HZ2`0gEkZ!&#}&@olH!q!Z7Rwthd+v&W7Sh zKDgV!_&59I7FNf0(btD*y7BOk5P18gl=Wq(h1<=2-qY!S6bxS}a;R9>eShpqPD zpZG@_xB`Pkq531BI=8!Max64EyGvZ!R1yFygDuoO>mhvG>A!vm*3 zkdK0oJXS8M>oEhc?WVcRRNQMW{UbMVWBtG~*6@(j-IJMzxwvPstT3Xrff8Dv>;!G20_P67#r2z;C2+>E0#pcdd`@ip8rr6H}&Ea8{z~e|$ z{c$Lk$mRLo#W8buSei`8b0Ve31=dYf4t98Luo=0EcM8O7+?(Jmy}P~sPgYgrL~(Z2 zn9q2TdwTrfrwlXuYkbyP2B22-426x4`GSuS0|nm@S1HGkBPPie6{@2CO16cAdcV*8 zg_OEVfeC-rje>OB%xq%)G*g%CCrbFDPOxg8-qDiwYEf&eu$iisMlFe3erVk81j`dN zE!2lFT-2BmL1dVEvOkqVC;ymJI)JQ5*Hf+TMOzvj;XB-`k)7qLs z3iD;Suh9DaHLuDEUsQJ>lDR`!xE#IipRWot^@%lK-gClbq(ZH;bm^%iE7Qy4D=bkT zyv1QPz*U|}4AhV9~<#t)S#XfT?GDj_@bd?bg#{54 zVRMCz@AQ9|{um3q>=|Y0t10CQhp!5GnXE?Kkeo;uIOH-`ce7q}bCAH8nYh=hS7@*O z-s?>)`@eh6o_@I@ofqYIt7EyhNfS7hs49na46ZV1hd>Q8{g3qEdMt}Df&5hJ!t*X0v^v1MZzXMKNVFDsZ(d6%wj^75Bz zyJIc=CO}64-u)tlmjbbs;(6i2nhFn45@d}3$fF384a7{Lcwsh>*z@V#L|bAMbvDb- z1!W|Hhp;^jo0fnm2;NJC0mLO#IB8VZm-2UQEpImJdb9{7x^`ft-A&O3b|-Yv(r2V9 zaPgP;(5&mcGe)3JTKk&09Zf&6e0y_yYr5V81avg9_uPk6)@`ItTQx8$XliQy^8+5z z_0tpHo%JTd+CmmhFAwOu*}s-__1ZfTwwdQdALV_cg+A*jn1_L4nWa|L*iGb0qlQvL z=$sA0#%3c&|EDxQxA9G z`BSB&;yp68S+;@rMru?IMr`T%tCYe$a?mW)F=z3KFa*yGRoZm_8&(=-8l<=gmm?`g}c*=(gG8&OdPgzSLaY` zQvA^(`b_hst3wt>fIWyYb%MML>T{aB>F2+MThuK}p6uOnCo(&CFm63JED5pcAo8Kb|Ffutu>Df{<`uq1^ zt$zphQY^P-x4x*eqLh&qO?u-V7|;HbTIjNfWz7A*1`)!`3yGcIZj}xl9`FQ%IzPpy zbN#gx#DV1ee3dK8Wlg4WFf676Nd^~mK>FhT-B%E%W8(z*l${I1YQfYgfE=n7f5r9# zGD46eRA=xFTu?ty&pqcCfV=Q}NgiG-I?@;xGNKhl8&>cWad}H?yZjt@h&xz_ssNvl zq=35C4y$TTcymz8du-qV`0stO{T;fph={O%Jbv+)^k25n_+Sg$V@V>DFAs3#{UTy4 zLBUHnf8jwOxWW*nD61C)?n0w8(gH_{g15w#lu^78l4=AK9{eB^zc>GhEGT*SrXYOZ z51p*pAGuyLVDd&dzA9*GkliTUh1KHc8=qoFRJD}@8AsSLnq5ClWyQ4ugA7_gPD z4n%z}OGcRr%gY%Y!BB%&v`UhcK8VG-@} zeB;>hK&So)0@c+V14a+#+Sk9d%C-ap!d(pxZ~AO>fiXdRgPbr?-X!8 zRoJh*0k<^+O8phSsI+H(N+>E71N~mBqvjOLTfLzj`=g5fTl<|4z8}+Pao; zqS~gI_n5YQZr7i|*LO4k$$8nJ!sahkTT;`ryeBrmTl=b!Nt@I{)AWG@hR|3V2amNa zO+VF)T|*}1LG}LlDY9YM(rQ+EGs?0ZLBOHOWNXkY%sBHVst}{nye$GX!onRZ&cvQN z3?eJd!61Q;s-G0qV2V{Sj&>tjGjHw7_2n8(u%xn;~6Z$gzfX~WaXmrsI$fl4;0Ezj!~{ClA9yVhCTiQSy@@` zHZWasIO5G)_rGur+c9>J)BnB&$qMMnegl5)A!B9zN~_k6#>TPlWYa{;o!%x+*jwG1n ze7faTzuhC#oB>KZJNdoVWzynij47GuD;bj7Osy}cw3~!2;5A+;MRuCTIhGm5_}Lk@ zE6{DeMjz^&|cEV;`oW zfv+WC)*fy`zWOV3#d5adRG~>`Rm!=2a=BZn!*HO#i|)M9RLJgj+A;elcrAs2!31xC z&fSLQQPkiZu43Ab$vB6=w7Zj#f^s#~jNh*mtJ**Wdij6}@qmAJp*g@`**Ph7%-lW?l0uRoK3p$jRbbth)Co|1GKX=e6A z$P`pn;r^u7G&P;Dps)hP?Qp!#SyNzzv1;s_JQLgtTKB`b5Ep~OhrTzlgoQ;#;;kPI zVDJ+WY)EUWa{h1(0W$DgNh{LtOc~%9+F?$E z(Y27)n~nQ>{vN?=+S8u9yrxz@ohVodK}+5Q+A9;r>#>N!@Z#XiG{?UncNz$VIK zfYVXf>%$ssme>a|FRhtB$ zT>Mu*AR5bn{hI)d_|0MdN1RRIo6>!4Jlboxs?^ncg0Fo!S-8dp$lpYK@y00vxyryB zaiZz1VXaMMH6(5-*rdVxiY)fKe@^TQamLIk8hHXqz^7T6nbCH|Yf(siWR4KX+QmMn z82iQmnIyz&&s2MK{?`vVD^^4dn~K;zp8la00Pfjxgz-6WkK{iUD|i!CZ;OKbVr&0F z>Dh75#(o*V>6UnAmFH6AsM_#0;|pxu!Z&={z{kw(iAl)&S`r3;P{0Fit{y0Um;D94b`?%jL?th&i>}iNIAy>N%WxRbpMLXHPQ!$ zU)MY_&H{Z=PrBce95$0HH(1*JBq9o$c#i^q+VkY7{+RdCPeJ^XNI?`^m;w15Q=pCx zNgAu3ww)C^?2w+>$XcKZJ4o;x@fBF3 z**{sO+oR@q+}zwx-Svz(IQ`ce>m0OZ?13yaLCz^=u`ikTx8>)RZhI8i@OnO|rOgsrBS8 z^4})VqB$u}75yHAz|l?p8*ZH+241TCX`l*1u{T_Oo_*zz z0?--L-m+o}Dw2QTv(1@L*Xsc-28J>Xn=vAyu3+T(lY!O6;;1Ksj#}PNw4qJ6T=<;2Ap@wvO?fR~`s2CxwJvmaR`vL0zqqQ&NeZ^W?}=qH zWl+pV!|RsObzCKIXjQ~u7VLGWv86wYHtiz;E!K`5aaUGK*}$)}fb+tfT7R}KC=!dF z&FyEa@82s2a_=&yt3yAg)oLd+AHg_)@rF39z?TNbzv6;zuffO)LOd`DZ*%Jf`PZ6e zLz}+iod4DrosN-IIaC7^#QnP?W)$QXV&1A}r|-5=RZVZpc+x31>^{HAsAPmgK@zHg zphi~h@MN=r(g2QdKl=R=(+&pw{oE)<=|2^ZdhE6~6^lS2L)I`mc8CXohjs<*SFo|e zCT{GxbAw$mgZh7|;j`)o7gX|}z;{-U7$(fSxz&^yFJY;NsQ4f-5v~1PHKAjz(|k(7 zY1Cn*o~4+J{x`doq*QH%MhdwZ(cl9a42qVC|G^3d9HJD>Qc&hrK?Mhg*q;7@B!w!E zrW(vKA?(xoQfC|dylVmPRv7IwEz>JsiWdU*(U9gCuH6dzQWL0}JQ6of2|l>Y6$x6| z71HeQza7eBuPym3U?!#Y$^gBd6=2EI3rE(PloCVI=U-vN3HwsQ5{7n3jRe^>0D%fh zO2Alv@I9sH$;$Un>)n2Qj_o^|zo&oJ4KIfLhspL}d2OvBQ}lPkq5%`NN20ZF+z9=>8Dl&xSbBUTDWbtCs5LaJ@5*+F!dNiisZ+ zU<3W0Y*&cH-uKugDicL8#R^+elbzw%UL*}5d&}n_u4h+i^R{nu)1>S9SM5cs=tE~y z-qzTd{EFLp_d>5%KHCe->sAM&(qN#CoSt5^%DnL(`twjMk*Hl}t(oQJ>}C-KtA8(= ze>|EuK|}3uBv<2L@4=r=Ijg1P_qmGsCQp}Lu4q8j% z`f^@=bMJP)Bo9&1H$>^_jA2%Om*-ny1clgW3rk+ zKYt={@?Rto#i2z(9AYTX3odGinLvHD%}2R~vjcB076IpFEG&s#{wPyO%oFDq34l z{j$4mmzGj#YZc|wsw5HRQ&{9v7+de%Ab6%scE(o65m%h86*ih#&=W}+( zRN@N~=@pJrPQ0b{U}wb-0Vw}%Np$a%XAFk&v9sB(JlIRZ4?&X=?w<$$gcw-K74|Kj zs_MVH-R#L0oK@SK^pArh7B_CKN0CvJQl(cT6#&JIyz^QKR=zt8U#HNELkS5YGQ7un zUd(^>nLX-JR#GsYembLq(YP-|=}uf(luK17Zy9dCH`Y;LhZA z&xjH`D*Qo;8mH?X=x4w9Ci*xBZv>1^-@s@NaW^+NxRG3-q?0MiQtabKItPBi25y(j z7SXKlW)x8}^B_vlQ1;ny*<<*An?Gh4$e$yup84`B!9?eG3;Qo00RdtpqwhLFvG2w? z{;ts`X6>oHH@FXK5x%$nVk%4{?zA-~42TuUHk0W#`F_v@e)F0vejlI=gW!VW^m~eS zsmdMn%ExnR8Q{`*3=)4>9GMSDX0@k=sLok77F&uj?}tbY84&4$z9iccNwj@V0@0OA zH+lN*yMrIG-@~g^fOT!dJx^fL@kKX{dQ3^D43F8wAMBv_dy(g}g=-<}{@tO;_xmb| z-viV@ewa7FM)E+n6alpP8bje9-&uZyDDmiucOJDoEEB6UEMVl(@|fxjOY(dy(#oY{ z`B`ug)9*IcKwMT#7)PF@bvd_bP)}JI%ky+W^|xDLis{}bcIpy2Q{I!itt~81D}9`1 z7TclSY$v&e!29u+d;c?fxdaBXZ^~pNBc1EY3q9U|4bflw1?}H%qk|`2>j+Lh?T&8; zIJ_C;5`rF3N1vv*7zgfpUSCSks<1?#v5_&!BoD(49k)I{E|{TyH0W?g74kafwov;1 ziVJH$V|jMJc*Z>F;D>n68YD6FQ%gy{NF>eAI4Iu@(t?g>B?D*Ss8FeC#KJQAi=(jn z92-Y~v=>IU2Y)T925W3Sz}6p{nI^$IMXv6u0>KA+K)-ikzROYkNLLO2EzF!09zMdP zs+aneV7#GvJh#v%rScE7e7Ml)A>TUZqPRgo0#dGNJ--Tn5ffxi2*fXo=~{HP07)(m z{LBJAHef%@EasGNTMOYP*O-|^$!&YaSP4MRJFe*j~C~h$TOEe^AY%J`gcex$mTLQ%=*RTiugM;Bu)34MfaQlF> z;KhEj@}&1MAdLA94+c1Yaa=BAS(NB>^Sy;ur$^dNbD)d5*_MS z4hoyWul52l^r^_BV$Y#4Y(jO>ML*x#g}?A)!QDs}z`pzv^W;|dn_cYucSp>pT@2@& zKgiXS;K>DrqKfw{4ezxwuEWoV>G!B6zR-(*zx)yGsDGNDaWJO>o2}Eq*7Gh5BHXbm&a_py4B)O z;=sXR@^WuBwmPdEuHoa*w9E5P6ZI)Rf^>GnzTTHP(U3$MU$TIc3#X!rva*7$y)ln$ zr$M8a#Me(RejAn1sCnXfsZz@#ulCZdb1so zq2JA)khQran$7>rLE}PRQ*Gy16N7lo=hk~AS}eb4YOiTxTNLMkT{k&g@#MnL6t?F~ zi@mTdkE?HTMu!|`(2ImA)Lg4`XW4_R4@B&mu}M+{vjmC0Kj#Y$ft8}KLwKjGQik+V zJ9_GffK({tCcgPyC7)jot&sIK8(LzqvBW7M~BNW1QNXr!Zp(AIy!B38dgE6R_X!6X2@euN;J2UZrbo#5hjn;Z4BxFmf0SG_N^ZjO^fzuM&;*8IEzx?wZf42F zk512%{$9~n;r`9KgRRE^k>|_xz=(CAPRJyG(sICT{V}aDW2YrSY322&7H$hnR80@O za69%nTMa>>iM$1Z^Izvg5BrJmTh?6Y{~CC8ADCq!Qi1;f&CQ2K9s1~m4;Rg~z`NYs zT-4=SgU*Q4Q%CiYOK;)(wY%PY?kngMtQVXAa{aB0`5mY|>1Qu=o8J31Ab@xxdTRvl zl2RKVK56@N1>s_GO*<_PE=2@HDvU%LYDR*Bnf+|lN;Q$RATmio@lo^Nz!z|Ujr<(> zc+5;N{A50$ChJdJ#87^PR*wPh{P;++kUaHqf@9-5xMIqvmf^1-_qKBgA)x@|v%08h z#BF(3wKtOWj{DB-uLzVN=}M3aWflR)UmU7S-kXotY{)8tVLgfsxALNrTSXk}j%klf zSc1A0GukJ?BeWyDj6Ez?i{AOVpM%bgVH6hc>lxsQqrB1xub;Q59RJ^n zg9nT)$*o~u-Fr9F>bx=kg@wv#1ZGHuohf6TL|?cC1qBsI&hEbsc;E2#4mXK%zU86< zCyLy#HnG_9tej1@t|p9*j)F^Jljp4KLh!%%2bp~TG5px)ru9TVqZd}plUM2ksK>lP z;uCow&6x|!E)vW5zf7zAq4k&hk&GN5hvnXzm6i4W2NnE0*D$6@Pd`Stz~x3A(a^43M(9@road=AfB^r%9R zG{mK1g^@z_6l62=H-Wx>sQoX2_jb}Va*#)T5S{5KJ7RACJXHGJPLhwS&u~CY^c8a7 z6FmofOf13FKB^F;B7G?QWAfm`6LRoYC@9EP2;ukOkkNb3sBo#-sN~Ym0YTD8^AVla zP7XRG1=a8cWcW_A^Y=aF?;yn}QAGDVd*9Y1#zt))86cOBNhLjFq02RPQf>}9{XK#| zOKbkJ)Qq&Thk2!vo+6QuUJU?5Q8WaDA6(8S3O3aMmhp{K#S`tnS*xZi!(449Qh0=| z8k>I-r%lH4yMyFtW3X=THlqDBC*;!m>PnCa8{P%>sH^Yf= z#|GYDVZr=RFY9J=Wr}TQ(5K`MBC8O!m=E;I#%FmS+ni7BfAL}rY%s5TlO6FIrq7Xq zHlQ*+FgfsiafE{QxYPNR1qyX~b+Yf?Qd(*9cstfLT&XPCZ{pv6_Tf0tiU@vgPHwrX z^VC-udh!ijzkkHEMHNt04YtY)AbdT0g|1^uUCBR{6;)QEuRlTWE}TT4NT^*l8DaS2 z{RnW6T&2^9gax~=!B|U-JD39+<}$um>pc4}z6AA2NJ!{ng#t=t=zB4gvuFHO_K*id z(c5YwSCl8%t{YooY0u!&83Bz{@63+ybjhvo`xMJ~vLYjJR%to9qUm#xfENEIJx3Kq=+|V)wuP>e)pn7lk3a4+o zNHblU-ETP5ZyWwKxai^9I_Ft!FZ}Gn#}NE!N+kv zp9m^6L!t5p_IGKmos{A}PDy&S<0-E+llA(Z;rq`mcG6+RKg@pMk8Y9PGMhqV(h;3xd;cd;?~X@eJ=ei}RE=F{654ZR4h+Z@j0dY6p}kS2RgC_UDA*MMao0%bJc zfWP^`aQwON_yufnYiP-1d?9+u2cQBy_y5qV^xJWPx3K6HSeJ1_@x3IhXpg6Ny1*P- zWFqIZ(h=(PzV7_F_rt9{@t^JHcX*J+QOJF+IW;sjP3Mn#KRG|``H)j|HKJ3T1yWT0 ztr@udQ(0ePM zI8Olt;0py_Wf#S@y6(t7A0!5b0WYJ<96YHR$9D_$X8fMV#7j#{br&5+b+C{OSe8jy zSD;UxjFAyV0)oY4$3{t6}PSzmm3nWK4ujCyA z;x|Qj*?(vJ)qb&;d2~JV9yK<_A5nLj*>L*EcFTBJ7n*)$(59G?tN`lt(3g{~2!qR~ zS`sY~nFyb~c3-E7g_}};Z^*LEz>A(>z1tm$L`}F+9%)888VGHpaZBqB#k|VN4=tdD zHT>hqJ#^R>tH;-lD6n&n#arabE^JTgSd=GdnU`hEM!&BdIjC9ovv!9&BlNNsiZ=cF zk7yr;TQ0!XKr|k`GYo_mi0JAdg~f@$`n%5U`mk_0SjY|RZ~yE}xlWj_*g};#?>_Xb zprvQ6$;ZC)ijA9_XLHA>8*BvN{*b{2lL>f(WH8A=pcE~Qf|eR`$3*0uNhDQlYz#05 zFK^7n>}=cvg0O|f{o&U7;GxHnVs_}zia86MPQd@e1j{WB`v<4PL`F1N6r9hsLy{Ui`A)?hvk`B!#7vEp>D}Jv-SJI zM63rZZYjUZtoB1o1)A2{=_+VOUp<27(;-GG+40+~{u0r+n1;b^S+`7P33cKR#6>2J z_1+u1v;yd_Xp=k^Z4PG4YfsNfgVqsH(P^dWO-Um4Wl%t%BlScSbFgI`?9}isc-VY9zEIX#)tidnY z;H~fBQgCvf-%C5dTMnnHcR-MJGHAH-Vnpw*u>N^&@U85fNCjl3xtJ3Xj>C%p&N2O6 z>#oTQI4Jd9a|8jXC#c?j{Ud_KtVV6~)L0Ww{ zpOviBSV0Z}q^HRa2_Nwmi88OUt{plUFK**X=?)@@j^dyD7{U|l)`%vA;SFl5A_Jk; zvBXA_2NM5h5p{xj9_W>FI9OwQ#!rUR99m7sTl6+>&A(m&brR8so-sox%js_m$z)A{9Q9u|^iGy;8jQk0w8bA>V2u)u``p;HEd^w)Ma^`Ue) z8i5Jzy%@IWjR@sn)C3D|IV;_v@BtJ3c7Li0NSf9KwPct$V;l~^E%YvEO-culWLs}_ zgyI{^OoiNF?S2Hru$^}tM4O+JT?o_S>{ej_BLE1s15dKi<)x1sLA-1nWG=dXWh zD>xQta%sQ@8Mwk#@G1&R`)Rs;ft^6!=x`*@>K`GFb44WeC`R5-#B=Mn*;ct1%$W={ z@NS_Fs;Qo~6bArev}}eXDCZZBcoj6w4Y6oYbYrNrmS^?JJMYt8D9Iz>>sNP{tnB=6|7%M9^MP}R zzIJ0E0|gOzyu=bqte!{V#@yh$;9C zk=nk0N7ZxeA>mu|exIXc1vkYF$RFA0S{K!vk_Pi;^Shk{dUm~4Fy{X5A@nx3Rh*wp z+Gv_K{tnRIegEgu)Q7TjX-@D$8!Z#d>%|2sJSZKCSBa zaPl;h4R=3<4@s8dhAxNH&wu76C%=gmZW9)|RDk5aSAkS`hv;!skY~}(;NHeuE(f?$=;-ovWQw!A(%sCN`zZz#@&$OI4ufy=_voJyXy(xh;%Rr6&@&6C zLhL*D2H}=Ub^fr-%KIUQ5>k)+kTvA7q3yQCXE$bGU2$W&p?e#R@>HWpg^%N^7C|Bp zugygTDt&_3+1mF1S7Mxmq5N$6Z9$DzQyVY~#(#q}I2h(w-^YOgi#$-((uyn#kDURQ zW`n0_KW%bQ)4&F3Tg(+d4yDxifkSet%ohRV+7mpIXA6sO^2Y66O?SCi5x{tZv9UCR zT~t6`cpy-yLXVS zdq2D62vyd`sXCd8#A#@J{=8WjNii&eB^n2-pgAG|q*_mpzx@R9(Wr2v`z#xO?7&{F zs6d1HLalY$u$i@LBn=Eak5XE0J#$N2s=K>Y)U)0%$`n& zv}m(+%5;5bU$q5F{in1xs9a|l;XpcH9FO*Yx1ZsOz*CnQHHmEpQl- zZkQG7UWTLxn|q~bD69;?-gHR`Y_VSqfqC1uSC#ej-omm|78j71&{>Ko#W^!^#m$GD zzlx6NIkqFVuDE_u1xDh&wYQT@PCo4I!WE!Nj9K~a<$7iPa$=jpki18sla}E)xeMNVUw|7Q5oKXQuZ+|G>0jv`KK5j9kR{Y-t)9sKLlYaU z5SQ35%7ZF`8(gA)h4c(gng(`>Nl1ntKG0j;(y&m*P_r2b1ITGxbp^D&D(Chy=r5pI zlvkBIvDMmDcxyKhPz^@kcqIyA{8t`Ooc&N8`>7LTFLc zhy#{^xNj2QChFN&O;NASQxaHUF4$KUvRw5*%-0w|NHTE&$^?e=731hzQ;YQlXnhtE zBNz#fZfc+fz@e&U%7#gPc=(V9ppucx1zfYnGMasyjir@$ItGzrUD%_UpBxQGhl6_UDqjmAjruTUg9NyQGc+J_@f+Nh2nMU zkifohoLo`d*Lo}uC_araA{{rXXAxhe8NyuP_1%s5MzYSRTgt!qK_dJp=I+%Ge(;2X zHMckTQgD#1wSyh^00xM?^0Bc}yUW%VLK7xJJ!aDq;>l;_f;3vA7UU;n8wB3i~ z(w#~Ts-$vV1J-MmXlgP{G3>A^TpjtOFj;;KKm=D+LhN61yv|P);Y4Tt9L+*%IouLi znp+=1vNTg#EH$Gai?5#8@Yo_?&wKogI;_mGGsa5S_1|EaA583f*fp+Q7Q-Wr#COi8 z#hflw(XU}3Y#-BD;JMTvV>&8z!Fe_U9DkH(brziO?=p*A zhAr2vOQweK@{yX>eNNQuFyPYwJZe0mvT_Ro&OX)M(OOMt_#C2QgP z&($NXQeUHdHby3nIb(Z8_(kc)M@EnEH&A9{o=3TnAC=T-iKCjMeJ}>`;p*oUb{RRe zIMl6MGjo0_#;TeG{vztXaw21$StK4v4YeAyH~&?TgaqTM!ad&CFnaaNQt=v5Cb|6@ zhV=x@k`F#~XCJtjeWi$Fzz2SV`=j6oHPC|E>n^j<-8gVm@hzC;^XBnWX<*?!u*mXH zsMxf`80HGDX=w7_^@Bsz7LH3xf)uCiRi?|B5Xx%_Wp~s7|HpOdRVq-;8;p!(5|I-# zre!jaoa`0ikSJ;U*Q<*2eAeRmh&~xKvq5-E!z>rSF>KVgMjv$Xk$~3DDwMp_3s)iT z2A`rNNOo|jv=PT6g?9HJ!>2skj@al6{22D2+iuXq}WFvNn?B@e46DpEWcrzm69)RB?}MP0FBcKGq)Pt9{W(3$*lP zMr0h&MFYLjNWw-#x&jEHf1nIfl-M9v)Ak-US~9d9mgl2K)JUqV8RdG0)J|q-jAo6C z)gYGU7)t>co>pHNUGi;ejEXU7V1B)8|Mzlc*zEq5q5XvuUksLt!0uEhXR;7JK@~bE ziZLu&f{{reOz~rI!8)yaPJK^Ntrlq|3TxXB9!OFzW55SR8H$Tmos7W769=!yE z!=yign$jM$VKKV6z1~EDl6vr?hyf>~2NLi_A19GgtHdVQdNmoqp*1_DA(O*Jg%x#< zr==mr{4avW?B_RD(?6a$FXm#Y^GH(&uEOe5IM8ndi6Af&8rjLw&Du$~(%y)|*zt z4mvU(*<7?QAwM`|rMjp^44@<-LGe;Y4HKxN*PP?^IYwi=i31TWx&b?M4sfCR;-HiV zHw@>14UXYe#V^0E2T|Tf>``D!)fL#846BcG1CjAkfJ|-=X&TpSW)EUTrCpurA6@+p zXTn02)53JZ2NN&;nZG^6@rt_|7IKM(WodGBv2$&_s_nUI{W#ba1TW3C&7>b+PD-^f zX+Cj$>B0{#(g&fPk*oUKuN*sbZig>^2WkJ+MM%r^n^)utBXfP{jMxJu(@EQ#qu$>4 zY^xIq0HS5nEM`AObNS?O>zdg%hBoM{;^XX!K}aljwGwH=7-AT?+_UGr zV4rH-!LT_`M?%AxZ@dydicUXH(%4J8Q2W97s%;Y%xNOqTK=e4rr&MvJbeF5vcLKM; zXr1-dzEkmUf`{NnMK$7pYKlb`@aq%n+_M1$XttaBrt{s&T0B4kkNRtrz$Q6igt0bK zLXqZ`9NqDV--Vs+V2**523aaHGq%%QHt7QD_WAmAnt+PlfszhYQT6wt0v|3G3>9uK zpax@$1B0Q;&XiaEC%*wi$(#r?e8U-Lv?x^h>0gTm+VELZ0}(@roIjzEr4rO>m1ueH z32Wx`W#2TgE2cOyQ3(>>X9vuKgQ{21Wh@AOY4}WLicg5nS*fEfSgAT<#tN$-K6;yo zJ_1#Sbk}Txsyg}D91X~z-w1dP(C=ZujkcrM3v2ar?KB<-#m2%Sl{QgBf6!tbODMrf zv-jmGf%B4;S5+;JecZ*_PwPLRVwil{h3ne;H?4J^Ze1+s%{Zys>AY#08WS^1Y>0`p zzb_s2Y=h?&;^Iv&$5ko~qpoIk6JsiUWQVw=PTSGZ=S@*gUXcs!;>2Ei@LCBFko4O@ z?N%es2>1rxh8{=I)`tDvk1E(oSy%##po)p*J%A8XM6ynY5u% zWojczhF#Z?2I`EhV-lc6#V&76er6JrO^ zz&3rGE$31sNr=0@-kKhwOa)gpX^tW~hzcd5a3~WH^n%`(`Amo&Gc<~uu*5`CZ;y1| zR%UhYi;jiMH`SW0I$x@D8geMpHQ6D}I?OY{ec5IEb&8CJdu;}MB`{1xfZTd$3<%Ja zH2zGyB$IzsyhqbR_VgBZ%OqztY!#@tMz;#ljLJ)lotQ&f)-BFO3SJQl%ub+g7xD zZl%DtfSxgWMY zMfrIR>aGew5hL+8Mmrt^yXGwNm}4B2;Vs-{bsR2f=T3s)pk%nRScc`v!6ZmlaVi`` zDT>}spN9Mp0_aOB$k_`tqy2-&v-zGU;Md)3%Y{RVM{|eh6lXg1P`xbfNS^&c4XOYg z*w_u*7Z8ZVv$oBBf0cMN(O+aeSoKhG8K?Fj_{SHK!J+W3qc80;KY}5lVqVZ-9EuY7RV_1h zF-hv-GyblM-GfjfT zN+xp>uIy(_K?YHrFq>)$9C-GesG2JX5Jz>QlEk^$+2R%eHEH_bez>iK7r71r#J?&I zIwZyl6>yh{QVu2FHAboKHWYXChu4o9{~ghX0b^qc9q@Un3Jla6eFt#Ym=D-7C=6ag zb>;PBZ#zgawAeFFns`4Ozm5h+5Wp|6vrl^Gtq_yUS5BXbA`CVX?$hXBNrHd2Zn<04$P)M_IgQ8w)BX;q`&0=Et=ivg3 zF-_rnm=-~nVHN2V4OSjO>rxns%(%^$= zK`d*Tj_@8#oed@5*qb*iv{u3AL)}n#uZ4s%WjpUPezV?h8b}>%$^r0)Z+@A^g~mov z$`PYIa1iG(X`?s_>pr!UJyCpelw%D4M^xZ_&pZaQaQjWl{>`aOV=|V}4wIYhX^gWT zE^5j*e6&S1joH}y37vL8kPYQrgWYqs6fDwsDw$+>`WGt3gxOSiHs`+AmE?(zZjxK?sv_%=q z#Nohuo1|*0@DsxX$b3%i zDc%H)olJ$$A<=+nm_|`=ir<<_ds@d`#dKBQ{7lz)FN!Q5U8AMg4Z*H9g){0mp;=noxi&Aq2G`>xPY%O17^m9iFZA1aejPWL8Ak)5?^SZq2~l- zJlL8ldIEkdT$Zj^9fYuo1L7$Fp~`@d7Xpy5oD4z`n=K-Si$Oj7i-`dvagn$h-nrVV znfd8R?DF0xTWrm{j184Zcr2Li)p_|QNJicwSeT2ORevAXi%Z*4+EUBRDY1< zEDNYZ65f^sZod+Vi4X{=fmE~tV>4~9td{r@*eeZzg_~Pbo{9hBm8agP{IC!uz=OiV zG=bqS=hF=s9T>v{(*(9-2HKq^Yv(S79Es_o{Go|hca|>(Z+@RK;8$(TqDi0NoFc!j_~HUh3yV;B&d z1ZxaQ;JZHMG9zgeq3G4T5)xjeLExCqCJ>L4uwtM6>b+fwY{mDCli>?+DI?&hAbn58 zz#L3`D+hDnCXUHsEd}_&n)q+Ye`wz@habQL^f41P&Bv8_X}Z(?q@OU#p;W_JLvTE3B2gS3ty3=eLnS>m7}x_Q1>5lb83>uPIH zDD|ryFfmxgWX%Y0gA+o6QB)u(I4EL}7*Ij|!hjlVh>%3^p!Bd5C-ag ziYQ}mf70$y^?mXj?(N~44fh4-xkJK%kx5#679jM=@whKx)rt~jIJq*qD6Da{n1A`B zZct;g!K>5qLY9~4p6@V*A4={ic{4r;_G%qvSf68S=$_Bq*ruvH4hDGR!W(0+lz~Qg zTH@!d(2q^$zEfvPT+H`mElH6&+7p_R<1a?xkU{v@Kn-bM5Xdx&k_%CV(~>|dd9HHg zC-ADKA}fr&3pXs&=L44=StRHV#}Mv^Q2(>K_ zyzYMN^~cz}CVbRx3EYWfQ~jCPt=WbAdoUdolmt*BlO#*8idDE2E<7-nWMyy1Nl+ z2?;?uln@DNX%J9Cy5o=|-6@Sy(%sz+BHi8HHN5Bfz3V?~@o8p0uxFpW@B6y15cxkc zftZsi+SWyjfV#WgN(8l=<4I6#<-8!ZfS1j}CpCie2t^8Ib4Qy+1z+A&^dC~Y4PNNr zbcjcUFC4VKR#bkN`nk<9)Vb!=x#yG(hQxftB+061AO}Z&EM?sJ^MT~x?qnBTs&|5m zz)%4+(Df2bmGMBsB6q*Wf!7<908*Nyii2UdL5jGiGIzLu0782lGTGY zRRICXX=xISR4_W|svr($J|UQx@zv5&%2bW8v9WRd-#_*0izbIH3>@mW$cbi>tU)ZH z^&64GV3^Xyv2N_|W;P_R^8scu$|-ik8K6}6M{R9w+WoKC__zacuzAfV6iEH(4VqQ( z2xn&{|7fU)>y(fRd*+RoE%pE8o5_I3_d(i*#A{daZ{@ABI<5+<5(Ngjb>KBIUrJ7X-G0BQ$)oR06VFAX(Tm2-dHkunu&<2*S z3T&-8Zrz!GwVhyyJv^P*pUJZ=$@a8R*cuwZFvSq|D%STEILYiQgB0cd6*#exV- zn3}W!eU>|`#>6laM+}8hl+Ant&~R2C?=Bi`z*tcsb`U!F^28k2zUAPzRiD;dU0z`oj+pU@rS(w|VnQ)_BKS`-4fjFbei~a*KkY((bObVH5c(L1z zr9hU{H5C_ z?FQMbHAp7%bai*dncIw@F@4{ApFr(wCulu;HP@5Yi7?!GPyuWd)wyhGSaQ?+x}k>D zr%n57=2d4F`f}U?*JrY~U&el%el%0MOvX`Qy?-dp0)L0=<{QpNFi~_`_*h~mHkT>g z#)H$a+1GW&4GAP(_b&>f#DBVUF??@(W7d4pdr-esyI?va|{YLnz%#Bb6L11T*b+BZfWj3jEVWD#?nMK^M)S-~@1Nrdc9; zy@VV3P)8(bEl6r$si;UWLZc8yKV#H!hr-%bvFhId$vjJos(~I~QGDDfC;sphn2++k zwfJ-V!T|@;S#XT-8PmJ?koIyAVMOR_0&-(FlIlzUze+`T$=C)EeqzpU*6_cdw6+AC z@AP$z6$}293FONd*aTrJFI5qo95w|mcgU;V^Mww5>k>^B9$$`c^5jBLG29w`TSz_h zx}b=U6X+LE_q3ar_}h4I8MVd}Tj3`8GNai7WqHvP!4#Dc>8GTpHDA+myHKRmx}mzoLwLfPMbF>r8CWtv|h@rTn>Vc7j+iWApAF8NGQFLk{V70^>&wDULZv}8m3@(1UB}Q)Z0;TNil{Op@RQE6ITR`66CUCn@KF%* z3$}CM`1DQ`!stERwk`%KX#&(|XVg)mh2uU^$xekSL>5M`n{X>of&jN#2`SP{B_UlB zC*MrV#J8RQ*phzufaXyW2jAGAb-;f9bZQ}SeRq!jPz2s*XY@0|__Q8+B!8>KXYi2wujbo|w5_W6IwW0)ul%tAQ+c_Hz%cEwFPk?2#?HR! z-_>C}^pm7mN6#?2soqMJUrcz~;wxv-+Y)5o+)+4~M^)5z=los^$R7#<8t+jB)0OHM zzt0}JoW?*q*SMMb`gj~{1bH{}0GOmun-h0~PW zhKAPc1SO%8j0CWioez{ukbVr<^X*=n$;C+BYDbw*$=B&^cq{wu2qu@2U6#11Zlam0 zfew1o5H`%1E`$Mb(g#pfQp$7w2r@Zs+nxlJGDJd7tXCrMJvO#JI<6&X8AwV?BT;;W z5~d6cLf-2?3q=MDZT%#EpLFNXatggN^y52XC+}d_3Le4HmFA_|O3w_1C7{`9f9zFF&{;HUxE=C&LJV_0rKzSB@Sue+ z%8(*vd3B!KR{%a3KdCxo1f2L+OE`!iGw+!rVMp|EYd4o;fN0Bvx@lw(6-2XoW_>k9Qt@t5e3uN?k(bc$ zvgo|=NP9~4#|G(ZUH&(mR)I_1-1riuICdA{2C*#b0d|-l>}xHCs}E-y?X5X9U8mPz z2_trMm=<^7H|y=M5D!HiUKU+{(6u^0C#ql($@Hm4D{DJ<`0Gv8XS{b#tnIqwto?63 zal(>Io&bi5X1BK}lqTfNW(J3d5p;kXjsM=m^Q_-=rGFvU01p{dwc{Ke8am`~3p^SW+AC_!7RU3`ZWNGP&JQWkaeL&BzJjrEq?#n>)%I zp6V2l5%b^cGW5m1jZWBSS!S;rU#r>^aZ)=ByS$P3TtQRXI6TNNPp~HJ0$J?dJxm2c zsf0}ct~}wSuB!4DyB#xzl3m`1h9laCcpzfI!HxEp6dWXTPD5`W&dg}=+HZPkDy}; zdAB=brlPJSK`v7zswwF!1>|$nA-g;b_X?Tkav<2q z8-etjy%e|(Owuu(bf+vlznX;*wi__(C_6Xms(iobX^I9)5jqkBk^)sp{<%v+!Qq18{DHNO zF81;AKb&5PW-{G-kG?e3gkmQ8@kiT>s(dArzOXh$%Njl42^&l)1A-~P&-?f0Z5O{T zCX`yeN;Fl~6&3*W0Hp8DX6)c@1UE09yvYQZG~eDBF|(EMO`HH{<1X_NQ;AA6)(LoL z_VU>C7T@b)0r;PzL3RcDC|_w9&JQH#D{SpnOXBbIF6{gJ2RwX&(f@csE@{YyY?RU6 zpoX32uv(<$-D$t5zKx(Z`SLd`qyn73JqAjX#1ig_C ziH64i*w&yPoPqEbHkXTy*J||xv$fI$?HRVv< zHhr;v({%g}cP>#Zqgk%r{o}s<**B|>3cG8K=-Ci-U#=L& z6;$w2E|^5Xdpc1fUI{qwCzcawe@GStx?cMsqnA3|kx4;P385c{&Mg#c6E-#qKT7Gm z{PjH|kcBLyfal8LQ3Rn2F&sN9u-!s8`aG?O`q-bm@x_G9Q8=4t+-~j%lMvjRhn$D0 zQ#3@uqqKJT$jW0>8_s*=)cw~G-;izO;IZQ}=$$$_8BYl!A2oYG!AoMi2+46qK$osc z0s#V{#{9EtKgYd|xrfXK4unCH60WsQIBMK_W86e*76DC?sIgb1>BQ9M0JQJ>G8zc+ zxM$^90lgHsnlAs0k77~z{<*0f+xwbr)e{=T|5d=G0?7x9A@4pCg8*Jr@og^@u&ZD0u+TPRcitY$3g|K5maqeC&Lq4U^Qe!X|?mS+o5fQZO{w zZjUI^Eq8vB;(k|7BxKD2P7_U^{-Qe7s%PgdqNhfn1f{(aPk$)r8qIE842eWZ&~BdFB8JUv73DT=#>Usoj-i9q5;ZG=s|&pRNFevLNy00WZT z*gv9$fQJ)wS_M4*Kz4PH+&KN`n%Qx5vxxblD`rM${>Y`;m9sZOw+?itW?x!*8|7Q# zx)@SJ`DS}joHk_jzbA!LUof*g%9w1?V`k}g+BNf?m8`5%$~HMna?+o~dftIokCU{K z%Ruq;D;S$7=zWen4HU0LtD)XIdEFihyPcH0i96P<1Vf6SSA~k(j_<<<$=@O1DLXs! zmo~vYoLpSi|MrAIkuSqE*D=Ry?@im6=F6Ad{ zrerIIuL^f^f(0o(vQj?pK{@^h1f%yWAl@p~lGGlUbJLCm1e!4tzEwl-NkLYZf`X$| zJN3i>6g+#aFT-K@`)!E5Zwj5FuiR6EQZCRS78)!R5`ehe16?l8xLlTh=N0#H?eXZmB__N(2q!1zo0|D60FTN z$gzyTNgxD>p+ku=@j?7k)PijH-8ask%#rhh`yluq$sp@TzAdq6b zm{yBnR023S!n!JTXNu~HLZ_>VJ;6|dyu7X~qSHnjyPs}K0*M_FMI=U(f6Nu{I-!^h zdN`DWAFnOBrMwd;uQa|FM|sSCf=o)%_|yGa!Iy?wQ(@+(^Iu(X2Q(_YIc};Tgy2Cj zqZu)PqyQuW4H3OD)DC#y9<9Nm+8!Vg--?H}51 zg-=99VJ@Ud&$KZ?AX^_m5Cu9IjR(;>;0yDN73&1sANOw)CmD8`aCWkKo z&nLHIhEEuv=6w8!@EyMRa~;q{`*cS8D;p|=;BvAY0ou|{O5xthAzLG`BYioz=SsSB z4B!_U9`2M;48Mya)r&)~oU0$+afsrjLetWJrTs&69_=p$>A#BY{zvqob`3S8QQ(!Q zM^B$o62q6bO13M1sf}x15&!{8@m%W;>)gl}@e2{3gRPQflRBT1$9;A&-Uct9r1L0=jPzB>l*5x!x5JZ8FPQ_Ve$sjLc{(s;*516J2O;p`$=D1m)}i8OtgiN>+Q8>e%(VDC z2JPW(wT?9=l+>AyLTleFRe}I%?_}=QPQ{VTnuWD**6KlkGsoon*R-7%68Nz)q(lmm zd}C6m1lkk`xxS2+?|?sQNCihP5m%BAk5B9fXGMtonjbR|4O*30T=?1T@U{3l=jjnZgn<{|#=YahgckUql_N2fFDrCCo;uim?#n6J=2x z1qvWb?71e!BmRd7m2;1RiZ{G)#~X7p)Elu=iTMp^f`kluys^d!j67(v$d_|2g6 zxp1TJ^a0m}8L%z`?S63KLs1w%35;o=~MGJPcMaSC}$!Zljd*Z~S^ zpC4~_2ua#iS9X_M%yaB7|E?@B)*91d;APRY62^M*-ciZ}u zB98AaNX?NpH8pTjL(uvphY%mf>(3Td7g<eCLk6tZABnG(Y{K!gZ{=LF(&9=viEymV#J z28XJOW+fQ$>97j$jTJumG$T;<4c2%$0Ce1<5n8~-LEsT6dK-H@6>=LA5xOb)(O>kJ zF%&0tDe_3%3+MT=4Ne>0{c_y%!L`hIZcwA3c<`0$z=_MT+-LXI17#5%6>!)S0D7qm z49I(3r!0Ti1pOEU-A?HQwqxofG3k*P+8*>DZvpriD3<|qstvraG`uz_SGWN)jw*H} znM%8-y1~a0sr5E?DG72M>7rxl?l^5FCH8eD&&;Xl@z92phYz(8*$gC+nZ7SXVg(^n zm}GmSFLX@AG5ll9>RxCkBoqEp-&SUMH~CMf9x){0qr&0?aIO1H%tzyo!}B@&qg7g@ z+T$*lJYph3Aa_8tvj5OfR&yv2!;Zuqvf`FQDp_o+uyw6uPvxTv&o#sT)jzLJxxsZZ z4%;Y5dEWTqMWI2&t#BAR-GVUQ1TRv>bJ+9M?&C=a#)^1SmYnk0GA*WM!NkN2>r_Q7 ziY^ca3=K`l`$k85V2upwgKrsqgAs!n{pCI_1E5eGHIIq;>WR?5FB5PhsF|9|3#We$ zq05POxZ1sTJ3X>!OIjWHuM}!Z7sm2V#IR6K@1BrGBdlGqno^vch7qjSNtc4q-lwh*`hk| zSx32BKS3RIM!RJO=supkof7!Dmi$F|_REt(V9)O&`aL0kIwd?F*jHD2^|@Fl!@}WA z0)KQ@4CAtYwjB-Y)V~W6>F}A93Z=7=e_P>xh2MB@o+xjp`K3TLHVZM1{8R! zjI{A^#gJn(gkJnbBbpO!XfA<1DhO{qlJ~Hc!CAi($yYlm01n~}R8opM5Q!v03HL&) zGF5`^MLv%IUc<)QnST`3jWT~G%gydwd0^kj7R1jrGnh>-686(J4}Y+CO(iFg;>D~bZYSDIX?+Lt2HO$vmiis>R<*@#zx@UJ3%N}rz<7P(z`~L zh%V|4$4gh|Fr*Ek*b4a$9RAFcZ^jN0!REL374Y%xUAHyS^omH7JfO~U!`l^sWHqw( zKbW9HF*GPTIzb2${eBP%P=TcmjN7(1ge{`D z1N43Kxr^Q#(>B`wrZdW)(q|0c@C{D{pm7V1XO=(3fD85#M~rm;;J|+6=>}ZyI$PSj z*g)3JuI-W33g?6Az@r?N_1q+b*Ulnh1PHVtn@-k@R7(A0Sy}OSRXaLjlP2bJH@^p& ztYs?1YTd{e$Gg{h%}K(Fw8=)$OGI&j=UMK^<|l^8V-NhvIG!8$7Yo9n4KwTJ+l{z% z6#)l7lLhNjJU!C%=W_}YmjIad(YL^SZ^7$jTf5zn=k{)+vPRLp$Asq(?Q^40Cz5!* zF$~?q2IiQr>z1e!Tbw&RR4zWV z8-hMWck3vZSLU`2%c??GjR=v=CmD4-OzCl8~~|!zH6KK$mZMAC~WfQP}Pz=P6MSV8fl64uln#UR2hq-s06fs z@%ZDLh*>{7)@}V|eo#cLXLZ|>frl+-*kLf~c)C1Ce3!Iz!%gPv_qg0c2#zcHo`giC z#Kgq2P8$(;`XX!~PhbIcEt|7(EmFNSQxJxGy+tqz5DX(@XLaDgy8I!#(Js?&|z`~M1~Pxgi&dT%DQ%G}^86k*&Wpj ze!Vjij$#U_v!Ginh1GXs@Wq1`?AoQAm<=D^QzQTIGxudr1&j^l_u= z=u}#(wC=G>cPrI4x}CKfKXA>qEPZa<{Q_-9USUp5PozxE2APB28g{)s)ym4s8^bBQ zc|erL|98L;DCGWcz(OVD&|O^tF1AjbOstX4^yRrfNv>qGhLSgWyUmLN7anbu-geUu zZARu$l_Lhb-ztdR;zIe%rEA?kxMYI>Z>7@HYFuWQwzPkQbXy{P&lL0>p4yX{adA5< zyXGoK!;7vpaenMQJ4E8ocI`h1X@TbOy^!u`w0G#-Lh;G{E&>a$3YSp#SrNjVIcKe- zMUDeU)UJadkkMSXVs;bHoIw~QnI?Z#jw6RQ%ZOY8i}x1v&$|$m4?S4EA&p6?ak*ON zo#Yke<$h?#;`Y@>>*mC(#M35#qN9hrtM&3Ob9!npIIb#tb~_Q%9~is#1}Zb3Dy-$@ zP&r=cyq1!Jez6YJ{^5P?ZCrbtk#W3tJkQR%OxvLT#r%tgrn82thO(D9mIg67eu`?k z^Xt(NN2M=$i?Gk@$pnjeLi` zB4DIa%a_m;DO1Uk-V$@YtqT5 zjGT;tt4LaWLcC)1M)X?FGq$tA@fKT++8ib`kw?S}!S zM62a`E#!Q@$7=nQD^5ixhkT*a%Z{(z5?i;9>TC1O|`gYaw)Q8 zKE}iuT%IOmF1Rz<<;MP=S#R-3B7)T9V(%rQl3Rp=;e)ClCr+S zULIaVx|t6aM3sr>%DyA%Pqz|(NVS}<*Zz!(?WEP>(|MaK?lv4yAQm18lw5ksy@P7H zsHs>z^7mX58o4vS%cN68EKhi5)*E~d8sG#LXR9ETvFY`>7WhO5m@LE?vuBS{cILO< zYjJ(~I5j;d@e(J8$OnhkPw5Cygb&@>H`mAp>_{D7htsUSvZ6{2$#0`W)r07SmALKw zvjsnvd`WqP`3$SV_=D(x-eO@(+Y{+%9^rzeNDj zxd%_MwU1w}imIqq;9Bm~7^G$(OqD7z#KDSSS`g8j#zKv+RE3!2jvML+l zprSi9k<)+1p%vMs?Q-9lS~A=P_$!sliPt)w9@uJys#n_dS65@{om`x!yx``Q9wQVh z-;o>iaJqQ=sZ}GCmpr*(GRtiFN^3v}bH>+EQ3}L&8j@zs&&@q26RJ2>M8LD5klD_8J=8i65n%=X`nd{ZL?|zr*(;F1^0N(|8W5!eR8^UXM#;1|-IB7i>f) zgZr{>u2NvWUx`%W@8MYyf$hWBWE1UgW4Z4=jDLSB$m58V9eby_hmh?%t)aPp)E4^Q z51OmODmV$zgCVw-zDH+JaMxer!DB?AKyV`HkQ=rw{?7l00*NeG0gAueyt6e34ctaO-{OKJnX8XNbuyi%zypMcq8vY{4p*AX zxDQkL^Y>?SrP3nd2YVf~x~PWSmwG9$r4bBL__W{`d#s0UYw~*Mls8(7yLp+Jizh@&yK;JC)DYCTNU@3!14XMSON31>|IvB^NN~=I&*Q4S82pY@EBo85kiQ< z(*qMUOYc^l{f_<{M9Q{3K;dKJPqepi(Qhk;A5?0--(jh z%LVTq-|}K5itYC~L=BA!lP$Jly%r31t&-lqW<&LdI|;PbS1{uYG5&q_4~%iUa!d!i zC3lzCR~zBX#%p^Ms^c{WfmeOV8Z5-(*p8V0{jEi4?cQ&M7PMl>6Y3ZIB9!egRV z^8sbiEjEkrwTG2w=Evg`cq#X9v-kZ%<2paa&Q{{?Xdw>oV0AEOj+5VV1sQa1J_CQ7 z(nfuGQD86PP@THG<)(79z3)cIR<0=oUi)Jb=o`WOOgK;UevpJUQ0T|(OQ*5T=HXr1 zG$X33wug2MerK6GxO#MrSkZHw!iLrT_y7pzPY#<&bVky)JNd2k$NQxnYi>e)HMAD} z<80f4`R@?LqW2LHqP+t%c2@huZxMR?`q*7G*b>SuZa5F;Y?!vf zdQG$|OkQdhe-0ronlU=7-0D0USN9LauzC4k)qU{((NT}2vNqu1@X4*E z#{}P9@^w=y-Ud5QmeAgf{~n3k8%4l_fJ`7v*S3XN7KgSMglBiy#=g7;?baS;z4ksB zTJ9!B2bom(D_3t?GpT)<6*9j+Lo03cT-}*tNOxaNbFTOOLpE=5T&y}s!tJtKpktV= zUGEX3OV8Z?j(TZV-w^@!WAy6kz$9-?C!-gIdX{&2_RN**Gt7~z1;41a6%~MRhrUdE z``D^x-0{aTTjl1&^J6oT{s*q^m?=s&Lr^TLIHGur4C7-$?o5}8VV!=o1 zVMP?R@{!Fcd0KprP$d)b`fEDY^$|CPZq!;g3Y5K=6~R1XfFb#wbYrNE0P&OtBE{b_ z`0k$}6L_)3-XXkTbW0V38~|g&wCvAc`3-<8;^x!Gi`G{+{{1@+vkj)gE}wOm-kI{G zRsC;dp&N@+9uyH@M3K`2zAc`BB)vf849jS(XUtz zk4V%2>~|9i~-mY^b6MOZ&w zT9#^O15Msn^5P~1NE!cI4;L6d#wRlZ@Z>DNo5x-MGcsfJ+}h&yF!HA2s^unn$Xq&; zIdjPPCh};u#Z=e_9>-i^XNO1neLgUZs}&iO^wpn(`LLdxGDS6h$&u;yR90H7=V z3Q9yjTM3w9!V)=qw){(w4sx|QBve_d z<$fD`D|}8GjA^Rk`@!^hXK9*OTc)svv{h~O5ms+df1Y&`fWC}wITCYEsKrNw^$oH* zz`7(j?u_Yijy93G;0Mjieo0=)gf-YWwuUX=+ zj~iihidlrdcE;Ij!}gxxYQxEZW%2o5*?#r@uoh>ZPn%LhJKbt6PA=4Em?ho9g5mi?y-&r1Hpl!GZ` z0GSQl#>vWe$gfD70_DH+rxmXkvpp>D+pJp$%71^5;XqqYkfGVy;#m%yh$&*OUj(>4 z_v4G)_rJL9nN;2&yjcvGvYLi9q53g!%oAs6;5BrI>FprU5vUk&5c$gF>^GP{u)e}D zgHq`7&Q*US{NA|7ByzLpSn8lZ1Dq|L_>daH&y!-HXHP+XJTN_hFc}8)Kf~6zZt_-L z&lzNGwyN-?f>+cMAn( z>XnQ>k)Q4=c4Q`zN%^#7}y5%3V-vj(fSO}c?Th4-b67+QMH#AK#qG&CKp z-k$bGD`Hf$b)*ITZgdXVL7jr%&*t-nC>>0f zxt3ok-uvPK9SeNM8+#1%eV^v17YMZn<^X3%}R{H7z+T@g|6TNEwZ zIDTgwvoH>oK-^3$6y@LoO?miA*@bS|?^g9xzhpqJjSI^PZ>;jTwL?`WOr8p1J38`j=m zUf*chJcAy@QMSNE>iE^50lK$0ycL`zSVfBFBdb9DUI$R4cXA833~Ei2o_ga+1@VUjp&I{^Jc|-WKrC`Bj122=;0AezA*F;&{mwZFK;IIg-{j zp#``k8(nddmo6*8r@GN&Hu4A>CI-P(w^Jbd$7vF9Mk*FCj>*;RoBJWjWTQ6%dx2bn zDFE!2%@yGkE?CsW7*a@|>kBsKa@*8kVzq)qGCmtmR?#c$ zopN?*VIvZ#@={1cK+ZVp>CR7G%1G;<4ufJJH z!m>jD#>!Ld#48Z0mc412ZSomKZ+!G0+kaCQNM>Vcg~o6=PzcFp2ba!BpbY>1VZTl%kEQZgzt zF$Hu6O|7>`=i!n&8Q(Av2sG0XDQ@Z)S{(DstoJInhbRQmb&QVko_vO3|x1`NwNftayj46rSi$IwYE&)^1TBKPs*MJC!HGaL@O& zu@@J(<|Hh2`+?33;55T5KXyeLa!IDVMUSt{nzN6V%DZns;-rsLGTq#?-*hC;f6!CL zAk$tVV24Y7RqrrrCiEC?cPjMtSC#sPy6i?E&XyajLJVFS3IS3yR(^hWo0%UP(DE-m zznBUcq9q}h$1)i1C9Czl<$0cKU@84RM?wDz0^YP41dI|u(TJ3cb4ytQM`cNH%{w|I zXC_O|oe|WL-_z-B2)JH*uBSJ^750jY!-lEpY@H{mW|{5@n^v(}nJz$+0l?j7Dq5Oc z*AzLUBEJ&hTT);^`6<6@3NN#?|Kh#Klo|#MPW(LP8f=Qnthavh6EAQG@94>x@@zI> zJ%9~?rwee@4a4NJ91i051(U}f22s(_C=+dfJg-N>%=U?2vi7H|l3I6#YWb(P8&Mme z4SU&7TLzA;bOeH|s%C7HA=Qs?6lyEU6m3;3_3J8ffBH(W)rxiKCBpUHc7N>K3Db#WNR+r~4 zLyD!*eD0+{G?*Ovs`E#LIooFD8M#vB{PC+H=nLqJM3EVNe`sxbFFx zsjK)J1XczV*Gke0&Xq5qL|9_On&WmH$I;Gvjtav(rDMF)=vMlTJ0zELXXrn zdKxd@+zzgI9o3-f&kgfnA=x&c!OFbAbJNj|-voUBKO(^BsM1OWxTG6*!1K)?VWofm z4ZISy#&;<5iF9|&u?er>8V%iT2f&E}BJr*YLoCAntk_H_z%N_{4d4N-34f{St+7&z&BvzJ?EOjvlN8%z zEvMs;4Oe4#=Be$>wM{Y^t!;nJNIYobORARf3W84m$_xVW1)cmwz;Z;&_1VG)?szC} zmvttL^yT%rt3lMGl|AsQz?HJygQO=7rRkA;yjWc5Yc4EEie^$xE%|3!d&=1)nUFix zkDHSYkdZDr*ruzB+ZY+`66&DkZ&&=;zSnRtrSzF!g@YtIqqbL^CvsvfPSC-KE0S7h z_iPiL2aeIl7z^9j{j0c3wDosS^?KAIqahEYwW57$aLcDFy$8_UR(fsp@WReU zpsvwCMlADPp|-E_uF>n>_YCOR*+lVdDmBoY31lKOnx4jUDb3CMlUIZdCFc&>{{#xS z&`r(+M|CO)JY5?$w#L#@PN&QkZ(8me4^FqO${HivfLpxlAeVQ1*zmym$u-Zto8LD~r*8CoOAuM1ydCPJK z1@hJhS{_TSNeOsZ66C-C5rcbKT4?&HVI{{H(RD3Y5og{g1wn43-;VfIL9(XNRB;sX zO&14pkjF$rKB!9|q8a4ic@uIgUwR}uUi#gp(Ln00H)@ccODWeohHr*W)DrkXUN|Xx z@-n9A0HbiDgauEWpntsJ&!x$?0Gc>`<|)P zvx`iTJvQKJE6MH%`%R7oPTjocK}nt6?WwULa0kxucUCPs?YpqwfTNzS*-EppB9Ww_ zHQ|*zoYu!Jt~XARj+!S}Dn*YM93~CI-!zhWS8zVkW1H;@%6%u`6W=02172b=M^X1| zc7KanH*D%Wm}HjnfFQdkp~hYnj|;Sd@Ew&$SA4t-2{id9tj43 zL&@POVDxl5Sae+gnv53maPw|h2Nxxn-DgE}_h<~FXHgz?#=}*rqNM3_MnQPX?dNg{ zVIjc;pSGC6HkrRh=M7j)y|OACK?{}nW@k#s%?hmr!%ZeA9Tu&MrEsm6oZ7Fh*v2L9 z4r*T1*}_kMcsoZ@y$wt<@IZIBVs8fs98Xa3h^}m&<<0jgYk?D*wf*OsH;XJ-&d~Ki ztI~I}Y+G#X2@1DogwG;f?8TXSoIASmX#Xn|KPGI#97kF*;nj9wof~~o8~h-oQp1RSs=qIZl4g`K-hCFmc7eG?o@y3MY_{<94Es zBh1e_$lXuSB`#YZZ9^pokeb7Aa|E!~#qJyxsQyk)wpMBnXX4LA9@ND?m>%6 zDm(qpj$q9q|9N-jVuLP;T;g()ja9fe%jU%tyFkd zr?yx*$I<$P`waP|ju=$9c>%znJS_<8|M>8nSh~%I3ekXGGN0R9)6#nH)P zPIE#!(V1^j3|n>#$sNm1n`%2(=Nm^4$dKpzu%d_ZvXkcBG(ItWd!f*S=x{fzXZZdI zx@l-6=UY%(fKBLi-CCQ>GGbQccDS(8x$=Bv2!Lf~6Yg7F>|?`#0T6d=bB!wVvisWa zUWQL6ITZR<1s=yir5B$1y`g6Y4o-J&A8frT)!tE)r_*oDp^h)Jwm;M>vLT}@q#Yr3 zonOX1hnAc)AAu1a6HIz;72-tz8PU6rKJlk-nV&v$5S^yCJy9w`v6x4UZjP7S9xM6) zudPCL4A({bzG6LTQSRR8v90KlFI29N*pvdRU3DwRMMVd1Tc1j7v&W61Z5 zi6{)u{+s5Q1ASQ^|@2bd#u@J_| zqbrE+LF^pc6AVWJyB9rgYwsIs5%`kq>A-^+riMl~Qr0jZiwfjhk+(kq%kRZHDM%2W zjPW)uRDlYbJl1RY2wbv0?yval2~RIAgbAOt=J(omkBnDt)!%j1ZIFt44{C_YIG)=|Twb?XUjf3z4BA${@vCI309x4%X43Qtoaqku@1~;NeeElf;%9xEgmRB2L z9zGF2rSPMI`&Qo9rG61>A9|Y~uGZgj!D2hDP((NtxnQj4>0`y1G!yOoX(o}jSkH(O z;qZF2ISKGQ303`ygw-WcIJ+G(z!)p=OMSS@2&e1k6X{#v4XRTu;V=tqpi6|N<2?qHhM#A$~ zQ}TrGC!&sFz;Y`yJH#n3cJk3bv2|h{aGih>ta~iB72782Q)4e1Np9egUU9YIHf6LPU1|RBgB$iPcJ;PoBVw}Gp4xaJQB#~{%>Kj%h^Jnh1cLcy&SAOBPtTPy7d_jqTEt#i$`X0KA?i6T42musdS5jChjO0BG#d-95KiklTOTf`*!H;dEx*^VaV1th@BPG0h+NiPOc+2xTC7#{2FZV7bWoXy2T=2ak&wE`;? z+T-S7N#sVv_4&bo4W=H;7~=1S8x>*-nV+`VE(}v6DD~UoyAcr2AUpwD)`ybU>alyf z%9}R&)C<>_qPEB1f94@+??qFD?)Y5TgWJff~F@;(R zKqdm{rHkmW*GrvXB7a{)m5FI5t$`A~OTrZiy}@;_+l4xAqD0x6k6KS)VqI3N_C(jW zCWhxd`mmr%fHLvE`3S%qM*I>koKWeM_Q@QGm_6(h+40JXD`9K!g#0*|_&zC$K{rWY z1l&Bbh4pKav54)}lg3TT8aF0*3Q|#Fp?|03dXf3?jbmfVA z(ro@lVfRlNnD8J~V=LTA2&(pR!`n<=tBLiO@diS#j-dVegBB=v2Q!m(0<#ka50y_2 zH^CqbleFT=4Sj`AJCncLe1fzMz)T?deP+f+|2YR5!2JLgRkR%y6kTsP3}tl0qu&}aFi$D9jD%hULgrE>U$lI%wY%T82 ze?OmsOCX$zker3OrR!>^`uJnWA-=ua6M{D&s>%*5LsQpSS101uy_MH-Ewpj^ZTnPt z6G0If$gz55ZSax$ijd$4j6NIfhumD9eRanJT-9ct>KW6NCclh|t(*M)?E@c)QLUy= zJHv)eSx4;t+8iFK16%ep(|V#Ju}~(i>H7#qxV~3`FrY2fv zN*^0{)sFx1efvev_k)P?&V5DaPYpGz>-DP(WvbGd8g0k@R3BSLqIjHzPhv_!9w1B) zE`iCV_l1(w{Uzp_ml-gSI6gt6l_#1DVMQJ0_0KWi+4-U~=z7hE^p2Ff@4olAeOz(o z=}!n-+8DGUu(692qEx8IaY?&T!mzQXwQ@KqIn3RY&jR=?_NQr}Ouq`y15ll}Nh@dBHebnELa05uF?pUT|I8GUu_p+u zBq%S5j(cs~toGqgKKfL3zEE`Bx@oLLk~2PZ>j9UQG^#+_+xW$_4VK~hJa>J6XHS)j zLCu;rL|hCq8_E*mzt_`*3?zV|D~7yKD@w)bxf(oPSX$uD?u5Ke=&GdZ6d>i+@y~z> z=1*#m^Whm!!JxcHH&_AZH+VKp0lQ&THD#J24G|l>J*=U3VrY-L4#UVjx-WT1BJ)YX zib1y^0uWe-!`@HY>dKC*DDs}hy7id?3++e+h=<`sOq%-Lcw|B$Vm>%dRVGaaKTZfB z^&v=&$2eK91YMbN0Y&j_B~m%Nu19PmqycY^9?N&W!QH})%Q!+wes!xEA0iDJh=irz zq7-43bH5$GWOoeN{0+G)V`7I_8o=)K?J_|MqTvu}524_{R;pLLlnf7)GB6mYzrQfj zHCh4z2urTe;)fxoAr;C|$n-6}6k{+#G{z)grtjw5IRZ2TSpcSK#;^IOi)pjZ7)?@y zStDl4!lN&*dH1Lu7K$^J%tB)#O^Peu>M=C2KM#diSuN6;wL!veaKRE#N?Z&v<<6jY z;v`1lq@Ag}qCy-DO+Ja$H5oT!)#W<+o((6wb6*J3loej|l&~nO7tVIScBCco;`?_B zIQ9ZyO#u{6h|c$p55;=u`U)4nG&o+orcnOAyqto;zw={yai7a&bldw|=@i}LAe@RP z>eT|)Dx>e#m#$&UzoJ7S6mJJSZ`C=8*{cX#&BjoW^^Dy;8Z(6TO6uO=4JVTcF<2%o zVc`8##ClpUGPU?#N`e&-dcmSqspAfUg_612z}k{7z(8x|tKSrB4ExU{Bn$Jns@&Kp z_z?Ab$P>&!vfA~NbPsel#;Z+9}ZhgX}82ZPOE;CE=(gJVrKhsLX zXG?F|?|$v?{jx)}vy;^G#{%y`Kk@n!w61l$_i+Bha`Hl^4Pd=Jc`AE^Kk)(! z`K=Y|hLIE$yw;7hYlyR?=~Lof3fg84#a=H5WC>e!Py;A+fVzX+f$p0_Q@1BT&Z5kp zKK#;nR_f8Cx7f4kdb`k2%RqEt$U$%Uv-b=gD&ghM5B5p*gs7vfg~t^f&2qZ3jOi{3 zQJdVRCK9CK4;=^EOKHW$A2M}xzxcyfAbZ!~Tg3BKb!&lHKf&3AKDl@J&GoVMbtO0- zUpqA%`2-D;QcosDZ8X`AIh`I00=Drws_7q7ALaZz7cKOg70HF==W1tHn2-4coO)rE z4x#@_*PaLTB!9zYM%4x#%UwKpLGi)$goFqyg`)xm+n7|>5M7?jNm*Sp^c2Vm-I-|bj zaIGc;J)%(l^cOc9R0)8$*tK@k@_xKs&~z1vxquB;i(*Ky=ZTICE}x%whsqv+HvP$e ze=hcHR)f?^{o(uCE8rqYt#7zIIhpKsbAd{PVSS3Fp~cicoO}mKWF|Y8=z9bW)v9k4 z>KaY%Wp3q5{G76^FEojzNYDsawzP=_&p8y~^qw1e?UbUGeYIrAu{b`>L{;|U5CK8- z!x9?!p=14<@FEZ8xuGkXw>yodczi#r|c(SNC@qE_8Zv{s?SB3)>bWtW%M(nS>bB% z1Z4TEx4~rw#O>kQSOs&M89;P2TXcx`u$wUjcAnFQ)WC~y8X#Z zr{>koil>DwaYdOR#3PrIYi17}S~q#VM(Rieh)w&J=Y@#{;J#o4yuQ8Sa0i93C09bQ;i*mFe?o&?l! zmggjdS(bgLS5cCdJfX^whd>bgPHZ#w_Og@~x@3jmC9X(lC;e&EwHmzR_KdFLyfL|GO5d`bd91Gp-@AmId^%_~wW>gxh67$P zp4Fo}MFQi`yIfqz!r6XMIQX%$gK@y8MBg=VU4>;K8c_=?P@e}asgs=9qa4|zePX0s zlwM9h=t>&sK5Hm8mQg$b;`knzo(Ekg^wLo)YpX4fEFg^d_@E>ND%}ZVDF%^5++sE7 zq>9SoZ}AQPe*VZO8EYmK3vNs(RoW*XO2y6pK3*SChQ^zbE)L855||G+-t&l+1>FUd z@xMw-w|&~bS05e+;K1aYL%b%YRzJ$evf#}1px=1d!7#G3lqTC?kCZ*Rm@jC&@!+?R;EZJzG-zMI*~~ty!jL`Z_2_D)M&bGM>so zz3bN`K>F5KI+ceR#LPd{`PFL3X0YbPnH(%BoQxc_N@l)R>LS^$BP2I9dWq<2E=Q1| z@UmNx$o8`dgdb^)nN4|!lIwBNdbb=fvUT7P>0}I*jo`pN9(W?_jyA@Bc(N! z-WT&RbaW8v3DM|%d!;Y5)l16!B+9fGgdvgw+;~R%Mb7$8KV+o*3ipc{KTB{6T(l4y z97LJiYzmkz{toh`4|gt*t-i>l(1Qq6C>(V}o7VG*H;G1x(~0@u`I^PzUphH4gC3NJ z86StIA2TG5&yjSLRCzmwvsDel>Mb7$zAXj&z0|imml;lf?qBj>h;ryj3VjU|nS&0X z9oM|Tb5zUmNdcN;sAU;XfTHr8Vy{bTvm-;@AzYZMI9D;`{4TeZ`x6|!4zU40={Gt^ zl%A*FskSn4o^} z=2YXs>+QzVXo%UP5c`|lSNfjq$C4AZ;TO~^rkCw<$%2tV(EWF~ir~Ff2E%^K^3U-j zdFzjuK=xYE!E@48%yeYI{Uoo$E^0cJXo`M5XoDTfeG_T>=vvi%ANE!PkUvk0{c0O5 zHAV}1SWen4pN+uEs2gO>A7snpn%(+2LB-~Nx;0o?QqN4_I@e(iA~YE?irXVal*70WbL5WX6fU5FA3S0;wB@GoY(J&SjN%Qdhg?5eoi8aTY`A@df^`{7;iNU| ziA#pX57+NOTfqQao^iW=CHC2FCtirnm6q;@^cNi{T!%qywC2s;NEdyXL0UVdi!!hRe5glI%CZ7nN0h9vTOwisZzyjFgd2z zeudC`+8bbkeje2AOixS{=gjtLPFze+%wb$tW(Jryw*@|(gxH<;=T~ic4c1~LqvSu{ zq@jCnS7#D-=k%y1yCYRg1hBgnjH;q`Y5Hy*bB(<+Cr*CGXhaBu#`o!Ezb zDinRU+53=9rUhqc{Z{Q;{AdBB=|cSHY8S-*#Ust{y!)JtP}0{<4XlTIKcWkP5%rXF!c|YgQgt>L)m;Ng+k$FXM!j9$fNXeH=z0 zKo)`H?~Z0?BFMJ82Mh0JLLGjvp{X=u<*N(Twdlk7x|=cc+JH3@zKfkOtuNQf|{64%e)R&VB%FA2Yn!v3C%rfE!2?x_Vj)bALsZJboR1Kz_B3kdNk z+O+5KN%Z!r%~phazacZ$5jFYRJxj_xCaC=lTsF^Uubqq&6Wsn25s2C+F>p_keyP}u zx+$9MwEUccU+ab+R%lPx&J!=j!Ru(bE=Qr=xR5vL`#0imAfzehYN$odnMus^H(v3Kc58h)+|jbaNyfWt)4O9MgrCrcu)9`@HzF=%0$=a|QBWlr68=ZIE$4mWKDOmij4TZ30e#zo@l z>k6Vq(Ro6;mcXR!es|~VuM>w#zjz_aPK%fPbdn?61+~W^JCmCz?)2b>3VusC+)#?- zwT+}QLXt?#aUE8Uvyu+^>fF1Bf=1=?5cCx|f4{UUT8K3>!QC#=nElX0Cg>@mZT@ne ztbjg;?`4|E{Zwf!;R_9SQzB@Ik=h#uHB&AEH3q!7Y`|rt^CBleS@48_NRFp!o+Ib= zHEC(#rblGeYwTB_|KL0oR)e;BwP5~sv7Gibn_680Hb=3I7j;*L)m;+{EV$|a4f@`g zR+;9z5-BOLsLN$I*YBellu|qI9LrbFs8rH#@aTL9bP`Sa=X>2jIP1ia8S^yNtQ$wF zbWEhQA{BsrA{_h`-6SyE!Y7a!5fg`K>fly+!*xnE1#vlNGTg0o34eO6emy(U;=ybo-nx2u<#MrAwW9 z`t2`w60O9aME@dr%J;jY>0_B%uq>_DwWs*X+Oz*ke%uP@DoN!{3Q>f~-%UBfbY|p9MJ;$Ul=fT%`_%PqQuvuBHUdK}o6EUXw#I z<$=b1=$IEh+a@}!zfnjmCEepaCz0bqQwzj*M=LwGB?1ZpHeX0d3uj@UD>{;Lw(}=# zly6@daHS6_644dgzEcXH9mZ*&OfvA9wt39R)kMUO*ATe-1rwrAjsGJ@it|WThb?to>Ft2f)6u3C#%Ro3`E_J zSJa>DIkN%%9Cw%L6%FJ|V?DV!v+w><5yI^nsnwXho1|3FW2*K>aBRG5+l1pD7a^?@ z$ip-!GU79O%nIS;Eu0z~Mh)|}JZ#>PM!XxNvmo47*0Ac3 zUEK-#S}`^d_Jj}D=Q%#=H$3WM4)|<>F2D~>+l4BK5HEODFmjw>{n;He#YD2c%i0Se zp7hEjN<6-WwFxQF;Q!FLZUak|4BF|v+B?oyc1EdshSrLm+Ik=*pUIf|l`Ur2ivC#u zqe1a%cN8D&F5S7eiXZ4k#@-!n!TQK`E*arqa(5|f0a#iiH+e0BV<6(QlX>lR z{~C1>%1lO}DCqE`!lB5#dP!u``qwISrI>nOvBmN4UJ~rjmr60XnrIPuMjTg3cf;>1 zT{b>8 z#3p3hb3yN*dOR1!u&}@o zqB3d_rsyD*`@C+QgAhCB4|VeV3Ep}72`Q0~hfXaEDXMnG-Gn|I2iYJ3v7HGxLV+liQ_2w_32ypV`#y-YFHj<%rZ?}P9!~z%Spa}` z^Fcjjbt8Vg$$z34^rZOyZH&FJ;M)V;6a+I=JBrcQGry$lz^Doj(( z$Ix@KD{6D=5vB4sp1hl9KQ83VF2sZMrx%?0^|(2{q$M~2odXa}RVAaFo$<&a51^WR zRfpA>*ofriQ&Jk1u8930l3A&L2GC<8-Dmr5Uq>>Wr0#h~Q)&_gZWfveUN7KueVCY+ zYkSJ-s0Ur^2r9q>LRG5sP0=xfI)l$B6bkW{YDwmLoI?FMv5M(IL{ZLoPExs{_u4z@ zaYsgV8P%QFVw#55M>YpH&jwHatpfs0JA)+*l*fZLkR99K62@OGro3rMH2p+0s?2CA za^i`LiWqMhB@BVaukVXmM`EuCf$*OS#u)c^LKevt2n@ad!EbTF?dxBTj}v=~2N@yd zjra)t=5#dGbW_T}`nZkXTV6R8dPwBGw{;2?JPX~l@BivMdOtzL&wBCHx{!! zH@ZwAzaC=5>{Eb2`J#OM6LkrB@T_arsMK`k45bD3*v9t5?`FH&kPy!)&ei<-V#6{myQ7#?V{pIudpnX@Ns| zO__=KAF*_AMLYkL5LmuNSiJ74<$t|Xt0lzHhiil8NFN5a>SPMP*m29rtAI&=pK4rg zzx8W29e4B*=A8XuB~GizP0ajDr1+lOo@r`Aj>zFXr5sZ&+>!@1RALa`^X|kj3plZg z=r)~QY(!W6`P-Nbx5=U7v(cdfyRV@OBOJpK;?PjsrRL1G5$^nx1jB-#8w5O zUC9f_$0AA$IOgwjN|ZAaw)3fq6Ql+|Lp#5+fV6AVw$4>ZiKmc_#h1?B49mgrQ!0{5 zUz}8<2*~eLJ%=^Op69;bjI^b*m4sCEdzi1Q%C#Fncy`!Qj2WbD3lx~{^C@tnHy z=c)d0d*>u&l(uJ#=2iBp?R`CJn)sKdE5}-EnYzgp29d?o19{f?)xmtf1R`@NB7MH_ zfogXZ{KTen5JrA&9Y!`r(hz5m5Jyun>dPEr4JYV(#~WTLx_rvB7hw5KL|h7CoQAq`+UXy)v8a=br zX$}#}+JR=BI%`G|3t~~hTXq?L8`RyQyW;yOee!6uNY!G{MZi&H2K=%A?X*k@X2ETuo<27>qs?CBO&_Uw#;5l^Cq#@T zW&PbeLxmAYe4AXr2Jt=9hRlrAShkZOFNeRp|9NrA_|R^D&hOdZ`SORC>U&s7CU1Mw zGld@!PC^Sl?@fdEU8kud6KMs^=BsU;6YSWmt-QD(_XG6uXDV#h!*^;hmlK35{Yw|X zr^9K-0-vGE$S+s1o{m_G5|cJ|Nz%QbOXx%Ou z6Fla4h>|%@byGp-rM|s#yS>YrlCKKqVnK3^IM=8`s?qt34w=b(w zCW1G?I9@e#QQ)lDho!~7#t#6EZnY#))LFykR(RrVPM_Grngva*Z?pOWtAnxUv(jSW zAt1+0<@%q&7xenpr~Vswi)lf6L0550h|kUInu{pS1fx>S@|0qJ5%0lk4|2e)2o2PD zh~HPYr%M?0QeU=Ht<7?Ap!f;w$9DK z4)ig`w^C9wV?I=@zYp|U-8}t1Jn)wlzRk@vdzFxZDEe=nkMb@1?7h8vAS)^H!@uhh zNZ=-7d!iZe&wO8ZMTvJLUW?wz+P}NfMjP0PV_9bo4bv12|L;wtt=JD@0VAnLWDJ|e5Blc(c6Se>DA0q<0c#0@^)3rB&El+Gry`*%C!>r%O+7qBSunNB zuY=(cbDK6njl1J259U+!Ng^i>;7<20>V#+jp8wQ%8Q5M^v1A9~jP8SQPq}4hOYtl$ z_rlJBzrSP^T#XNAhv=}v{v=$Q z68E}yMVV3Q%AQ>{^BwH5Dv!LvLp?}-9ag(`+4-dus>pR;y{cMwVwGz=A_F*(*y^CA zKYXG#^2&q=avWeMjaM<|qny<$aKw&NH!KpsaqY4|K;R7EI1!c@4d^vmY~kjpaTxW2 ze+Aooz89St0JVjl)LYI9tv{*>Oo4)_myr2FXR$61aJ7gY%ND(OE=*s}<%qAMpAbUu zIkpZne~V;Bmo4`;&sf>`U_q}x;s#CYxjrr}jqaGE(IPtNI&5mYk$z0_tlFl}vfbrD z_sKE_fPhtbTvn#>SG-)$Mhx_o<=~CG9qwDU9h$^yjsdWe<7mSz%XHlg5ttOu9ZBSG zXI<7ZI~KyF;9gA>?FZ_Be;pwGt?UQh-jAFtRoEUpjuJ2`Jl>{<+8-K%%^Ig|jwHZBWo< zaG5Pd9)b25(2n0g>`FhS^Q-?OS)pP#zNeg@^YcUpa`NVf zNPlI*t6`RZs_PQ`W>m#^f8O$Z5}J*w)JD%(%dkLR(Yx4>!cN1UW7>H?y-tDZC)3ys z0M9Q;3D2?bi{fTy&gT<9&?RYb7WKb;5xw>_O8n@;>w`YufE6ni50n+0)m6Da&owW$ zy1wf^0H$b&e0G4pE(9f-Ic;DAFDYUF?>>s7PKjB~_mVqQ~)9Gl>c;Lxoy`t0k zGEYU}L~J-qZiHz+zHrsgzNa`{qGu%RiS{?F;`_6Apf17RCC&Y;JOQneiWUThp58Oy z`}=n)BR4wW{bSzq1hylnXw`Zx>#stC$b*Tkj#N#C6lm-%-OgHh_`A4|#s2JF{0J?6 zj)d6Ks)&&{Pb|`hH&O*N(I<80orWu37N24dIqy%W#;FS$)v(I1j&b${xjo&TX4Kdc z-sYwbeevR#l-u~)$j;y6so&>d{UMOd{zAJjSCyyWi9%WrC_0&d0g`;=3(hsKTsJ|X zzrG9>%OSLH$eH_dB^|~5$~(V)RO9$_@OKboiF#o`(pO{58W^+lU941!4Gz80Z0BQn z%f?d8lCi8!XD{R9B$`@q&OF7bSxQ^u|CkEmm8Dqy<5-|xazks)z6?+%8~i3NG`4-u zl$x#s%w6I*YfSVxaG@gG(U-aJ2VExq)1oIOarY~J7pCV<3!+&YIh>-~yw(_~62$|m7UF6>bZX5cr*m!wOWt?{u;98yvcv<&L& z(KN=tFBEbAsp9nMpJ66|w(z~*IeTGx0gBEX%jrG06N-ZpF*(`Gg(sI;{7}t!tLNhUb!3fvhbB z`YI}7F;n{Fgx;*6W4!MG{>-wMm2BV`zSP4w#l1JWLnkV}(MiswX+iY??~y?7NKWKa zLxFc{{G{I;f!3GzKWbu*>sk7$EHkq-xK0xoHV}t05Q@r{>y+K1`ZUM%9jgNGbRr5Q zG$Lr%%l-DG&a(0nTBn8)N5wSOiyZ%I-l(yfm8EsnB7@vJClh=6fja8m-At$NL=h8X z6zrPUDoRBZMc?R19R|m>u9IJ$f7Hi#WmtTX>AVvG@;}l(-(k7rCHY4iT>Ngis&2id z`GHg8PT1tkMXlTM8ES@N6&G}CfS%*l>uO!_#(BjkSG^?Dn3uxOzS@?T5D{c%h&&xV z2NFDoHR^sl>KkL9&D zqZ@z0@P-)}=P_sC$y*?(4HdV^T}XZgcGuJ;4Zs9AJR8YTYCEs1I>1yvdx$%C%d%G( zdJpKjg`Is~ed&;Mwd5_^d#l*{#oA|eq3x#C8kN($V2UVb4}nn_K#+#Ew+zDxk431O z1V~oKS~h@DFGt*dY5iIuEc#6FxvwK7mK&78zS1YO{e*mX%XOB=^3!a)YY)AcXA~G=F`$ zz3gE;A;S%TKMlaJ)jZgdAEAZ=@yI&6J zTC07{t>1o7Nf|f}S%PcF3s-c2?RD!K zx-BTP^}Hjj4piYwOz))1_$2(&(Z1GA_T)czuG?%Wmr6nHOYU@c-vJm;D8UHb`o*44 z)ukX5?yJRhjv-Zupl^#$U0c&YX zq}W(YK}n20xU zG@JJdIq!KpYwYWQq62AZBZCIlT^5-3tgvno*y`rnS}+@Zp~Q2~n= z1jKElixSzB)oZOAdG%{8w?pzgweiKTcOO3ky^=z6 zRHt|uhBtyG_wHH~ZLwrztE-v4z4Je@Ye1V1x(ElLpc@{3HsZg`v0~LeGPD?L)|!D8 zoA&x(jv)EEEU&}G`-I`TE}Oqzk;YPwfE{BgVk8K>+_v`dW;9*oiS%ADnH5~YdK``c zEnKZ$QfN+>_N&H{Xnfcs@YoGX{!8UJo@p>#!&&>l!In@$ z{dcUkp!ZdCE$&U9qp_99Oky1C`0@#JjTB~61oQD`+x}Vh=ov}6*tFM%`_Gdl8p3dD; z(Y8ic!hbF`3lQ33o>g{EhwRZ!xljLIIxORN^9|b*@G*}z>Lzzs*3o`n|FJ}1prYCS zXL1lm5V!V_Y9rS;eL7a7ygVHX$53edb%Zgj{-E9q?{+)4TTLJa7|n zy&mzih&l#Uk=;1A-JGY0Aqp}u{rN>S+!=jj3=zrR{nN2{u!!P)YQc?Z2olS>M=&Ts z@eUQ-wJ3i)yXoDYT)w++k__a>1DQH_{hyD>!ugnOGiFV62tRcwd}J%Q${=%MtgxTk z^tP!pwFI9>++ppJv4$vQa}vk_paKIkcsuc?XBoI}xs4}zZ{_*JuYIZGSod9v7Mha^ zOQe~f6wsBIr9bmNMH>8XgI`yRmk=$Mj}@DT;y+9Xjut#OJl{vVgb(LRg{fEhNGDDW zNBnzD0|Iw&R{g)M!7pA_gU#mHLAFQz4A7&S_#f;L?}ukl2bsQre{1e>R&dhj058N+ zWX9{vc5u@_G2nCT8mk@J74z9|E-Y83E&tI&P|WK)$1DDRzfh=|($;Ht?MK|?l%Ikc zNQP()XB}()Sz$L0XbU21Th4yBWxgWAU1~jjRZs{jwJyu=vCY)0i+0q|CW>}yOtO04 zO0Z;Wf>v2f`VcT;XAU9G-UVylv{}~m?X0ikz!lb*Yl~5|a8kubSgndc=^AE~b)EDA zIyM8;f8`Qv;zfuX`swIHK<9)_iAmcZ!TcT9Y)joztBB<;QIt9V)8lMtrByY>LGZ8- z5vk<_t>t026sT_Ir{oTunu-$xNPmA591jsp48jpeTX`$;9+$3{X$=yAAh*(8!Z+U)wE;aGwKn;H+CP%1_rJ6~%+ z5HG_SY~-dN%lCL`3Ti^KHgR3}-wE+*i2T#+qE$S2IZT4{9A4xg0Kd8FS+ubREr*PQ z065y6QMWA5O9YH)vAqw?XEzD!S{avMp|7&Q7f+^3LLeuMk5lH| znX!4$1I{2JEfey%@!kE{lqTKOTm8i49$!q7(_m$&upP&Z@qjpam5}6Ae4JTit%y(t zgi=G^qpe(Kw8+t{EN9{luJu`CBp_yZXYdBoGih^JfcSZwXenA_oojqX z`oy9>9)Vn%9G54!wRp(YEi)gbm+Cy!6)*5 zm?A-gGg^faJ4eT4au>31AmXwdHhy(1_=umeE54~`)wzzM8jCrL4FHA`MmOggxXKGf zX9BZHj$fJl4Fo5-uF{Xpf<6>JPnUWV#NSxgMVxYoZ*VgANP*>c8@#`(=}AUs$DLtyLB zl(!&O&8B0K6?M98VOg8`7Vt71Y6UO#?QbIqpO~4S2QZ=6#ik|$i9uceU=u9S%e2ve zW#`Z|XjHO?4U(s>9hCOFj>Y%c^-=+q6r!J@zvUVt9UYW?fJ z1;e6lte!#s;Tbp!c_|a>TbbUClbmek!CMenBpJQ`op?bt`f#~>Z8uv~Cd}F7e!ha% z7jVY$1xIe67|R9W#0(?L#gHOeh3CJ`pa1%mK9Z#}$GrR5(W1%WEATJt-d)l#;|_DQiY}?h3@=4DfK9kL&C zK~sALTL^mm+Oxcq5#%!X_mfg@(*9k~z41eDPv}SMw%(D{na5IMt$&-K7bS!=+tRX8$8*?40}PJsdi}HOn!M^3$^_ z6UfW_RwZddh9Vr}xn40_=4;ItT!Oe?yAw`^6Ky5nb43N2l1y^$50SMWNXTaoQHE=x z)4hquhQK5y95Hc-o$bHk-7UKJN0!Q`WTQBOdf%_W0!w z_n}Kcl=_D8Dd$xa9X1@1g~pDh-)AEe5;NkG+4|`hOOO8U{JWi@E#Uo);0Q~1x_0f6{y6RvR)t+v%r?a}vd-T31 z$93|O{A;~`KI}o}(P{5x)@1eZDG_{M^)Bq}$Va+18#Z;$gEku0r9oHiXK!pvc^Ja` z8xv1YW6_wFvWvya`QFKt(7;V|-u`k*KBn$%m zke^XJ;px0kj#8QteqO3;1Jn5(BMF@b0rD@ku+H*lAt%j`|2PEnA+C#%60rALlWQ}6 zTPM|IzcZKNvrjL>z)m2DU8d3h@Zb{YswEzD`92x)g+GP`o;N&+h(?f2)Tf)QS7;Zo zh#Ut=z|@gdm+hl_=+R?Wm;=baI3R(utdLt6qeohqfQdIG@c-Oh5yGw!NFS)gH^g7! zMgLvSnWJ5_K3Xadf#}uUuWzL%vyNQ$ra=wA10QmYi_V`f?A4{Zl(!T-C6o_C-*XYi zWQ;tsxch{Jm+0Z9yQ~8jZp;P=Tcodus;`%YG@eBhbEu)eFky8l9V?I_W$599Azd#= zZ+UzZIi|h(n1@K;xukMog^BiijIyR7#eO&VQDShmM~@x%ghvn`5s&yYQRB3rse9=dUF$4?f$%V94JMkZ;{v$Gl!Eq;si=og32(R16@aPwTGg*D+dJDg=ecm9+% z)I1R(y;8w@WEc;lUQD&|no>p^je6|W4(Mw7>HMrh)w-bOuksKMM;QX|Pv5><$==67 zp1&}L-vH7>^>cD~!0ycG5#xTc%{45BRfY_iVAX`m-98=-`kaDXv@T#xKsZ@o{>xT^ zGbKx%Cjj8$n$d#9dD6<_{dY5yJhmV~> zMFgO~vnJg`FZ4~?qiXj_>sv0V;p2KMhol5P0J?0lSYV#mp9Wq0^Gx_JE^{lBeCCK){M8SEVt@Ycm*; zf%-Y?d>gmq&1?yK)WC!h{NtDV$Y0a`nZTR%?BJ)T_E7jdp)A}w7ePKkzLT_TvJKFd zH=sN2%xsZQ)2``0+B-SLL7xP;!)wM;@KFt{7{j&v15zEw_wuX`VQeatgz9D5+bW!w z-fIS)!!`{bScWgmHXv8sUVgxLj}HFxk{iCbq=g=MrN?>s@eN||$l~!RqN(`-@cXS_ z^<~)s1XkNi{_m7G`6Y@w%o%PG0Fc6d_`(+hxZx$v=-Nen^jegx$b<)~%zYa%Sikn$ z@Uj{9^tieO_5k^taa1%=1+5wcf6Rw0N?D!fWj=yH$X0K`1nT%OleIUiLnLTDbmoMu zAO-lTkF=aTkglGQHR~vJH@yBRALtCHSs?EfU6|Yw^~yx$USEEcSNyXnjab!3|BhP@ zMe;Q~%3$TZY~Vl^#)t7B>BN=^oevF9nod);ws}w9;2sg9#CuY3Pd;p_M<4_*k8#kI z8(?P%P~vHg_;!?d@mZ;~FK_br74?gsRyK;dpZDN)CUnt8&MJ7jSp1G-MZ~d!%a-6V)oLc`T3?L1 z!>~Fpu*-yoPx`t zJk}S!l!H(|89JFidK&WfVgjiPU!i6zg_*1SmaRlvqEj(;`g|W?s2WO{24UtAB3ii@ zwk30>{;$fTj2(Fii_Z8xAzO+&C)9fYue%&_4z3U1%VZ^78&XD_rLxk)Wxz)M_qjN& z)_Q;J6JgUT z`zwA!cM_*3g#OrSLz9x$@0q|5oS*Ko%_UDfsq7DX&{Qm+>8l>w^I-(2Tq(+y^)@J6 zA4og-aY+NS&b*Z?_&G%d@uC%aChwdOE<2u_lEQ_?SmhsVZbzM-l3mUoCF(NGnIRB& z(3u-Er>CTt-`o7i{@lm#`NGWNd+1IHAew$ibYE)!FcG}w>QqDU=oEtdZIuVUog4)+ za|WHi`evjR4S-Ados-ii=rL_xJ(&jsT17;4k!ilk9Ju^uB$vmDKfTQ5xmml9)RJ3X zz2>~4mXF8?YyPKP!1UGjL1>!&VxV5kJ4GVw4)?dKwvMKL;RWuZO(&h zH(mokiui?{3ui*<;0>B%aIy3)aE-b($|VsLcvm)89Q$U`FlaRmg!GIlQVZ?X#)-#HZrJ>V&PDF2lsL zr(;c21F#8L>(?T~*Ka_JF=s|aiy+nJwW=b1FubFgjZ;lcmnNzLmx7(rj8P6hZ^**; zgDx;DO{N|~6~$>H0#wW`k@hSBO;rvFC5_61pw0Ob*<@9ffN;oRJ!pp}^c70L8a3dc&5hDDJCnWaRHPdl1^L{r`E#O3!a=mBN3?aXrU@{wo$o za`)gKnvvLaa=va}V@qh?j)F~&LCHsaN$~PXxm*XJy}??_eNeBcjbI-u0jX#Xx6DLO@#%uv;naVdvb{cw`m^hSm#AY%jxsWqzr)x8uWfHi*=uht*hOS<|HixqePwg2lCT(>M zxlmgn%3?&fKEb6O)#-n}uM2WEjPjLP>OH?nyyx0o_>-IFk9JIzr8HwiuSC9ry^5js zC#$yAClR4|@wKv4qQx}_>=-5NuFSa^S zYvmT8_)p8&2`S>!)KM@PFAop zGyY5wT>IARNVN%_(ybR5aD~6QMf86Q{#dJBcn4IyQG^-gtf6$It`kZ?EXn?~loWvM zLGJ&Gc!0l@m}H)MW@G%|R;T;Nr(VmB1(;nf+-tEhStO7}$d>arVq zD`*bBnkCoe(1M=DT*nZ`nFb(e4C!!p01u#jNQFzeui1sCt*Ofqt~JzVokBb(zJuum z@-Pm=My;lRku*8i9^s~8mV#O)mH?)VAjlJ~#J)rxkCw`3lu8If)kWfcKlJ5zmPWRv z*{e+TY+0Pvd^E>B*kQ8M*CXTPikXd@n+Nx?bW3U`_Mq}#@^8-^O&Ktfa z20au6ubIC#UxlP$=tzC&jEdTW&M+ZH8AbOl6#49U_bY=${bS*fl%IR+1lMj^k|qT_W- z>q$HwCZw_=;B6TP$k{?>l9tF&%njYaSV1o4Yz&=%#=ewuq|I>k=sL_!IKBq)$|62@ z8Dl~+q>a-^<9`c7tCvpYt(m~~bhKwB&vg|noy=S>kU;&wwcf(LjfoE31E=@}iJiSonI-wZ7aDuA}*3`Phq z1wVuw+hA_4es%AF9ck{DErxz9!GyQHLr+eoWW5ajKuW$Q2>W|pQ@_v)p4M07aSd@brq}>~Z45 zI&HG+OR{XWf(C$LXLPu^m(K($zq@U5^i>F7v{~HXIdLxo>F7`dW2h&Dp+233gBGJ4 z$S0jBavf(2`(*3dGR5O!FQ7y^3%kF3Xs>;Yx#JLkhaD06&H<||bAhB{A5#<{pB0MC zG_q`gHhvZN%dmZ|={|W-icFi8{=$HBSK#BrpRW^3`BQ!ayyyd=)F%0c8D^#RYoKNP zx6|#CFH9~BeY(wQKh$?N(Y5|fd)$?pPp-mhhQhYj?cxyHK@Y$xgT6DyBQ-gH(VB*4WwU<1!7>pT<(A{H6C!GY zr5U^f@yKeOoOau@{M{Zt?Ed#!vBN^v?+VIlu;lMI&-bo)WCaIHj%Bu`%&jSWg7z6^ z&o)xz=Z~X2yPIPEzkZscVP{qv;u{o~dR5g|(D#kefvBG^et8N%N;rR5ZuShe|XH8)zF6T$15|dURbhA zL^AwLgx;h6Qa>o)(Jm-ND6{X$4yBQ$-tA$t1&p#htWW3Jr;KngaK3=ydvOK&AjLgj zd!FTku$=OaSLKMBObwj3lJeIY>x!?Eo{hw|$58PVbaSYD+-&#Cwauq?JV z?~AMETW&7lPoaR(@X&=1dWSdtw8y!YOe{U6@if0~M|}S*V+FG5-IEZYmMRwTw$3;t zA-@;nFMDrx<6$oy_-`<>U@8|{hAHrwcnh7K*R428EK=?+a@Wz8<4$fzpC0kQ{%=xU BdcObw