forked from balancer/balancer-deployments
-
Notifications
You must be signed in to change notification settings - Fork 0
/
BatchRelayerLibrary.json
890 lines (890 loc) · 90.1 KB
/
BatchRelayerLibrary.json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
{
"_format": "hh-sol-artifact-1",
"contractName": "BatchRelayerLibrary",
"sourceName": "contracts/BatchRelayerLibrary.sol",
"abi": [
{
"inputs": [
{
"internalType": "contract IVault",
"name": "vault",
"type": "address"
},
{
"internalType": "contract IERC20",
"name": "wstETH",
"type": "address"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"inputs": [
{
"internalType": "contract IERC20",
"name": "token",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "approveVault",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "enum IVault.SwapKind",
"name": "kind",
"type": "uint8"
},
{
"components": [
{
"internalType": "bytes32",
"name": "poolId",
"type": "bytes32"
},
{
"internalType": "uint256",
"name": "assetInIndex",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "assetOutIndex",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "userData",
"type": "bytes"
}
],
"internalType": "struct IVault.BatchSwapStep[]",
"name": "swaps",
"type": "tuple[]"
},
{
"internalType": "contract IAsset[]",
"name": "assets",
"type": "address[]"
},
{
"components": [
{
"internalType": "address",
"name": "sender",
"type": "address"
},
{
"internalType": "bool",
"name": "fromInternalBalance",
"type": "bool"
},
{
"internalType": "address payable",
"name": "recipient",
"type": "address"
},
{
"internalType": "bool",
"name": "toInternalBalance",
"type": "bool"
}
],
"internalType": "struct IVault.FundManagement",
"name": "funds",
"type": "tuple"
},
{
"internalType": "int256[]",
"name": "limits",
"type": "int256[]"
},
{
"internalType": "uint256",
"name": "deadline",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "value",
"type": "uint256"
},
{
"components": [
{
"internalType": "uint256",
"name": "index",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "key",
"type": "uint256"
}
],
"internalType": "struct VaultActions.OutputReference[]",
"name": "outputReferences",
"type": "tuple[]"
}
],
"name": "batchSwap",
"outputs": [
{
"internalType": "int256[]",
"name": "",
"type": "int256[]"
}
],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "poolId",
"type": "bytes32"
},
{
"internalType": "enum VaultActions.PoolKind",
"name": "kind",
"type": "uint8"
},
{
"internalType": "address",
"name": "sender",
"type": "address"
},
{
"internalType": "address payable",
"name": "recipient",
"type": "address"
},
{
"components": [
{
"internalType": "contract IAsset[]",
"name": "assets",
"type": "address[]"
},
{
"internalType": "uint256[]",
"name": "minAmountsOut",
"type": "uint256[]"
},
{
"internalType": "bytes",
"name": "userData",
"type": "bytes"
},
{
"internalType": "bool",
"name": "toInternalBalance",
"type": "bool"
}
],
"internalType": "struct IVault.ExitPoolRequest",
"name": "request",
"type": "tuple"
},
{
"components": [
{
"internalType": "uint256",
"name": "index",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "key",
"type": "uint256"
}
],
"internalType": "struct VaultActions.OutputReference[]",
"name": "outputReferences",
"type": "tuple[]"
}
],
"name": "exitPool",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [],
"name": "getEntrypoint",
"outputs": [
{
"internalType": "contract IBalancerRelayer",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "getVault",
"outputs": [
{
"internalType": "contract IVault",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "poolId",
"type": "bytes32"
},
{
"internalType": "enum VaultActions.PoolKind",
"name": "kind",
"type": "uint8"
},
{
"internalType": "address",
"name": "sender",
"type": "address"
},
{
"internalType": "address",
"name": "recipient",
"type": "address"
},
{
"components": [
{
"internalType": "contract IAsset[]",
"name": "assets",
"type": "address[]"
},
{
"internalType": "uint256[]",
"name": "maxAmountsIn",
"type": "uint256[]"
},
{
"internalType": "bytes",
"name": "userData",
"type": "bytes"
},
{
"internalType": "bool",
"name": "fromInternalBalance",
"type": "bool"
}
],
"internalType": "struct IVault.JoinPoolRequest",
"name": "request",
"type": "tuple"
},
{
"internalType": "uint256",
"name": "value",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "outputReference",
"type": "uint256"
}
],
"name": "joinPool",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"components": [
{
"internalType": "enum IVault.UserBalanceOpKind",
"name": "kind",
"type": "uint8"
},
{
"internalType": "contract IAsset",
"name": "asset",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
},
{
"internalType": "address",
"name": "sender",
"type": "address"
},
{
"internalType": "address payable",
"name": "recipient",
"type": "address"
}
],
"internalType": "struct IVault.UserBalanceOp[]",
"name": "ops",
"type": "tuple[]"
},
{
"internalType": "uint256",
"name": "value",
"type": "uint256"
}
],
"name": "manageUserBalance",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "relayer",
"type": "address"
},
{
"internalType": "bool",
"name": "approved",
"type": "bool"
},
{
"internalType": "bytes",
"name": "authorisation",
"type": "bytes"
}
],
"name": "setRelayerApproval",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "recipient",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "outputReference",
"type": "uint256"
}
],
"name": "stakeETH",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "recipient",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "outputReference",
"type": "uint256"
}
],
"name": "stakeETHAndWrap",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"components": [
{
"internalType": "bytes32",
"name": "poolId",
"type": "bytes32"
},
{
"internalType": "enum IVault.SwapKind",
"name": "kind",
"type": "uint8"
},
{
"internalType": "contract IAsset",
"name": "assetIn",
"type": "address"
},
{
"internalType": "contract IAsset",
"name": "assetOut",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "userData",
"type": "bytes"
}
],
"internalType": "struct IVault.SingleSwap",
"name": "singleSwap",
"type": "tuple"
},
{
"components": [
{
"internalType": "address",
"name": "sender",
"type": "address"
},
{
"internalType": "bool",
"name": "fromInternalBalance",
"type": "bool"
},
{
"internalType": "address payable",
"name": "recipient",
"type": "address"
},
{
"internalType": "bool",
"name": "toInternalBalance",
"type": "bool"
}
],
"internalType": "struct IVault.FundManagement",
"name": "funds",
"type": "tuple"
},
{
"internalType": "uint256",
"name": "limit",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "deadline",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "value",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "outputReference",
"type": "uint256"
}
],
"name": "swap",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "contract IStaticATokenLM",
"name": "staticToken",
"type": "address"
},
{
"internalType": "address",
"name": "sender",
"type": "address"
},
{
"internalType": "address",
"name": "recipient",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
},
{
"internalType": "bool",
"name": "toUnderlying",
"type": "bool"
},
{
"internalType": "uint256",
"name": "outputReference",
"type": "uint256"
}
],
"name": "unwrapAaveStaticToken",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "contract IERC4626",
"name": "wrappedToken",
"type": "address"
},
{
"internalType": "address",
"name": "sender",
"type": "address"
},
{
"internalType": "address",
"name": "recipient",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "outputReference",
"type": "uint256"
}
],
"name": "unwrapERC4626",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "contract IUnbuttonToken",
"name": "wrapperToken",
"type": "address"
},
{
"internalType": "address",
"name": "sender",
"type": "address"
},
{
"internalType": "address",
"name": "recipient",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "outputReference",
"type": "uint256"
}
],
"name": "unwrapUnbuttonToken",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "sender",
"type": "address"
},
{
"internalType": "address",
"name": "recipient",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "outputReference",
"type": "uint256"
}
],
"name": "unwrapWstETH",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "contract IERC20Permit",
"name": "token",
"type": "address"
},
{
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"internalType": "uint256",
"name": "value",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "deadline",
"type": "uint256"
},
{
"internalType": "uint8",
"name": "v",
"type": "uint8"
},
{
"internalType": "bytes32",
"name": "r",
"type": "bytes32"
},
{
"internalType": "bytes32",
"name": "s",
"type": "bytes32"
}
],
"name": "vaultPermit",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "contract IERC20PermitDAI",
"name": "token",
"type": "address"
},
{
"internalType": "address",
"name": "holder",
"type": "address"
},
{
"internalType": "uint256",
"name": "nonce",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "expiry",
"type": "uint256"
},
{
"internalType": "bool",
"name": "allowed",
"type": "bool"
},
{
"internalType": "uint8",
"name": "v",
"type": "uint8"
},
{
"internalType": "bytes32",
"name": "r",
"type": "bytes32"
},
{
"internalType": "bytes32",
"name": "s",
"type": "bytes32"
}
],
"name": "vaultPermitDAI",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "contract IStaticATokenLM",
"name": "staticToken",
"type": "address"
},
{
"internalType": "address",
"name": "sender",
"type": "address"
},
{
"internalType": "address",
"name": "recipient",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
},
{
"internalType": "bool",
"name": "fromUnderlying",
"type": "bool"
},
{
"internalType": "uint256",
"name": "outputReference",
"type": "uint256"
}
],
"name": "wrapAaveDynamicToken",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "contract IERC4626",
"name": "wrappedToken",
"type": "address"
},
{
"internalType": "address",
"name": "sender",
"type": "address"
},
{
"internalType": "address",
"name": "recipient",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "outputReference",
"type": "uint256"
}
],
"name": "wrapERC4626",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "sender",
"type": "address"
},
{
"internalType": "address",
"name": "recipient",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "outputReference",
"type": "uint256"
}
],
"name": "wrapStETH",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "contract IUnbuttonToken",
"name": "wrapperToken",
"type": "address"
},
{
"internalType": "address",
"name": "sender",
"type": "address"
},
{
"internalType": "address",
"name": "recipient",
"type": "address"
},
{
"internalType": "uint256",
"name": "uAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "outputReference",
"type": "uint256"
}
],
"name": "wrapUnbuttonToken",
"outputs": [],
"stateMutability": "payable",
"type": "function"
}
],
"bytecode": "0x6101406040527fae1dc54057af8e8e5ce068cdd4383149c7efcb30e8fb95b592ee1594367fb50960e0523480156200003657600080fd5b5060405162004ae138038062004ae18339810160408190526200005991620001fa565b8082806001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200009557600080fd5b505afa158015620000aa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000d0919062000238565b6001600160601b0319606091821b81166080529082901b1660a05260405181903090620000fd90620001ec565b6200010a9291906200025e565b604051809103906000f08015801562000127573d6000803e3d6000fd5b5060601b6001600160601b03191660c052506001600160a01b03811662000150576000620001c7565b806001600160a01b031663c1fe3e486040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156200018c57600080fd5b505af1158015620001a1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001c7919062000238565b6001600160601b0319606091821b81166101005291901b166101205250620002919050565b61074f806200439283390190565b600080604083850312156200020d578182fd5b82516200021a8162000278565b60208401519092506200022d8162000278565b809150509250929050565b6000602082840312156200024a578081fd5b8151620002578162000278565b9392505050565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03811681146200028e57600080fd5b50565b60805160601c60a05160601c60c05160601c60e0516101005160601c6101205160601c614071620003216000398061038e52806104225280610488528061081852806108c85280610991528061204852806120a052508061079652806107eb5280610a595280610b3852806121695250806125e95250806113a85250806114a8528061154a5250506140716000f3fe60806040526004361061016a5760003560e01c806380db15bd116100cb578063abf6d3991161007f578063db4c0e9111610059578063db4c0e9114610308578063ecc026371461031b578063efe691081461032e5761016a565b8063abf6d399146102c2578063b6d24737146102d5578063d80952d5146102f55761016a565b80638d928af8116100b05780638d928af8146102875780638fe4624f1461029c578063959fc17a146102af5761016a565b806380db15bd146102615780638d64cfbc146102745761016a565b8063433b0865116101225780636d307ea8116101075780636d307ea8146102195780637ab6e03c1461022c5780637fd0e5d51461023f5761016a565b8063433b0865146101f3578063611b90dd146102065761016a565b80631c982441116101535780631c982441146101ad5780632cbec84e146101c05780632e6272ea146101d35761016a565b80631089e5e31461016f5780631836944614610184575b600080fd5b61018261017d366004612f7e565b610341565b005b610197610192366004613500565b610531565b6040516101a49190613ace565b60405180910390f35b6101826101bb366004612eac565b61073e565b6101826101ce366004612f7e565b610a3b565b6101e66101e13660046135fc565b610b6f565b6040516101a49190613f35565b6101826102013660046133ba565b610c9c565b610182610214366004613360565b610f4b565b610182610227366004613360565b611066565b61018261023a3660046133ba565b611291565b34801561024b57600080fd5b506102546113a6565b6040516101a4919061394a565b61018261026f366004612ef1565b6113ca565b6101826102823660046132c7565b6114ce565b34801561029357600080fd5b50610254611548565b6101826102aa3660046131b7565b61156c565b6101826102bd366004613246565b6117a3565b6101826102d0366004613360565b611820565b3480156102e157600080fd5b506101826102f0366004613335565b6119d6565b61018261030336600461310f565b611a62565b610182610316366004612eac565b611ff0565b610182610329366004613042565b6121a0565b61018261033c366004613360565b612298565b61034a82612341565b1561035b576103588261238c565b91505b6040517fb0e389000000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b0e38900906103c3908690600401613f35565b60206040518083038186803b1580156103db57600080fd5b505afa1580156103ef573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061041391906136ea565b90506104486001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016846123a6565b6001600160a01b0384163014610513576040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906104bf9087908590600401613a66565b602060405180830381600087803b1580156104d957600080fd5b505af11580156104ed573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051191906130f3565b505b61051c82612341565b1561052b5761052b8282612420565b50505050565b60603361054160208a018a612e74565b6001600160a01b0316148061056a57503061055f60208a018a612e74565b6001600160a01b0316145b61058f5760405162461bcd60e51b815260040161058690613e05565b60405180910390fd5b60005b8b518110156105f45760008c82815181106105a957fe5b60200260200101516060015190506105c081612341565b156105eb576105ce8161238c565b8d83815181106105da57fe5b602002602001015160600181815250505b50600101610592565b5060606105ff611548565b6001600160a01b031663945bcec9868f8f8f8f8f8f8f8f6040518a63ffffffff1660e01b8152600401610639989796959493929190613cfc565b6000604051808303818588803b15801561065257600080fd5b505af1158015610666573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f1916820160405261068f9190810190612fb2565b905060005b8381101561072d576106ba8585838181106106ab57fe5b90506040020160200135612341565b6106d65760405162461bcd60e51b815260040161058690613e73565b6107258585838181106106e557fe5b90506040020160200135610720848888868181106106ff57fe5b905060400201600001358151811061071357fe5b6020026020010151612433565b612420565b600101610694565b509c9b505050505050505050505050565b61074782612341565b15610758576107558261238c565b91505b6001600160a01b03841630146107bb576001600160a01b03841633146107905760405162461bcd60e51b815260040161058690613e05565b6107bb847f00000000000000000000000000000000000000000000000000000000000000008461244d565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b390610842907f0000000000000000000000000000000000000000000000000000000000000000908690600401613a66565b602060405180830381600087803b15801561085c57600080fd5b505af1158015610870573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061089491906130f3565b506040517fea598cb00000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063ea598cb0906108fd908690600401613f35565b602060405180830381600087803b15801561091757600080fd5b505af115801561092b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094f91906136ea565b90506001600160a01b0384163014610a1c576040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906109c89087908590600401613a66565b602060405180830381600087803b1580156109e257600080fd5b505af11580156109f6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a1a91906130f3565b505b610a2582612341565b15610a3457610a348282612420565b5050505050565b610a4482612341565b15610a5557610a528261238c565b91505b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a1903eab84306040518363ffffffff1660e01b8152600401610aa4919061394a565b6020604051808303818588803b158015610abd57600080fd5b505af1158015610ad1573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610af691906136ea565b90506001600160a01b0384163014610513576040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906104bf9087908590600401613a66565b600033610b7f6020880188612e74565b6001600160a01b03161480610ba8575030610b9d6020880188612e74565b6001600160a01b0316145b610bc45760405162461bcd60e51b815260040161058690613e05565b610bd18760800151612341565b15610be957610be3876080015161238c565b60808801525b6000610bf3611548565b6001600160a01b03166352bbbe29858a8a8a8a6040518663ffffffff1660e01b8152600401610c259493929190613eaa565b6020604051808303818588803b158015610c3e57600080fd5b505af1158015610c52573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610c7791906136ea565b9050610c8283612341565b15610c9157610c918382612420565b979650505050505050565b610ca583612341565b15610cb657610cb38361238c565b92505b600082610d3557866001600160a01b03166351c0e0616040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610cf857600080fd5b505af1158015610d0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d309190612e90565b610da8565b866001600160a01b0316634800d97f6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610d7057600080fd5b505af1158015610d84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da89190612e90565b90506001600160a01b0386163014610ded576001600160a01b0386163314610de25760405162461bcd60e51b815260040161058690613e05565b610ded86828661244d565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0382169063095ea7b390610e34908a908890600401613a66565b602060405180830381600087803b158015610e4e57600080fd5b505af1158015610e62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e8691906130f3565b506040517f2f2cab870000000000000000000000000000000000000000000000000000000081526000906001600160a01b03891690632f2cab8790610ed5908990899086908a90600401613aa2565b602060405180830381600087803b158015610eef57600080fd5b505af1158015610f03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f2791906136ea565b9050610f3283612341565b15610f4157610f418382612420565b5050505050505050565b610f5482612341565b15610f6557610f628261238c565b91505b6001600160a01b0384163014610fa8576001600160a01b0384163314610f9d5760405162461bcd60e51b815260040161058690613e05565b610fa884868461244d565b6040517fea785a5e0000000000000000000000000000000000000000000000000000000081526000906001600160a01b0387169063ea785a5e90610ff29087908790600401613a66565b602060405180830381600087803b15801561100c57600080fd5b505af1158015611020573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104491906136ea565b905061104f82612341565b1561105e5761105e8282612420565b505050505050565b61106f82612341565b156110805761107d8261238c565b91505b6000856001600160a01b03166338d52e0f6040518163ffffffff1660e01b815260040160206040518083038186803b1580156110bb57600080fd5b505afa1580156110cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110f39190612e90565b90506001600160a01b0385163014611138576001600160a01b038516331461112d5760405162461bcd60e51b815260040161058690613e05565b61113885828561244d565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0382169063095ea7b39061117f9089908790600401613a66565b602060405180830381600087803b15801561119957600080fd5b505af11580156111ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111d191906130f3565b506040517f6e553f650000000000000000000000000000000000000000000000000000000081526000906001600160a01b03881690636e553f659061121c9087908990600401613f3e565b602060405180830381600087803b15801561123657600080fd5b505af115801561124a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061126e91906136ea565b905061127983612341565b15611288576112888382612420565b50505050505050565b61129a83612341565b156112ab576112a88361238c565b92505b6001600160a01b03851630146112ee576001600160a01b03851633146112e35760405162461bcd60e51b815260040161058690613e05565b6112ee85878561244d565b6040517fead5d3590000000000000000000000000000000000000000000000000000000081526000906001600160a01b0388169063ead5d3599061133a90889088908890600401613a7f565b6040805180830381600087803b15801561135357600080fd5b505af1158015611367573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061138b9190613702565b91505061139782612341565b15611288576112888282612420565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b0384163014806113df575082155b6113fb5760405162461bcd60e51b815260040161058690613e3c565b606063fa6e671d60e01b33868660405160240161141a9392919061395e565b60408051601f19818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009095169490941790935251611489928691869101613917565b60408051601f19818403018152919052905061105e6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016826124e9565b866001600160a01b031663d505accf876114e6611548565b88888888886040518863ffffffff1660e01b815260040161150d9796959493929190613a25565b600060405180830381600087803b15801561152757600080fd5b505af115801561153b573d6000803e3d6000fd5b5050505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b03851633148061158b57506001600160a01b03851630145b6115a75760405162461bcd60e51b815260040161058690613e05565b60006115b288612561565b905060006115bf83612341565b6115ca57600061165f565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b038316906370a082319061160f90899060040161394a565b60206040518083038186803b15801561162757600080fd5b505afa15801561163b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061165f91906136ea565b905061166f888660400151612567565b604086015261167c611548565b6001600160a01b031663b95cac28858b8a8a8a6040518663ffffffff1660e01b81526004016116ae9493929190613c56565b6000604051808303818588803b1580156116c757600080fd5b505af11580156116db573d6000803e3d6000fd5b50505050506116e983612341565b15611798576040517f70a082310000000000000000000000000000000000000000000000000000000081526000906001600160a01b038416906370a0823190611736908a9060040161394a565b60206040518083038186803b15801561174e57600080fd5b505afa158015611762573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061178691906136ea565b9050611796846107208385612595565b505b505050505050505050565b876001600160a01b0316638fcbaf0c886117bb611548565b8989898989896040518963ffffffff1660e01b81526004016117e49897969594939291906139dc565b600060405180830381600087803b1580156117fe57600080fd5b505af1158015611812573d6000803e3d6000fd5b505050505050505050505050565b61182982612341565b1561183a576118378261238c565b91505b6000856001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b15801561187557600080fd5b505afa158015611889573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ad9190612e90565b90506001600160a01b03851630146118f2576001600160a01b03851633146118e75760405162461bcd60e51b815260040161058690613e05565b6118f285828561244d565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0382169063095ea7b3906119399089908790600401613a66565b602060405180830381600087803b15801561195357600080fd5b505af1158015611967573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061198b91906130f3565b506040517f2f4f21e20000000000000000000000000000000000000000000000000000000081526000906001600160a01b03881690632f4f21e29061121c9088908890600401613a66565b816001600160a01b031663095ea7b36119ed611548565b836040518363ffffffff1660e01b8152600401611a0b929190613a66565b602060405180830381600087803b158015611a2557600080fd5b505af1158015611a39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a5d91906130f3565b505050565b6001600160a01b038516331480611a8157506001600160a01b03851630145b611a9d5760405162461bcd60e51b815260040161058690613e05565b60608167ffffffffffffffff81118015611ab657600080fd5b50604051908082528060200260200182016040528015611ae0578160200160208202803683370190505b50905060608267ffffffffffffffff81118015611afc57600080fd5b50604051908082528060200260200182016040528015611b26578160200160208202803683370190505b50905060005b83811015611c9657611b438585838181106106ab57fe5b611b5f5760405162461bcd60e51b815260040161058690613e73565b8551600090868684818110611b7057fe5b9050604002016000013581518110611b8457fe5b60200260200101519050866060015115611bd257611ba1816125ab565b848381518110611bad57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050611c8d565b611bdb816125ae565b611c6857611be8816125ab565b6001600160a01b03166370a08231896040518263ffffffff1660e01b8152600401611c13919061394a565b60206040518083038186803b158015611c2b57600080fd5b505afa158015611c3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c6391906136ea565b611c74565b876001600160a01b0316315b838381518110611c8057fe5b6020026020010181815250505b50600101611b2c565b50846060015115611d2d57611ca9611548565b6001600160a01b0316630f5a6efa87846040518363ffffffff1660e01b8152600401611cd6929190613982565b60006040518083038186803b158015611cee57600080fd5b505afa158015611d02573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611d2a91908101906130b8565b90505b611d3b8886604001516125bb565b6040860152611d48611548565b6001600160a01b0316638bdb39138a8989896040518563ffffffff1660e01b8152600401611d799493929190613c56565b600060405180830381600087803b158015611d9357600080fd5b505af1158015611da7573d6000803e3d6000fd5b50606092508591505067ffffffffffffffff81118015611dc657600080fd5b50604051908082528060200260200182016040528015611df0578160200160208202803683370190505b509050856060015115611e8d57611e05611548565b6001600160a01b0316630f5a6efa88856040518363ffffffff1660e01b8152600401611e32929190613982565b60006040518083038186803b158015611e4a57600080fd5b505afa158015611e5e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611e8691908101906130b8565b9050611f8b565b60005b84811015611f89578651600090878784818110611ea957fe5b9050604002016000013581518110611ebd57fe5b60200260200101519050611ed0816125ae565b611f5d57611edd816125ab565b6001600160a01b03166370a082318a6040518263ffffffff1660e01b8152600401611f08919061394a565b60206040518083038186803b158015611f2057600080fd5b505afa158015611f34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f5891906136ea565b611f69565b886001600160a01b0316315b838381518110611f7557fe5b602090810291909101015250600101611e90565b505b60005b8481101561153b57611fe8868683818110611fa557fe5b90506040020160200135610720858481518110611fbe57fe5b6020026020010151858581518110611fd257fe5b602002602001015161259590919063ffffffff16565b600101611f8e565b611ff982612341565b1561200a576120078261238c565b91505b6001600160a01b038416301461206d576001600160a01b03841633146120425760405162461bcd60e51b815260040161058690613e05565b61206d847f00000000000000000000000000000000000000000000000000000000000000008461244d565b6040517fde0e9a3e0000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063de0e9a3e906120d5908690600401613f35565b602060405180830381600087803b1580156120ef57600080fd5b505af1158015612103573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061212791906136ea565b90506001600160a01b0384163014610a1c576040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906109c89087908590600401613a66565b60005b8281101561223457338484838181106121b857fe5b905060a0020160600160208101906121d09190612e74565b6001600160a01b031614806122105750308484838181106121ed57fe5b905060a0020160600160208101906122059190612e74565b6001600160a01b0316145b61222c5760405162461bcd60e51b815260040161058690613e05565b6001016121a3565b5061223d611548565b6001600160a01b0316630e8e3e848285856040518463ffffffff1660e01b815260040161226b929190613b12565b6000604051808303818588803b15801561228457600080fd5b505af1158015610f41573d6000803e3d6000fd5b6122a182612341565b156122b2576122af8261238c565b91505b6001600160a01b03841630146122f5576001600160a01b03841633146122ea5760405162461bcd60e51b815260040161058690613e05565b6122f584868461244d565b6040517fba0876520000000000000000000000000000000000000000000000000000000081526000906001600160a01b0387169063ba08765290610ff290869088903090600401613f55565b7fba100000000000000000000000000000000000000000000000000000000000007fffff0000000000000000000000000000000000000000000000000000000000008216145b919050565b600080612398836125e2565b805460009091559392505050565b6123b5814710156101a3612638565b6000826001600160a01b0316826040516123ce906125ab565b60006040518083038185875af1925050503d806000811461240b576040519150601f19603f3d011682016040523d82523d6000602084013e612410565b606091505b50509050611a5d816101a4612638565b600061242b836125e2565b919091555050565b60008082136124455781600003612447565b815b92915050565b8061245757611a5d565b60408051600180825281830190925260609160208083019080368337019050509050828160008151811061248757fe5b6001600160a01b03929092166020928302919091019091015260408051600180825281830190925260609181602001602082028036833701905050905082816000815181106124d257fe5b602002602001018181525050610a3485838361264a565b606060006060846001600160a01b03168460405161250791906138fb565b6000604051808303816000865af19150503d8060008114612544576040519150601f19603f3d011682016040523d82523d6000602084013e612549565b606091505b50915091506125588282612784565b95945050505050565b60601c90565b6060600083801561257457fe5b141561258a57612583826127ae565b9050612447565b6124476101366127eb565b60006125a5838311156001612638565b50900390565b90565b6001600160a01b03161590565b606060008380156125c857fe5b14156125d7576125838261283e565b6124476101506127eb565b60006001827f000000000000000000000000000000000000000000000000000000000000000060405160200161261992919061393c565b60408051808303601f1901815291905280516020909101200392915050565b8161264657612646816127eb565b5050565b6060825167ffffffffffffffff8111801561266457600080fd5b5060405190808252806020026020018201604052801561269e57816020015b61268b612a58565b8152602001906001900390816126835790505b50905060005b8351811015612736576040805160a0810190915280600381526020018583815181106126cc57fe5b60200260200101516001600160a01b031681526020018483815181106126ee57fe5b60200260200101518152602001866001600160a01b03168152602001306001600160a01b031681525082828151811061272357fe5b60209081029190910101526001016126a4565b5061273f611548565b6001600160a01b0316630e8e3e84826040518263ffffffff1660e01b815260040161276a9190613bc0565b600060405180830381600087803b15801561228457600080fd5b60608215612793575080612447565b8151156127a35781518083602001fd5b6124476101ae6127eb565b606060006127bb83612887565b905060018160038111156127cb57fe5b14156127e2576127da8361289d565b915050612387565b82915050612387565b62461bcd60e51b6000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b6060600061284b83612887565b9050600081600381111561285b57fe5b141561286a576127da8361294b565b600181600381111561287857fe5b14156127e2576127da836129ae565b6000818060200190518101906124479190613429565b60608060006128ab84612a01565b915091506000805b83518110156129115760008482815181106128ca57fe5b602002602001015190506128dd81612341565b15612908576128eb8161238c565b8583815181106128f757fe5b602002602001018181525050600192505b506001016128b3565b508061291d5784612558565b6001838360405160200161293393929190613cca565b60405160208183030381529060405295945050505050565b606060008061295984612a24565b9150915061296682612341565b156129a4576129748261238c565b91506000828260405160200161298c93929190613ca9565b60405160208183030381529060405292505050612387565b8392505050612387565b606060006129bb83612a3b565b90506129c681612341565b156127e2576129d48161238c565b90506001816040516020016129ea929190613c92565b604051602081830303815290604052915050612387565b6060600082806020019051810190612a1991906134a8565b909590945092505050565b60008082806020019051810190612a199190613472565b600081806020019051810190612a519190613445565b9392505050565b6040805160a081019091528060008152600060208201819052604082018190526060820181905260809091015290565b80356124478161400b565b60008083601f840112612aa4578182fd5b50813567ffffffffffffffff811115612abb578182fd5b6020830191508360208083028501011115612ad557600080fd5b9250929050565b600082601f830112612aec578081fd5b8135612aff612afa82613f9b565b613f74565b818152915060208083019084810181840286018201871015612b2057600080fd5b60005b84811015612b48578135612b368161400b565b84529282019290820190600101612b23565b505050505092915050565b600082601f830112612b63578081fd5b8135612b71612afa82613f9b565b818152915060208083019084810160005b84811015612b48578135870160a080601f19838c03011215612ba357600080fd5b612bac81613f74565b85830135815260408084013587830152606080850135828401526080915081850135818401525082840135925067ffffffffffffffff831115612bee57600080fd5b612bfc8c8885870101612d1e565b90820152865250509282019290820190600101612b82565b60008083601f840112612c25578182fd5b50813567ffffffffffffffff811115612c3c578182fd5b602083019150836020604083028501011115612ad557600080fd5b600082601f830112612c67578081fd5b8135612c75612afa82613f9b565b818152915060208083019084810181840286018201871015612c9657600080fd5b60005b84811015612b4857813584529282019290820190600101612c99565b600082601f830112612cc5578081fd5b8151612cd3612afa82613f9b565b818152915060208083019084810181840286018201871015612cf457600080fd5b60005b84811015612b4857815184529282019290820190600101612cf7565b803561244781614020565b600082601f830112612d2e578081fd5b813567ffffffffffffffff811115612d44578182fd5b612d576020601f19601f84011601613f74565b9150808252836020828501011115612d6e57600080fd5b8060208401602084013760009082016020015292915050565b80356001811061244757600080fd5b80356002811061244757600080fd5b600060808284031215612db6578081fd5b612dc06080613f74565b9050813567ffffffffffffffff80821115612dda57600080fd5b612de685838601612adc565b83526020840135915080821115612dfc57600080fd5b612e0885838601612c57565b60208401526040840135915080821115612e2157600080fd5b50612e2e84828501612d1e565b604083015250612e418360608401612d13565b606082015292915050565b600060808284031215612e5d578081fd5b50919050565b803560ff8116811461244757600080fd5b600060208284031215612e85578081fd5b8135612a518161400b565b600060208284031215612ea1578081fd5b8151612a518161400b565b60008060008060808587031215612ec1578283fd5b8435612ecc8161400b565b93506020850135612edc8161400b565b93969395505050506040820135916060013590565b60008060008060608587031215612f06578182fd5b8435612f118161400b565b93506020850135612f2181614020565b9250604085013567ffffffffffffffff80821115612f3d578384fd5b818701915087601f830112612f50578384fd5b813581811115612f5e578485fd5b886020828501011115612f6f578485fd5b95989497505060200194505050565b600080600060608486031215612f92578081fd5b8335612f9d8161400b565b95602085013595506040909401359392505050565b60006020808385031215612fc4578182fd5b825167ffffffffffffffff811115612fda578283fd5b8301601f81018513612fea578283fd5b8051612ff8612afa82613f9b565b8181528381019083850185840285018601891015613014578687fd5b8694505b83851015613036578051835260019490940193918501918501613018565b50979650505050505050565b600080600060408486031215613056578081fd5b833567ffffffffffffffff8082111561306d578283fd5b818601915086601f830112613080578283fd5b81358181111561308e578384fd5b87602060a0830285010111156130a2578384fd5b6020928301989097509590910135949350505050565b6000602082840312156130c9578081fd5b815167ffffffffffffffff8111156130df578182fd5b6130eb84828501612cb5565b949350505050565b600060208284031215613104578081fd5b8151612a5181614020565b600080600080600080600060c0888a031215613129578485fd5b8735965061313a8960208a01612d87565b9550604088013561314a8161400b565b9450606088013561315a8161400b565b9350608088013567ffffffffffffffff80821115613176578485fd5b6131828b838c01612da5565b945060a08a0135915080821115613197578384fd5b506131a48a828b01612c14565b989b979a50959850939692959293505050565b600080600080600080600060e0888a0312156131d1578081fd5b873596506131e28960208a01612d87565b955060408801356131f28161400b565b945060608801356132028161400b565b9350608088013567ffffffffffffffff81111561321d578182fd5b6132298a828b01612da5565b93505060a0880135915060c0880135905092959891949750929550565b600080600080600080600080610100898b031215613262578182fd5b883561326d8161400b565b9750602089013561327d8161400b565b96506040890135955060608901359450608089013561329b81614020565b93506132aa8a60a08b01612e63565b925060c0890135915060e089013590509295985092959890939650565b600080600080600080600060e0888a0312156132e1578081fd5b87356132ec8161400b565b965060208801356132fc8161400b565b955060408801359450606088013593506133198960808a01612e63565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215613347578182fd5b82356133528161400b565b946020939093013593505050565b600080600080600060a08688031215613377578283fd5b85356133828161400b565b945060208601356133928161400b565b935060408601356133a28161400b565b94979396509394606081013594506080013592915050565b60008060008060008060c087890312156133d2578384fd5b86356133dd8161400b565b955060208701356133ed8161400b565b945060408701356133fd8161400b565b935060608701359250608087013561341481614020565b8092505060a087013590509295509295509295565b60006020828403121561343a578081fd5b8151612a518161402e565b60008060408385031215613457578182fd5b82516134628161402e565b6020939093015192949293505050565b600080600060608486031215613486578081fd5b83516134918161402e565b602085015160409095015190969495509392505050565b6000806000606084860312156134bc578081fd5b83516134c78161402e565b602085015190935067ffffffffffffffff8111156134e3578182fd5b6134ef86828701612cb5565b925050604084015190509250925092565b60008060008060008060008060008060006101608c8e031215613521578485fd5b61352b8d8d612d96565b9a5067ffffffffffffffff8060208e01351115613546578586fd5b6135568e60208f01358f01612b53565b9a508060408e01351115613568578586fd5b6135788e60408f01358f01612a93565b909a50985061358a8e60608f01612e4c565b97508060e08e0135111561359c578586fd5b6135ac8e60e08f01358f01612a93565b90975095506101008d013594506101208d013593506101408d01358110156135d2578283fd5b506135e48d6101408e01358e01612c14565b81935080925050509295989b509295989b9093969950565b6000806000806000806101208789031215613615578384fd5b863567ffffffffffffffff8082111561362c578586fd5b9088019060c0828b03121561363f578586fd5b61364960c0613f74565b8235815261365a8b60208501612d96565b6020820152604083013561366d8161400b565b604082015261367f8b60608501612a88565b60608201526080830135608082015260a08301358281111561369f578788fd5b6136ab8c828601612d1e565b60a0830152508098505050506136c48860208901612e4c565b959895975050505060a08401359360c08101359360e08201359350610100909101359150565b6000602082840312156136fb578081fd5b5051919050565b60008060408385031215613714578182fd5b505080516020909101519092909150565b6001600160a01b03169052565b60008284526020808501945082825b8581101561376f5781356137548161400b565b6001600160a01b031687529582019590820190600101613741565b509495945050505050565b60008284526020808501945082825b8581101561376f57813587529582019590820190600101613789565b6000815180845260208085019450808401835b8381101561376f578151875295820195908201906001016137b8565b15159052565b600081518084526137f2816020860160208601613fc8565b601f01601f19169290920160200192915050565b8051608080845281519084018190526000916020919082019060a0860190845b8181101561384b5783516001600160a01b031683529284019291840191600101613826565b50508285015191508581038387015261386481836137a5565b925050506040830151848203604086015261387f82826137da565b915050606083015161389460608601826137d4565b509392505050565b80356138a78161400b565b6001600160a01b0390811683526020820135906138c382614020565b90151560208401526040820135906138da8261400b565b16604083015260608101356138ee81614020565b8015156060840152505050565b6000825161390d818460208701613fc8565b9190910192915050565b60008451613929818460208901613fc8565b8201838582379092019182525092915050565b918252602082015260400190565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152901515604082015260600190565b6000604082016001600160a01b03808616845260206040818601528286518085526060870191508288019450855b818110156139ce5785518516835294830194918301916001016139b0565b509098975050505050505050565b6001600160a01b039889168152969097166020870152604086019490945260608501929092521515608084015260ff1660a083015260c082015260e08101919091526101000190565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0393909316835260208301919091521515604082015260600190565b6001600160a01b03949094168452602084019290925261ffff1660408301521515606082015260800190565b6020808252825182820181905260009190848201906040850190845b81811015613b0657835183529284019291840191600101613aea565b50909695505050505050565b6020808252818101839052600090604080840186845b87811015613bb3578135613b3b8161402e565b613b4481613ff4565b835281850135613b538161400b565b6001600160a01b03168386015281840135848401526060613b7681840184613fbb565b613b8282860182613725565b50506080613b9281840184613fbb565b613b9e82860182613725565b505060a0928301929190910190600101613b28565b5090979650505050505050565b602080825282518282018190526000919060409081850190868401855b82811015613c495781518051613bf281613ff4565b8552808701516001600160a01b0316878601528581015186860152606080820151613c1f82880182613725565b505060809081015190613c3486820183613725565b505060a0939093019290850190600101613bdd565b5091979650505050505050565b60008582526001600160a01b03808616602084015280851660408401525060806060830152613c886080830184613806565b9695505050505050565b60408101613c9f84613ff4565b9281526020015290565b60608101613cb685613ff4565b938152602081019290925260409091015290565b6000613cd585613ff4565b84825260606020830152613cec60608301856137a5565b9050826040830152949350505050565b6000610120808301613d0d8c614001565b8b84526020808501929092528a5190819052610140808501928281028601909101918c8201855b82811015613db4578785037ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec00186528151805186528481015185870152604080820151908701526060808201519087015260809081015160a091870182905290613da0818801836137da565b978601979650505090830190600101613d34565b505050508381036040850152613dcb818a8c613732565b915050613ddb606084018861389c565b82810360e0840152613dee81868861377a565b915050826101008301529998505050505050505050565b60208082526010908201527f496e636f72726563742073656e64657200000000000000000000000000000000604082015260600190565b6020808252601f908201527f52656c617965722063616e206f6e6c7920617070726f766520697473656c6600604082015260600190565b60208082526019908201527f696e76616c696420636861696e6564207265666572656e636500000000000000604082015260600190565b600060e08252855160e08301526020860151613ec581614001565b61010083015260408601516001600160a01b03908116610120840152606087015116610140830152608086015161016083015260a086015160c0610180840152613f136101a08401826137da565b915050613f23602083018661389c565b60a082019390935260c0015292915050565b90815260200190565b9182526001600160a01b0316602082015260400190565b9283526001600160a01b03918216602084015216604082015260600190565b60405181810167ffffffffffffffff81118282101715613f9357600080fd5b604052919050565b600067ffffffffffffffff821115613fb1578081fd5b5060209081020190565b60008235612a518161400b565b60005b83811015613fe3578181015183820152602001613fcb565b8381111561052b5750506000910152565b60048110613ffe57fe5b50565b60028110613ffe57fe5b6001600160a01b0381168114613ffe57600080fd5b8015158114613ffe57600080fd5b60048110613ffe57600080fdfea264697066735822122025243bbdfb65ba86b5f803d93a3a51b76dfd9a870b570145fb0333e20f93cf5f64736f6c6343000701003360c060405234801561001057600080fd5b5060405161074f38038061074f83398101604081905261002f91610052565b60016000556001600160601b0319606092831b8116608052911b1660a0526100a3565b60008060408385031215610064578182fd5b825161006f8161008b565b60208401519092506100808161008b565b809150509250929050565b6001600160a01b03811681146100a057600080fd5b50565b60805160601c60a05160601c61067b6100d46000398060fc528061020f52508060585280610120525061067b6000f3fe6080604052600436106100385760003560e01c80637678922e146100885780638d928af8146100b3578063ac9650d8146100c857610083565b36610083576100813373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146102066100e8565b005b600080fd5b34801561009457600080fd5b5061009d6100fa565b6040516100aa91906104d6565b60405180910390f35b3480156100bf57600080fd5b5061009d61011e565b6100db6100d6366004610448565b610142565b6040516100aa91906104f7565b816100f6576100f68161026e565b5050565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b606061014c6102db565b8167ffffffffffffffff8111801561016357600080fd5b5060405190808252806020026020018201604052801561019757816020015b60608152602001906001900390816101825790505b50905060005b82811015610257576102388484838181106101b457fe5b90506020028101906101c691906105ab565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929150506102f4565b82828151811061024457fe5b602090810291909101015260010161019d565b50610260610377565b61026861038b565b92915050565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b6102ed600260005414156101906100e8565b6002600055565b6060600060608473ffffffffffffffffffffffffffffffffffffffff168460405161031f91906104b7565b600060405180830381855af49150503d806000811461035a576040519150601f19603f3d011682016040523d82523d6000602084013e61035f565b606091505b509150915061036e8282610392565b95945050505050565b4780156103885761038833826103bc565b50565b6001600055565b606082156103a1575080610268565b8151156103b15781518083602001fd5b6102686101ae61026e565b6103cb814710156101a36100e8565b60008273ffffffffffffffffffffffffffffffffffffffff16826040516103f1906104d3565b60006040518083038185875af1925050503d806000811461042e576040519150601f19603f3d011682016040523d82523d6000602084013e610433565b606091505b50509050610443816101a46100e8565b505050565b6000806020838503121561045a578182fd5b823567ffffffffffffffff80821115610471578384fd5b818501915085601f830112610484578384fd5b813581811115610492578485fd5b86602080830285010111156104a5578485fd5b60209290920196919550909350505050565b600082516104c9818460208701610615565b9190910192915050565b90565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b6000602080830181845280855180835260408601915060408482028701019250838701855b8281101561059e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc088860301845281518051808752610561818989018a8501610615565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169590950186019450928501929085019060010161051c565b5092979650505050505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126105df578283fd5b83018035915067ffffffffffffffff8211156105f9578283fd5b60200191503681900382131561060e57600080fd5b9250929050565b60005b83811015610630578181015183820152602001610618565b8381111561063f576000848401525b5050505056fea26469706673582212207bec353e9208321ecbb5e97f79b940fc6df900afa85b759a6fc41b9c6709c0fe64736f6c63430007010033",
"deployedBytecode": "0x60806040526004361061016a5760003560e01c806380db15bd116100cb578063abf6d3991161007f578063db4c0e9111610059578063db4c0e9114610308578063ecc026371461031b578063efe691081461032e5761016a565b8063abf6d399146102c2578063b6d24737146102d5578063d80952d5146102f55761016a565b80638d928af8116100b05780638d928af8146102875780638fe4624f1461029c578063959fc17a146102af5761016a565b806380db15bd146102615780638d64cfbc146102745761016a565b8063433b0865116101225780636d307ea8116101075780636d307ea8146102195780637ab6e03c1461022c5780637fd0e5d51461023f5761016a565b8063433b0865146101f3578063611b90dd146102065761016a565b80631c982441116101535780631c982441146101ad5780632cbec84e146101c05780632e6272ea146101d35761016a565b80631089e5e31461016f5780631836944614610184575b600080fd5b61018261017d366004612f7e565b610341565b005b610197610192366004613500565b610531565b6040516101a49190613ace565b60405180910390f35b6101826101bb366004612eac565b61073e565b6101826101ce366004612f7e565b610a3b565b6101e66101e13660046135fc565b610b6f565b6040516101a49190613f35565b6101826102013660046133ba565b610c9c565b610182610214366004613360565b610f4b565b610182610227366004613360565b611066565b61018261023a3660046133ba565b611291565b34801561024b57600080fd5b506102546113a6565b6040516101a4919061394a565b61018261026f366004612ef1565b6113ca565b6101826102823660046132c7565b6114ce565b34801561029357600080fd5b50610254611548565b6101826102aa3660046131b7565b61156c565b6101826102bd366004613246565b6117a3565b6101826102d0366004613360565b611820565b3480156102e157600080fd5b506101826102f0366004613335565b6119d6565b61018261030336600461310f565b611a62565b610182610316366004612eac565b611ff0565b610182610329366004613042565b6121a0565b61018261033c366004613360565b612298565b61034a82612341565b1561035b576103588261238c565b91505b6040517fb0e389000000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b0e38900906103c3908690600401613f35565b60206040518083038186803b1580156103db57600080fd5b505afa1580156103ef573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061041391906136ea565b90506104486001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016846123a6565b6001600160a01b0384163014610513576040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906104bf9087908590600401613a66565b602060405180830381600087803b1580156104d957600080fd5b505af11580156104ed573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051191906130f3565b505b61051c82612341565b1561052b5761052b8282612420565b50505050565b60603361054160208a018a612e74565b6001600160a01b0316148061056a57503061055f60208a018a612e74565b6001600160a01b0316145b61058f5760405162461bcd60e51b815260040161058690613e05565b60405180910390fd5b60005b8b518110156105f45760008c82815181106105a957fe5b60200260200101516060015190506105c081612341565b156105eb576105ce8161238c565b8d83815181106105da57fe5b602002602001015160600181815250505b50600101610592565b5060606105ff611548565b6001600160a01b031663945bcec9868f8f8f8f8f8f8f8f6040518a63ffffffff1660e01b8152600401610639989796959493929190613cfc565b6000604051808303818588803b15801561065257600080fd5b505af1158015610666573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f1916820160405261068f9190810190612fb2565b905060005b8381101561072d576106ba8585838181106106ab57fe5b90506040020160200135612341565b6106d65760405162461bcd60e51b815260040161058690613e73565b6107258585838181106106e557fe5b90506040020160200135610720848888868181106106ff57fe5b905060400201600001358151811061071357fe5b6020026020010151612433565b612420565b600101610694565b509c9b505050505050505050505050565b61074782612341565b15610758576107558261238c565b91505b6001600160a01b03841630146107bb576001600160a01b03841633146107905760405162461bcd60e51b815260040161058690613e05565b6107bb847f00000000000000000000000000000000000000000000000000000000000000008461244d565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b390610842907f0000000000000000000000000000000000000000000000000000000000000000908690600401613a66565b602060405180830381600087803b15801561085c57600080fd5b505af1158015610870573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061089491906130f3565b506040517fea598cb00000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063ea598cb0906108fd908690600401613f35565b602060405180830381600087803b15801561091757600080fd5b505af115801561092b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094f91906136ea565b90506001600160a01b0384163014610a1c576040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906109c89087908590600401613a66565b602060405180830381600087803b1580156109e257600080fd5b505af11580156109f6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a1a91906130f3565b505b610a2582612341565b15610a3457610a348282612420565b5050505050565b610a4482612341565b15610a5557610a528261238c565b91505b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a1903eab84306040518363ffffffff1660e01b8152600401610aa4919061394a565b6020604051808303818588803b158015610abd57600080fd5b505af1158015610ad1573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610af691906136ea565b90506001600160a01b0384163014610513576040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906104bf9087908590600401613a66565b600033610b7f6020880188612e74565b6001600160a01b03161480610ba8575030610b9d6020880188612e74565b6001600160a01b0316145b610bc45760405162461bcd60e51b815260040161058690613e05565b610bd18760800151612341565b15610be957610be3876080015161238c565b60808801525b6000610bf3611548565b6001600160a01b03166352bbbe29858a8a8a8a6040518663ffffffff1660e01b8152600401610c259493929190613eaa565b6020604051808303818588803b158015610c3e57600080fd5b505af1158015610c52573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610c7791906136ea565b9050610c8283612341565b15610c9157610c918382612420565b979650505050505050565b610ca583612341565b15610cb657610cb38361238c565b92505b600082610d3557866001600160a01b03166351c0e0616040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610cf857600080fd5b505af1158015610d0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d309190612e90565b610da8565b866001600160a01b0316634800d97f6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610d7057600080fd5b505af1158015610d84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da89190612e90565b90506001600160a01b0386163014610ded576001600160a01b0386163314610de25760405162461bcd60e51b815260040161058690613e05565b610ded86828661244d565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0382169063095ea7b390610e34908a908890600401613a66565b602060405180830381600087803b158015610e4e57600080fd5b505af1158015610e62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e8691906130f3565b506040517f2f2cab870000000000000000000000000000000000000000000000000000000081526000906001600160a01b03891690632f2cab8790610ed5908990899086908a90600401613aa2565b602060405180830381600087803b158015610eef57600080fd5b505af1158015610f03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f2791906136ea565b9050610f3283612341565b15610f4157610f418382612420565b5050505050505050565b610f5482612341565b15610f6557610f628261238c565b91505b6001600160a01b0384163014610fa8576001600160a01b0384163314610f9d5760405162461bcd60e51b815260040161058690613e05565b610fa884868461244d565b6040517fea785a5e0000000000000000000000000000000000000000000000000000000081526000906001600160a01b0387169063ea785a5e90610ff29087908790600401613a66565b602060405180830381600087803b15801561100c57600080fd5b505af1158015611020573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104491906136ea565b905061104f82612341565b1561105e5761105e8282612420565b505050505050565b61106f82612341565b156110805761107d8261238c565b91505b6000856001600160a01b03166338d52e0f6040518163ffffffff1660e01b815260040160206040518083038186803b1580156110bb57600080fd5b505afa1580156110cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110f39190612e90565b90506001600160a01b0385163014611138576001600160a01b038516331461112d5760405162461bcd60e51b815260040161058690613e05565b61113885828561244d565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0382169063095ea7b39061117f9089908790600401613a66565b602060405180830381600087803b15801561119957600080fd5b505af11580156111ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111d191906130f3565b506040517f6e553f650000000000000000000000000000000000000000000000000000000081526000906001600160a01b03881690636e553f659061121c9087908990600401613f3e565b602060405180830381600087803b15801561123657600080fd5b505af115801561124a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061126e91906136ea565b905061127983612341565b15611288576112888382612420565b50505050505050565b61129a83612341565b156112ab576112a88361238c565b92505b6001600160a01b03851630146112ee576001600160a01b03851633146112e35760405162461bcd60e51b815260040161058690613e05565b6112ee85878561244d565b6040517fead5d3590000000000000000000000000000000000000000000000000000000081526000906001600160a01b0388169063ead5d3599061133a90889088908890600401613a7f565b6040805180830381600087803b15801561135357600080fd5b505af1158015611367573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061138b9190613702565b91505061139782612341565b15611288576112888282612420565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b0384163014806113df575082155b6113fb5760405162461bcd60e51b815260040161058690613e3c565b606063fa6e671d60e01b33868660405160240161141a9392919061395e565b60408051601f19818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009095169490941790935251611489928691869101613917565b60408051601f19818403018152919052905061105e6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016826124e9565b866001600160a01b031663d505accf876114e6611548565b88888888886040518863ffffffff1660e01b815260040161150d9796959493929190613a25565b600060405180830381600087803b15801561152757600080fd5b505af115801561153b573d6000803e3d6000fd5b5050505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b03851633148061158b57506001600160a01b03851630145b6115a75760405162461bcd60e51b815260040161058690613e05565b60006115b288612561565b905060006115bf83612341565b6115ca57600061165f565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b038316906370a082319061160f90899060040161394a565b60206040518083038186803b15801561162757600080fd5b505afa15801561163b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061165f91906136ea565b905061166f888660400151612567565b604086015261167c611548565b6001600160a01b031663b95cac28858b8a8a8a6040518663ffffffff1660e01b81526004016116ae9493929190613c56565b6000604051808303818588803b1580156116c757600080fd5b505af11580156116db573d6000803e3d6000fd5b50505050506116e983612341565b15611798576040517f70a082310000000000000000000000000000000000000000000000000000000081526000906001600160a01b038416906370a0823190611736908a9060040161394a565b60206040518083038186803b15801561174e57600080fd5b505afa158015611762573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061178691906136ea565b9050611796846107208385612595565b505b505050505050505050565b876001600160a01b0316638fcbaf0c886117bb611548565b8989898989896040518963ffffffff1660e01b81526004016117e49897969594939291906139dc565b600060405180830381600087803b1580156117fe57600080fd5b505af1158015611812573d6000803e3d6000fd5b505050505050505050505050565b61182982612341565b1561183a576118378261238c565b91505b6000856001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b15801561187557600080fd5b505afa158015611889573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ad9190612e90565b90506001600160a01b03851630146118f2576001600160a01b03851633146118e75760405162461bcd60e51b815260040161058690613e05565b6118f285828561244d565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0382169063095ea7b3906119399089908790600401613a66565b602060405180830381600087803b15801561195357600080fd5b505af1158015611967573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061198b91906130f3565b506040517f2f4f21e20000000000000000000000000000000000000000000000000000000081526000906001600160a01b03881690632f4f21e29061121c9088908890600401613a66565b816001600160a01b031663095ea7b36119ed611548565b836040518363ffffffff1660e01b8152600401611a0b929190613a66565b602060405180830381600087803b158015611a2557600080fd5b505af1158015611a39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a5d91906130f3565b505050565b6001600160a01b038516331480611a8157506001600160a01b03851630145b611a9d5760405162461bcd60e51b815260040161058690613e05565b60608167ffffffffffffffff81118015611ab657600080fd5b50604051908082528060200260200182016040528015611ae0578160200160208202803683370190505b50905060608267ffffffffffffffff81118015611afc57600080fd5b50604051908082528060200260200182016040528015611b26578160200160208202803683370190505b50905060005b83811015611c9657611b438585838181106106ab57fe5b611b5f5760405162461bcd60e51b815260040161058690613e73565b8551600090868684818110611b7057fe5b9050604002016000013581518110611b8457fe5b60200260200101519050866060015115611bd257611ba1816125ab565b848381518110611bad57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050611c8d565b611bdb816125ae565b611c6857611be8816125ab565b6001600160a01b03166370a08231896040518263ffffffff1660e01b8152600401611c13919061394a565b60206040518083038186803b158015611c2b57600080fd5b505afa158015611c3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c6391906136ea565b611c74565b876001600160a01b0316315b838381518110611c8057fe5b6020026020010181815250505b50600101611b2c565b50846060015115611d2d57611ca9611548565b6001600160a01b0316630f5a6efa87846040518363ffffffff1660e01b8152600401611cd6929190613982565b60006040518083038186803b158015611cee57600080fd5b505afa158015611d02573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611d2a91908101906130b8565b90505b611d3b8886604001516125bb565b6040860152611d48611548565b6001600160a01b0316638bdb39138a8989896040518563ffffffff1660e01b8152600401611d799493929190613c56565b600060405180830381600087803b158015611d9357600080fd5b505af1158015611da7573d6000803e3d6000fd5b50606092508591505067ffffffffffffffff81118015611dc657600080fd5b50604051908082528060200260200182016040528015611df0578160200160208202803683370190505b509050856060015115611e8d57611e05611548565b6001600160a01b0316630f5a6efa88856040518363ffffffff1660e01b8152600401611e32929190613982565b60006040518083038186803b158015611e4a57600080fd5b505afa158015611e5e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611e8691908101906130b8565b9050611f8b565b60005b84811015611f89578651600090878784818110611ea957fe5b9050604002016000013581518110611ebd57fe5b60200260200101519050611ed0816125ae565b611f5d57611edd816125ab565b6001600160a01b03166370a082318a6040518263ffffffff1660e01b8152600401611f08919061394a565b60206040518083038186803b158015611f2057600080fd5b505afa158015611f34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f5891906136ea565b611f69565b886001600160a01b0316315b838381518110611f7557fe5b602090810291909101015250600101611e90565b505b60005b8481101561153b57611fe8868683818110611fa557fe5b90506040020160200135610720858481518110611fbe57fe5b6020026020010151858581518110611fd257fe5b602002602001015161259590919063ffffffff16565b600101611f8e565b611ff982612341565b1561200a576120078261238c565b91505b6001600160a01b038416301461206d576001600160a01b03841633146120425760405162461bcd60e51b815260040161058690613e05565b61206d847f00000000000000000000000000000000000000000000000000000000000000008461244d565b6040517fde0e9a3e0000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063de0e9a3e906120d5908690600401613f35565b602060405180830381600087803b1580156120ef57600080fd5b505af1158015612103573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061212791906136ea565b90506001600160a01b0384163014610a1c576040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906109c89087908590600401613a66565b60005b8281101561223457338484838181106121b857fe5b905060a0020160600160208101906121d09190612e74565b6001600160a01b031614806122105750308484838181106121ed57fe5b905060a0020160600160208101906122059190612e74565b6001600160a01b0316145b61222c5760405162461bcd60e51b815260040161058690613e05565b6001016121a3565b5061223d611548565b6001600160a01b0316630e8e3e848285856040518463ffffffff1660e01b815260040161226b929190613b12565b6000604051808303818588803b15801561228457600080fd5b505af1158015610f41573d6000803e3d6000fd5b6122a182612341565b156122b2576122af8261238c565b91505b6001600160a01b03841630146122f5576001600160a01b03841633146122ea5760405162461bcd60e51b815260040161058690613e05565b6122f584868461244d565b6040517fba0876520000000000000000000000000000000000000000000000000000000081526000906001600160a01b0387169063ba08765290610ff290869088903090600401613f55565b7fba100000000000000000000000000000000000000000000000000000000000007fffff0000000000000000000000000000000000000000000000000000000000008216145b919050565b600080612398836125e2565b805460009091559392505050565b6123b5814710156101a3612638565b6000826001600160a01b0316826040516123ce906125ab565b60006040518083038185875af1925050503d806000811461240b576040519150601f19603f3d011682016040523d82523d6000602084013e612410565b606091505b50509050611a5d816101a4612638565b600061242b836125e2565b919091555050565b60008082136124455781600003612447565b815b92915050565b8061245757611a5d565b60408051600180825281830190925260609160208083019080368337019050509050828160008151811061248757fe5b6001600160a01b03929092166020928302919091019091015260408051600180825281830190925260609181602001602082028036833701905050905082816000815181106124d257fe5b602002602001018181525050610a3485838361264a565b606060006060846001600160a01b03168460405161250791906138fb565b6000604051808303816000865af19150503d8060008114612544576040519150601f19603f3d011682016040523d82523d6000602084013e612549565b606091505b50915091506125588282612784565b95945050505050565b60601c90565b6060600083801561257457fe5b141561258a57612583826127ae565b9050612447565b6124476101366127eb565b60006125a5838311156001612638565b50900390565b90565b6001600160a01b03161590565b606060008380156125c857fe5b14156125d7576125838261283e565b6124476101506127eb565b60006001827f000000000000000000000000000000000000000000000000000000000000000060405160200161261992919061393c565b60408051808303601f1901815291905280516020909101200392915050565b8161264657612646816127eb565b5050565b6060825167ffffffffffffffff8111801561266457600080fd5b5060405190808252806020026020018201604052801561269e57816020015b61268b612a58565b8152602001906001900390816126835790505b50905060005b8351811015612736576040805160a0810190915280600381526020018583815181106126cc57fe5b60200260200101516001600160a01b031681526020018483815181106126ee57fe5b60200260200101518152602001866001600160a01b03168152602001306001600160a01b031681525082828151811061272357fe5b60209081029190910101526001016126a4565b5061273f611548565b6001600160a01b0316630e8e3e84826040518263ffffffff1660e01b815260040161276a9190613bc0565b600060405180830381600087803b15801561228457600080fd5b60608215612793575080612447565b8151156127a35781518083602001fd5b6124476101ae6127eb565b606060006127bb83612887565b905060018160038111156127cb57fe5b14156127e2576127da8361289d565b915050612387565b82915050612387565b62461bcd60e51b6000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b6060600061284b83612887565b9050600081600381111561285b57fe5b141561286a576127da8361294b565b600181600381111561287857fe5b14156127e2576127da836129ae565b6000818060200190518101906124479190613429565b60608060006128ab84612a01565b915091506000805b83518110156129115760008482815181106128ca57fe5b602002602001015190506128dd81612341565b15612908576128eb8161238c565b8583815181106128f757fe5b602002602001018181525050600192505b506001016128b3565b508061291d5784612558565b6001838360405160200161293393929190613cca565b60405160208183030381529060405295945050505050565b606060008061295984612a24565b9150915061296682612341565b156129a4576129748261238c565b91506000828260405160200161298c93929190613ca9565b60405160208183030381529060405292505050612387565b8392505050612387565b606060006129bb83612a3b565b90506129c681612341565b156127e2576129d48161238c565b90506001816040516020016129ea929190613c92565b604051602081830303815290604052915050612387565b6060600082806020019051810190612a1991906134a8565b909590945092505050565b60008082806020019051810190612a199190613472565b600081806020019051810190612a519190613445565b9392505050565b6040805160a081019091528060008152600060208201819052604082018190526060820181905260809091015290565b80356124478161400b565b60008083601f840112612aa4578182fd5b50813567ffffffffffffffff811115612abb578182fd5b6020830191508360208083028501011115612ad557600080fd5b9250929050565b600082601f830112612aec578081fd5b8135612aff612afa82613f9b565b613f74565b818152915060208083019084810181840286018201871015612b2057600080fd5b60005b84811015612b48578135612b368161400b565b84529282019290820190600101612b23565b505050505092915050565b600082601f830112612b63578081fd5b8135612b71612afa82613f9b565b818152915060208083019084810160005b84811015612b48578135870160a080601f19838c03011215612ba357600080fd5b612bac81613f74565b85830135815260408084013587830152606080850135828401526080915081850135818401525082840135925067ffffffffffffffff831115612bee57600080fd5b612bfc8c8885870101612d1e565b90820152865250509282019290820190600101612b82565b60008083601f840112612c25578182fd5b50813567ffffffffffffffff811115612c3c578182fd5b602083019150836020604083028501011115612ad557600080fd5b600082601f830112612c67578081fd5b8135612c75612afa82613f9b565b818152915060208083019084810181840286018201871015612c9657600080fd5b60005b84811015612b4857813584529282019290820190600101612c99565b600082601f830112612cc5578081fd5b8151612cd3612afa82613f9b565b818152915060208083019084810181840286018201871015612cf457600080fd5b60005b84811015612b4857815184529282019290820190600101612cf7565b803561244781614020565b600082601f830112612d2e578081fd5b813567ffffffffffffffff811115612d44578182fd5b612d576020601f19601f84011601613f74565b9150808252836020828501011115612d6e57600080fd5b8060208401602084013760009082016020015292915050565b80356001811061244757600080fd5b80356002811061244757600080fd5b600060808284031215612db6578081fd5b612dc06080613f74565b9050813567ffffffffffffffff80821115612dda57600080fd5b612de685838601612adc565b83526020840135915080821115612dfc57600080fd5b612e0885838601612c57565b60208401526040840135915080821115612e2157600080fd5b50612e2e84828501612d1e565b604083015250612e418360608401612d13565b606082015292915050565b600060808284031215612e5d578081fd5b50919050565b803560ff8116811461244757600080fd5b600060208284031215612e85578081fd5b8135612a518161400b565b600060208284031215612ea1578081fd5b8151612a518161400b565b60008060008060808587031215612ec1578283fd5b8435612ecc8161400b565b93506020850135612edc8161400b565b93969395505050506040820135916060013590565b60008060008060608587031215612f06578182fd5b8435612f118161400b565b93506020850135612f2181614020565b9250604085013567ffffffffffffffff80821115612f3d578384fd5b818701915087601f830112612f50578384fd5b813581811115612f5e578485fd5b886020828501011115612f6f578485fd5b95989497505060200194505050565b600080600060608486031215612f92578081fd5b8335612f9d8161400b565b95602085013595506040909401359392505050565b60006020808385031215612fc4578182fd5b825167ffffffffffffffff811115612fda578283fd5b8301601f81018513612fea578283fd5b8051612ff8612afa82613f9b565b8181528381019083850185840285018601891015613014578687fd5b8694505b83851015613036578051835260019490940193918501918501613018565b50979650505050505050565b600080600060408486031215613056578081fd5b833567ffffffffffffffff8082111561306d578283fd5b818601915086601f830112613080578283fd5b81358181111561308e578384fd5b87602060a0830285010111156130a2578384fd5b6020928301989097509590910135949350505050565b6000602082840312156130c9578081fd5b815167ffffffffffffffff8111156130df578182fd5b6130eb84828501612cb5565b949350505050565b600060208284031215613104578081fd5b8151612a5181614020565b600080600080600080600060c0888a031215613129578485fd5b8735965061313a8960208a01612d87565b9550604088013561314a8161400b565b9450606088013561315a8161400b565b9350608088013567ffffffffffffffff80821115613176578485fd5b6131828b838c01612da5565b945060a08a0135915080821115613197578384fd5b506131a48a828b01612c14565b989b979a50959850939692959293505050565b600080600080600080600060e0888a0312156131d1578081fd5b873596506131e28960208a01612d87565b955060408801356131f28161400b565b945060608801356132028161400b565b9350608088013567ffffffffffffffff81111561321d578182fd5b6132298a828b01612da5565b93505060a0880135915060c0880135905092959891949750929550565b600080600080600080600080610100898b031215613262578182fd5b883561326d8161400b565b9750602089013561327d8161400b565b96506040890135955060608901359450608089013561329b81614020565b93506132aa8a60a08b01612e63565b925060c0890135915060e089013590509295985092959890939650565b600080600080600080600060e0888a0312156132e1578081fd5b87356132ec8161400b565b965060208801356132fc8161400b565b955060408801359450606088013593506133198960808a01612e63565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215613347578182fd5b82356133528161400b565b946020939093013593505050565b600080600080600060a08688031215613377578283fd5b85356133828161400b565b945060208601356133928161400b565b935060408601356133a28161400b565b94979396509394606081013594506080013592915050565b60008060008060008060c087890312156133d2578384fd5b86356133dd8161400b565b955060208701356133ed8161400b565b945060408701356133fd8161400b565b935060608701359250608087013561341481614020565b8092505060a087013590509295509295509295565b60006020828403121561343a578081fd5b8151612a518161402e565b60008060408385031215613457578182fd5b82516134628161402e565b6020939093015192949293505050565b600080600060608486031215613486578081fd5b83516134918161402e565b602085015160409095015190969495509392505050565b6000806000606084860312156134bc578081fd5b83516134c78161402e565b602085015190935067ffffffffffffffff8111156134e3578182fd5b6134ef86828701612cb5565b925050604084015190509250925092565b60008060008060008060008060008060006101608c8e031215613521578485fd5b61352b8d8d612d96565b9a5067ffffffffffffffff8060208e01351115613546578586fd5b6135568e60208f01358f01612b53565b9a508060408e01351115613568578586fd5b6135788e60408f01358f01612a93565b909a50985061358a8e60608f01612e4c565b97508060e08e0135111561359c578586fd5b6135ac8e60e08f01358f01612a93565b90975095506101008d013594506101208d013593506101408d01358110156135d2578283fd5b506135e48d6101408e01358e01612c14565b81935080925050509295989b509295989b9093969950565b6000806000806000806101208789031215613615578384fd5b863567ffffffffffffffff8082111561362c578586fd5b9088019060c0828b03121561363f578586fd5b61364960c0613f74565b8235815261365a8b60208501612d96565b6020820152604083013561366d8161400b565b604082015261367f8b60608501612a88565b60608201526080830135608082015260a08301358281111561369f578788fd5b6136ab8c828601612d1e565b60a0830152508098505050506136c48860208901612e4c565b959895975050505060a08401359360c08101359360e08201359350610100909101359150565b6000602082840312156136fb578081fd5b5051919050565b60008060408385031215613714578182fd5b505080516020909101519092909150565b6001600160a01b03169052565b60008284526020808501945082825b8581101561376f5781356137548161400b565b6001600160a01b031687529582019590820190600101613741565b509495945050505050565b60008284526020808501945082825b8581101561376f57813587529582019590820190600101613789565b6000815180845260208085019450808401835b8381101561376f578151875295820195908201906001016137b8565b15159052565b600081518084526137f2816020860160208601613fc8565b601f01601f19169290920160200192915050565b8051608080845281519084018190526000916020919082019060a0860190845b8181101561384b5783516001600160a01b031683529284019291840191600101613826565b50508285015191508581038387015261386481836137a5565b925050506040830151848203604086015261387f82826137da565b915050606083015161389460608601826137d4565b509392505050565b80356138a78161400b565b6001600160a01b0390811683526020820135906138c382614020565b90151560208401526040820135906138da8261400b565b16604083015260608101356138ee81614020565b8015156060840152505050565b6000825161390d818460208701613fc8565b9190910192915050565b60008451613929818460208901613fc8565b8201838582379092019182525092915050565b918252602082015260400190565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152901515604082015260600190565b6000604082016001600160a01b03808616845260206040818601528286518085526060870191508288019450855b818110156139ce5785518516835294830194918301916001016139b0565b509098975050505050505050565b6001600160a01b039889168152969097166020870152604086019490945260608501929092521515608084015260ff1660a083015260c082015260e08101919091526101000190565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0393909316835260208301919091521515604082015260600190565b6001600160a01b03949094168452602084019290925261ffff1660408301521515606082015260800190565b6020808252825182820181905260009190848201906040850190845b81811015613b0657835183529284019291840191600101613aea565b50909695505050505050565b6020808252818101839052600090604080840186845b87811015613bb3578135613b3b8161402e565b613b4481613ff4565b835281850135613b538161400b565b6001600160a01b03168386015281840135848401526060613b7681840184613fbb565b613b8282860182613725565b50506080613b9281840184613fbb565b613b9e82860182613725565b505060a0928301929190910190600101613b28565b5090979650505050505050565b602080825282518282018190526000919060409081850190868401855b82811015613c495781518051613bf281613ff4565b8552808701516001600160a01b0316878601528581015186860152606080820151613c1f82880182613725565b505060809081015190613c3486820183613725565b505060a0939093019290850190600101613bdd565b5091979650505050505050565b60008582526001600160a01b03808616602084015280851660408401525060806060830152613c886080830184613806565b9695505050505050565b60408101613c9f84613ff4565b9281526020015290565b60608101613cb685613ff4565b938152602081019290925260409091015290565b6000613cd585613ff4565b84825260606020830152613cec60608301856137a5565b9050826040830152949350505050565b6000610120808301613d0d8c614001565b8b84526020808501929092528a5190819052610140808501928281028601909101918c8201855b82811015613db4578785037ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec00186528151805186528481015185870152604080820151908701526060808201519087015260809081015160a091870182905290613da0818801836137da565b978601979650505090830190600101613d34565b505050508381036040850152613dcb818a8c613732565b915050613ddb606084018861389c565b82810360e0840152613dee81868861377a565b915050826101008301529998505050505050505050565b60208082526010908201527f496e636f72726563742073656e64657200000000000000000000000000000000604082015260600190565b6020808252601f908201527f52656c617965722063616e206f6e6c7920617070726f766520697473656c6600604082015260600190565b60208082526019908201527f696e76616c696420636861696e6564207265666572656e636500000000000000604082015260600190565b600060e08252855160e08301526020860151613ec581614001565b61010083015260408601516001600160a01b03908116610120840152606087015116610140830152608086015161016083015260a086015160c0610180840152613f136101a08401826137da565b915050613f23602083018661389c565b60a082019390935260c0015292915050565b90815260200190565b9182526001600160a01b0316602082015260400190565b9283526001600160a01b03918216602084015216604082015260600190565b60405181810167ffffffffffffffff81118282101715613f9357600080fd5b604052919050565b600067ffffffffffffffff821115613fb1578081fd5b5060209081020190565b60008235612a518161400b565b60005b83811015613fe3578181015183820152602001613fcb565b8381111561052b5750506000910152565b60048110613ffe57fe5b50565b60028110613ffe57fe5b6001600160a01b0381168114613ffe57600080fd5b8015158114613ffe57600080fd5b60048110613ffe57600080fdfea264697066735822122025243bbdfb65ba86b5f803d93a3a51b76dfd9a870b570145fb0333e20f93cf5f64736f6c63430007010033",
"linkReferences": {},
"deployedLinkReferences": {}
}