├── public
├── robots.txt
├── favicon.ico
├── logo192.png
├── logo512.png
├── manifest.json
└── index.html
├── squirrels.gif
├── .gitignore
├── src
├── App.css
├── index.css
├── reportWebVitals.js
├── index.js
├── App.js
└── contracts
│ └── NFTCollectible.json
├── README.md
└── package.json
/public/robots.txt:
--------------------------------------------------------------------------------
1 | # https://www.robotstxt.org/robotstxt.html
2 | User-agent: *
3 | Disallow:
4 |
--------------------------------------------------------------------------------
/squirrels.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rounakbanik/nft-collectible-frontend/HEAD/squirrels.gif
--------------------------------------------------------------------------------
/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rounakbanik/nft-collectible-frontend/HEAD/public/favicon.ico
--------------------------------------------------------------------------------
/public/logo192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rounakbanik/nft-collectible-frontend/HEAD/public/logo192.png
--------------------------------------------------------------------------------
/public/logo512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rounakbanik/nft-collectible-frontend/HEAD/public/logo512.png
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.js
7 |
8 | # testing
9 | /coverage
10 |
11 | # production
12 | /build
13 |
14 | # misc
15 | .DS_Store
16 | .env.local
17 | .env.development.local
18 | .env.test.local
19 | .env.production.local
20 |
21 | npm-debug.log*
22 | yarn-debug.log*
23 | yarn-error.log*
24 |
--------------------------------------------------------------------------------
/src/App.css:
--------------------------------------------------------------------------------
1 | .main-app {
2 | text-align: center;
3 | margin: 100px;
4 | }
5 |
6 | .cta-button {
7 | padding: 15px;
8 | border: none;
9 | border-radius: 12px;
10 | min-width: 250px;
11 | color: white;
12 | font-size: 18px;
13 | cursor: pointer;
14 | }
15 |
16 | .connect-wallet-button {
17 | background: rgb(32, 129, 226);
18 | }
19 |
20 | .mint-nft-button {
21 | background: orange;
22 | }
--------------------------------------------------------------------------------
/src/index.css:
--------------------------------------------------------------------------------
1 | body {
2 | margin: 0;
3 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
4 | 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
5 | sans-serif;
6 | -webkit-font-smoothing: antialiased;
7 | -moz-osx-font-smoothing: grayscale;
8 | }
9 |
10 | code {
11 | font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
12 | monospace;
13 | }
14 |
--------------------------------------------------------------------------------
/src/reportWebVitals.js:
--------------------------------------------------------------------------------
1 | const reportWebVitals = onPerfEntry => {
2 | if (onPerfEntry && onPerfEntry instanceof Function) {
3 | import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {
4 | getCLS(onPerfEntry);
5 | getFID(onPerfEntry);
6 | getFCP(onPerfEntry);
7 | getLCP(onPerfEntry);
8 | getTTFB(onPerfEntry);
9 | });
10 | }
11 | };
12 |
13 | export default reportWebVitals;
14 |
--------------------------------------------------------------------------------
/src/index.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom';
3 | import './index.css';
4 | import App from './App';
5 | import reportWebVitals from './reportWebVitals';
6 |
7 | ReactDOM.render(
8 |
9 |
10 | ,
11 | document.getElementById('root')
12 | );
13 |
14 | // If you want to start measuring performance in your app, pass a function
15 | // to log results (for example: reportWebVitals(console.log))
16 | // or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
17 | reportWebVitals();
18 |
--------------------------------------------------------------------------------
/public/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "short_name": "React App",
3 | "name": "Create React App Sample",
4 | "icons": [
5 | {
6 | "src": "favicon.ico",
7 | "sizes": "64x64 32x32 24x24 16x16",
8 | "type": "image/x-icon"
9 | },
10 | {
11 | "src": "logo192.png",
12 | "type": "image/png",
13 | "sizes": "192x192"
14 | },
15 | {
16 | "src": "logo512.png",
17 | "type": "image/png",
18 | "sizes": "512x512"
19 | }
20 | ],
21 | "start_url": ".",
22 | "display": "standalone",
23 | "theme_color": "#000000",
24 | "background_color": "#ffffff"
25 | }
26 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # NFT Collectible Smart Contract
2 |
3 | This is a companion code repository to Scrappy Squirrels' [Medium article](https://medium.com/scrappy-squirrels/tutorial-building-a-web3-frontend-with-react-e0a87ea3bad) on building a web3 frontend with React.
4 |
5 | ## About Scrappy Squirrels
6 |
7 |
8 |
9 | This library was created as part of the Scrappy Squirrels Project.
10 |
11 | Scrappy Squirrels is a collection of 10,000 randomly generated NFTs on the Ethereum Blockchain. Scrappy Squirrels are meant for buyers, creators, and developers who are completely new to the NFT ecosystem.
12 |
13 | The community is built around learning about the NFT revolution, exploring its current use cases, discovering new applications, and finding members to collaborate on exciting projects with.
14 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "nft-collectible-frontend",
3 | "version": "0.1.0",
4 | "private": true,
5 | "dependencies": {
6 | "@testing-library/jest-dom": "^5.11.4",
7 | "@testing-library/react": "^11.1.0",
8 | "@testing-library/user-event": "^12.1.10",
9 | "ethers": "^5.5.1",
10 | "react": "^17.0.2",
11 | "react-dom": "^17.0.2",
12 | "react-scripts": "4.0.3",
13 | "web-vitals": "^1.0.1"
14 | },
15 | "scripts": {
16 | "start": "react-scripts start",
17 | "build": "react-scripts build",
18 | "test": "react-scripts test",
19 | "eject": "react-scripts eject"
20 | },
21 | "eslintConfig": {
22 | "extends": [
23 | "react-app",
24 | "react-app/jest"
25 | ]
26 | },
27 | "browserslist": {
28 | "production": [
29 | ">0.2%",
30 | "not dead",
31 | "not op_mini all"
32 | ],
33 | "development": [
34 | "last 1 chrome version",
35 | "last 1 firefox version",
36 | "last 1 safari version"
37 | ]
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
12 |
13 |
17 |
18 |
27 | Scrappy Squirrels Tutorial
28 |
29 |
30 |
31 |
32 |
42 |
43 |
44 |
--------------------------------------------------------------------------------
/src/App.js:
--------------------------------------------------------------------------------
1 | import { useEffect, useState } from 'react';
2 | import './App.css';
3 | import contract from './contracts/NFTCollectible.json';
4 | import { ethers } from 'ethers';
5 |
6 | const contractAddress = "0x355638a4eCcb777794257f22f50c289d4189F245";
7 | const abi = contract.abi;
8 |
9 | function App() {
10 |
11 | const [currentAccount, setCurrentAccount] = useState(null);
12 |
13 | const checkWalletIsConnected = async () => {
14 | const { ethereum } = window;
15 |
16 | if (!ethereum) {
17 | console.log("Make sure you have Metamask installed!");
18 | return;
19 | } else {
20 | console.log("Wallet exists! We're ready to go!")
21 | }
22 |
23 | const accounts = await ethereum.request({ method: 'eth_accounts' });
24 |
25 | if (accounts.length !== 0) {
26 | const account = accounts[0];
27 | console.log("Found an authorized account: ", account);
28 | setCurrentAccount(account);
29 | } else {
30 | console.log("No authorized account found");
31 | }
32 | }
33 |
34 | const connectWalletHandler = async () => {
35 | const { ethereum } = window;
36 |
37 | if (!ethereum) {
38 | alert("Please install Metamask!");
39 | }
40 |
41 | try {
42 | const accounts = await ethereum.request({ method: 'eth_requestAccounts' });
43 | console.log("Found an account! Address: ", accounts[0]);
44 | setCurrentAccount(accounts[0]);
45 | } catch (err) {
46 | console.log(err)
47 | }
48 | }
49 |
50 | const mintNftHandler = async () => {
51 | try {
52 | const { ethereum } = window;
53 |
54 | if (ethereum) {
55 | const provider = new ethers.providers.Web3Provider(ethereum);
56 | const signer = provider.getSigner();
57 | const nftContract = new ethers.Contract(contractAddress, abi, signer);
58 |
59 | console.log("Initialize payment");
60 | let nftTxn = await nftContract.mintNFTs(1, { value: ethers.utils.parseEther("0.01") });
61 |
62 | console.log("Mining... please wait");
63 | await nftTxn.wait();
64 |
65 | console.log(`Mined, see transaction: https://rinkeby.etherscan.io/tx/${nftTxn.hash}`);
66 |
67 | } else {
68 | console.log("Ethereum object does not exist");
69 | }
70 |
71 | } catch (err) {
72 | console.log(err);
73 | }
74 | }
75 |
76 | const connectWalletButton = () => {
77 | return (
78 |
81 | )
82 | }
83 |
84 | const mintNftButton = () => {
85 | return (
86 |
89 | )
90 | }
91 |
92 | useEffect(() => {
93 | checkWalletIsConnected();
94 | }, [])
95 |
96 | return (
97 |
98 |
Scrappy Squirrels Tutorial
99 |
100 | {currentAccount ? mintNftButton() : connectWalletButton()}
101 |
102 |
103 | )
104 | }
105 |
106 | export default App;
107 |
--------------------------------------------------------------------------------
/src/contracts/NFTCollectible.json:
--------------------------------------------------------------------------------
1 | {
2 | "_format": "hh-sol-artifact-1",
3 | "contractName": "NFTCollectible",
4 | "sourceName": "contracts/NFTCollectible.sol",
5 | "abi": [
6 | {
7 | "inputs": [
8 | {
9 | "internalType": "string",
10 | "name": "baseURI",
11 | "type": "string"
12 | }
13 | ],
14 | "stateMutability": "nonpayable",
15 | "type": "constructor"
16 | },
17 | {
18 | "anonymous": false,
19 | "inputs": [
20 | {
21 | "indexed": true,
22 | "internalType": "address",
23 | "name": "owner",
24 | "type": "address"
25 | },
26 | {
27 | "indexed": true,
28 | "internalType": "address",
29 | "name": "approved",
30 | "type": "address"
31 | },
32 | {
33 | "indexed": true,
34 | "internalType": "uint256",
35 | "name": "tokenId",
36 | "type": "uint256"
37 | }
38 | ],
39 | "name": "Approval",
40 | "type": "event"
41 | },
42 | {
43 | "anonymous": false,
44 | "inputs": [
45 | {
46 | "indexed": true,
47 | "internalType": "address",
48 | "name": "owner",
49 | "type": "address"
50 | },
51 | {
52 | "indexed": true,
53 | "internalType": "address",
54 | "name": "operator",
55 | "type": "address"
56 | },
57 | {
58 | "indexed": false,
59 | "internalType": "bool",
60 | "name": "approved",
61 | "type": "bool"
62 | }
63 | ],
64 | "name": "ApprovalForAll",
65 | "type": "event"
66 | },
67 | {
68 | "anonymous": false,
69 | "inputs": [
70 | {
71 | "indexed": true,
72 | "internalType": "address",
73 | "name": "previousOwner",
74 | "type": "address"
75 | },
76 | {
77 | "indexed": true,
78 | "internalType": "address",
79 | "name": "newOwner",
80 | "type": "address"
81 | }
82 | ],
83 | "name": "OwnershipTransferred",
84 | "type": "event"
85 | },
86 | {
87 | "anonymous": false,
88 | "inputs": [
89 | {
90 | "indexed": true,
91 | "internalType": "address",
92 | "name": "from",
93 | "type": "address"
94 | },
95 | {
96 | "indexed": true,
97 | "internalType": "address",
98 | "name": "to",
99 | "type": "address"
100 | },
101 | {
102 | "indexed": true,
103 | "internalType": "uint256",
104 | "name": "tokenId",
105 | "type": "uint256"
106 | }
107 | ],
108 | "name": "Transfer",
109 | "type": "event"
110 | },
111 | {
112 | "inputs": [],
113 | "name": "MAX_PER_MINT",
114 | "outputs": [
115 | {
116 | "internalType": "uint256",
117 | "name": "",
118 | "type": "uint256"
119 | }
120 | ],
121 | "stateMutability": "view",
122 | "type": "function"
123 | },
124 | {
125 | "inputs": [],
126 | "name": "MAX_SUPPLY",
127 | "outputs": [
128 | {
129 | "internalType": "uint256",
130 | "name": "",
131 | "type": "uint256"
132 | }
133 | ],
134 | "stateMutability": "view",
135 | "type": "function"
136 | },
137 | {
138 | "inputs": [],
139 | "name": "PRICE",
140 | "outputs": [
141 | {
142 | "internalType": "uint256",
143 | "name": "",
144 | "type": "uint256"
145 | }
146 | ],
147 | "stateMutability": "view",
148 | "type": "function"
149 | },
150 | {
151 | "inputs": [
152 | {
153 | "internalType": "address",
154 | "name": "to",
155 | "type": "address"
156 | },
157 | {
158 | "internalType": "uint256",
159 | "name": "tokenId",
160 | "type": "uint256"
161 | }
162 | ],
163 | "name": "approve",
164 | "outputs": [],
165 | "stateMutability": "nonpayable",
166 | "type": "function"
167 | },
168 | {
169 | "inputs": [
170 | {
171 | "internalType": "address",
172 | "name": "owner",
173 | "type": "address"
174 | }
175 | ],
176 | "name": "balanceOf",
177 | "outputs": [
178 | {
179 | "internalType": "uint256",
180 | "name": "",
181 | "type": "uint256"
182 | }
183 | ],
184 | "stateMutability": "view",
185 | "type": "function"
186 | },
187 | {
188 | "inputs": [],
189 | "name": "baseTokenURI",
190 | "outputs": [
191 | {
192 | "internalType": "string",
193 | "name": "",
194 | "type": "string"
195 | }
196 | ],
197 | "stateMutability": "view",
198 | "type": "function"
199 | },
200 | {
201 | "inputs": [
202 | {
203 | "internalType": "uint256",
204 | "name": "tokenId",
205 | "type": "uint256"
206 | }
207 | ],
208 | "name": "getApproved",
209 | "outputs": [
210 | {
211 | "internalType": "address",
212 | "name": "",
213 | "type": "address"
214 | }
215 | ],
216 | "stateMutability": "view",
217 | "type": "function"
218 | },
219 | {
220 | "inputs": [
221 | {
222 | "internalType": "address",
223 | "name": "owner",
224 | "type": "address"
225 | },
226 | {
227 | "internalType": "address",
228 | "name": "operator",
229 | "type": "address"
230 | }
231 | ],
232 | "name": "isApprovedForAll",
233 | "outputs": [
234 | {
235 | "internalType": "bool",
236 | "name": "",
237 | "type": "bool"
238 | }
239 | ],
240 | "stateMutability": "view",
241 | "type": "function"
242 | },
243 | {
244 | "inputs": [
245 | {
246 | "internalType": "uint256",
247 | "name": "_count",
248 | "type": "uint256"
249 | }
250 | ],
251 | "name": "mintNFTs",
252 | "outputs": [],
253 | "stateMutability": "payable",
254 | "type": "function"
255 | },
256 | {
257 | "inputs": [],
258 | "name": "name",
259 | "outputs": [
260 | {
261 | "internalType": "string",
262 | "name": "",
263 | "type": "string"
264 | }
265 | ],
266 | "stateMutability": "view",
267 | "type": "function"
268 | },
269 | {
270 | "inputs": [],
271 | "name": "owner",
272 | "outputs": [
273 | {
274 | "internalType": "address",
275 | "name": "",
276 | "type": "address"
277 | }
278 | ],
279 | "stateMutability": "view",
280 | "type": "function"
281 | },
282 | {
283 | "inputs": [
284 | {
285 | "internalType": "uint256",
286 | "name": "tokenId",
287 | "type": "uint256"
288 | }
289 | ],
290 | "name": "ownerOf",
291 | "outputs": [
292 | {
293 | "internalType": "address",
294 | "name": "",
295 | "type": "address"
296 | }
297 | ],
298 | "stateMutability": "view",
299 | "type": "function"
300 | },
301 | {
302 | "inputs": [],
303 | "name": "renounceOwnership",
304 | "outputs": [],
305 | "stateMutability": "nonpayable",
306 | "type": "function"
307 | },
308 | {
309 | "inputs": [],
310 | "name": "reserveNFTs",
311 | "outputs": [],
312 | "stateMutability": "nonpayable",
313 | "type": "function"
314 | },
315 | {
316 | "inputs": [
317 | {
318 | "internalType": "address",
319 | "name": "from",
320 | "type": "address"
321 | },
322 | {
323 | "internalType": "address",
324 | "name": "to",
325 | "type": "address"
326 | },
327 | {
328 | "internalType": "uint256",
329 | "name": "tokenId",
330 | "type": "uint256"
331 | }
332 | ],
333 | "name": "safeTransferFrom",
334 | "outputs": [],
335 | "stateMutability": "nonpayable",
336 | "type": "function"
337 | },
338 | {
339 | "inputs": [
340 | {
341 | "internalType": "address",
342 | "name": "from",
343 | "type": "address"
344 | },
345 | {
346 | "internalType": "address",
347 | "name": "to",
348 | "type": "address"
349 | },
350 | {
351 | "internalType": "uint256",
352 | "name": "tokenId",
353 | "type": "uint256"
354 | },
355 | {
356 | "internalType": "bytes",
357 | "name": "_data",
358 | "type": "bytes"
359 | }
360 | ],
361 | "name": "safeTransferFrom",
362 | "outputs": [],
363 | "stateMutability": "nonpayable",
364 | "type": "function"
365 | },
366 | {
367 | "inputs": [
368 | {
369 | "internalType": "address",
370 | "name": "operator",
371 | "type": "address"
372 | },
373 | {
374 | "internalType": "bool",
375 | "name": "approved",
376 | "type": "bool"
377 | }
378 | ],
379 | "name": "setApprovalForAll",
380 | "outputs": [],
381 | "stateMutability": "nonpayable",
382 | "type": "function"
383 | },
384 | {
385 | "inputs": [
386 | {
387 | "internalType": "string",
388 | "name": "_baseTokenURI",
389 | "type": "string"
390 | }
391 | ],
392 | "name": "setBaseURI",
393 | "outputs": [],
394 | "stateMutability": "nonpayable",
395 | "type": "function"
396 | },
397 | {
398 | "inputs": [
399 | {
400 | "internalType": "bytes4",
401 | "name": "interfaceId",
402 | "type": "bytes4"
403 | }
404 | ],
405 | "name": "supportsInterface",
406 | "outputs": [
407 | {
408 | "internalType": "bool",
409 | "name": "",
410 | "type": "bool"
411 | }
412 | ],
413 | "stateMutability": "view",
414 | "type": "function"
415 | },
416 | {
417 | "inputs": [],
418 | "name": "symbol",
419 | "outputs": [
420 | {
421 | "internalType": "string",
422 | "name": "",
423 | "type": "string"
424 | }
425 | ],
426 | "stateMutability": "view",
427 | "type": "function"
428 | },
429 | {
430 | "inputs": [
431 | {
432 | "internalType": "uint256",
433 | "name": "index",
434 | "type": "uint256"
435 | }
436 | ],
437 | "name": "tokenByIndex",
438 | "outputs": [
439 | {
440 | "internalType": "uint256",
441 | "name": "",
442 | "type": "uint256"
443 | }
444 | ],
445 | "stateMutability": "view",
446 | "type": "function"
447 | },
448 | {
449 | "inputs": [
450 | {
451 | "internalType": "address",
452 | "name": "owner",
453 | "type": "address"
454 | },
455 | {
456 | "internalType": "uint256",
457 | "name": "index",
458 | "type": "uint256"
459 | }
460 | ],
461 | "name": "tokenOfOwnerByIndex",
462 | "outputs": [
463 | {
464 | "internalType": "uint256",
465 | "name": "",
466 | "type": "uint256"
467 | }
468 | ],
469 | "stateMutability": "view",
470 | "type": "function"
471 | },
472 | {
473 | "inputs": [
474 | {
475 | "internalType": "uint256",
476 | "name": "tokenId",
477 | "type": "uint256"
478 | }
479 | ],
480 | "name": "tokenURI",
481 | "outputs": [
482 | {
483 | "internalType": "string",
484 | "name": "",
485 | "type": "string"
486 | }
487 | ],
488 | "stateMutability": "view",
489 | "type": "function"
490 | },
491 | {
492 | "inputs": [
493 | {
494 | "internalType": "address",
495 | "name": "_owner",
496 | "type": "address"
497 | }
498 | ],
499 | "name": "tokensOfOwner",
500 | "outputs": [
501 | {
502 | "internalType": "uint256[]",
503 | "name": "",
504 | "type": "uint256[]"
505 | }
506 | ],
507 | "stateMutability": "view",
508 | "type": "function"
509 | },
510 | {
511 | "inputs": [],
512 | "name": "totalSupply",
513 | "outputs": [
514 | {
515 | "internalType": "uint256",
516 | "name": "",
517 | "type": "uint256"
518 | }
519 | ],
520 | "stateMutability": "view",
521 | "type": "function"
522 | },
523 | {
524 | "inputs": [
525 | {
526 | "internalType": "address",
527 | "name": "from",
528 | "type": "address"
529 | },
530 | {
531 | "internalType": "address",
532 | "name": "to",
533 | "type": "address"
534 | },
535 | {
536 | "internalType": "uint256",
537 | "name": "tokenId",
538 | "type": "uint256"
539 | }
540 | ],
541 | "name": "transferFrom",
542 | "outputs": [],
543 | "stateMutability": "nonpayable",
544 | "type": "function"
545 | },
546 | {
547 | "inputs": [
548 | {
549 | "internalType": "address",
550 | "name": "newOwner",
551 | "type": "address"
552 | }
553 | ],
554 | "name": "transferOwnership",
555 | "outputs": [],
556 | "stateMutability": "nonpayable",
557 | "type": "function"
558 | },
559 | {
560 | "inputs": [],
561 | "name": "withdraw",
562 | "outputs": [],
563 | "stateMutability": "payable",
564 | "type": "function"
565 | }
566 | ],
567 | "bytecode": "0x60806040523480156200001157600080fd5b506040516200485f3803806200485f8339818101604052810190620000379190620003d4565b6040518060400160405280600f81526020017f4e465420436f6c6c65637469626c6500000000000000000000000000000000008152506040518060400160405280600481526020017f4e465443000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000bb929190620002b2565b508060019080519060200190620000d4929190620002b2565b505050620000f7620000eb6200010f60201b60201c565b6200011760201b60201c565b6200010881620001dd60201b60201c565b506200060c565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620001ed6200010f60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002136200028860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200026c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002639062000440565b60405180910390fd5b80600c908051906020019062000284929190620002b2565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620002c09062000508565b90600052602060002090601f016020900481019282620002e4576000855562000330565b82601f10620002ff57805160ff191683800117855562000330565b8280016001018555821562000330579182015b828111156200032f57825182559160200191906001019062000312565b5b5090506200033f919062000343565b5090565b5b808211156200035e57600081600090555060010162000344565b5090565b60006200037962000373846200048b565b62000462565b9050828152602081018484840111156200039257600080fd5b6200039f848285620004d2565b509392505050565b600082601f830112620003b957600080fd5b8151620003cb84826020860162000362565b91505092915050565b600060208284031215620003e757600080fd5b600082015167ffffffffffffffff8111156200040257600080fd5b6200041084828501620003a7565b91505092915050565b600062000428602083620004c1565b91506200043582620005e3565b602082019050919050565b600060208201905081810360008301526200045b8162000419565b9050919050565b60006200046e62000481565b90506200047c82826200053e565b919050565b6000604051905090565b600067ffffffffffffffff821115620004a957620004a8620005a3565b5b620004b482620005d2565b9050602081019050919050565b600082825260208201905092915050565b60005b83811015620004f2578082015181840152602081019050620004d5565b8381111562000502576000848401525b50505050565b600060028204905060018216806200052157607f821691505b6020821081141562000538576200053762000574565b5b50919050565b6200054982620005d2565b810181811067ffffffffffffffff821117156200056b576200056a620005a3565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b614243806200061c6000396000f3fe6080604052600436106101b75760003560e01c806355f804b3116100ec57806395d89b411161008a578063c87b56dd11610064578063c87b56dd146105de578063d547cfb71461061b578063e985e9c514610646578063f2fde38b14610683576101b7565b806395d89b4114610561578063a22cb4651461058c578063b88d4fde146105b5576101b7565b8063715018a6116100c6578063715018a6146104b75780638462151c146104ce5780638d859f3e1461050b5780638da5cb5b14610536576101b7565b806355f804b3146104145780636352211e1461043d57806370a082311461047a576101b7565b806323b872dd116101595780633b4b1381116101335780633b4b1381146103885780633ccfd60b146103a457806342842e0e146103ae5780634f6ccce7146103d7576101b7565b806323b872dd146102f75780632f745c591461032057806332cb6b0c1461035d576101b7565b8063095ea7b311610195578063095ea7b31461026157806309d42b301461028a578063144100c7146102b557806318160ddd146102cc576101b7565b806301ffc9a7146101bc57806306fdde03146101f9578063081812fc14610224575b600080fd5b3480156101c857600080fd5b506101e360048036038101906101de9190612d5d565b6106ac565b6040516101f0919061339b565b60405180910390f35b34801561020557600080fd5b5061020e610726565b60405161021b91906133b6565b60405180910390f35b34801561023057600080fd5b5061024b60048036038101906102469190612df0565b6107b8565b6040516102589190613312565b60405180910390f35b34801561026d57600080fd5b5061028860048036038101906102839190612d21565b61083d565b005b34801561029657600080fd5b5061029f610955565b6040516102ac91906136d8565b60405180910390f35b3480156102c157600080fd5b506102ca61095a565b005b3480156102d857600080fd5b506102e1610a65565b6040516102ee91906136d8565b60405180910390f35b34801561030357600080fd5b5061031e60048036038101906103199190612c1b565b610a72565b005b34801561032c57600080fd5b5061034760048036038101906103429190612d21565b610ad2565b60405161035491906136d8565b60405180910390f35b34801561036957600080fd5b50610372610b77565b60405161037f91906136d8565b60405180910390f35b6103a2600480360381019061039d9190612df0565b610b7c565b005b6103ac610cb7565b005b3480156103ba57600080fd5b506103d560048036038101906103d09190612c1b565b610e2b565b005b3480156103e357600080fd5b506103fe60048036038101906103f99190612df0565b610e4b565b60405161040b91906136d8565b60405180910390f35b34801561042057600080fd5b5061043b60048036038101906104369190612daf565b610ee2565b005b34801561044957600080fd5b50610464600480360381019061045f9190612df0565b610f78565b6040516104719190613312565b60405180910390f35b34801561048657600080fd5b506104a1600480360381019061049c9190612bb6565b61102a565b6040516104ae91906136d8565b60405180910390f35b3480156104c357600080fd5b506104cc6110e2565b005b3480156104da57600080fd5b506104f560048036038101906104f09190612bb6565b61116a565b6040516105029190613379565b60405180910390f35b34801561051757600080fd5b50610520611264565b60405161052d91906136d8565b60405180910390f35b34801561054257600080fd5b5061054b61126f565b6040516105589190613312565b60405180910390f35b34801561056d57600080fd5b50610576611299565b60405161058391906133b6565b60405180910390f35b34801561059857600080fd5b506105b360048036038101906105ae9190612ce5565b61132b565b005b3480156105c157600080fd5b506105dc60048036038101906105d79190612c6a565b6114ac565b005b3480156105ea57600080fd5b5061060560048036038101906106009190612df0565b61150e565b60405161061291906133b6565b60405180910390f35b34801561062757600080fd5b506106306115b5565b60405161063d91906133b6565b60405180910390f35b34801561065257600080fd5b5061066d60048036038101906106689190612bdf565b611643565b60405161067a919061339b565b60405180910390f35b34801561068f57600080fd5b506106aa60048036038101906106a59190612bb6565b6116d7565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061071f575061071e826117cf565b5b9050919050565b606060008054610735906139cc565b80601f0160208091040260200160405190810160405280929190818152602001828054610761906139cc565b80156107ae5780601f10610783576101008083540402835291602001916107ae565b820191906000526020600020905b81548152906001019060200180831161079157829003601f168201915b5050505050905090565b60006107c3826118b1565b610802576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f9906135d8565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061084882610f78565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b090613658565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108d861191d565b73ffffffffffffffffffffffffffffffffffffffff16148061090757506109068161090161191d565b611643565b5b610946576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093d90613538565b60405180910390fd5b6109508383611925565b505050565b600581565b61096261191d565b73ffffffffffffffffffffffffffffffffffffffff1661098061126f565b73ffffffffffffffffffffffffffffffffffffffff16146109d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109cd906135f8565b60405180910390fd5b60006109e2600b6119de565b905060646109fa600a836119ec90919063ffffffff16565b10610a3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a31906133d8565b60405180910390fd5b60005b600a811015610a6157610a4e611a02565b8080610a5990613a2f565b915050610a3d565b5050565b6000600880549050905090565b610a83610a7d61191d565b82611a27565b610ac2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab990613698565b60405180910390fd5b610acd838383611b05565b505050565b6000610add8361102a565b8210610b1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b15906133f8565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b606481565b6000610b88600b6119de565b90506064610b9f83836119ec90919063ffffffff16565b1115610be0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd7906134d8565b60405180910390fd5b600082118015610bf1575060058211155b610c30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c27906134f8565b60405180910390fd5b610c4a82662386f26fc10000611d6190919063ffffffff16565b341015610c8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c83906134b8565b60405180910390fd5b60005b82811015610cb257610c9f611a02565b8080610caa90613a2f565b915050610c8f565b505050565b610cbf61191d565b73ffffffffffffffffffffffffffffffffffffffff16610cdd61126f565b73ffffffffffffffffffffffffffffffffffffffff1614610d33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2a906135f8565b60405180910390fd5b600047905060008111610d7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d72906135b8565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1682604051610da1906132fd565b60006040518083038185875af1925050503d8060008114610dde576040519150601f19603f3d011682016040523d82523d6000602084013e610de3565b606091505b5050905080610e27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1e90613678565b60405180910390fd5b5050565b610e46838383604051806020016040528060008152506114ac565b505050565b6000610e55610a65565b8210610e96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8d906136b8565b60405180910390fd5b60088281548110610ed0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610eea61191d565b73ffffffffffffffffffffffffffffffffffffffff16610f0861126f565b73ffffffffffffffffffffffffffffffffffffffff1614610f5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f55906135f8565b60405180910390fd5b80600c9080519060200190610f749291906129da565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611021576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101890613578565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561109b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109290613558565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6110ea61191d565b73ffffffffffffffffffffffffffffffffffffffff1661110861126f565b73ffffffffffffffffffffffffffffffffffffffff161461115e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611155906135f8565b60405180910390fd5b6111686000611d77565b565b606060006111778361102a565b905060008167ffffffffffffffff8111156111bb577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156111e95781602001602082028036833780820191505090505b50905060005b82811015611259576112018582610ad2565b82828151811061123a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050808061125190613a2f565b9150506111ef565b508092505050919050565b662386f26fc1000081565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546112a8906139cc565b80601f01602080910402602001604051908101604052809291908181526020018280546112d4906139cc565b80156113215780601f106112f657610100808354040283529160200191611321565b820191906000526020600020905b81548152906001019060200180831161130457829003601f168201915b5050505050905090565b61133361191d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139890613498565b60405180910390fd5b80600560006113ae61191d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661145b61191d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114a0919061339b565b60405180910390a35050565b6114bd6114b761191d565b83611a27565b6114fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f390613698565b60405180910390fd5b61150884848484611e3d565b50505050565b6060611519826118b1565b611558576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154f90613638565b60405180910390fd5b6000611562611e99565b9050600081511161158257604051806020016040528060008152506115ad565b8061158c84611f2b565b60405160200161159d9291906132d9565b6040516020818303038152906040525b915050919050565b600c80546115c2906139cc565b80601f01602080910402602001604051908101604052809291908181526020018280546115ee906139cc565b801561163b5780601f106116105761010080835404028352916020019161163b565b820191906000526020600020905b81548152906001019060200180831161161e57829003601f168201915b505050505081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6116df61191d565b73ffffffffffffffffffffffffffffffffffffffff166116fd61126f565b73ffffffffffffffffffffffffffffffffffffffff1614611753576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174a906135f8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156117c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ba90613438565b60405180910390fd5b6117cc81611d77565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061189a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806118aa57506118a9826120d8565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661199883610f78565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b600081836119fa9190613801565b905092915050565b6000611a0e600b6119de565b9050611a1a3382612142565b611a24600b612160565b50565b6000611a32826118b1565b611a71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6890613518565b60405180910390fd5b6000611a7c83610f78565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611aeb57508373ffffffffffffffffffffffffffffffffffffffff16611ad3846107b8565b73ffffffffffffffffffffffffffffffffffffffff16145b80611afc5750611afb8185611643565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611b2582610f78565b73ffffffffffffffffffffffffffffffffffffffff1614611b7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7290613618565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611beb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be290613478565b60405180910390fd5b611bf6838383612176565b611c01600082611925565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c5191906138e2565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ca89190613801565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008183611d6f9190613888565b905092915050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611e48848484611b05565b611e548484848461228a565b611e93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8a90613418565b60405180910390fd5b50505050565b6060600c8054611ea8906139cc565b80601f0160208091040260200160405190810160405280929190818152602001828054611ed4906139cc565b8015611f215780601f10611ef657610100808354040283529160200191611f21565b820191906000526020600020905b815481529060010190602001808311611f0457829003601f168201915b5050505050905090565b60606000821415611f73576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506120d3565b600082905060005b60008214611fa5578080611f8e90613a2f565b915050600a82611f9e9190613857565b9150611f7b565b60008167ffffffffffffffff811115611fe7577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156120195781602001600182028036833780820191505090505b5090505b600085146120cc5760018261203291906138e2565b9150600a856120419190613a78565b603061204d9190613801565b60f81b818381518110612089577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856120c59190613857565b945061201d565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61215c828260405180602001604052806000815250612421565b5050565b6001816000016000828254019250508190555050565b61218183838361247c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156121c4576121bf81612481565b612203565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146122025761220183826124ca565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122465761224181612637565b612285565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461228457612283828261277a565b5b5b505050565b60006122ab8473ffffffffffffffffffffffffffffffffffffffff166127f9565b15612414578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026122d461191d565b8786866040518563ffffffff1660e01b81526004016122f6949392919061332d565b602060405180830381600087803b15801561231057600080fd5b505af192505050801561234157506040513d601f19601f8201168201806040525081019061233e9190612d86565b60015b6123c4573d8060008114612371576040519150601f19603f3d011682016040523d82523d6000602084013e612376565b606091505b506000815114156123bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b390613418565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612419565b600190505b949350505050565b61242b838361280c565b612438600084848461228a565b612477576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246e90613418565b60405180910390fd5b505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016124d78461102a565b6124e191906138e2565b90506000600760008481526020019081526020016000205490508181146125c6576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061264b91906138e2565b90506000600960008481526020019081526020016000205490506000600883815481106126a1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106126e9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061275e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006127858361102a565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561287c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287390613598565b60405180910390fd5b612885816118b1565b156128c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128bc90613458565b60405180910390fd5b6128d160008383612176565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129219190613801565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8280546129e6906139cc565b90600052602060002090601f016020900481019282612a085760008555612a4f565b82601f10612a2157805160ff1916838001178555612a4f565b82800160010185558215612a4f579182015b82811115612a4e578251825591602001919060010190612a33565b5b509050612a5c9190612a60565b5090565b5b80821115612a79576000816000905550600101612a61565b5090565b6000612a90612a8b84613718565b6136f3565b905082815260208101848484011115612aa857600080fd5b612ab384828561398a565b509392505050565b6000612ace612ac984613749565b6136f3565b905082815260208101848484011115612ae657600080fd5b612af184828561398a565b509392505050565b600081359050612b08816141b1565b92915050565b600081359050612b1d816141c8565b92915050565b600081359050612b32816141df565b92915050565b600081519050612b47816141df565b92915050565b600082601f830112612b5e57600080fd5b8135612b6e848260208601612a7d565b91505092915050565b600082601f830112612b8857600080fd5b8135612b98848260208601612abb565b91505092915050565b600081359050612bb0816141f6565b92915050565b600060208284031215612bc857600080fd5b6000612bd684828501612af9565b91505092915050565b60008060408385031215612bf257600080fd5b6000612c0085828601612af9565b9250506020612c1185828601612af9565b9150509250929050565b600080600060608486031215612c3057600080fd5b6000612c3e86828701612af9565b9350506020612c4f86828701612af9565b9250506040612c6086828701612ba1565b9150509250925092565b60008060008060808587031215612c8057600080fd5b6000612c8e87828801612af9565b9450506020612c9f87828801612af9565b9350506040612cb087828801612ba1565b925050606085013567ffffffffffffffff811115612ccd57600080fd5b612cd987828801612b4d565b91505092959194509250565b60008060408385031215612cf857600080fd5b6000612d0685828601612af9565b9250506020612d1785828601612b0e565b9150509250929050565b60008060408385031215612d3457600080fd5b6000612d4285828601612af9565b9250506020612d5385828601612ba1565b9150509250929050565b600060208284031215612d6f57600080fd5b6000612d7d84828501612b23565b91505092915050565b600060208284031215612d9857600080fd5b6000612da684828501612b38565b91505092915050565b600060208284031215612dc157600080fd5b600082013567ffffffffffffffff811115612ddb57600080fd5b612de784828501612b77565b91505092915050565b600060208284031215612e0257600080fd5b6000612e1084828501612ba1565b91505092915050565b6000612e2583836132bb565b60208301905092915050565b612e3a81613916565b82525050565b6000612e4b8261378a565b612e5581856137b8565b9350612e608361377a565b8060005b83811015612e91578151612e788882612e19565b9750612e83836137ab565b925050600181019050612e64565b5085935050505092915050565b612ea781613928565b82525050565b6000612eb882613795565b612ec281856137c9565b9350612ed2818560208601613999565b612edb81613b65565b840191505092915050565b6000612ef1826137a0565b612efb81856137e5565b9350612f0b818560208601613999565b612f1481613b65565b840191505092915050565b6000612f2a826137a0565b612f3481856137f6565b9350612f44818560208601613999565b80840191505092915050565b6000612f5d601f836137e5565b9150612f6882613b76565b602082019050919050565b6000612f80602b836137e5565b9150612f8b82613b9f565b604082019050919050565b6000612fa36032836137e5565b9150612fae82613bee565b604082019050919050565b6000612fc66026836137e5565b9150612fd182613c3d565b604082019050919050565b6000612fe9601c836137e5565b9150612ff482613c8c565b602082019050919050565b600061300c6024836137e5565b915061301782613cb5565b604082019050919050565b600061302f6019836137e5565b915061303a82613d04565b602082019050919050565b60006130526022836137e5565b915061305d82613d2d565b604082019050919050565b60006130756015836137e5565b915061308082613d7c565b602082019050919050565b60006130986025836137e5565b91506130a382613da5565b604082019050919050565b60006130bb602c836137e5565b91506130c682613df4565b604082019050919050565b60006130de6038836137e5565b91506130e982613e43565b604082019050919050565b6000613101602a836137e5565b915061310c82613e92565b604082019050919050565b60006131246029836137e5565b915061312f82613ee1565b604082019050919050565b60006131476020836137e5565b915061315282613f30565b602082019050919050565b600061316a6019836137e5565b915061317582613f59565b602082019050919050565b600061318d602c836137e5565b915061319882613f82565b604082019050919050565b60006131b06020836137e5565b91506131bb82613fd1565b602082019050919050565b60006131d36029836137e5565b91506131de82613ffa565b604082019050919050565b60006131f6602f836137e5565b915061320182614049565b604082019050919050565b60006132196021836137e5565b915061322482614098565b604082019050919050565b600061323c6000836137da565b9150613247826140e7565b600082019050919050565b600061325f6010836137e5565b915061326a826140ea565b602082019050919050565b60006132826031836137e5565b915061328d82614113565b604082019050919050565b60006132a5602c836137e5565b91506132b082614162565b604082019050919050565b6132c481613980565b82525050565b6132d381613980565b82525050565b60006132e58285612f1f565b91506132f18284612f1f565b91508190509392505050565b60006133088261322f565b9150819050919050565b60006020820190506133276000830184612e31565b92915050565b60006080820190506133426000830187612e31565b61334f6020830186612e31565b61335c60408301856132ca565b818103606083015261336e8184612ead565b905095945050505050565b600060208201905081810360008301526133938184612e40565b905092915050565b60006020820190506133b06000830184612e9e565b92915050565b600060208201905081810360008301526133d08184612ee6565b905092915050565b600060208201905081810360008301526133f181612f50565b9050919050565b6000602082019050818103600083015261341181612f73565b9050919050565b6000602082019050818103600083015261343181612f96565b9050919050565b6000602082019050818103600083015261345181612fb9565b9050919050565b6000602082019050818103600083015261347181612fdc565b9050919050565b6000602082019050818103600083015261349181612fff565b9050919050565b600060208201905081810360008301526134b181613022565b9050919050565b600060208201905081810360008301526134d181613045565b9050919050565b600060208201905081810360008301526134f181613068565b9050919050565b600060208201905081810360008301526135118161308b565b9050919050565b60006020820190508181036000830152613531816130ae565b9050919050565b60006020820190508181036000830152613551816130d1565b9050919050565b60006020820190508181036000830152613571816130f4565b9050919050565b6000602082019050818103600083015261359181613117565b9050919050565b600060208201905081810360008301526135b18161313a565b9050919050565b600060208201905081810360008301526135d18161315d565b9050919050565b600060208201905081810360008301526135f181613180565b9050919050565b60006020820190508181036000830152613611816131a3565b9050919050565b60006020820190508181036000830152613631816131c6565b9050919050565b60006020820190508181036000830152613651816131e9565b9050919050565b600060208201905081810360008301526136718161320c565b9050919050565b6000602082019050818103600083015261369181613252565b9050919050565b600060208201905081810360008301526136b181613275565b9050919050565b600060208201905081810360008301526136d181613298565b9050919050565b60006020820190506136ed60008301846132ca565b92915050565b60006136fd61370e565b905061370982826139fe565b919050565b6000604051905090565b600067ffffffffffffffff82111561373357613732613b36565b5b61373c82613b65565b9050602081019050919050565b600067ffffffffffffffff82111561376457613763613b36565b5b61376d82613b65565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061380c82613980565b915061381783613980565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561384c5761384b613aa9565b5b828201905092915050565b600061386282613980565b915061386d83613980565b92508261387d5761387c613ad8565b5b828204905092915050565b600061389382613980565b915061389e83613980565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156138d7576138d6613aa9565b5b828202905092915050565b60006138ed82613980565b91506138f883613980565b92508282101561390b5761390a613aa9565b5b828203905092915050565b600061392182613960565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156139b757808201518184015260208101905061399c565b838111156139c6576000848401525b50505050565b600060028204905060018216806139e457607f821691505b602082108114156139f8576139f7613b07565b5b50919050565b613a0782613b65565b810181811067ffffffffffffffff82111715613a2657613a25613b36565b5b80604052505050565b6000613a3a82613980565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613a6d57613a6c613aa9565b5b600182019050919050565b6000613a8382613980565b9150613a8e83613980565b925082613a9e57613a9d613ad8565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4e6f7420656e6f756768204e465473206c65667420746f207265736572766500600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4e6f7420656e6f75676820657468657220746f207075726368617365204e465460008201527f732e000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f756768204e465473206c656674210000000000000000000000600082015250565b7f43616e6e6f74206d696e7420737065636966696564206e756d626572206f662060008201527f4e4654732e000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4e6f206574686572206c65667420746f20776974686472617700000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6141ba81613916565b81146141c557600080fd5b50565b6141d181613928565b81146141dc57600080fd5b50565b6141e881613934565b81146141f357600080fd5b50565b6141ff81613980565b811461420a57600080fd5b5056fea2646970667358221220dbb56ffa0ef16d53b56dc70ac93f7b1c3eba45cd6b47475ad832e39dca7a355664736f6c63430008040033",
568 | "deployedBytecode": "0x6080604052600436106101b75760003560e01c806355f804b3116100ec57806395d89b411161008a578063c87b56dd11610064578063c87b56dd146105de578063d547cfb71461061b578063e985e9c514610646578063f2fde38b14610683576101b7565b806395d89b4114610561578063a22cb4651461058c578063b88d4fde146105b5576101b7565b8063715018a6116100c6578063715018a6146104b75780638462151c146104ce5780638d859f3e1461050b5780638da5cb5b14610536576101b7565b806355f804b3146104145780636352211e1461043d57806370a082311461047a576101b7565b806323b872dd116101595780633b4b1381116101335780633b4b1381146103885780633ccfd60b146103a457806342842e0e146103ae5780634f6ccce7146103d7576101b7565b806323b872dd146102f75780632f745c591461032057806332cb6b0c1461035d576101b7565b8063095ea7b311610195578063095ea7b31461026157806309d42b301461028a578063144100c7146102b557806318160ddd146102cc576101b7565b806301ffc9a7146101bc57806306fdde03146101f9578063081812fc14610224575b600080fd5b3480156101c857600080fd5b506101e360048036038101906101de9190612d5d565b6106ac565b6040516101f0919061339b565b60405180910390f35b34801561020557600080fd5b5061020e610726565b60405161021b91906133b6565b60405180910390f35b34801561023057600080fd5b5061024b60048036038101906102469190612df0565b6107b8565b6040516102589190613312565b60405180910390f35b34801561026d57600080fd5b5061028860048036038101906102839190612d21565b61083d565b005b34801561029657600080fd5b5061029f610955565b6040516102ac91906136d8565b60405180910390f35b3480156102c157600080fd5b506102ca61095a565b005b3480156102d857600080fd5b506102e1610a65565b6040516102ee91906136d8565b60405180910390f35b34801561030357600080fd5b5061031e60048036038101906103199190612c1b565b610a72565b005b34801561032c57600080fd5b5061034760048036038101906103429190612d21565b610ad2565b60405161035491906136d8565b60405180910390f35b34801561036957600080fd5b50610372610b77565b60405161037f91906136d8565b60405180910390f35b6103a2600480360381019061039d9190612df0565b610b7c565b005b6103ac610cb7565b005b3480156103ba57600080fd5b506103d560048036038101906103d09190612c1b565b610e2b565b005b3480156103e357600080fd5b506103fe60048036038101906103f99190612df0565b610e4b565b60405161040b91906136d8565b60405180910390f35b34801561042057600080fd5b5061043b60048036038101906104369190612daf565b610ee2565b005b34801561044957600080fd5b50610464600480360381019061045f9190612df0565b610f78565b6040516104719190613312565b60405180910390f35b34801561048657600080fd5b506104a1600480360381019061049c9190612bb6565b61102a565b6040516104ae91906136d8565b60405180910390f35b3480156104c357600080fd5b506104cc6110e2565b005b3480156104da57600080fd5b506104f560048036038101906104f09190612bb6565b61116a565b6040516105029190613379565b60405180910390f35b34801561051757600080fd5b50610520611264565b60405161052d91906136d8565b60405180910390f35b34801561054257600080fd5b5061054b61126f565b6040516105589190613312565b60405180910390f35b34801561056d57600080fd5b50610576611299565b60405161058391906133b6565b60405180910390f35b34801561059857600080fd5b506105b360048036038101906105ae9190612ce5565b61132b565b005b3480156105c157600080fd5b506105dc60048036038101906105d79190612c6a565b6114ac565b005b3480156105ea57600080fd5b5061060560048036038101906106009190612df0565b61150e565b60405161061291906133b6565b60405180910390f35b34801561062757600080fd5b506106306115b5565b60405161063d91906133b6565b60405180910390f35b34801561065257600080fd5b5061066d60048036038101906106689190612bdf565b611643565b60405161067a919061339b565b60405180910390f35b34801561068f57600080fd5b506106aa60048036038101906106a59190612bb6565b6116d7565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061071f575061071e826117cf565b5b9050919050565b606060008054610735906139cc565b80601f0160208091040260200160405190810160405280929190818152602001828054610761906139cc565b80156107ae5780601f10610783576101008083540402835291602001916107ae565b820191906000526020600020905b81548152906001019060200180831161079157829003601f168201915b5050505050905090565b60006107c3826118b1565b610802576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f9906135d8565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061084882610f78565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b090613658565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108d861191d565b73ffffffffffffffffffffffffffffffffffffffff16148061090757506109068161090161191d565b611643565b5b610946576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093d90613538565b60405180910390fd5b6109508383611925565b505050565b600581565b61096261191d565b73ffffffffffffffffffffffffffffffffffffffff1661098061126f565b73ffffffffffffffffffffffffffffffffffffffff16146109d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109cd906135f8565b60405180910390fd5b60006109e2600b6119de565b905060646109fa600a836119ec90919063ffffffff16565b10610a3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a31906133d8565b60405180910390fd5b60005b600a811015610a6157610a4e611a02565b8080610a5990613a2f565b915050610a3d565b5050565b6000600880549050905090565b610a83610a7d61191d565b82611a27565b610ac2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab990613698565b60405180910390fd5b610acd838383611b05565b505050565b6000610add8361102a565b8210610b1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b15906133f8565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b606481565b6000610b88600b6119de565b90506064610b9f83836119ec90919063ffffffff16565b1115610be0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd7906134d8565b60405180910390fd5b600082118015610bf1575060058211155b610c30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c27906134f8565b60405180910390fd5b610c4a82662386f26fc10000611d6190919063ffffffff16565b341015610c8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c83906134b8565b60405180910390fd5b60005b82811015610cb257610c9f611a02565b8080610caa90613a2f565b915050610c8f565b505050565b610cbf61191d565b73ffffffffffffffffffffffffffffffffffffffff16610cdd61126f565b73ffffffffffffffffffffffffffffffffffffffff1614610d33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2a906135f8565b60405180910390fd5b600047905060008111610d7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d72906135b8565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1682604051610da1906132fd565b60006040518083038185875af1925050503d8060008114610dde576040519150601f19603f3d011682016040523d82523d6000602084013e610de3565b606091505b5050905080610e27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1e90613678565b60405180910390fd5b5050565b610e46838383604051806020016040528060008152506114ac565b505050565b6000610e55610a65565b8210610e96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8d906136b8565b60405180910390fd5b60088281548110610ed0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610eea61191d565b73ffffffffffffffffffffffffffffffffffffffff16610f0861126f565b73ffffffffffffffffffffffffffffffffffffffff1614610f5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f55906135f8565b60405180910390fd5b80600c9080519060200190610f749291906129da565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611021576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101890613578565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561109b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109290613558565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6110ea61191d565b73ffffffffffffffffffffffffffffffffffffffff1661110861126f565b73ffffffffffffffffffffffffffffffffffffffff161461115e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611155906135f8565b60405180910390fd5b6111686000611d77565b565b606060006111778361102a565b905060008167ffffffffffffffff8111156111bb577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156111e95781602001602082028036833780820191505090505b50905060005b82811015611259576112018582610ad2565b82828151811061123a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050808061125190613a2f565b9150506111ef565b508092505050919050565b662386f26fc1000081565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546112a8906139cc565b80601f01602080910402602001604051908101604052809291908181526020018280546112d4906139cc565b80156113215780601f106112f657610100808354040283529160200191611321565b820191906000526020600020905b81548152906001019060200180831161130457829003601f168201915b5050505050905090565b61133361191d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139890613498565b60405180910390fd5b80600560006113ae61191d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661145b61191d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114a0919061339b565b60405180910390a35050565b6114bd6114b761191d565b83611a27565b6114fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f390613698565b60405180910390fd5b61150884848484611e3d565b50505050565b6060611519826118b1565b611558576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154f90613638565b60405180910390fd5b6000611562611e99565b9050600081511161158257604051806020016040528060008152506115ad565b8061158c84611f2b565b60405160200161159d9291906132d9565b6040516020818303038152906040525b915050919050565b600c80546115c2906139cc565b80601f01602080910402602001604051908101604052809291908181526020018280546115ee906139cc565b801561163b5780601f106116105761010080835404028352916020019161163b565b820191906000526020600020905b81548152906001019060200180831161161e57829003601f168201915b505050505081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6116df61191d565b73ffffffffffffffffffffffffffffffffffffffff166116fd61126f565b73ffffffffffffffffffffffffffffffffffffffff1614611753576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174a906135f8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156117c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ba90613438565b60405180910390fd5b6117cc81611d77565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061189a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806118aa57506118a9826120d8565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661199883610f78565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b600081836119fa9190613801565b905092915050565b6000611a0e600b6119de565b9050611a1a3382612142565b611a24600b612160565b50565b6000611a32826118b1565b611a71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6890613518565b60405180910390fd5b6000611a7c83610f78565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611aeb57508373ffffffffffffffffffffffffffffffffffffffff16611ad3846107b8565b73ffffffffffffffffffffffffffffffffffffffff16145b80611afc5750611afb8185611643565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611b2582610f78565b73ffffffffffffffffffffffffffffffffffffffff1614611b7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7290613618565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611beb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be290613478565b60405180910390fd5b611bf6838383612176565b611c01600082611925565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c5191906138e2565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ca89190613801565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008183611d6f9190613888565b905092915050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611e48848484611b05565b611e548484848461228a565b611e93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8a90613418565b60405180910390fd5b50505050565b6060600c8054611ea8906139cc565b80601f0160208091040260200160405190810160405280929190818152602001828054611ed4906139cc565b8015611f215780601f10611ef657610100808354040283529160200191611f21565b820191906000526020600020905b815481529060010190602001808311611f0457829003601f168201915b5050505050905090565b60606000821415611f73576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506120d3565b600082905060005b60008214611fa5578080611f8e90613a2f565b915050600a82611f9e9190613857565b9150611f7b565b60008167ffffffffffffffff811115611fe7577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156120195781602001600182028036833780820191505090505b5090505b600085146120cc5760018261203291906138e2565b9150600a856120419190613a78565b603061204d9190613801565b60f81b818381518110612089577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856120c59190613857565b945061201d565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61215c828260405180602001604052806000815250612421565b5050565b6001816000016000828254019250508190555050565b61218183838361247c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156121c4576121bf81612481565b612203565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146122025761220183826124ca565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122465761224181612637565b612285565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461228457612283828261277a565b5b5b505050565b60006122ab8473ffffffffffffffffffffffffffffffffffffffff166127f9565b15612414578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026122d461191d565b8786866040518563ffffffff1660e01b81526004016122f6949392919061332d565b602060405180830381600087803b15801561231057600080fd5b505af192505050801561234157506040513d601f19601f8201168201806040525081019061233e9190612d86565b60015b6123c4573d8060008114612371576040519150601f19603f3d011682016040523d82523d6000602084013e612376565b606091505b506000815114156123bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b390613418565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612419565b600190505b949350505050565b61242b838361280c565b612438600084848461228a565b612477576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246e90613418565b60405180910390fd5b505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016124d78461102a565b6124e191906138e2565b90506000600760008481526020019081526020016000205490508181146125c6576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061264b91906138e2565b90506000600960008481526020019081526020016000205490506000600883815481106126a1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106126e9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061275e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006127858361102a565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561287c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287390613598565b60405180910390fd5b612885816118b1565b156128c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128bc90613458565b60405180910390fd5b6128d160008383612176565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129219190613801565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8280546129e6906139cc565b90600052602060002090601f016020900481019282612a085760008555612a4f565b82601f10612a2157805160ff1916838001178555612a4f565b82800160010185558215612a4f579182015b82811115612a4e578251825591602001919060010190612a33565b5b509050612a5c9190612a60565b5090565b5b80821115612a79576000816000905550600101612a61565b5090565b6000612a90612a8b84613718565b6136f3565b905082815260208101848484011115612aa857600080fd5b612ab384828561398a565b509392505050565b6000612ace612ac984613749565b6136f3565b905082815260208101848484011115612ae657600080fd5b612af184828561398a565b509392505050565b600081359050612b08816141b1565b92915050565b600081359050612b1d816141c8565b92915050565b600081359050612b32816141df565b92915050565b600081519050612b47816141df565b92915050565b600082601f830112612b5e57600080fd5b8135612b6e848260208601612a7d565b91505092915050565b600082601f830112612b8857600080fd5b8135612b98848260208601612abb565b91505092915050565b600081359050612bb0816141f6565b92915050565b600060208284031215612bc857600080fd5b6000612bd684828501612af9565b91505092915050565b60008060408385031215612bf257600080fd5b6000612c0085828601612af9565b9250506020612c1185828601612af9565b9150509250929050565b600080600060608486031215612c3057600080fd5b6000612c3e86828701612af9565b9350506020612c4f86828701612af9565b9250506040612c6086828701612ba1565b9150509250925092565b60008060008060808587031215612c8057600080fd5b6000612c8e87828801612af9565b9450506020612c9f87828801612af9565b9350506040612cb087828801612ba1565b925050606085013567ffffffffffffffff811115612ccd57600080fd5b612cd987828801612b4d565b91505092959194509250565b60008060408385031215612cf857600080fd5b6000612d0685828601612af9565b9250506020612d1785828601612b0e565b9150509250929050565b60008060408385031215612d3457600080fd5b6000612d4285828601612af9565b9250506020612d5385828601612ba1565b9150509250929050565b600060208284031215612d6f57600080fd5b6000612d7d84828501612b23565b91505092915050565b600060208284031215612d9857600080fd5b6000612da684828501612b38565b91505092915050565b600060208284031215612dc157600080fd5b600082013567ffffffffffffffff811115612ddb57600080fd5b612de784828501612b77565b91505092915050565b600060208284031215612e0257600080fd5b6000612e1084828501612ba1565b91505092915050565b6000612e2583836132bb565b60208301905092915050565b612e3a81613916565b82525050565b6000612e4b8261378a565b612e5581856137b8565b9350612e608361377a565b8060005b83811015612e91578151612e788882612e19565b9750612e83836137ab565b925050600181019050612e64565b5085935050505092915050565b612ea781613928565b82525050565b6000612eb882613795565b612ec281856137c9565b9350612ed2818560208601613999565b612edb81613b65565b840191505092915050565b6000612ef1826137a0565b612efb81856137e5565b9350612f0b818560208601613999565b612f1481613b65565b840191505092915050565b6000612f2a826137a0565b612f3481856137f6565b9350612f44818560208601613999565b80840191505092915050565b6000612f5d601f836137e5565b9150612f6882613b76565b602082019050919050565b6000612f80602b836137e5565b9150612f8b82613b9f565b604082019050919050565b6000612fa36032836137e5565b9150612fae82613bee565b604082019050919050565b6000612fc66026836137e5565b9150612fd182613c3d565b604082019050919050565b6000612fe9601c836137e5565b9150612ff482613c8c565b602082019050919050565b600061300c6024836137e5565b915061301782613cb5565b604082019050919050565b600061302f6019836137e5565b915061303a82613d04565b602082019050919050565b60006130526022836137e5565b915061305d82613d2d565b604082019050919050565b60006130756015836137e5565b915061308082613d7c565b602082019050919050565b60006130986025836137e5565b91506130a382613da5565b604082019050919050565b60006130bb602c836137e5565b91506130c682613df4565b604082019050919050565b60006130de6038836137e5565b91506130e982613e43565b604082019050919050565b6000613101602a836137e5565b915061310c82613e92565b604082019050919050565b60006131246029836137e5565b915061312f82613ee1565b604082019050919050565b60006131476020836137e5565b915061315282613f30565b602082019050919050565b600061316a6019836137e5565b915061317582613f59565b602082019050919050565b600061318d602c836137e5565b915061319882613f82565b604082019050919050565b60006131b06020836137e5565b91506131bb82613fd1565b602082019050919050565b60006131d36029836137e5565b91506131de82613ffa565b604082019050919050565b60006131f6602f836137e5565b915061320182614049565b604082019050919050565b60006132196021836137e5565b915061322482614098565b604082019050919050565b600061323c6000836137da565b9150613247826140e7565b600082019050919050565b600061325f6010836137e5565b915061326a826140ea565b602082019050919050565b60006132826031836137e5565b915061328d82614113565b604082019050919050565b60006132a5602c836137e5565b91506132b082614162565b604082019050919050565b6132c481613980565b82525050565b6132d381613980565b82525050565b60006132e58285612f1f565b91506132f18284612f1f565b91508190509392505050565b60006133088261322f565b9150819050919050565b60006020820190506133276000830184612e31565b92915050565b60006080820190506133426000830187612e31565b61334f6020830186612e31565b61335c60408301856132ca565b818103606083015261336e8184612ead565b905095945050505050565b600060208201905081810360008301526133938184612e40565b905092915050565b60006020820190506133b06000830184612e9e565b92915050565b600060208201905081810360008301526133d08184612ee6565b905092915050565b600060208201905081810360008301526133f181612f50565b9050919050565b6000602082019050818103600083015261341181612f73565b9050919050565b6000602082019050818103600083015261343181612f96565b9050919050565b6000602082019050818103600083015261345181612fb9565b9050919050565b6000602082019050818103600083015261347181612fdc565b9050919050565b6000602082019050818103600083015261349181612fff565b9050919050565b600060208201905081810360008301526134b181613022565b9050919050565b600060208201905081810360008301526134d181613045565b9050919050565b600060208201905081810360008301526134f181613068565b9050919050565b600060208201905081810360008301526135118161308b565b9050919050565b60006020820190508181036000830152613531816130ae565b9050919050565b60006020820190508181036000830152613551816130d1565b9050919050565b60006020820190508181036000830152613571816130f4565b9050919050565b6000602082019050818103600083015261359181613117565b9050919050565b600060208201905081810360008301526135b18161313a565b9050919050565b600060208201905081810360008301526135d18161315d565b9050919050565b600060208201905081810360008301526135f181613180565b9050919050565b60006020820190508181036000830152613611816131a3565b9050919050565b60006020820190508181036000830152613631816131c6565b9050919050565b60006020820190508181036000830152613651816131e9565b9050919050565b600060208201905081810360008301526136718161320c565b9050919050565b6000602082019050818103600083015261369181613252565b9050919050565b600060208201905081810360008301526136b181613275565b9050919050565b600060208201905081810360008301526136d181613298565b9050919050565b60006020820190506136ed60008301846132ca565b92915050565b60006136fd61370e565b905061370982826139fe565b919050565b6000604051905090565b600067ffffffffffffffff82111561373357613732613b36565b5b61373c82613b65565b9050602081019050919050565b600067ffffffffffffffff82111561376457613763613b36565b5b61376d82613b65565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061380c82613980565b915061381783613980565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561384c5761384b613aa9565b5b828201905092915050565b600061386282613980565b915061386d83613980565b92508261387d5761387c613ad8565b5b828204905092915050565b600061389382613980565b915061389e83613980565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156138d7576138d6613aa9565b5b828202905092915050565b60006138ed82613980565b91506138f883613980565b92508282101561390b5761390a613aa9565b5b828203905092915050565b600061392182613960565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156139b757808201518184015260208101905061399c565b838111156139c6576000848401525b50505050565b600060028204905060018216806139e457607f821691505b602082108114156139f8576139f7613b07565b5b50919050565b613a0782613b65565b810181811067ffffffffffffffff82111715613a2657613a25613b36565b5b80604052505050565b6000613a3a82613980565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613a6d57613a6c613aa9565b5b600182019050919050565b6000613a8382613980565b9150613a8e83613980565b925082613a9e57613a9d613ad8565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4e6f7420656e6f756768204e465473206c65667420746f207265736572766500600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4e6f7420656e6f75676820657468657220746f207075726368617365204e465460008201527f732e000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f756768204e465473206c656674210000000000000000000000600082015250565b7f43616e6e6f74206d696e7420737065636966696564206e756d626572206f662060008201527f4e4654732e000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4e6f206574686572206c65667420746f20776974686472617700000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6141ba81613916565b81146141c557600080fd5b50565b6141d181613928565b81146141dc57600080fd5b50565b6141e881613934565b81146141f357600080fd5b50565b6141ff81613980565b811461420a57600080fd5b5056fea2646970667358221220dbb56ffa0ef16d53b56dc70ac93f7b1c3eba45cd6b47475ad832e39dca7a355664736f6c63430008040033",
569 | "linkReferences": {},
570 | "deployedLinkReferences": {}
571 | }
572 |
--------------------------------------------------------------------------------